@mastra/playground-ui 48.0.0 → 48.1.0-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 +51 -0
- package/dist/Composer.css +2 -2
- package/dist/{code-C5KVVzOZ.js → code-Cj09LVys.js} +2 -2
- package/dist/{code-C5KVVzOZ.js.map → code-Cj09LVys.js.map} +1 -1
- package/dist/{code-B3WONxnA.cjs → code-FZwLnf_f.cjs} +2 -2
- package/dist/{code-B3WONxnA.cjs.map → code-FZwLnf_f.cjs.map} +1 -1
- package/dist/code-block-Dn0K3DkE.cjs +88 -0
- package/dist/code-block-Dn0K3DkE.cjs.map +1 -0
- package/dist/code-block-DqKXZajq.js +86 -0
- package/dist/code-block-DqKXZajq.js.map +1 -0
- package/dist/components/Code.cjs.js +1 -1
- package/dist/components/Code.es.js +1 -1
- package/dist/components/CodeBlock.cjs.js +3 -83
- package/dist/components/CodeBlock.cjs.js.map +1 -1
- package/dist/components/CodeBlock.es.js +1 -85
- package/dist/components/CodeBlock.es.js.map +1 -1
- package/dist/components/CodeEditor.cjs.js +2 -2
- package/dist/components/CodeEditor.es.js +2 -2
- package/dist/components/CopyButton.cjs.js +1 -1
- package/dist/components/CopyButton.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataDetailsPanel.cjs.js +1 -1
- package/dist/components/DataDetailsPanel.es.js +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +1 -1
- package/dist/components/SideDialog.es.js +1 -1
- package/dist/components/Truncate.cjs.js +1 -1
- package/dist/components/Truncate.es.js +1 -1
- package/dist/components/ai/plan.cjs.js +2 -2
- package/dist/components/ai/plan.cjs.js.map +1 -1
- package/dist/components/ai/plan.es.js +2 -2
- package/dist/components/ai/plan.es.js.map +1 -1
- package/dist/components/ai/task-list.cjs.js +44 -18
- package/dist/components/ai/task-list.cjs.js.map +1 -1
- package/dist/components/ai/task-list.es.js +47 -21
- package/dist/components/ai/task-list.es.js.map +1 -1
- package/dist/{copy-button-B1GWIQ-x.js → copy-button-BLGUkVE8.js} +4 -2
- package/dist/copy-button-BLGUkVE8.js.map +1 -0
- package/dist/{copy-button-DwZ3c7D4.cjs → copy-button-BfawWA4t.cjs} +4 -2
- package/dist/copy-button-BfawWA4t.cjs.map +1 -0
- package/dist/{data-code-section-PJM5l3aS.js → data-code-section-DHbytoQ2.js} +2 -2
- package/dist/{data-code-section-PJM5l3aS.js.map → data-code-section-DHbytoQ2.js.map} +1 -1
- package/dist/{data-code-section-BjmFgJpC.cjs → data-code-section-bqvIovEN.cjs} +2 -2
- package/dist/{data-code-section-BjmFgJpC.cjs.map → data-code-section-bqvIovEN.cjs.map} +1 -1
- package/dist/{data-panel-BQqPr6ew.js → data-panel-BX_78wCj.js} +2 -2
- package/dist/{data-panel-BQqPr6ew.js.map → data-panel-BX_78wCj.js.map} +1 -1
- package/dist/{data-panel-C85h9XvH.cjs → data-panel-DT6LgTVX.cjs} +2 -2
- package/dist/{data-panel-C85h9XvH.cjs.map → data-panel-DT6LgTVX.cjs.map} +1 -1
- package/dist/domains/logs/components/log-details-view.cjs.js +1 -1
- package/dist/domains/logs/components/log-details-view.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +1 -1
- package/dist/ee/signals/entity-learning-api.cjs.js +8 -2
- package/dist/ee/signals/entity-learning-api.cjs.js.map +1 -1
- package/dist/ee/signals/entity-learning-api.es.js +8 -3
- package/dist/ee/signals/entity-learning-api.es.js.map +1 -1
- package/dist/ee/signals/hooks/use-noise-examples.cjs.js +5 -3
- package/dist/ee/signals/hooks/use-noise-examples.cjs.js.map +1 -1
- package/dist/ee/signals/hooks/use-noise-examples.es.js +6 -4
- package/dist/ee/signals/hooks/use-noise-examples.es.js.map +1 -1
- package/dist/ee/signals/hooks/use-theme-examples.cjs.js +6 -3
- package/dist/ee/signals/hooks/use-theme-examples.cjs.js.map +1 -1
- package/dist/ee/signals/hooks/use-theme-examples.es.js +7 -4
- package/dist/ee/signals/hooks/use-theme-examples.es.js.map +1 -1
- package/dist/ee/signals/hooks/use-theme-paths.cjs.js +2 -2
- package/dist/ee/signals/hooks/use-theme-paths.cjs.js.map +1 -1
- package/dist/ee/signals/hooks/use-theme-paths.es.js +3 -3
- package/dist/ee/signals/hooks/use-theme-paths.es.js.map +1 -1
- package/dist/ee/signals/lifeline-row.cjs.js +1 -1
- package/dist/ee/signals/lifeline-row.cjs.js.map +1 -1
- package/dist/ee/signals/lifeline-row.es.js +1 -1
- package/dist/ee/signals/lifeline-row.es.js.map +1 -1
- package/dist/ee/signals/noise-detail-panel.cjs.js +18 -5
- package/dist/ee/signals/noise-detail-panel.cjs.js.map +1 -1
- package/dist/ee/signals/noise-detail-panel.es.js +18 -5
- package/dist/ee/signals/noise-detail-panel.es.js.map +1 -1
- package/dist/ee/signals/sankey-signals.cjs.js +50 -34
- package/dist/ee/signals/sankey-signals.cjs.js.map +1 -1
- package/dist/ee/signals/sankey-signals.es.js +52 -36
- package/dist/ee/signals/sankey-signals.es.js.map +1 -1
- package/dist/ee/signals/signal-delta-column.cjs.js +1 -1
- package/dist/ee/signals/signal-delta-column.cjs.js.map +1 -1
- package/dist/ee/signals/signal-delta-column.es.js +1 -1
- package/dist/ee/signals/signal-delta-column.es.js.map +1 -1
- package/dist/ee/signals/theme-detail-panel.cjs.js +11 -4
- package/dist/ee/signals/theme-detail-panel.cjs.js.map +1 -1
- package/dist/ee/signals/theme-detail-panel.es.js +11 -4
- package/dist/ee/signals/theme-detail-panel.es.js.map +1 -1
- package/dist/ee/signals/theme-drilldown-data.cjs.js +41 -13
- package/dist/ee/signals/theme-drilldown-data.cjs.js.map +1 -1
- package/dist/ee/signals/theme-drilldown-data.es.js +40 -14
- package/dist/ee/signals/theme-drilldown-data.es.js.map +1 -1
- package/dist/ee/signals/theme-filter-banner.cjs.js +53 -28
- package/dist/ee/signals/theme-filter-banner.cjs.js.map +1 -1
- package/dist/ee/signals/theme-filter-banner.es.js +53 -28
- package/dist/ee/signals/theme-filter-banner.es.js.map +1 -1
- package/dist/{highlight-C2uRVhiA.cjs → highlight-CEt2vhD8.cjs} +20 -3
- package/dist/highlight-CEt2vhD8.cjs.map +1 -0
- package/dist/{highlight-Dis62bkj.js → highlight-CSJjjoqh.js} +20 -3
- package/dist/highlight-CSJjjoqh.js.map +1 -0
- package/dist/markdown-renderer-D1vSFfp9.cjs +86 -0
- package/dist/markdown-renderer-D1vSFfp9.cjs.map +1 -0
- package/dist/markdown-renderer-DmYYQHxu.js +84 -0
- package/dist/markdown-renderer-DmYYQHxu.js.map +1 -0
- package/dist/markdown-renderer.css +182 -0
- package/dist/src/ds/components/CopyButton/copy-button.d.ts +2 -1
- package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +9 -5
- package/dist/src/ds/components/ai/task-list/task-list.d.ts +4 -2
- package/dist/src/ds/components/ai/task-list/task-list.stories.d.ts +2 -0
- package/dist/src/ee/signals/entity-learning-api.d.ts +4 -2
- package/dist/src/ee/signals/hooks/use-noise-examples.d.ts +2 -1
- package/dist/src/ee/signals/hooks/use-theme-examples.d.ts +2 -1
- package/dist/src/ee/signals/hooks/use-theme-paths.d.ts +1 -1
- package/dist/src/ee/signals/noise-detail-panel.d.ts +4 -1
- package/dist/src/ee/signals/theme-detail-panel.d.ts +5 -3
- package/dist/src/ee/signals/theme-drilldown-data.d.ts +17 -4
- package/dist/src/ee/signals/theme-filter-banner.d.ts +5 -3
- package/dist/style.css +5 -98
- package/package.json +7 -7
- package/dist/copy-button-B1GWIQ-x.js.map +0 -1
- package/dist/copy-button-DwZ3c7D4.cjs.map +0 -1
- package/dist/highlight-C2uRVhiA.cjs.map +0 -1
- package/dist/highlight-Dis62bkj.js.map +0 -1
- package/dist/markdown-renderer-DszxuuNM.js +0 -117
- package/dist/markdown-renderer-DszxuuNM.js.map +0 -1
- package/dist/markdown-renderer-g8xNLOc0.cjs +0 -119
- package/dist/markdown-renderer-g8xNLOc0.cjs.map +0 -1
|
@@ -13,8 +13,17 @@ const ee_signals_signalFormatting = require('./signal-formatting.cjs.js');
|
|
|
13
13
|
const ee_signals_traceInsightView = require('./trace-insight-view.cjs.js');
|
|
14
14
|
const drawer = require('../../drawer-CNnvBMfD.cjs');
|
|
15
15
|
|
|
16
|
-
function NoiseDetailPanel({
|
|
17
|
-
|
|
16
|
+
function NoiseDetailPanel({
|
|
17
|
+
entityId,
|
|
18
|
+
entityType,
|
|
19
|
+
snapshotId,
|
|
20
|
+
signalName,
|
|
21
|
+
filters = [],
|
|
22
|
+
filteredStats,
|
|
23
|
+
onClose
|
|
24
|
+
}) {
|
|
25
|
+
const filterKey = filters.map((filter) => `${filter.signalName}:${filter.kind === "theme" ? filter.themeId : "noise"}`).join(",");
|
|
26
|
+
const examplesContextKey = `${snapshotId}:${signalName ?? ""}:${filterKey}`;
|
|
18
27
|
const [examplesPage, setExamplesPage] = React.useState(() => ({ contextKey: examplesContextKey, offset: 0 }));
|
|
19
28
|
const examplesOffset = examplesPage.contextKey === examplesContextKey ? examplesPage.offset : 0;
|
|
20
29
|
const [insightTraceId, setInsightTraceId] = React.useState();
|
|
@@ -25,7 +34,8 @@ function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClos
|
|
|
25
34
|
signalName,
|
|
26
35
|
snapshotId,
|
|
27
36
|
ee_signals_examplesPager.EXAMPLES_PAGE_SIZE,
|
|
28
|
-
examplesOffset
|
|
37
|
+
examplesOffset,
|
|
38
|
+
filters
|
|
29
39
|
);
|
|
30
40
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
31
41
|
drawer.Drawer,
|
|
@@ -58,7 +68,10 @@ function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClos
|
|
|
58
68
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-neutral5 mt-3 text-sm", children: "Noise contains trace signal summaries that did not consistently match a recurring theme in this snapshot." }),
|
|
59
69
|
noiseQuery.isPending && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-neutral3 mt-4 text-sm", children: "Loading noise details…" }),
|
|
60
70
|
noiseQuery.isError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 text-sm text-red-500", children: "Unable to load noise details." }),
|
|
61
|
-
noiseQuery.data && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-neutral5 mt-4 font-mono text-sm tabular-nums", children: ee_signals_signalFormatting.shareSentence(
|
|
71
|
+
noiseQuery.data && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-neutral5 mt-4 font-mono text-sm tabular-nums", children: ee_signals_signalFormatting.shareSentence(
|
|
72
|
+
filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount,
|
|
73
|
+
filteredStats?.stageShare ?? noiseQuery.data.noise.coverage
|
|
74
|
+
) })
|
|
62
75
|
] }),
|
|
63
76
|
/* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-labelledby": "noise-examples-heading", children: [
|
|
64
77
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { id: "noise-examples-heading", className: "text-neutral3 font-mono text-xs tracking-wider uppercase", children: "Example summaries" }),
|
|
@@ -78,7 +91,7 @@ function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClos
|
|
|
78
91
|
noiseQuery.data && /* @__PURE__ */ jsxRuntime.jsx(
|
|
79
92
|
ee_signals_examplesPager.ExamplesPager,
|
|
80
93
|
{
|
|
81
|
-
traceCount: noiseQuery.data.noise.traceCount,
|
|
94
|
+
traceCount: filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount,
|
|
82
95
|
offset: examplesOffset,
|
|
83
96
|
onOffsetChange: (offset) => setExamplesPage({ contextKey: examplesContextKey, offset })
|
|
84
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noise-detail-panel.cjs.js","sources":["../../../src/ee/signals/noise-detail-panel.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { EXAMPLES_PAGE_SIZE, ExamplesPager } from './examples-pager';\nimport { useNoise, useNoiseExamples } from './hooks';\nimport { shareSentence } from './signal-formatting';\nimport { TraceInsightView } from './trace-insight-view';\nimport type { TraceSignalName } from './types';\nimport {\n Drawer,\n DrawerBody,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n} from '@/ds/components/Drawer';\n\ninterface NoiseDetailPanelProps {\n entityId: string;\n entityType: string;\n snapshotId: string;\n signalName: TraceSignalName | undefined;\n onClose: () => void;\n}\n\nexport function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClose }: NoiseDetailPanelProps) {\n const examplesContextKey = `${snapshotId}:${signalName ?? ''}`;\n const [examplesPage, setExamplesPage] = useState(() => ({ contextKey: examplesContextKey, offset: 0 }));\n const examplesOffset = examplesPage.contextKey === examplesContextKey ? examplesPage.offset : 0;\n const [insightTraceId, setInsightTraceId] = useState<string>();\n const noiseQuery = useNoise(entityId, entityType, signalName, snapshotId);\n const examplesQuery = useNoiseExamples(\n entityId,\n entityType,\n signalName,\n snapshotId,\n EXAMPLES_PAGE_SIZE,\n examplesOffset,\n );\n\n return (\n <Drawer\n onOpenChange={open => {\n if (!open) {\n setExamplesPage({ contextKey: '', offset: 0 });\n setInsightTraceId(undefined);\n onClose();\n }\n }}\n open={signalName !== undefined}\n overlay=\"none\"\n side=\"right\"\n variant=\"floating\"\n >\n <DrawerContent>\n <DrawerHeader className=\"border-border1 border-b\">\n <DrawerTitle>Noise</DrawerTitle>\n <DrawerDescription className=\"sr-only\">Noise details for the {signalName} trace signal</DrawerDescription>\n </DrawerHeader>\n <DrawerBody className=\"grid content-start gap-6 overflow-y-auto p-6\">\n {insightTraceId !== undefined && (\n <TraceInsightView traceId={insightTraceId} onBack={() => setInsightTraceId(undefined)} />\n )}\n {insightTraceId === undefined && (\n <>\n <section aria-labelledby=\"noise-summary-heading\">\n <h2 id=\"noise-summary-heading\" className=\"text-neutral3 font-mono text-xs tracking-wider uppercase\">\n Summary\n </h2>\n <p className=\"text-neutral5 mt-3 text-sm\">\n Noise contains trace signal summaries that did not consistently match a recurring theme in this\n snapshot.\n </p>\n {noiseQuery.isPending && <p className=\"text-neutral3 mt-4 text-sm\">Loading noise details…</p>}\n {noiseQuery.isError && <p className=\"mt-4 text-sm text-red-500\">Unable to load noise details.</p>}\n {noiseQuery.data && (\n <p className=\"text-neutral5 mt-4 font-mono text-sm tabular-nums\">\n {shareSentence(noiseQuery.data.noise.traceCount, noiseQuery.data.noise.coverage)}\n </p>\n )}\n </section>\n\n <section aria-labelledby=\"noise-examples-heading\">\n <h2 id=\"noise-examples-heading\" className=\"text-neutral3 font-mono text-xs tracking-wider uppercase\">\n Example summaries\n </h2>\n {examplesQuery.isPending && <p className=\"text-neutral3 mt-3 text-sm\">Loading examples…</p>}\n {examplesQuery.isError && <p className=\"mt-3 text-sm text-red-500\">Unable to load examples.</p>}\n {examplesQuery.data && (\n <>\n {examplesQuery.data.examples.length === 0 ? (\n <p className=\"text-neutral3 mt-3 text-sm\">No noise examples in this snapshot.</p>\n ) : (\n <ul className=\"mt-3 space-y-3\">\n {examplesQuery.data.examples.map(example => (\n <li key={example.traceId}>\n <button\n type=\"button\"\n aria-label={`View trace insight for ${example.signalText}`}\n className=\"border-border1 bg-surface3 text-neutral5 hover:bg-surface5 w-full cursor-pointer rounded-md border p-3 text-left text-sm\"\n onClick={() => setInsightTraceId(example.traceId)}\n >\n {example.signalText}\n </button>\n </li>\n ))}\n </ul>\n )}\n {noiseQuery.data && (\n <ExamplesPager\n traceCount={noiseQuery.data.noise.traceCount}\n offset={examplesOffset}\n onOffsetChange={offset => setExamplesPage({ contextKey: examplesContextKey, offset })}\n />\n )}\n </>\n )}\n </section>\n </>\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n );\n}\n"],"names":["useState","useNoise","useNoiseExamples","EXAMPLES_PAGE_SIZE","jsx","Drawer","DrawerContent","jsxs","DrawerHeader","DrawerTitle","DrawerDescription","DrawerBody","TraceInsightView","Fragment","shareSentence","ExamplesPager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"noise-detail-panel.cjs.js","sources":["../../../src/ee/signals/noise-detail-panel.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { EXAMPLES_PAGE_SIZE, ExamplesPager } from './examples-pager';\nimport { useNoise, useNoiseExamples } from './hooks';\nimport { shareSentence } from './signal-formatting';\nimport type { ThemeSelection, ThemeSelectionStats } from './theme-drilldown-data';\nimport { TraceInsightView } from './trace-insight-view';\nimport type { TraceSignalName } from './types';\nimport {\n Drawer,\n DrawerBody,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n} from '@/ds/components/Drawer';\n\ninterface NoiseDetailPanelProps {\n entityId: string;\n entityType: string;\n snapshotId: string;\n signalName: TraceSignalName | undefined;\n filters?: ThemeSelection[];\n filteredStats?: ThemeSelectionStats;\n onClose: () => void;\n}\n\nexport function NoiseDetailPanel({\n entityId,\n entityType,\n snapshotId,\n signalName,\n filters = [],\n filteredStats,\n onClose,\n}: NoiseDetailPanelProps) {\n const filterKey = filters\n .map(filter => `${filter.signalName}:${filter.kind === 'theme' ? filter.themeId : 'noise'}`)\n .join(',');\n const examplesContextKey = `${snapshotId}:${signalName ?? ''}:${filterKey}`;\n const [examplesPage, setExamplesPage] = useState(() => ({ contextKey: examplesContextKey, offset: 0 }));\n const examplesOffset = examplesPage.contextKey === examplesContextKey ? examplesPage.offset : 0;\n const [insightTraceId, setInsightTraceId] = useState<string>();\n const noiseQuery = useNoise(entityId, entityType, signalName, snapshotId);\n const examplesQuery = useNoiseExamples(\n entityId,\n entityType,\n signalName,\n snapshotId,\n EXAMPLES_PAGE_SIZE,\n examplesOffset,\n filters,\n );\n\n return (\n <Drawer\n onOpenChange={open => {\n if (!open) {\n setExamplesPage({ contextKey: '', offset: 0 });\n setInsightTraceId(undefined);\n onClose();\n }\n }}\n open={signalName !== undefined}\n overlay=\"none\"\n side=\"right\"\n variant=\"floating\"\n >\n <DrawerContent>\n <DrawerHeader className=\"border-border1 border-b\">\n <DrawerTitle>Noise</DrawerTitle>\n <DrawerDescription className=\"sr-only\">Noise details for the {signalName} trace signal</DrawerDescription>\n </DrawerHeader>\n <DrawerBody className=\"grid content-start gap-6 overflow-y-auto p-6\">\n {insightTraceId !== undefined && (\n <TraceInsightView traceId={insightTraceId} onBack={() => setInsightTraceId(undefined)} />\n )}\n {insightTraceId === undefined && (\n <>\n <section aria-labelledby=\"noise-summary-heading\">\n <h2 id=\"noise-summary-heading\" className=\"text-neutral3 font-mono text-xs tracking-wider uppercase\">\n Summary\n </h2>\n <p className=\"text-neutral5 mt-3 text-sm\">\n Noise contains trace signal summaries that did not consistently match a recurring theme in this\n snapshot.\n </p>\n {noiseQuery.isPending && <p className=\"text-neutral3 mt-4 text-sm\">Loading noise details…</p>}\n {noiseQuery.isError && <p className=\"mt-4 text-sm text-red-500\">Unable to load noise details.</p>}\n {noiseQuery.data && (\n <p className=\"text-neutral5 mt-4 font-mono text-sm tabular-nums\">\n {shareSentence(\n filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount,\n filteredStats?.stageShare ?? noiseQuery.data.noise.coverage,\n )}\n </p>\n )}\n </section>\n\n <section aria-labelledby=\"noise-examples-heading\">\n <h2 id=\"noise-examples-heading\" className=\"text-neutral3 font-mono text-xs tracking-wider uppercase\">\n Example summaries\n </h2>\n {examplesQuery.isPending && <p className=\"text-neutral3 mt-3 text-sm\">Loading examples…</p>}\n {examplesQuery.isError && <p className=\"mt-3 text-sm text-red-500\">Unable to load examples.</p>}\n {examplesQuery.data && (\n <>\n {examplesQuery.data.examples.length === 0 ? (\n <p className=\"text-neutral3 mt-3 text-sm\">No noise examples in this snapshot.</p>\n ) : (\n <ul className=\"mt-3 space-y-3\">\n {examplesQuery.data.examples.map(example => (\n <li key={example.traceId}>\n <button\n type=\"button\"\n aria-label={`View trace insight for ${example.signalText}`}\n className=\"border-border1 bg-surface3 text-neutral5 hover:bg-surface5 w-full cursor-pointer rounded-md border p-3 text-left text-sm\"\n onClick={() => setInsightTraceId(example.traceId)}\n >\n {example.signalText}\n </button>\n </li>\n ))}\n </ul>\n )}\n {noiseQuery.data && (\n <ExamplesPager\n traceCount={filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount}\n offset={examplesOffset}\n onOffsetChange={offset => setExamplesPage({ contextKey: examplesContextKey, offset })}\n />\n )}\n </>\n )}\n </section>\n </>\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n );\n}\n"],"names":["useState","useNoise","useNoiseExamples","EXAMPLES_PAGE_SIZE","jsx","Drawer","DrawerContent","jsxs","DrawerHeader","DrawerTitle","DrawerDescription","DrawerBody","TraceInsightView","Fragment","shareSentence","ExamplesPager"],"mappings":"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"}
|
|
@@ -9,8 +9,17 @@ import { shareSentence } from './signal-formatting.es.js';
|
|
|
9
9
|
import { TraceInsightView } from './trace-insight-view.es.js';
|
|
10
10
|
import { D as Drawer, d as DrawerContent, g as DrawerHeader, o as DrawerTitle, e as DrawerDescription, b as DrawerBody } from '../../drawer-C8jNXutE.js';
|
|
11
11
|
|
|
12
|
-
function NoiseDetailPanel({
|
|
13
|
-
|
|
12
|
+
function NoiseDetailPanel({
|
|
13
|
+
entityId,
|
|
14
|
+
entityType,
|
|
15
|
+
snapshotId,
|
|
16
|
+
signalName,
|
|
17
|
+
filters = [],
|
|
18
|
+
filteredStats,
|
|
19
|
+
onClose
|
|
20
|
+
}) {
|
|
21
|
+
const filterKey = filters.map((filter) => `${filter.signalName}:${filter.kind === "theme" ? filter.themeId : "noise"}`).join(",");
|
|
22
|
+
const examplesContextKey = `${snapshotId}:${signalName ?? ""}:${filterKey}`;
|
|
14
23
|
const [examplesPage, setExamplesPage] = useState(() => ({ contextKey: examplesContextKey, offset: 0 }));
|
|
15
24
|
const examplesOffset = examplesPage.contextKey === examplesContextKey ? examplesPage.offset : 0;
|
|
16
25
|
const [insightTraceId, setInsightTraceId] = useState();
|
|
@@ -21,7 +30,8 @@ function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClos
|
|
|
21
30
|
signalName,
|
|
22
31
|
snapshotId,
|
|
23
32
|
EXAMPLES_PAGE_SIZE,
|
|
24
|
-
examplesOffset
|
|
33
|
+
examplesOffset,
|
|
34
|
+
filters
|
|
25
35
|
);
|
|
26
36
|
return /* @__PURE__ */ jsx(
|
|
27
37
|
Drawer,
|
|
@@ -54,7 +64,10 @@ function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClos
|
|
|
54
64
|
/* @__PURE__ */ jsx("p", { className: "text-neutral5 mt-3 text-sm", children: "Noise contains trace signal summaries that did not consistently match a recurring theme in this snapshot." }),
|
|
55
65
|
noiseQuery.isPending && /* @__PURE__ */ jsx("p", { className: "text-neutral3 mt-4 text-sm", children: "Loading noise details…" }),
|
|
56
66
|
noiseQuery.isError && /* @__PURE__ */ jsx("p", { className: "mt-4 text-sm text-red-500", children: "Unable to load noise details." }),
|
|
57
|
-
noiseQuery.data && /* @__PURE__ */ jsx("p", { className: "text-neutral5 mt-4 font-mono text-sm tabular-nums", children: shareSentence(
|
|
67
|
+
noiseQuery.data && /* @__PURE__ */ jsx("p", { className: "text-neutral5 mt-4 font-mono text-sm tabular-nums", children: shareSentence(
|
|
68
|
+
filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount,
|
|
69
|
+
filteredStats?.stageShare ?? noiseQuery.data.noise.coverage
|
|
70
|
+
) })
|
|
58
71
|
] }),
|
|
59
72
|
/* @__PURE__ */ jsxs("section", { "aria-labelledby": "noise-examples-heading", children: [
|
|
60
73
|
/* @__PURE__ */ jsx("h2", { id: "noise-examples-heading", className: "text-neutral3 font-mono text-xs tracking-wider uppercase", children: "Example summaries" }),
|
|
@@ -74,7 +87,7 @@ function NoiseDetailPanel({ entityId, entityType, snapshotId, signalName, onClos
|
|
|
74
87
|
noiseQuery.data && /* @__PURE__ */ jsx(
|
|
75
88
|
ExamplesPager,
|
|
76
89
|
{
|
|
77
|
-
traceCount: noiseQuery.data.noise.traceCount,
|
|
90
|
+
traceCount: filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount,
|
|
78
91
|
offset: examplesOffset,
|
|
79
92
|
onOffsetChange: (offset) => setExamplesPage({ contextKey: examplesContextKey, offset })
|
|
80
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noise-detail-panel.es.js","sources":["../../../src/ee/signals/noise-detail-panel.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { EXAMPLES_PAGE_SIZE, ExamplesPager } from './examples-pager';\nimport { useNoise, useNoiseExamples } from './hooks';\nimport { shareSentence } from './signal-formatting';\nimport { TraceInsightView } from './trace-insight-view';\nimport type { TraceSignalName } from './types';\nimport {\n Drawer,\n DrawerBody,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n} from '@/ds/components/Drawer';\n\ninterface NoiseDetailPanelProps {\n entityId: string;\n entityType: string;\n snapshotId: string;\n signalName: TraceSignalName | undefined;\n onClose: () => void;\n}\n\nexport function NoiseDetailPanel({
|
|
1
|
+
{"version":3,"file":"noise-detail-panel.es.js","sources":["../../../src/ee/signals/noise-detail-panel.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { EXAMPLES_PAGE_SIZE, ExamplesPager } from './examples-pager';\nimport { useNoise, useNoiseExamples } from './hooks';\nimport { shareSentence } from './signal-formatting';\nimport type { ThemeSelection, ThemeSelectionStats } from './theme-drilldown-data';\nimport { TraceInsightView } from './trace-insight-view';\nimport type { TraceSignalName } from './types';\nimport {\n Drawer,\n DrawerBody,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n} from '@/ds/components/Drawer';\n\ninterface NoiseDetailPanelProps {\n entityId: string;\n entityType: string;\n snapshotId: string;\n signalName: TraceSignalName | undefined;\n filters?: ThemeSelection[];\n filteredStats?: ThemeSelectionStats;\n onClose: () => void;\n}\n\nexport function NoiseDetailPanel({\n entityId,\n entityType,\n snapshotId,\n signalName,\n filters = [],\n filteredStats,\n onClose,\n}: NoiseDetailPanelProps) {\n const filterKey = filters\n .map(filter => `${filter.signalName}:${filter.kind === 'theme' ? filter.themeId : 'noise'}`)\n .join(',');\n const examplesContextKey = `${snapshotId}:${signalName ?? ''}:${filterKey}`;\n const [examplesPage, setExamplesPage] = useState(() => ({ contextKey: examplesContextKey, offset: 0 }));\n const examplesOffset = examplesPage.contextKey === examplesContextKey ? examplesPage.offset : 0;\n const [insightTraceId, setInsightTraceId] = useState<string>();\n const noiseQuery = useNoise(entityId, entityType, signalName, snapshotId);\n const examplesQuery = useNoiseExamples(\n entityId,\n entityType,\n signalName,\n snapshotId,\n EXAMPLES_PAGE_SIZE,\n examplesOffset,\n filters,\n );\n\n return (\n <Drawer\n onOpenChange={open => {\n if (!open) {\n setExamplesPage({ contextKey: '', offset: 0 });\n setInsightTraceId(undefined);\n onClose();\n }\n }}\n open={signalName !== undefined}\n overlay=\"none\"\n side=\"right\"\n variant=\"floating\"\n >\n <DrawerContent>\n <DrawerHeader className=\"border-border1 border-b\">\n <DrawerTitle>Noise</DrawerTitle>\n <DrawerDescription className=\"sr-only\">Noise details for the {signalName} trace signal</DrawerDescription>\n </DrawerHeader>\n <DrawerBody className=\"grid content-start gap-6 overflow-y-auto p-6\">\n {insightTraceId !== undefined && (\n <TraceInsightView traceId={insightTraceId} onBack={() => setInsightTraceId(undefined)} />\n )}\n {insightTraceId === undefined && (\n <>\n <section aria-labelledby=\"noise-summary-heading\">\n <h2 id=\"noise-summary-heading\" className=\"text-neutral3 font-mono text-xs tracking-wider uppercase\">\n Summary\n </h2>\n <p className=\"text-neutral5 mt-3 text-sm\">\n Noise contains trace signal summaries that did not consistently match a recurring theme in this\n snapshot.\n </p>\n {noiseQuery.isPending && <p className=\"text-neutral3 mt-4 text-sm\">Loading noise details…</p>}\n {noiseQuery.isError && <p className=\"mt-4 text-sm text-red-500\">Unable to load noise details.</p>}\n {noiseQuery.data && (\n <p className=\"text-neutral5 mt-4 font-mono text-sm tabular-nums\">\n {shareSentence(\n filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount,\n filteredStats?.stageShare ?? noiseQuery.data.noise.coverage,\n )}\n </p>\n )}\n </section>\n\n <section aria-labelledby=\"noise-examples-heading\">\n <h2 id=\"noise-examples-heading\" className=\"text-neutral3 font-mono text-xs tracking-wider uppercase\">\n Example summaries\n </h2>\n {examplesQuery.isPending && <p className=\"text-neutral3 mt-3 text-sm\">Loading examples…</p>}\n {examplesQuery.isError && <p className=\"mt-3 text-sm text-red-500\">Unable to load examples.</p>}\n {examplesQuery.data && (\n <>\n {examplesQuery.data.examples.length === 0 ? (\n <p className=\"text-neutral3 mt-3 text-sm\">No noise examples in this snapshot.</p>\n ) : (\n <ul className=\"mt-3 space-y-3\">\n {examplesQuery.data.examples.map(example => (\n <li key={example.traceId}>\n <button\n type=\"button\"\n aria-label={`View trace insight for ${example.signalText}`}\n className=\"border-border1 bg-surface3 text-neutral5 hover:bg-surface5 w-full cursor-pointer rounded-md border p-3 text-left text-sm\"\n onClick={() => setInsightTraceId(example.traceId)}\n >\n {example.signalText}\n </button>\n </li>\n ))}\n </ul>\n )}\n {noiseQuery.data && (\n <ExamplesPager\n traceCount={filteredStats?.traceCount ?? noiseQuery.data.noise.traceCount}\n offset={examplesOffset}\n onOffsetChange={offset => setExamplesPage({ contextKey: examplesContextKey, offset })}\n />\n )}\n </>\n )}\n </section>\n </>\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA2BO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAU,EAAC;AAAA,EACX,aAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,YAAY,OAAA,CACf,GAAA,CAAI,CAAA,MAAA,KAAU,CAAA,EAAG,OAAO,UAAU,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,KAAS,UAAU,MAAA,CAAO,OAAA,GAAU,OAAO,CAAA,CAAE,CAAA,CAC1F,KAAK,GAAG,CAAA;AACX,EAAA,MAAM,qBAAqB,CAAA,EAAG,UAAU,IAAI,UAAA,IAAc,EAAE,IAAI,SAAS,CAAA,CAAA;AACzE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA,CAAS,OAAO,EAAE,UAAA,EAAY,kBAAA,EAAoB,MAAA,EAAQ,CAAA,EAAE,CAAE,CAAA;AACtG,EAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,UAAA,KAAe,kBAAA,GAAqB,aAAa,MAAA,GAAS,CAAA;AAC9F,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA,EAAiB;AAC7D,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,QAAA,EAAU,UAAA,EAAY,YAAY,UAAU,CAAA;AACxE,EAAA,MAAM,aAAA,GAAgB,gBAAA;AAAA,IACpB,QAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,cAAc,CAAA,IAAA,KAAQ;AACpB,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,eAAA,CAAgB,EAAE,UAAA,EAAY,EAAA,EAAI,MAAA,EAAQ,GAAG,CAAA;AAC7C,UAAA,iBAAA,CAAkB,MAAS,CAAA;AAC3B,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAAA,MACA,MAAM,UAAA,KAAe,MAAA;AAAA,MACrB,OAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAK,OAAA;AAAA,MACL,OAAA,EAAQ,UAAA;AAAA,MAER,+BAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAA,EAAA,EAAa,WAAU,yBAAA,EACtB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,eAAY,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,0BAClB,IAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA;AAAA,YAAA,wBAAA;AAAA,YAAuB,UAAA;AAAA,YAAW;AAAA,WAAA,EAAa;AAAA,SAAA,EACxF,CAAA;AAAA,wBACA,IAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,8CAAA,EACnB,QAAA,EAAA;AAAA,UAAA,cAAA,KAAmB,MAAA,wBACjB,gBAAA,EAAA,EAAiB,OAAA,EAAS,gBAAgB,MAAA,EAAQ,MAAM,iBAAA,CAAkB,MAAS,CAAA,EAAG,CAAA;AAAA,UAExF,cAAA,KAAmB,0BAClB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,SAAA,EAAA,EAAQ,mBAAgB,uBAAA,EACvB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAG,uBAAA,EAAwB,SAAA,EAAU,4DAA2D,QAAA,EAAA,SAAA,EAEpG,CAAA;AAAA,8BACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,2GAAA,EAG1C,CAAA;AAAA,cACC,WAAW,SAAA,oBAAa,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,cACxF,WAAW,OAAA,oBAAW,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAA4B,QAAA,EAAA,+BAAA,EAA6B,CAAA;AAAA,cAC5F,UAAA,CAAW,IAAA,oBACV,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mDAAA,EACV,QAAA,EAAA,aAAA;AAAA,gBACC,aAAA,EAAe,UAAA,IAAc,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,UAAA;AAAA,gBACnD,aAAA,EAAe,UAAA,IAAc,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM;AAAA,eACrD,EACF;AAAA,aAAA,EAEJ,CAAA;AAAA,4BAEA,IAAA,CAAC,SAAA,EAAA,EAAQ,iBAAA,EAAgB,wBAAA,EACvB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAG,wBAAA,EAAyB,SAAA,EAAU,4DAA2D,QAAA,EAAA,mBAAA,EAErG,CAAA;AAAA,cACC,cAAc,SAAA,oBAAa,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,cACtF,cAAc,OAAA,oBAAW,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAA4B,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,cAC1F,aAAA,CAAc,wBACb,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,gBAAA,aAAA,CAAc,IAAA,CAAK,SAAS,MAAA,KAAW,CAAA,uBACrC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,qCAAA,EAAmC,CAAA,uBAE5E,IAAA,EAAA,EAAG,SAAA,EAAU,kBACX,QAAA,EAAA,aAAA,CAAc,IAAA,CAAK,SAAS,GAAA,CAAI,CAAA,OAAA,yBAC9B,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,YAAA,EAAY,CAAA,uBAAA,EAA0B,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,oBACxD,SAAA,EAAU,0HAAA;AAAA,oBACV,OAAA,EAAS,MAAM,iBAAA,CAAkB,OAAA,CAAQ,OAAO,CAAA;AAAA,oBAE/C,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,iBACX,EAAA,EARO,OAAA,CAAQ,OASjB,CACD,CAAA,EACH,CAAA;AAAA,gBAED,WAAW,IAAA,oBACV,GAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACC,UAAA,EAAY,aAAA,EAAe,UAAA,IAAc,UAAA,CAAW,KAAK,KAAA,CAAM,UAAA;AAAA,oBAC/D,MAAA,EAAQ,cAAA;AAAA,oBACR,gBAAgB,CAAA,MAAA,KAAU,eAAA,CAAgB,EAAE,UAAA,EAAY,kBAAA,EAAoB,QAAQ;AAAA;AAAA;AACtF,eAAA,EAEJ;AAAA,aAAA,EAEJ;AAAA,WAAA,EACF;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -55,7 +55,7 @@ function SankeySignals({
|
|
|
55
55
|
const [selectedSnapshotOrdinal, setSelectedSnapshotOrdinal] = React.useState();
|
|
56
56
|
const [isPlaying, setIsPlaying] = React.useState(false);
|
|
57
57
|
const [viewMode, setViewMode] = React.useState("flow");
|
|
58
|
-
const [
|
|
58
|
+
const [drillStack, setDrillStack] = React.useState([]);
|
|
59
59
|
const [detailSelection, setDetailSelection] = React.useState();
|
|
60
60
|
const [noiseSignalName, setNoiseSignalName] = React.useState();
|
|
61
61
|
const matchedSnapshotIndex = snapshots.findIndex((snapshot2) => snapshot2.ordinal === selectedSnapshotOrdinal);
|
|
@@ -72,6 +72,7 @@ function SankeySignals({
|
|
|
72
72
|
setIsPlaying(nextIsPlaying);
|
|
73
73
|
};
|
|
74
74
|
const openThemeDetailsAt = (selection, snapshotIndex) => {
|
|
75
|
+
if (selection.kind !== "theme") return;
|
|
75
76
|
selectSnapshot(snapshotIndex);
|
|
76
77
|
setNoiseSignalName(void 0);
|
|
77
78
|
setDetailSelection(selection);
|
|
@@ -95,19 +96,19 @@ function SankeySignals({
|
|
|
95
96
|
entityType,
|
|
96
97
|
signalNames,
|
|
97
98
|
snapshot?.snapshotId,
|
|
98
|
-
drillInAvailable
|
|
99
|
+
drillInAvailable && drillStack.length > 0
|
|
99
100
|
);
|
|
100
101
|
const flow = React.useMemo(() => {
|
|
101
|
-
if (!stableUnfilteredFlow ||
|
|
102
|
-
const drilledFlow = ee_signals_themeDrilldownData.buildDrilledThemeFlow(stableUnfilteredFlow, pathsQuery.data,
|
|
102
|
+
if (!stableUnfilteredFlow || drillStack.length === 0 || !pathsQuery.data) return stableUnfilteredFlow;
|
|
103
|
+
const drilledFlow = ee_signals_themeDrilldownData.buildDrilledThemeFlow(stableUnfilteredFlow, pathsQuery.data, drillStack);
|
|
103
104
|
return ee_signals_sankeySignalsData.stabilizeThemeFlow(drilledFlow, [stableUnfilteredFlow, drilledFlow]);
|
|
104
|
-
}, [
|
|
105
|
+
}, [drillStack, pathsQuery.data, stableUnfilteredFlow]);
|
|
105
106
|
const graphSummary = React.useMemo(() => flow ? ee_signals_sankeySignalsData.buildSignalGraphSummary(flow) : void 0, [flow]);
|
|
106
107
|
const populatedStageCount = currentFlow?.stages.filter((stage) => stage.nodes.length > 0).length ?? 0;
|
|
107
108
|
const shouldLoadProgress = snapshotsQuery.isSuccess && !snapshotsQuery.isError && (!snapshot || Boolean(currentFlow && (!flow || !graphSummary || populatedStageCount < 2)));
|
|
108
109
|
const progressQuery = ee_signals_hooks_useEntityLearningProgress.useEntityLearningProgress(entityId, entityType, shouldLoadProgress);
|
|
109
|
-
const isPlaybackBlockedByDrillIn =
|
|
110
|
-
const hasActivePathsError =
|
|
110
|
+
const isPlaybackBlockedByDrillIn = drillStack.length > 0 && (pathsQuery.isFetching || pathsQuery.isError);
|
|
111
|
+
const hasActivePathsError = drillStack.length > 0 && pathsQuery.isError;
|
|
111
112
|
ee_signals_hooks_useSnapshotPlayback.useSnapshotPlayback({
|
|
112
113
|
isPlaying,
|
|
113
114
|
isPlaybackBlocked: isFlowWindowBusy || isPlaybackBlockedByDrillIn,
|
|
@@ -148,7 +149,7 @@ function SankeySignals({
|
|
|
148
149
|
})
|
|
149
150
|
)
|
|
150
151
|
);
|
|
151
|
-
if (
|
|
152
|
+
if (drillStack.length > 0 && nextSnapshot && nextSnapshot.traceCount <= DRILL_IN_TRACE_LIMIT) {
|
|
152
153
|
await queryClient.fetchQuery({
|
|
153
154
|
queryKey: [
|
|
154
155
|
"entity-learning",
|
|
@@ -187,9 +188,9 @@ function SankeySignals({
|
|
|
187
188
|
setIsPlaying(false);
|
|
188
189
|
void snapshotsQuery.refetch();
|
|
189
190
|
void Promise.all(flowQueries.map((query) => query.refetch()));
|
|
190
|
-
if (
|
|
191
|
+
if (drillStack.length > 0 && drillInAvailable) void pathsQuery.refetch();
|
|
191
192
|
},
|
|
192
|
-
onClear: hasActivePathsError ? () =>
|
|
193
|
+
onClear: hasActivePathsError ? () => setDrillStack([]) : void 0
|
|
193
194
|
}
|
|
194
195
|
)
|
|
195
196
|
] });
|
|
@@ -227,28 +228,32 @@ function SankeySignals({
|
|
|
227
228
|
const stages = flow.stages;
|
|
228
229
|
const isNodeClickable = (selection) => ee_signals_themeDrilldownData.findNoiseSelection(flow, selection.column.id, selection.value) !== void 0 || ee_signals_themeDrilldownData.findThemeSelection(flow, selection.column.id, selection.value) !== void 0;
|
|
229
230
|
const handleNodeClick = (selection) => {
|
|
230
|
-
const
|
|
231
|
-
if (
|
|
231
|
+
const nextSelection = ee_signals_themeDrilldownData.findNoiseSelection(flow, selection.column.id, selection.value) ?? ee_signals_themeDrilldownData.findThemeSelection(flow, selection.column.id, selection.value);
|
|
232
|
+
if (!nextSelection || drillStack.some((filter) => filter.signalName === nextSelection.signalName)) return;
|
|
233
|
+
if (nextSelection.kind === "theme") {
|
|
234
|
+
setNoiseSignalName(void 0);
|
|
235
|
+
setDetailSelection(nextSelection);
|
|
236
|
+
if (drillInAvailable) setDrillStack((current) => [...current, nextSelection]);
|
|
237
|
+
} else {
|
|
232
238
|
setDetailSelection(void 0);
|
|
233
|
-
setNoiseSignalName(
|
|
234
|
-
return;
|
|
239
|
+
setNoiseSignalName(nextSelection.signalName);
|
|
235
240
|
}
|
|
236
|
-
const nextSelection = ee_signals_themeDrilldownData.findThemeSelection(flow, selection.column.id, selection.value);
|
|
237
|
-
if (!nextSelection) return;
|
|
238
|
-
setNoiseSignalName(void 0);
|
|
239
|
-
setDetailSelection(nextSelection);
|
|
240
|
-
if (drillInAvailable) setDrillIn(nextSelection);
|
|
241
241
|
};
|
|
242
242
|
const drillInDisabledReason = drillInAvailable ? void 0 : "Drill-in is unavailable for snapshots with more than 2,000 traces.";
|
|
243
|
-
const isDrilledEmpty =
|
|
243
|
+
const isDrilledEmpty = drillStack.length > 0 && pathsQuery.data !== void 0 && flow.snapshot.traceCount === 0;
|
|
244
244
|
const handleSignalOrderChange = (nextSignalNames) => {
|
|
245
245
|
if (perspectiveMutation.isPending) return;
|
|
246
246
|
setIsPlaying(false);
|
|
247
247
|
setDetailSelection(void 0);
|
|
248
248
|
setNoiseSignalName(void 0);
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
const mergedSignalNames = ee_signals_themeDrilldownData.mergeVisibleSignalOrder(signalNames, nextSignalNames);
|
|
250
|
+
setPendingSignalNames(mergedSignalNames);
|
|
251
|
+
perspectiveMutation.mutate(mergedSignalNames);
|
|
251
252
|
};
|
|
253
|
+
const filtersResolved = drillStack.length > 0 && drillInAvailable && pathsQuery.data !== void 0;
|
|
254
|
+
const detailStats = filtersResolved ? ee_signals_themeDrilldownData.findSelectionStats(flow, drillStack, detailSelection) : void 0;
|
|
255
|
+
const noiseStats = filtersResolved ? ee_signals_themeDrilldownData.findSelectionStats(flow, drillStack, noiseSignalName ? { kind: "noise", signalName: noiseSignalName } : void 0) : void 0;
|
|
256
|
+
const filterKey = ee_signals_entityLearningApi.serializeThemeFilters(drillStack);
|
|
252
257
|
return /* @__PURE__ */ jsxRuntime.jsxs("main", { className: "min-w-0 space-y-5 p-4 lg:p-6", children: [
|
|
253
258
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-wrap items-center justify-between gap-3", children: [
|
|
254
259
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-4", children: [
|
|
@@ -300,26 +305,33 @@ function SankeySignals({
|
|
|
300
305
|
snapshots,
|
|
301
306
|
selectedIndex: selectedSnapshotIndex,
|
|
302
307
|
totalSnapshots,
|
|
303
|
-
summary: `${
|
|
308
|
+
summary: `${drillStack.length > 0 ? drillInAvailable ? "Filtered · " : "Filters unavailable · " : ""}${ee_signals_sankeySignalsData.snapshotSummaryLabel(snapshot, flow)}`,
|
|
304
309
|
isPlaying,
|
|
305
310
|
onPlayingChange: handlePlayingChange,
|
|
306
311
|
onSnapshotChange: selectSnapshot
|
|
307
312
|
}
|
|
308
313
|
),
|
|
309
|
-
|
|
314
|
+
drillStack.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
310
315
|
ee_signals_themeFilterBanner.ThemeFilterBanner,
|
|
311
316
|
{
|
|
312
|
-
|
|
313
|
-
filteredTraceCount:
|
|
314
|
-
totalTraceCount: currentFlow.
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
317
|
+
selections: drillStack,
|
|
318
|
+
filteredTraceCount: filtersResolved ? flow.snapshot.traceCount : void 0,
|
|
319
|
+
totalTraceCount: currentFlow.snapshot.traceCount,
|
|
320
|
+
isUnavailable: !drillInAvailable,
|
|
321
|
+
onViewDetails: (selection) => {
|
|
322
|
+
if (selection.kind === "theme") {
|
|
323
|
+
setNoiseSignalName(void 0);
|
|
324
|
+
setDetailSelection(selection);
|
|
325
|
+
} else {
|
|
326
|
+
setDetailSelection(void 0);
|
|
327
|
+
setNoiseSignalName(selection.signalName);
|
|
328
|
+
}
|
|
318
329
|
},
|
|
319
|
-
|
|
330
|
+
onRemove: (signalName) => setDrillStack((current) => current.filter((filter) => filter.signalName !== signalName)),
|
|
331
|
+
onClear: () => setDrillStack([])
|
|
320
332
|
}
|
|
321
333
|
) : null,
|
|
322
|
-
|
|
334
|
+
isDrilledEmpty ? /* @__PURE__ */ jsxRuntime.jsx("section", { className: "border-border1 bg-surface2 text-neutral3 rounded-lg border p-6 text-sm", children: "This theme is not present in the selected snapshot. Use the clear filter action above to return to the full flow." }) : graphSummary.records.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("section", { className: "border-border1 bg-surface2 text-neutral3 rounded-lg border p-6 text-sm", children: "No cross-signal flow for this snapshot — its trace signals have not overlapped on shared traces yet. Pick another snapshot from the timeline below." }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
323
335
|
ee_signals_flowCard.FlowCard,
|
|
324
336
|
{
|
|
325
337
|
columns: graphSummary.columns,
|
|
@@ -345,9 +357,11 @@ function SankeySignals({
|
|
|
345
357
|
snapshotId: snapshot.snapshotId,
|
|
346
358
|
snapshotTotal: snapshot.total,
|
|
347
359
|
selection: detailSelection,
|
|
360
|
+
filters: drillStack,
|
|
361
|
+
filteredStats: detailStats,
|
|
348
362
|
onClose: () => setDetailSelection(void 0)
|
|
349
363
|
},
|
|
350
|
-
`${snapshot.snapshotId}:${detailSelection?.signalName ?? ""}:${detailSelection?.themeId ?? ""}`
|
|
364
|
+
`${snapshot.snapshotId}:${detailSelection?.signalName ?? ""}:${detailSelection?.themeId ?? ""}:${filterKey}`
|
|
351
365
|
),
|
|
352
366
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
353
367
|
ee_signals_noiseDetailPanel.NoiseDetailPanel,
|
|
@@ -356,9 +370,11 @@ function SankeySignals({
|
|
|
356
370
|
entityType,
|
|
357
371
|
snapshotId: snapshot.snapshotId,
|
|
358
372
|
signalName: noiseSignalName,
|
|
373
|
+
filters: drillStack,
|
|
374
|
+
filteredStats: noiseStats,
|
|
359
375
|
onClose: () => setNoiseSignalName(void 0)
|
|
360
376
|
},
|
|
361
|
-
`${snapshot.snapshotId}:${noiseSignalName ?? ""}`
|
|
377
|
+
`${snapshot.snapshotId}:${noiseSignalName ?? ""}:${filterKey}`
|
|
362
378
|
)
|
|
363
379
|
] });
|
|
364
380
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sankey-signals.cjs.js","sources":["../../../src/ee/signals/sankey-signals.tsx"],"sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { ArrowLeftRight, ChartNoAxesGantt, Waypoints } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport { SignalsOverviewPage as SignalsEmptyState } from './components/signals-overview-page';\nimport { fetchThemeFlow, fetchThemePaths, fetchThemeSnapshots } from './entity-learning-api';\nimport { FlowCard } from './flow-card';\nimport { useEntityLearningProgress } from './hooks/use-entity-learning-progress';\nimport { useSnapshotPlayback } from './hooks/use-snapshot-playback';\nimport { useThemeFlows } from './hooks/use-theme-flows';\nimport { useThemePaths } from './hooks/use-theme-paths';\nimport { useThemeSnapshots } from './hooks/use-theme-snapshots';\nimport { NoiseDetailPanel } from './noise-detail-panel';\nimport {\n buildSignalGraphSummary,\n selectFlowSnapshotIds,\n snapshotSummaryLabel,\n stabilizeThemeFlow,\n} from './sankey-signals-data';\nimport { SIGNAL_PROCESSING_ORDER } from './signal-formatting';\nimport { SignalsErrorState } from './signals-error-state';\nimport { SignalsFrameLoadingSkeleton, SignalsLoadingSkeleton } from './signals-loading-skeleton';\nimport { SnapshotTimeline } from './snapshot-timeline';\nimport { ThemeCompare } from './theme-compare';\nimport { ThemeDetailPanel } from './theme-detail-panel';\nimport { buildDrilledThemeFlow, findNoiseSelection, findThemeSelection } from './theme-drilldown-data';\nimport type { ThemeSelection } from './theme-drilldown-data';\nimport { ThemeFilterBanner } from './theme-filter-banner';\nimport { ThemeLifelines } from './theme-lifelines';\nimport { TraceIntelligenceExplainer } from './trace-intelligence-explainer';\nimport type { TraceSignalName } from './types';\nimport { useTraceIntelligence } from './use-trace-intelligence';\nimport { ViewModeTab } from './view-mode-tab';\nimport type { SignalsViewMode } from './view-mode-tab';\nimport type { SankeyChartNodeSelection } from '@/ds/components/SankeyChart';\nimport { TabList, Tabs } from '@/ds/components/Tabs';\n\nexport interface SankeySignalsProps {\n entityId: string;\n entityType?: string;\n signalNames: TraceSignalName[];\n dateFrom?: Date;\n dateTo?: Date;\n height?: number;\n /** Date range control rendered in line with the view mode tabs. */\n dateRangePicker?: React.ReactNode;\n}\n\nconst DRILL_IN_TRACE_LIMIT = 2000;\nconst FLOW_SIGNAL_LIST = `${SIGNAL_PROCESSING_ORDER.slice(0, -1).join(', ')}, and ${SIGNAL_PROCESSING_ORDER[SIGNAL_PROCESSING_ORDER.length - 1]}`;\n\n/** One-line answer to \"what am I looking at?\" for each view, shown under the tabs. */\nconst VIEW_DESCRIPTIONS: Record<SignalsViewMode, string> = {\n flow: `How this agent's traces distribute across ${FLOW_SIGNAL_LIST} themes at this point in time.`,\n compare: 'Which themes grew, shrank, appeared, or disappeared between two points in time.',\n lifelines: \"Each theme's share of traces across the whole selected range.\",\n};\n\nexport function SankeySignals({\n entityId,\n entityType = 'agent',\n signalNames: initialSignalNames,\n dateFrom,\n dateTo,\n height,\n dateRangePicker,\n}: SankeySignalsProps) {\n const queryClient = useQueryClient();\n const { cacheScope, request, LinkComponent } = useTraceIntelligence();\n const [signalNames, setSignalNames] = useState(() => initialSignalNames);\n const [pendingSignalNames, setPendingSignalNames] = useState<TraceSignalName[]>();\n const snapshotsQuery = useThemeSnapshots(entityId, entityType, signalNames, dateFrom, dateTo);\n const snapshots = [...(snapshotsQuery.data?.snapshots ?? [])].sort((left, right) => left.ordinal - right.ordinal);\n const [selectedSnapshotOrdinal, setSelectedSnapshotOrdinal] = useState<number>();\n const [isPlaying, setIsPlaying] = useState(false);\n const [viewMode, setViewMode] = useState<SignalsViewMode>('flow');\n const [drillIn, setDrillIn] = useState<ThemeSelection>();\n const [detailSelection, setDetailSelection] = useState<ThemeSelection>();\n const [noiseSignalName, setNoiseSignalName] = useState<TraceSignalName>();\n const matchedSnapshotIndex = snapshots.findIndex(snapshot => snapshot.ordinal === selectedSnapshotOrdinal);\n const selectedSnapshotIndex = matchedSnapshotIndex >= 0 ? matchedSnapshotIndex : 0;\n const snapshot = snapshots[selectedSnapshotIndex];\n const totalSnapshots = snapshotsQuery.data?.totalSnapshots ?? snapshot?.total ?? 0;\n const selectSnapshot = (index: number) => setSelectedSnapshotOrdinal(snapshots[index]?.ordinal);\n const handleViewModeChange = (nextViewMode: SignalsViewMode) => {\n if (nextViewMode !== 'flow') setIsPlaying(false);\n setViewMode(nextViewMode);\n };\n const handlePlayingChange = (nextIsPlaying: boolean) => {\n // Restart from the first landmark when play is pressed at the end.\n if (nextIsPlaying && selectedSnapshotIndex === snapshots.length - 1) selectSnapshot(0);\n setIsPlaying(nextIsPlaying);\n };\n // Compare cards and lifeline points open details for the theme at the\n // landmark they were clicked on, so the panel's snapshot follows the click.\n const openThemeDetailsAt = (selection: ThemeSelection, snapshotIndex: number) => {\n selectSnapshot(snapshotIndex);\n setNoiseSignalName(undefined);\n setDetailSelection(selection);\n };\n\n // Undefined at the last landmark so playback stops instead of looping.\n const nextSnapshotOrdinal = snapshots[selectedSnapshotIndex + 1]?.ordinal;\n const flowSnapshotIds = selectFlowSnapshotIds(snapshots, selectedSnapshotIndex);\n const flowQueries = useThemeFlows(entityId, entityType, signalNames, flowSnapshotIds);\n const flowQuery = flowQueries[flowSnapshotIds.indexOf(snapshot?.snapshotId ?? '')];\n const currentFlow = flowQuery?.data;\n // The loading skeleton tracks only the selected snapshot's flow; prefetched\n // neighbors warm the cache in the background without blocking the chart.\n const isFlowPending = flowQuery?.isPending ?? false;\n // Errors stay window-wide: a failed preload surfaces the retry state instead\n // of letting playback advance into a broken frame.\n const hasFlowError = flowQueries.some(query => query.isError);\n const isFlowWindowBusy = flowQueries.some(query => query.isPending) || hasFlowError;\n const windowFlows = useMemo(() => flowQueries.flatMap(query => (query.data ? [query.data] : [])), [flowQueries]);\n const stableUnfilteredFlow = useMemo(\n () => (currentFlow ? stabilizeThemeFlow(currentFlow, windowFlows) : undefined),\n [currentFlow, windowFlows],\n );\n const drillInAvailable = Boolean(currentFlow && currentFlow.snapshot.traceCount <= DRILL_IN_TRACE_LIMIT);\n const pathsQuery = useThemePaths(\n entityId,\n entityType,\n signalNames,\n snapshot?.snapshotId,\n drillInAvailable ? drillIn?.themeId : undefined,\n );\n const flow = useMemo(() => {\n if (!stableUnfilteredFlow || !drillIn || !pathsQuery.data) return stableUnfilteredFlow;\n\n const drilledFlow = buildDrilledThemeFlow(stableUnfilteredFlow, pathsQuery.data, drillIn);\n return stabilizeThemeFlow(drilledFlow, [stableUnfilteredFlow, drilledFlow]);\n }, [drillIn, pathsQuery.data, stableUnfilteredFlow]);\n const graphSummary = useMemo(() => (flow ? buildSignalGraphSummary(flow) : undefined), [flow]);\n const populatedStageCount = currentFlow?.stages.filter(stage => stage.nodes.length > 0).length ?? 0;\n const shouldLoadProgress =\n snapshotsQuery.isSuccess &&\n !snapshotsQuery.isError &&\n (!snapshot || Boolean(currentFlow && (!flow || !graphSummary || populatedStageCount < 2)));\n const progressQuery = useEntityLearningProgress(entityId, entityType, shouldLoadProgress);\n const isPlaybackBlockedByDrillIn = drillIn !== undefined && (pathsQuery.isFetching || pathsQuery.isError);\n const hasActivePathsError = drillIn !== undefined && pathsQuery.isError;\n\n useSnapshotPlayback({\n isPlaying,\n isPlaybackBlocked: isFlowWindowBusy || isPlaybackBlockedByDrillIn,\n nextSnapshot: nextSnapshotOrdinal,\n onAdvance: ordinal => {\n if (ordinal === undefined) {\n setIsPlaying(false);\n return;\n }\n setSelectedSnapshotOrdinal(ordinal);\n },\n snapshotCount: snapshots.length,\n });\n\n const perspectiveMutation = useMutation({\n mutationFn: async (nextSignalNames: TraceSignalName[]) => {\n const nextSnapshots = await queryClient.fetchQuery({\n queryKey: [\n 'entity-learning',\n cacheScope,\n entityType,\n entityId,\n 'theme-snapshots',\n nextSignalNames,\n dateFrom?.toISOString(),\n dateTo?.toISOString(),\n ],\n queryFn: () => fetchThemeSnapshots(request, entityId, entityType, nextSignalNames, dateFrom, dateTo),\n });\n const sortedNextSnapshots = [...nextSnapshots.snapshots].sort((left, right) => left.ordinal - right.ordinal);\n const matchedNextIndex = sortedNextSnapshots.findIndex(candidate => candidate.ordinal === snapshot?.ordinal);\n const nextSelectedIndex = matchedNextIndex >= 0 ? matchedNextIndex : 0;\n const nextSnapshot = sortedNextSnapshots[nextSelectedIndex];\n await Promise.all(\n selectFlowSnapshotIds(sortedNextSnapshots, nextSelectedIndex).map(snapshotId =>\n queryClient.fetchQuery({\n queryKey: ['entity-learning', cacheScope, entityType, entityId, 'theme-flow', nextSignalNames, snapshotId],\n queryFn: () => fetchThemeFlow(request, entityId, entityType, nextSignalNames, snapshotId),\n }),\n ),\n );\n if (drillIn && nextSnapshot && nextSnapshot.traceCount <= DRILL_IN_TRACE_LIMIT) {\n await queryClient.fetchQuery({\n queryKey: [\n 'entity-learning',\n cacheScope,\n entityType,\n entityId,\n 'theme-paths',\n nextSignalNames,\n nextSnapshot.snapshotId,\n ],\n queryFn: () => fetchThemePaths(request, entityId, entityType, nextSignalNames, nextSnapshot.snapshotId),\n });\n }\n return nextSignalNames;\n },\n onSuccess: nextSignalNames => {\n setSignalNames(nextSignalNames);\n setPendingSignalNames(undefined);\n },\n onError: () => setPendingSignalNames(undefined),\n });\n\n if (snapshotsQuery.isPending) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsLoadingSkeleton />\n </>\n );\n }\n\n if (snapshotsQuery.isError || hasFlowError || hasActivePathsError) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsErrorState\n message=\"Unable to load trace signal flow.\"\n onRetry={() => {\n setIsPlaying(false);\n void snapshotsQuery.refetch();\n void Promise.all(flowQueries.map(query => query.refetch()));\n if (drillIn && drillInAvailable) void pathsQuery.refetch();\n }}\n onClear={hasActivePathsError ? () => setDrillIn(undefined) : undefined}\n />\n </>\n );\n }\n\n if (!snapshot) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsEmptyState LinkComponent={LinkComponent} progress={progressQuery.data} isRangeEmpty />\n </>\n );\n }\n\n if (isFlowPending) {\n return (\n <main className=\"min-w-0 space-y-5 p-4 lg:p-6\">\n {dateRangePicker && <div className=\"flex justify-end\">{dateRangePicker}</div>}\n <SnapshotTimeline\n snapshots={snapshots}\n selectedIndex={selectedSnapshotIndex}\n totalSnapshots={totalSnapshots}\n summary={snapshot ? snapshotSummaryLabel(snapshot, undefined) : ''}\n isPlaying={isPlaying}\n onPlayingChange={handlePlayingChange}\n onSnapshotChange={selectSnapshot}\n />\n <SignalsFrameLoadingSkeleton />\n </main>\n );\n }\n\n if (!currentFlow || !flow || !graphSummary || populatedStageCount < 2) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsEmptyState LinkComponent={LinkComponent} progress={progressQuery.data} />\n </>\n );\n }\n\n const stages = flow.stages;\n // Noise nodes open the noise details panel (noise has no themeId, so it\n // cannot drill in). Theme nodes always open details; they additionally\n // isolate the flow when the snapshot is under the drill-in limit.\n const isNodeClickable = (selection: SankeyChartNodeSelection) =>\n findNoiseSelection(flow, selection.column.id, selection.value) !== undefined ||\n findThemeSelection(flow, selection.column.id, selection.value) !== undefined;\n const handleNodeClick = (selection: SankeyChartNodeSelection) => {\n const noiseSignal = findNoiseSelection(flow, selection.column.id, selection.value);\n if (noiseSignal) {\n setDetailSelection(undefined);\n setNoiseSignalName(noiseSignal);\n return;\n }\n const nextSelection = findThemeSelection(flow, selection.column.id, selection.value);\n if (!nextSelection) return;\n setNoiseSignalName(undefined);\n setDetailSelection(nextSelection);\n if (drillInAvailable) setDrillIn(nextSelection);\n };\n const drillInDisabledReason = drillInAvailable\n ? undefined\n : 'Drill-in is unavailable for snapshots with more than 2,000 traces.';\n const isDrilledEmpty = drillIn !== undefined && pathsQuery.data !== undefined && flow.snapshot.traceCount === 0;\n const handleSignalOrderChange = (nextSignalNames: TraceSignalName[]) => {\n if (perspectiveMutation.isPending) return;\n setIsPlaying(false);\n setDetailSelection(undefined);\n setNoiseSignalName(undefined);\n setPendingSignalNames(nextSignalNames);\n perspectiveMutation.mutate(nextSignalNames);\n };\n\n return (\n <main className=\"min-w-0 space-y-5 p-4 lg:p-6\">\n <div className=\"flex min-w-0 flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-4\">\n <Tabs<SignalsViewMode>\n value={viewMode}\n defaultTab=\"flow\"\n onValueChange={handleViewModeChange}\n className=\"w-fit\"\n >\n <TabList variant=\"pill-ghost\">\n <ViewModeTab value=\"flow\" icon={<Waypoints />} label=\"Flow\" />\n <ViewModeTab value=\"compare\" icon={<ArrowLeftRight />} label=\"Compare\" />\n <ViewModeTab value=\"lifelines\" icon={<ChartNoAxesGantt />} label=\"Lifelines\" />\n </TabList>\n </Tabs>\n <TraceIntelligenceExplainer />\n </div>\n {dateRangePicker}\n </div>\n <p className=\"text-neutral3 text-xs\">{VIEW_DESCRIPTIONS[viewMode]}</p>\n {viewMode === 'compare' ? (\n <ThemeCompare\n entityId={entityId}\n entityType={entityType}\n signalNames={signalNames}\n snapshots={snapshots}\n totalSnapshots={totalSnapshots}\n onThemeSelect={openThemeDetailsAt}\n />\n ) : viewMode === 'lifelines' ? (\n <ThemeLifelines\n entityId={entityId}\n entityType={entityType}\n signalNames={signalNames}\n snapshots={snapshots}\n totalSnapshots={totalSnapshots}\n selectedIndex={selectedSnapshotIndex}\n onSnapshotSelect={selectSnapshot}\n onThemeSelect={openThemeDetailsAt}\n />\n ) : (\n <>\n <SnapshotTimeline\n snapshots={snapshots}\n selectedIndex={selectedSnapshotIndex}\n totalSnapshots={totalSnapshots}\n summary={`${drillIn ? 'Filtered · ' : ''}${snapshotSummaryLabel(snapshot, flow)}`}\n isPlaying={isPlaying}\n onPlayingChange={handlePlayingChange}\n onSnapshotChange={selectSnapshot}\n />\n {drillIn ? (\n <ThemeFilterBanner\n selection={drillIn}\n filteredTraceCount={pathsQuery.data ? flow.stages[0]?.traceCount : undefined}\n totalTraceCount={currentFlow.stages[0]?.traceCount ?? currentFlow.snapshot.traceCount}\n onViewDetails={() => {\n setNoiseSignalName(undefined);\n setDetailSelection(drillIn);\n }}\n onClear={() => setDrillIn(undefined)}\n />\n ) : null}\n {drillIn && !drillInAvailable ? (\n <section className=\"border-border1 bg-surface2 text-neutral3 rounded-lg border p-6 text-sm\">\n This drill-in is unavailable for snapshots with more than 2,000 traces. Use the clear filter action above\n or choose another snapshot.\n </section>\n ) : drillIn && pathsQuery.isPending ? (\n <SignalsFrameLoadingSkeleton />\n ) : isDrilledEmpty ? (\n <section className=\"border-border1 bg-surface2 text-neutral3 rounded-lg border p-6 text-sm\">\n This theme is not present in the selected snapshot. Use the clear filter action above to return to the\n full flow.\n </section>\n ) : graphSummary.records.length === 0 ? (\n <section className=\"border-border1 bg-surface2 text-neutral3 rounded-lg border p-6 text-sm\">\n No cross-signal flow for this snapshot — its trace signals have not overlapped on shared traces yet. Pick\n another snapshot from the timeline below.\n </section>\n ) : (\n <FlowCard\n columns={graphSummary.columns}\n records={graphSummary.records}\n stages={stages}\n height={height}\n onNodeClick={handleNodeClick}\n isNodeClickable={isNodeClickable}\n drillInDisabledReason={drillInDisabledReason}\n onOrderChange={handleSignalOrderChange}\n signalOrder={pendingSignalNames ?? signalNames}\n reorderDisabled={perspectiveMutation.isPending}\n />\n )}\n {perspectiveMutation.isPending ? (\n <p className=\"text-neutral3 font-mono text-xs\" role=\"status\">\n Reloading snapshots for new trace signal perspective…\n </p>\n ) : null}\n {perspectiveMutation.isError ? (\n <p className=\"text-xs text-red-500\" role=\"alert\">\n Unable to load that trace signal perspective. Try reordering the columns again.\n </p>\n ) : null}\n </>\n )}\n <ThemeDetailPanel\n key={`${snapshot.snapshotId}:${detailSelection?.signalName ?? ''}:${detailSelection?.themeId ?? ''}`}\n entityId={entityId}\n entityType={entityType}\n snapshotId={snapshot.snapshotId}\n snapshotTotal={snapshot.total}\n selection={detailSelection}\n onClose={() => setDetailSelection(undefined)}\n />\n <NoiseDetailPanel\n key={`${snapshot.snapshotId}:${noiseSignalName ?? ''}`}\n entityId={entityId}\n entityType={entityType}\n snapshotId={snapshot.snapshotId}\n signalName={noiseSignalName}\n onClose={() => setNoiseSignalName(undefined)}\n />\n </main>\n );\n}\n"],"names":["SIGNAL_PROCESSING_ORDER","useQueryClient","useTraceIntelligence","useState","useThemeSnapshots","snapshot","selectFlowSnapshotIds","useThemeFlows","useMemo","stabilizeThemeFlow","useThemePaths","buildDrilledThemeFlow","buildSignalGraphSummary","useEntityLearningProgress","useSnapshotPlayback","useMutation","fetchThemeSnapshots","fetchThemeFlow","fetchThemePaths","jsxs","Fragment","jsx","SignalsLoadingSkeleton","SignalsErrorState","SignalsEmptyState","SnapshotTimeline","snapshotSummaryLabel","SignalsFrameLoadingSkeleton","findNoiseSelection","findThemeSelection","Tabs","TabList","ViewModeTab","Waypoints","ArrowLeftRight","ChartNoAxesGantt","TraceIntelligenceExplainer","ThemeCompare","ThemeLifelines","ThemeFilterBanner","FlowCard","ThemeDetailPanel","NoiseDetailPanel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sankey-signals.cjs.js","sources":["../../../src/ee/signals/sankey-signals.tsx"],"sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { ArrowLeftRight, ChartNoAxesGantt, Waypoints } from 'lucide-react';\nimport { useMemo, useState } from 'react';\n\nimport { SignalsOverviewPage as SignalsEmptyState } from './components/signals-overview-page';\nimport { fetchThemeFlow, fetchThemePaths, fetchThemeSnapshots, serializeThemeFilters } from './entity-learning-api';\nimport { FlowCard } from './flow-card';\nimport { useEntityLearningProgress } from './hooks/use-entity-learning-progress';\nimport { useSnapshotPlayback } from './hooks/use-snapshot-playback';\nimport { useThemeFlows } from './hooks/use-theme-flows';\nimport { useThemePaths } from './hooks/use-theme-paths';\nimport { useThemeSnapshots } from './hooks/use-theme-snapshots';\nimport { NoiseDetailPanel } from './noise-detail-panel';\nimport {\n buildSignalGraphSummary,\n selectFlowSnapshotIds,\n snapshotSummaryLabel,\n stabilizeThemeFlow,\n} from './sankey-signals-data';\nimport { SIGNAL_PROCESSING_ORDER } from './signal-formatting';\nimport { SignalsErrorState } from './signals-error-state';\nimport { SignalsFrameLoadingSkeleton, SignalsLoadingSkeleton } from './signals-loading-skeleton';\nimport { SnapshotTimeline } from './snapshot-timeline';\nimport { ThemeCompare } from './theme-compare';\nimport { ThemeDetailPanel } from './theme-detail-panel';\nimport {\n buildDrilledThemeFlow,\n findNoiseSelection,\n findSelectionStats,\n findThemeSelection,\n mergeVisibleSignalOrder,\n} from './theme-drilldown-data';\nimport type { SelectedTheme, ThemeSelection } from './theme-drilldown-data';\nimport { ThemeFilterBanner } from './theme-filter-banner';\nimport { ThemeLifelines } from './theme-lifelines';\nimport { TraceIntelligenceExplainer } from './trace-intelligence-explainer';\nimport type { TraceSignalName } from './types';\nimport { useTraceIntelligence } from './use-trace-intelligence';\nimport { ViewModeTab } from './view-mode-tab';\nimport type { SignalsViewMode } from './view-mode-tab';\nimport type { SankeyChartNodeSelection } from '@/ds/components/SankeyChart';\nimport { TabList, Tabs } from '@/ds/components/Tabs';\n\nexport interface SankeySignalsProps {\n entityId: string;\n entityType?: string;\n signalNames: TraceSignalName[];\n dateFrom?: Date;\n dateTo?: Date;\n height?: number;\n /** Date range control rendered in line with the view mode tabs. */\n dateRangePicker?: React.ReactNode;\n}\n\nconst DRILL_IN_TRACE_LIMIT = 2000;\nconst FLOW_SIGNAL_LIST = `${SIGNAL_PROCESSING_ORDER.slice(0, -1).join(', ')}, and ${SIGNAL_PROCESSING_ORDER[SIGNAL_PROCESSING_ORDER.length - 1]}`;\n\n/** One-line answer to \"what am I looking at?\" for each view, shown under the tabs. */\nconst VIEW_DESCRIPTIONS: Record<SignalsViewMode, string> = {\n flow: `How this agent's traces distribute across ${FLOW_SIGNAL_LIST} themes at this point in time.`,\n compare: 'Which themes grew, shrank, appeared, or disappeared between two points in time.',\n lifelines: \"Each theme's share of traces across the whole selected range.\",\n};\n\nexport function SankeySignals({\n entityId,\n entityType = 'agent',\n signalNames: initialSignalNames,\n dateFrom,\n dateTo,\n height,\n dateRangePicker,\n}: SankeySignalsProps) {\n const queryClient = useQueryClient();\n const { cacheScope, request, LinkComponent } = useTraceIntelligence();\n const [signalNames, setSignalNames] = useState(() => initialSignalNames);\n const [pendingSignalNames, setPendingSignalNames] = useState<TraceSignalName[]>();\n const snapshotsQuery = useThemeSnapshots(entityId, entityType, signalNames, dateFrom, dateTo);\n const snapshots = [...(snapshotsQuery.data?.snapshots ?? [])].sort((left, right) => left.ordinal - right.ordinal);\n const [selectedSnapshotOrdinal, setSelectedSnapshotOrdinal] = useState<number>();\n const [isPlaying, setIsPlaying] = useState(false);\n const [viewMode, setViewMode] = useState<SignalsViewMode>('flow');\n const [drillStack, setDrillStack] = useState<ThemeSelection[]>([]);\n const [detailSelection, setDetailSelection] = useState<SelectedTheme>();\n const [noiseSignalName, setNoiseSignalName] = useState<TraceSignalName>();\n const matchedSnapshotIndex = snapshots.findIndex(snapshot => snapshot.ordinal === selectedSnapshotOrdinal);\n const selectedSnapshotIndex = matchedSnapshotIndex >= 0 ? matchedSnapshotIndex : 0;\n const snapshot = snapshots[selectedSnapshotIndex];\n const totalSnapshots = snapshotsQuery.data?.totalSnapshots ?? snapshot?.total ?? 0;\n const selectSnapshot = (index: number) => setSelectedSnapshotOrdinal(snapshots[index]?.ordinal);\n const handleViewModeChange = (nextViewMode: SignalsViewMode) => {\n if (nextViewMode !== 'flow') setIsPlaying(false);\n setViewMode(nextViewMode);\n };\n const handlePlayingChange = (nextIsPlaying: boolean) => {\n // Restart from the first landmark when play is pressed at the end.\n if (nextIsPlaying && selectedSnapshotIndex === snapshots.length - 1) selectSnapshot(0);\n setIsPlaying(nextIsPlaying);\n };\n // Compare cards and lifeline points open details for the theme at the\n // landmark they were clicked on, so the panel's snapshot follows the click.\n const openThemeDetailsAt = (selection: ThemeSelection, snapshotIndex: number) => {\n if (selection.kind !== 'theme') return;\n selectSnapshot(snapshotIndex);\n setNoiseSignalName(undefined);\n setDetailSelection(selection);\n };\n\n // Undefined at the last landmark so playback stops instead of looping.\n const nextSnapshotOrdinal = snapshots[selectedSnapshotIndex + 1]?.ordinal;\n const flowSnapshotIds = selectFlowSnapshotIds(snapshots, selectedSnapshotIndex);\n const flowQueries = useThemeFlows(entityId, entityType, signalNames, flowSnapshotIds);\n const flowQuery = flowQueries[flowSnapshotIds.indexOf(snapshot?.snapshotId ?? '')];\n const currentFlow = flowQuery?.data;\n // The loading skeleton tracks only the selected snapshot's flow; prefetched\n // neighbors warm the cache in the background without blocking the chart.\n const isFlowPending = flowQuery?.isPending ?? false;\n // Errors stay window-wide: a failed preload surfaces the retry state instead\n // of letting playback advance into a broken frame.\n const hasFlowError = flowQueries.some(query => query.isError);\n const isFlowWindowBusy = flowQueries.some(query => query.isPending) || hasFlowError;\n const windowFlows = useMemo(() => flowQueries.flatMap(query => (query.data ? [query.data] : [])), [flowQueries]);\n const stableUnfilteredFlow = useMemo(\n () => (currentFlow ? stabilizeThemeFlow(currentFlow, windowFlows) : undefined),\n [currentFlow, windowFlows],\n );\n const drillInAvailable = Boolean(currentFlow && currentFlow.snapshot.traceCount <= DRILL_IN_TRACE_LIMIT);\n const pathsQuery = useThemePaths(\n entityId,\n entityType,\n signalNames,\n snapshot?.snapshotId,\n drillInAvailable && drillStack.length > 0,\n );\n const flow = useMemo(() => {\n if (!stableUnfilteredFlow || drillStack.length === 0 || !pathsQuery.data) return stableUnfilteredFlow;\n\n const drilledFlow = buildDrilledThemeFlow(stableUnfilteredFlow, pathsQuery.data, drillStack);\n return stabilizeThemeFlow(drilledFlow, [stableUnfilteredFlow, drilledFlow]);\n }, [drillStack, pathsQuery.data, stableUnfilteredFlow]);\n const graphSummary = useMemo(() => (flow ? buildSignalGraphSummary(flow) : undefined), [flow]);\n const populatedStageCount = currentFlow?.stages.filter(stage => stage.nodes.length > 0).length ?? 0;\n const shouldLoadProgress =\n snapshotsQuery.isSuccess &&\n !snapshotsQuery.isError &&\n (!snapshot || Boolean(currentFlow && (!flow || !graphSummary || populatedStageCount < 2)));\n const progressQuery = useEntityLearningProgress(entityId, entityType, shouldLoadProgress);\n const isPlaybackBlockedByDrillIn = drillStack.length > 0 && (pathsQuery.isFetching || pathsQuery.isError);\n const hasActivePathsError = drillStack.length > 0 && pathsQuery.isError;\n\n useSnapshotPlayback({\n isPlaying,\n isPlaybackBlocked: isFlowWindowBusy || isPlaybackBlockedByDrillIn,\n nextSnapshot: nextSnapshotOrdinal,\n onAdvance: ordinal => {\n if (ordinal === undefined) {\n setIsPlaying(false);\n return;\n }\n setSelectedSnapshotOrdinal(ordinal);\n },\n snapshotCount: snapshots.length,\n });\n\n const perspectiveMutation = useMutation({\n mutationFn: async (nextSignalNames: TraceSignalName[]) => {\n const nextSnapshots = await queryClient.fetchQuery({\n queryKey: [\n 'entity-learning',\n cacheScope,\n entityType,\n entityId,\n 'theme-snapshots',\n nextSignalNames,\n dateFrom?.toISOString(),\n dateTo?.toISOString(),\n ],\n queryFn: () => fetchThemeSnapshots(request, entityId, entityType, nextSignalNames, dateFrom, dateTo),\n });\n const sortedNextSnapshots = [...nextSnapshots.snapshots].sort((left, right) => left.ordinal - right.ordinal);\n const matchedNextIndex = sortedNextSnapshots.findIndex(candidate => candidate.ordinal === snapshot?.ordinal);\n const nextSelectedIndex = matchedNextIndex >= 0 ? matchedNextIndex : 0;\n const nextSnapshot = sortedNextSnapshots[nextSelectedIndex];\n await Promise.all(\n selectFlowSnapshotIds(sortedNextSnapshots, nextSelectedIndex).map(snapshotId =>\n queryClient.fetchQuery({\n queryKey: ['entity-learning', cacheScope, entityType, entityId, 'theme-flow', nextSignalNames, snapshotId],\n queryFn: () => fetchThemeFlow(request, entityId, entityType, nextSignalNames, snapshotId),\n }),\n ),\n );\n if (drillStack.length > 0 && nextSnapshot && nextSnapshot.traceCount <= DRILL_IN_TRACE_LIMIT) {\n await queryClient.fetchQuery({\n queryKey: [\n 'entity-learning',\n cacheScope,\n entityType,\n entityId,\n 'theme-paths',\n nextSignalNames,\n nextSnapshot.snapshotId,\n ],\n queryFn: () => fetchThemePaths(request, entityId, entityType, nextSignalNames, nextSnapshot.snapshotId),\n });\n }\n return nextSignalNames;\n },\n onSuccess: nextSignalNames => {\n setSignalNames(nextSignalNames);\n setPendingSignalNames(undefined);\n },\n onError: () => setPendingSignalNames(undefined),\n });\n\n if (snapshotsQuery.isPending) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsLoadingSkeleton />\n </>\n );\n }\n\n if (snapshotsQuery.isError || hasFlowError || hasActivePathsError) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsErrorState\n message=\"Unable to load trace signal flow.\"\n onRetry={() => {\n setIsPlaying(false);\n void snapshotsQuery.refetch();\n void Promise.all(flowQueries.map(query => query.refetch()));\n if (drillStack.length > 0 && drillInAvailable) void pathsQuery.refetch();\n }}\n onClear={hasActivePathsError ? () => setDrillStack([]) : undefined}\n />\n </>\n );\n }\n\n if (!snapshot) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsEmptyState LinkComponent={LinkComponent} progress={progressQuery.data} isRangeEmpty />\n </>\n );\n }\n\n if (isFlowPending) {\n return (\n <main className=\"min-w-0 space-y-5 p-4 lg:p-6\">\n {dateRangePicker && <div className=\"flex justify-end\">{dateRangePicker}</div>}\n <SnapshotTimeline\n snapshots={snapshots}\n selectedIndex={selectedSnapshotIndex}\n totalSnapshots={totalSnapshots}\n summary={snapshot ? snapshotSummaryLabel(snapshot, undefined) : ''}\n isPlaying={isPlaying}\n onPlayingChange={handlePlayingChange}\n onSnapshotChange={selectSnapshot}\n />\n <SignalsFrameLoadingSkeleton />\n </main>\n );\n }\n\n if (!currentFlow || !flow || !graphSummary || populatedStageCount < 2) {\n return (\n <>\n {dateRangePicker && <div className=\"flex justify-end px-4 pt-4 lg:px-6 lg:pt-6\">{dateRangePicker}</div>}\n <SignalsEmptyState LinkComponent={LinkComponent} progress={progressQuery.data} />\n </>\n );\n }\n\n const stages = flow.stages;\n const isNodeClickable = (selection: SankeyChartNodeSelection) =>\n findNoiseSelection(flow, selection.column.id, selection.value) !== undefined ||\n findThemeSelection(flow, selection.column.id, selection.value) !== undefined;\n const handleNodeClick = (selection: SankeyChartNodeSelection) => {\n const nextSelection =\n findNoiseSelection(flow, selection.column.id, selection.value) ??\n findThemeSelection(flow, selection.column.id, selection.value);\n if (!nextSelection || drillStack.some(filter => filter.signalName === nextSelection.signalName)) return;\n if (nextSelection.kind === 'theme') {\n setNoiseSignalName(undefined);\n setDetailSelection(nextSelection);\n if (drillInAvailable) setDrillStack(current => [...current, nextSelection]);\n } else {\n setDetailSelection(undefined);\n setNoiseSignalName(nextSelection.signalName);\n }\n };\n const drillInDisabledReason = drillInAvailable\n ? undefined\n : 'Drill-in is unavailable for snapshots with more than 2,000 traces.';\n const isDrilledEmpty = drillStack.length > 0 && pathsQuery.data !== undefined && flow.snapshot.traceCount === 0;\n const handleSignalOrderChange = (nextSignalNames: TraceSignalName[]) => {\n if (perspectiveMutation.isPending) return;\n setIsPlaying(false);\n setDetailSelection(undefined);\n setNoiseSignalName(undefined);\n const mergedSignalNames = mergeVisibleSignalOrder(signalNames, nextSignalNames);\n setPendingSignalNames(mergedSignalNames);\n perspectiveMutation.mutate(mergedSignalNames);\n };\n const filtersResolved = drillStack.length > 0 && drillInAvailable && pathsQuery.data !== undefined;\n const detailStats = filtersResolved ? findSelectionStats(flow, drillStack, detailSelection) : undefined;\n const noiseStats = filtersResolved\n ? findSelectionStats(flow, drillStack, noiseSignalName ? { kind: 'noise', signalName: noiseSignalName } : undefined)\n : undefined;\n const filterKey = serializeThemeFilters(drillStack);\n\n return (\n <main className=\"min-w-0 space-y-5 p-4 lg:p-6\">\n <div className=\"flex min-w-0 flex-wrap items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-4\">\n <Tabs<SignalsViewMode>\n value={viewMode}\n defaultTab=\"flow\"\n onValueChange={handleViewModeChange}\n className=\"w-fit\"\n >\n <TabList variant=\"pill-ghost\">\n <ViewModeTab value=\"flow\" icon={<Waypoints />} label=\"Flow\" />\n <ViewModeTab value=\"compare\" icon={<ArrowLeftRight />} label=\"Compare\" />\n <ViewModeTab value=\"lifelines\" icon={<ChartNoAxesGantt />} label=\"Lifelines\" />\n </TabList>\n </Tabs>\n <TraceIntelligenceExplainer />\n </div>\n {dateRangePicker}\n </div>\n <p className=\"text-neutral3 text-xs\">{VIEW_DESCRIPTIONS[viewMode]}</p>\n {viewMode === 'compare' ? (\n <ThemeCompare\n entityId={entityId}\n entityType={entityType}\n signalNames={signalNames}\n snapshots={snapshots}\n totalSnapshots={totalSnapshots}\n onThemeSelect={openThemeDetailsAt}\n />\n ) : viewMode === 'lifelines' ? (\n <ThemeLifelines\n entityId={entityId}\n entityType={entityType}\n signalNames={signalNames}\n snapshots={snapshots}\n totalSnapshots={totalSnapshots}\n selectedIndex={selectedSnapshotIndex}\n onSnapshotSelect={selectSnapshot}\n onThemeSelect={openThemeDetailsAt}\n />\n ) : (\n <>\n <SnapshotTimeline\n snapshots={snapshots}\n selectedIndex={selectedSnapshotIndex}\n totalSnapshots={totalSnapshots}\n summary={`${drillStack.length > 0 ? (drillInAvailable ? 'Filtered · ' : 'Filters unavailable · ') : ''}${snapshotSummaryLabel(snapshot, flow)}`}\n isPlaying={isPlaying}\n onPlayingChange={handlePlayingChange}\n onSnapshotChange={selectSnapshot}\n />\n {drillStack.length > 0 ? (\n <ThemeFilterBanner\n selections={drillStack}\n filteredTraceCount={filtersResolved ? flow.snapshot.traceCount : undefined}\n totalTraceCount={currentFlow.snapshot.traceCount}\n isUnavailable={!drillInAvailable}\n onViewDetails={selection => {\n if (selection.kind === 'theme') {\n setNoiseSignalName(undefined);\n setDetailSelection(selection);\n } else {\n setDetailSelection(undefined);\n setNoiseSignalName(selection.signalName);\n }\n }}\n onRemove={signalName =>\n setDrillStack(current => current.filter(filter => filter.signalName !== signalName))\n }\n onClear={() => setDrillStack([])}\n />\n ) : null}\n {isDrilledEmpty ? (\n <section className=\"border-border1 bg-surface2 text-neutral3 rounded-lg border p-6 text-sm\">\n This theme is not present in the selected snapshot. Use the clear filter action above to return to the\n full flow.\n </section>\n ) : graphSummary.records.length === 0 ? (\n <section className=\"border-border1 bg-surface2 text-neutral3 rounded-lg border p-6 text-sm\">\n No cross-signal flow for this snapshot — its trace signals have not overlapped on shared traces yet. Pick\n another snapshot from the timeline below.\n </section>\n ) : (\n <FlowCard\n columns={graphSummary.columns}\n records={graphSummary.records}\n stages={stages}\n height={height}\n onNodeClick={handleNodeClick}\n isNodeClickable={isNodeClickable}\n drillInDisabledReason={drillInDisabledReason}\n onOrderChange={handleSignalOrderChange}\n signalOrder={pendingSignalNames ?? signalNames}\n reorderDisabled={perspectiveMutation.isPending}\n />\n )}\n {perspectiveMutation.isPending ? (\n <p className=\"text-neutral3 font-mono text-xs\" role=\"status\">\n Reloading snapshots for new trace signal perspective…\n </p>\n ) : null}\n {perspectiveMutation.isError ? (\n <p className=\"text-xs text-red-500\" role=\"alert\">\n Unable to load that trace signal perspective. Try reordering the columns again.\n </p>\n ) : null}\n </>\n )}\n <ThemeDetailPanel\n key={`${snapshot.snapshotId}:${detailSelection?.signalName ?? ''}:${detailSelection?.themeId ?? ''}:${filterKey}`}\n entityId={entityId}\n entityType={entityType}\n snapshotId={snapshot.snapshotId}\n snapshotTotal={snapshot.total}\n selection={detailSelection}\n filters={drillStack}\n filteredStats={detailStats}\n onClose={() => setDetailSelection(undefined)}\n />\n <NoiseDetailPanel\n key={`${snapshot.snapshotId}:${noiseSignalName ?? ''}:${filterKey}`}\n entityId={entityId}\n entityType={entityType}\n snapshotId={snapshot.snapshotId}\n signalName={noiseSignalName}\n filters={drillStack}\n filteredStats={noiseStats}\n onClose={() => setNoiseSignalName(undefined)}\n />\n </main>\n );\n}\n"],"names":["SIGNAL_PROCESSING_ORDER","useQueryClient","useTraceIntelligence","useState","useThemeSnapshots","snapshot","selectFlowSnapshotIds","useThemeFlows","useMemo","stabilizeThemeFlow","useThemePaths","buildDrilledThemeFlow","buildSignalGraphSummary","useEntityLearningProgress","useSnapshotPlayback","useMutation","fetchThemeSnapshots","fetchThemeFlow","fetchThemePaths","jsxs","Fragment","jsx","SignalsLoadingSkeleton","SignalsErrorState","SignalsEmptyState","SnapshotTimeline","snapshotSummaryLabel","SignalsFrameLoadingSkeleton","findNoiseSelection","findThemeSelection","mergeVisibleSignalOrder","findSelectionStats","serializeThemeFilters","Tabs","TabList","ViewModeTab","Waypoints","ArrowLeftRight","ChartNoAxesGantt","TraceIntelligenceExplainer","ThemeCompare","ThemeLifelines","ThemeFilterBanner","FlowCard","ThemeDetailPanel","NoiseDetailPanel"],"mappings":"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"}
|