@flanksource/clicky-ui 0.3.56 → 0.3.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/components/ErrorWrapper.cjs +15 -4
  2. package/dist/components/ErrorWrapper.cjs.map +1 -1
  3. package/dist/components/ErrorWrapper.d.ts +7 -0
  4. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  5. package/dist/components/ErrorWrapper.js +15 -4
  6. package/dist/components/ErrorWrapper.js.map +1 -1
  7. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs +6 -3
  8. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -1
  9. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +6 -3
  10. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -1
  11. package/dist/data/ai/PromptCatalog/PromptPage.cjs +2 -1
  12. package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -1
  13. package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -1
  14. package/dist/data/ai/PromptCatalog/PromptPage.js +2 -1
  15. package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -1
  16. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +9 -6
  17. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -1
  18. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -1
  19. package/dist/data/ai/PromptCatalog/PromptPageHeader.js +9 -6
  20. package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -1
  21. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +3 -3
  22. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -1
  23. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +2 -1
  24. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -1
  25. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +3 -3
  26. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -1
  27. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +4 -3
  28. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -1
  29. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +1 -1
  30. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -1
  31. package/dist/data/ai/PromptCatalog/prompt-page-model.js +4 -3
  32. package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -1
  33. package/dist/data/ai/PromptCatalog/types.d.ts +1 -0
  34. package/dist/data/ai/PromptCatalog/types.d.ts.map +1 -1
  35. package/dist/data/traces/index.d.ts +7 -0
  36. package/dist/data/traces/index.d.ts.map +1 -1
  37. package/dist/data/traces/otel/OperationList.cjs +64 -0
  38. package/dist/data/traces/otel/OperationList.cjs.map +1 -0
  39. package/dist/data/traces/otel/OperationList.d.ts +10 -0
  40. package/dist/data/traces/otel/OperationList.d.ts.map +1 -0
  41. package/dist/data/traces/otel/OperationList.js +64 -0
  42. package/dist/data/traces/otel/OperationList.js.map +1 -0
  43. package/dist/data/traces/otel/OtelTraceDetail.cjs +781 -0
  44. package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -0
  45. package/dist/data/traces/otel/OtelTraceDetail.d.ts +7 -0
  46. package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -0
  47. package/dist/data/traces/otel/OtelTraceDetail.js +781 -0
  48. package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -0
  49. package/dist/data/traces/otel/OtelTraceSearch.cjs +145 -0
  50. package/dist/data/traces/otel/OtelTraceSearch.cjs.map +1 -0
  51. package/dist/data/traces/otel/OtelTraceSearch.d.ts +16 -0
  52. package/dist/data/traces/otel/OtelTraceSearch.d.ts.map +1 -0
  53. package/dist/data/traces/otel/OtelTraceSearch.js +145 -0
  54. package/dist/data/traces/otel/OtelTraceSearch.js.map +1 -0
  55. package/dist/data/traces/otel/OtelTraceTable.cjs +47 -0
  56. package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -0
  57. package/dist/data/traces/otel/OtelTraceTable.d.ts +12 -0
  58. package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -0
  59. package/dist/data/traces/otel/OtelTraceTable.js +47 -0
  60. package/dist/data/traces/otel/OtelTraceTable.js.map +1 -0
  61. package/dist/data/traces/otel/QueryBar.cjs +158 -0
  62. package/dist/data/traces/otel/QueryBar.cjs.map +1 -0
  63. package/dist/data/traces/otel/QueryBar.d.ts +12 -0
  64. package/dist/data/traces/otel/QueryBar.d.ts.map +1 -0
  65. package/dist/data/traces/otel/QueryBar.js +158 -0
  66. package/dist/data/traces/otel/QueryBar.js.map +1 -0
  67. package/dist/data/traces/otel/SpanCards.cjs +264 -0
  68. package/dist/data/traces/otel/SpanCards.cjs.map +1 -0
  69. package/dist/data/traces/otel/SpanCards.d.ts +17 -0
  70. package/dist/data/traces/otel/SpanCards.d.ts.map +1 -0
  71. package/dist/data/traces/otel/SpanCards.js +261 -0
  72. package/dist/data/traces/otel/SpanCards.js.map +1 -0
  73. package/dist/data/traces/otel/SpanCategory.cjs +18 -0
  74. package/dist/data/traces/otel/SpanCategory.cjs.map +1 -0
  75. package/dist/data/traces/otel/SpanCategory.d.ts +7 -0
  76. package/dist/data/traces/otel/SpanCategory.d.ts.map +1 -0
  77. package/dist/data/traces/otel/SpanCategory.js +18 -0
  78. package/dist/data/traces/otel/SpanCategory.js.map +1 -0
  79. package/dist/data/traces/otel/TraceResults.cjs +195 -0
  80. package/dist/data/traces/otel/TraceResults.cjs.map +1 -0
  81. package/dist/data/traces/otel/TraceResults.d.ts +19 -0
  82. package/dist/data/traces/otel/TraceResults.d.ts.map +1 -0
  83. package/dist/data/traces/otel/TraceResults.js +193 -0
  84. package/dist/data/traces/otel/TraceResults.js.map +1 -0
  85. package/dist/data/traces/otel/api.cjs +36 -0
  86. package/dist/data/traces/otel/api.cjs.map +1 -0
  87. package/dist/data/traces/otel/api.d.ts +87 -0
  88. package/dist/data/traces/otel/api.d.ts.map +1 -0
  89. package/dist/data/traces/otel/api.js +33 -0
  90. package/dist/data/traces/otel/api.js.map +1 -0
  91. package/dist/data/traces/otel/fixtures.d.ts +4 -0
  92. package/dist/data/traces/otel/fixtures.d.ts.map +1 -0
  93. package/dist/data/traces/otel/metrics.cjs +7 -0
  94. package/dist/data/traces/otel/metrics.cjs.map +1 -0
  95. package/dist/data/traces/otel/metrics.d.ts +2 -0
  96. package/dist/data/traces/otel/metrics.d.ts.map +1 -0
  97. package/dist/data/traces/otel/metrics.js +7 -0
  98. package/dist/data/traces/otel/metrics.js.map +1 -0
  99. package/dist/data/traces/otel/model.cjs +167 -0
  100. package/dist/data/traces/otel/model.cjs.map +1 -0
  101. package/dist/data/traces/otel/model.d.ts +81 -0
  102. package/dist/data/traces/otel/model.d.ts.map +1 -0
  103. package/dist/data/traces/otel/model.js +154 -0
  104. package/dist/data/traces/otel/model.js.map +1 -0
  105. package/dist/data/traces/otel/query.cjs +90 -0
  106. package/dist/data/traces/otel/query.cjs.map +1 -0
  107. package/dist/data/traces/otel/query.d.ts +20 -0
  108. package/dist/data/traces/otel/query.d.ts.map +1 -0
  109. package/dist/data/traces/otel/query.js +86 -0
  110. package/dist/data/traces/otel/query.js.map +1 -0
  111. package/dist/data/traces/otel/result-model.cjs +25 -0
  112. package/dist/data/traces/otel/result-model.cjs.map +1 -0
  113. package/dist/data/traces/otel/result-model.d.ts +5 -0
  114. package/dist/data/traces/otel/result-model.d.ts.map +1 -0
  115. package/dist/data/traces/otel/result-model.js +24 -0
  116. package/dist/data/traces/otel/result-model.js.map +1 -0
  117. package/dist/data/traces/otel/source.cjs +11 -0
  118. package/dist/data/traces/otel/source.cjs.map +1 -0
  119. package/dist/data/traces/otel/source.d.ts +5 -0
  120. package/dist/data/traces/otel/source.d.ts.map +1 -0
  121. package/dist/data/traces/otel/source.js +10 -0
  122. package/dist/data/traces/otel/source.js.map +1 -0
  123. package/dist/data/traces/otel/span-traces.cjs +39 -0
  124. package/dist/data/traces/otel/span-traces.cjs.map +1 -0
  125. package/dist/data/traces/otel/span-traces.d.ts +3 -0
  126. package/dist/data/traces/otel/span-traces.d.ts.map +1 -0
  127. package/dist/data/traces/otel/span-traces.js +39 -0
  128. package/dist/data/traces/otel/span-traces.js.map +1 -0
  129. package/dist/data/version-info.cjs +3 -3
  130. package/dist/data/version-info.js +3 -3
  131. package/dist/data.cjs +11 -0
  132. package/dist/data.js +6 -1
  133. package/dist/index.cjs +11 -0
  134. package/dist/index.js +6 -1
  135. package/dist/profiles/editor/profileEditorSections.cjs +4 -0
  136. package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
  137. package/dist/profiles/editor/profileEditorSections.d.ts.map +1 -1
  138. package/dist/profiles/editor/profileEditorSections.js +4 -0
  139. package/dist/profiles/editor/profileEditorSections.js.map +1 -1
  140. package/dist/styles.css +1 -1
  141. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtelTraceDetail.js","names":["_Fragment"],"sources":["../../../../src/data/traces/otel/OtelTraceDetail.tsx"],"sourcesContent":["import { Tinted } from \"./SpanCategory\";\nimport { AgentCard, LlmCard, DbCard, GroupDetail } from \"./SpanCards\";\nimport { metric } from \"./metrics\";\nimport { StatStrip } from \"../../StatStrip\";\nimport { Icon } from \"../../Icon\";\nimport { Callout } from \"../../Callout\";\nimport { Badge } from \"../../Badge\";\nimport { CodeBlock } from \"../../CodeBlock\";\nimport { Properties } from \"../../Properties\";\n/**\n * OpenTelemetry waterfall with grouped calls and an adjacent span inspector.\n */\nimport { useEffect, useMemo, useRef, useState, type KeyboardEvent } from \"react\";\nimport {\n Button,\n CopyButton,\n SearchInput,\n Section,\n SplitPane,\n Switch,\n} from \"../../../components\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCoins,\n UiCollapseAll,\n UiDatabase,\n UiExpandAll,\n UiRobotAi,\n UiSparkles,\n UiWarningTriangle,\n} from \"../../../icons\";\n\n\nimport {\n CATEGORY_COLOR,\n CATEGORY_LABEL,\n buildRows,\n category,\n duration,\n indexTrace,\n isError,\n misparented,\n niceStep,\n num,\n selfTimeMs,\n shortOperation,\n withAncestors,\n type Category,\n type Row,\n type Span,\n type TraceIndex,\n type Trace,\n} from \"./model\";\n\nconst CATEGORY_ICON = { agent: UiRobotAi, llm: UiSparkles, db: UiDatabase, other: UiClock } as const;\nconst ROW_HEIGHT = 28;\n\nconst NAME_COLUMN = \"minmax(15rem, 36%) minmax(0, 1fr)\";\n\n\nexport function OtelTraceDetail({ trace: TRACE, selectedSpanId, onSelectSpan }: { trace: Trace; selectedSpanId?: string; onSelectSpan: (id: string) => void }) {\n const index = useMemo(() => indexTrace(TRACE), [TRACE]);\n const suspects = useMemo(() => misparented(index), [index]);\n const selected = selectedSpanId ?? TRACE.spans[0]?.spanId ?? \"\";\n const [collapsed, setCollapsed] = useState(new Set<string>());\n const groupOf = (id: string) => buildRows(index, { collapsed: new Set(), expanded: new Set(), group: true }).find(row => row.type === \"group\" && row.spans.some(span => span.spanId === id))?.id;\n const [expanded, setExpanded] = useState(() => new Set([groupOf(selected)].filter(id => id !== undefined)));\n const [group, setGroup] = useState(true);\n const [query, setQuery] = useState(\"\");\n const [categories, setCategories] = useState(new Set<Category>());\n const [onlySuspects, setOnlySuspects] = useState(false);\n\n const visible = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q && categories.size === 0 && !onlySuspects) return undefined;\n const hits = TRACE.spans.filter(span =>\n (!q || [span.operation, span.service, ...Object.values(span.attributes ?? {}).map(String)].some(text => text.toLowerCase().includes(q))) &&\n (categories.size === 0 || categories.has(category(span))) &&\n (!onlySuspects || suspects.has(span.spanId)));\n return withAncestors(index, hits.map(span => span.spanId));\n }, [index, query, categories, onlySuspects, suspects, TRACE]);\n\n const rows = useMemo(() => buildRows(index, { collapsed, expanded, group, ...(visible ? { visible } : {}) }), [index, collapsed, expanded, group, visible]);\n\n const select = (id: string) => {\n const group = groupOf(id);\n if (group) setExpanded(previous => new Set(previous).add(group));\n onSelectSpan(id);\n };\n const toggle = (set: typeof setCollapsed, id: string) => set(previous => {\n const next = new Set(previous);\n if (!next.delete(id)) next.add(id);\n return next;\n });\n\n const selectedSpan = index.byId.get(selected);\n const selectedGroup = rows.find((row): row is Extract<Row, { type: \"group\" }> => row.type === \"group\" && row.id === selected);\n\n return (\n <div className=\"space-y-8\">\n <section className=\"space-y-4 rounded-xl border border-border bg-background p-density-4\">\n <TraceHeader index={index} trace={TRACE} />\n {TRACE.missingParents.length > 0 && <p role=\"status\">Partial trace: {TRACE.missingParents.length} parent spans are missing from this source.</p>}\n {suspects.size > 0 && (\n <Callout variant=\"warning\" title={`${suspects.size} spans run inside a nested agent but hang off its parent`}>\n <p className=\"text-sm\">\n They start and end within <code>{shortOperation(suspects.values().next().value!.operation)}</code>, yet their parent is the root span, so the nested agent looks like it made a single LLM call. This usually means the agent's context is not propagated to its database client.{\" \"}\n <Button size=\"sm\" variant=\"link\" className=\"h-auto p-0\" onClick={() => setOnlySuspects(on => !on)}>{onlySuspects ? \"Show all spans\" : \"Show only these spans\"}</Button>\n </p>\n </Callout>\n )}\n <Toolbar\n trace={TRACE}\n query={query}\n setQuery={setQuery}\n categories={categories}\n toggleCategory={c => setCategories(previous => {\n const next = new Set(previous);\n if (!next.delete(c)) next.add(c);\n return next;\n })}\n group={group}\n setGroup={setGroup}\n expandAll={() => {\n setCollapsed(new Set());\n setExpanded(new Set(rows.filter(row => row.type === \"group\").map(row => row.id)));\n }}\n collapseAll={() => {\n setExpanded(new Set());\n setCollapsed(new Set(TRACE.spans.filter(span => index.children.has(span.spanId) && !span.parentId).map(span => span.spanId)));\n }}\n shown={rows.length}\n />\n <SplitPane\n stackOnMobile\n defaultSplit={62}\n minLeft={40}\n minRight={25}\n className=\"rounded-lg border border-border\"\n left={<Waterfall index={index} rows={rows} selected={selected} onSelect={select} suspects={suspects} onToggleSpan={id => toggle(setCollapsed, id)} onToggleGroup={id => toggle(setExpanded, id)} expanded={expanded} collapsed={collapsed} />}\n right={\n <div className=\"h-72 overflow-auto p-density-3 md:h-[calc(100dvh-14rem)] md:min-h-[30rem]\">\n {selectedGroup ? <GroupDetail index={index} spans={selectedGroup.spans} onSelect={select} />\n : selectedSpan ? <SpanDetail index={index} span={selectedSpan} host={suspects.get(selectedSpan.spanId)} onSelect={select} />\n : <p className=\"text-sm text-muted-foreground\">Select a span.</p>}\n </div>\n }\n />\n </section>\n </div>\n );\n}\n\nfunction TraceHeader({ index, trace: TRACE }: { index: TraceIndex; trace: Trace }) {\n const { summary } = TRACE;\n const by = (c: Category) => TRACE.spans.filter(span => category(span) === c);\n const llm = by(\"llm\");\n const db = by(\"db\");\n const sum = (spans: Span[], key: string) => { const values = spans.map(span => num(span.attributes?.[key])).filter(value => value !== undefined); return values.length ? values.reduce((total, value) => total + value, 0) : undefined; };\n const root = index.roots[0]!;\n const cost = num(root.attributes?.[\"captain.cost_usd\"]);\n const budget = num(root.attributes?.[\"captain.budget.cost_usd\"]);\n const tokensIn = sum(llm, \"gen_ai.usage.input_tokens\");\n const tokensOut = sum(llm, \"gen_ai.usage.output_tokens\");\n const ms = (spans: Span[]) => spans.reduce((total, span) => total + span.durationMs, 0);\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-1\">\n \n <h2 className=\"flex items-center gap-2 text-xl font-semibold tracking-tight\">\n <Tinted icon={UiRobotAi} color={CATEGORY_COLOR.agent} />\n {shortOperation(summary.operation)}\n {summary.errors === 0 ? <Badge tone=\"success\" variant=\"soft\">no errors</Badge> : <Badge tone=\"danger\" variant=\"soft\">{summary.errors} errors</Badge>}\n </h2>\n <p className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <code>{summary.traceId}</code>\n <CopyButton value={summary.traceId} label=\"Copy trace ID\" />\n <span>· {summary.services.join(\", \")} · {new Date(summary.startedAt).toLocaleString()}</span>\n </p>\n </div>\n </div>\n <StatStrip\n items={[\n { label: \"Duration\", value: duration(summary.durationMs), sub: `${summary.spanCount} spans`, icon: UiClock },\n { label: \"LLM\", value: duration(ms(llm)), sub: `${llm.length} calls · ${metric(tokensIn)} in / ${metric(tokensOut)} out`, icon: UiSparkles },\n { label: \"Database\", value: duration(ms(db)), sub: `${db.length} calls · ${new Set(db.map(span => span.attributes?.[\"db.sql.table\"])).size} tables`, icon: UiDatabase },\n { label: \"Cost\", value: metric(cost, value => `$${value.toFixed(4)}`), sub: budget ? `of $${budget} budget` : \"budget unavailable\", icon: UiCoins },\n { label: \"Root self-time\", value: duration(selfTimeMs(index, root)), sub: \"not covered by any child span\", icon: UiRobotAi, tone: \"warning\" },\n ]}\n />\n </div>\n );\n}\n\nfunction Toolbar(props: {\n trace: Trace;\n query: string; setQuery: (q: string) => void;\n categories: Set<Category>; toggleCategory: (c: Category) => void;\n group: boolean; setGroup: (on: boolean) => void;\n expandAll: () => void; collapseAll: () => void; shown: number;\n}) {\n const counts = props.trace.spans.reduce((acc, span) => ({ ...acc, [category(span)]: (acc[category(span)] ?? 0) + 1 }), {} as Partial<Record<Category, number>>);\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <SearchInput className=\"w-72\" placeholder=\"Filter by name, table or attribute\" value={props.query} onChange={props.setQuery} />\n {(Object.keys(counts) as Category[]).map(c => {\n const on = props.categories.has(c);\n return (\n <Button key={c} size=\"sm\" variant={on ? \"default\" : \"outline\"} aria-pressed={on} onClick={() => props.toggleCategory(c)}>\n <span className=\"mr-1.5 inline-block size-2 rounded-full\" style={{ background: CATEGORY_COLOR[c] }} />\n {CATEGORY_LABEL[c]} <span className=\"ml-1 text-muted-foreground\">{counts[c]}</span>\n </Button>\n );\n })}\n <label className=\"ml-2 inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <Switch checked={props.group} aria-label=\"Group repeated database calls\" onChange={props.setGroup} />\n Group repeated DB calls\n </label>\n <div className=\"ml-auto flex items-center gap-1\">\n <span className=\"mr-2 text-xs text-muted-foreground\">{props.shown} rows</span>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.expandAll}><Icon icon={UiExpandAll} className=\"mr-1\" />Expand all</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.collapseAll}><Icon icon={UiCollapseAll} className=\"mr-1\" />Collapse</Button>\n </div>\n </div>\n );\n}\n\nfunction Waterfall(props: {\n index: TraceIndex; rows: Row[]; selected: string; onSelect: (id: string) => void; suspects: Map<string, Span>;\n onToggleSpan: (id: string) => void; onToggleGroup: (id: string) => void; expanded: Set<string>; collapsed: Set<string>;\n}) {\n const { index, rows, selected, onSelect } = props;\n const total = Math.max(index.totalMs, 0.001);\n const step = niceStep(total);\n const ticks = Array.from({ length: Math.floor(total / step) + 1 }, (_, i) => i * step);\n const scroller = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n scroller.current?.querySelector<HTMLElement>(`[data-row-id=\"${CSS.escape(selected)}\"]`)?.scrollIntoView?.({ block: \"nearest\" });\n }, [selected]);\n\n const onKey = (event: KeyboardEvent) => {\n const at = rows.findIndex(row => row.id === selected);\n const next = event.key === \"ArrowDown\" ? rows[at + 1] : event.key === \"ArrowUp\" ? rows[at - 1] : undefined;\n const row = rows[at];\n if (next) onSelect(next.id);\n else if (row && (event.key === \"ArrowRight\" || event.key === \"ArrowLeft\")) {\n const open = row.type === \"group\" ? props.expanded.has(row.id) : !props.collapsed.has(row.id);\n const want = event.key === \"ArrowRight\";\n if (open !== want && (row.type === \"group\" || row.childCount > 0)) (row.type === \"group\" ? props.onToggleGroup : props.onToggleSpan)(row.id);\n } else return;\n event.preventDefault();\n };\n\n const pct = (ms: number) => `${(ms / total) * 100}%`;\n return (\n <div ref={scroller} tabIndex={0} onKeyDown={onKey} aria-label=\"Span waterfall\" className=\"h-72 overflow-auto text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring md:h-[calc(100dvh-14rem)] md:min-h-[30rem]\">\n <div className=\"min-w-[40rem]\">\n <div className=\"sticky top-0 z-10 grid border-b border-border bg-muted text-muted-foreground\" style={{ gridTemplateColumns: NAME_COLUMN, height: ROW_HEIGHT }}>\n <div className=\"flex items-center px-density-2 font-medium\">Span</div>\n <div className=\"relative mr-12\">\n {ticks.map(t => <span key={t} className=\"absolute top-1.5 -translate-x-1/2 tabular-nums\" style={{ left: pct(t) }}>{t === 0 ? \"0\" : duration(t)}</span>)}\n </div>\n </div>\n <div className=\"relative\">\n <div aria-hidden className=\"pointer-events-none absolute inset-y-0 grid\" style={{ gridTemplateColumns: NAME_COLUMN, left: 0, right: 0 }}>\n <div />\n <div className=\"relative mr-12\">{ticks.map(t => <span key={t} className=\"absolute inset-y-0 border-l border-border\" style={{ left: pct(t), opacity: 0.6 }} />)}</div>\n </div>\n {rows.map(row => <WaterfallRow key={row.id} {...props} row={row} pct={pct} active={row.id === selected} />)}\n {rows.length === 0 && <p className=\"p-density-4 text-sm text-muted-foreground\">No spans match these filters.</p>}\n </div>\n </div>\n </div>\n );\n}\n\nfunction WaterfallRow({ index, row, active, pct, onSelect, suspects, onToggleSpan, onToggleGroup, expanded, collapsed }: Parameters<typeof Waterfall>[0] & { row: Row; active: boolean; pct: (ms: number) => string }) {\n const indent = { paddingLeft: `${row.depth * 14 + 4}px` };\n const toggleButton = (open: boolean, onClick: () => void, label: string) => (\n <button type=\"button\" aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`} className=\"flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-muted\" onClick={event => { event.stopPropagation(); onClick(); }}>\n <Icon icon={open ? UiChevronDown : UiChevronRight} />\n </button>\n );\n const rowClass = `relative grid w-full cursor-pointer items-center text-left ${active ? \"bg-accent\" : \"hover:bg-muted\"}`;\n\n if (row.type === \"group\") {\n const open = expanded.has(row.id);\n const ops = Object.entries(row.spans.reduce<Record<string, number>>((acc, span) => ({ ...acc, [span.operation.replace(\"gorm.\", \"\")]: (acc[span.operation.replace(\"gorm.\", \"\")] ?? 0) + 1 }), {}));\n const first = index.offsetMs(row.spans[0]!);\n const last = row.spans.at(-1)!;\n const end = index.offsetMs(last) + last.durationMs;\n const busy = row.spans.reduce((total, span) => total + span.durationMs, 0);\n const suspectCount = row.spans.filter(span => suspects.has(span.spanId)).length;\n return (\n <div role=\"button\" tabIndex={-1} data-row-id={row.id} aria-selected={active} className={rowClass} style={{ gridTemplateColumns: NAME_COLUMN, height: ROW_HEIGHT }} onClick={() => onSelect(row.id)}>\n <div className=\"flex min-w-0 items-center gap-1 pr-2\" style={indent}>\n {toggleButton(open, () => onToggleGroup(row.id), \"database group\")}\n <Tinted icon={UiDatabase} color={CATEGORY_COLOR.db} />\n <span className=\"truncate\"><span className=\"font-medium\">{row.spans.length} DB calls</span> <span className=\"text-muted-foreground\">{ops.map(([op, n]) => `${op} ×${n}`).join(\", \")}</span></span>\n {suspectCount > 0 && <><Tinted icon={UiWarningTriangle} color=\"var(--fs-warning)\" label={`${suspectCount} calls run inside a nested agent but are parented elsewhere`} /><span className=\"text-muted-foreground\">{suspectCount}</span></>}\n </div>\n <div className=\"relative mr-12 h-full\">\n <span className=\"absolute rounded-sm\" style={{ left: pct(first), width: pct(end - first), top: 11, height: 6, background: CATEGORY_COLOR.db, opacity: 0.18 }} />\n {row.spans.map(span => <span key={span.spanId} className=\"absolute rounded-sm\" style={{ left: pct(index.offsetMs(span)), width: pct(span.durationMs), minWidth: 2, top: 8, height: 12, background: CATEGORY_COLOR.db }} />)}\n <BarLabel start={(first / Math.max(index.totalMs, 0.001)) * 100} end={(end / Math.max(index.totalMs, 0.001)) * 100} text={`${duration(busy)} busy`} />\n </div>\n </div>\n );\n }\n\n const { span } = row;\n const c = category(span);\n const parent = span.parentId ? index.byId.get(span.parentId) : undefined;\n const left = (index.offsetMs(span) / Math.max(index.totalMs, 0.001)) * 100;\n const width = (span.durationMs / Math.max(index.totalMs, 0.001)) * 100;\n const error = isError(span);\n const label = shortOperation(span.operation);\n const table = span.attributes?.[\"db.sql.table\"];\n return (\n <div role=\"button\" tabIndex={-1} data-row-id={row.id} aria-selected={active} className={rowClass} style={{ gridTemplateColumns: NAME_COLUMN, height: ROW_HEIGHT }} onClick={() => onSelect(row.id)} title={span.operation}>\n <div className=\"flex min-w-0 items-center gap-1 pr-2\" style={indent}>\n {row.childCount > 0 ? toggleButton(!collapsed.has(span.spanId), () => onToggleSpan(span.spanId), label) : <span className=\"size-5 shrink-0\" />}\n <Tinted icon={CATEGORY_ICON[c]} color={CATEGORY_COLOR[c]} />\n {parent && parent.service !== span.service && <Badge size=\"sm\" variant=\"outline\">{span.service}</Badge>}\n <span className={`truncate ${c === \"db\" ? \"\" : \"font-medium\"}`}>{label}</span>\n {typeof table === \"string\" && <span className=\"truncate text-muted-foreground\">{table}</span>}\n {row.childCount > 0 && collapsed.has(span.spanId) && <span className=\"text-muted-foreground\">+{row.childCount}</span>}\n {suspects.has(span.spanId) && <Tinted icon={UiWarningTriangle} color=\"var(--fs-warning)\" label=\"Runs inside a nested agent but is parented elsewhere\" />}\n {error && <Badge size=\"sm\" tone=\"danger\" variant=\"soft\">error</Badge>}\n </div>\n <div className=\"relative mr-12 h-full\">\n <span className=\"absolute rounded-sm\" style={{ left: `${left}%`, width: `${width}%`, minWidth: 2, top: 7, height: 14, background: error ? \"var(--destructive)\" : CATEGORY_COLOR[c], opacity: c === \"agent\" ? 0.85 : 1 }} />\n <BarLabel start={left} end={left + width} inside={width > 14} text={duration(span.durationMs)} />\n </div>\n </div>\n );\n}\n\n/** Duration next to the bar's end — or inside a wide bar — and flipped left of the start near the right edge. */\nfunction BarLabel({ start, end, inside, text }: { start: number; end: number; inside?: boolean; text: string }) {\n if (inside) return <span className=\"absolute top-1.5 px-1.5 font-medium text-white tabular-nums\" style={{ left: `${start}%` }}>{text}</span>;\n const position = end > 90 ? { right: `${100 - start}%`, paddingRight: 4 } : { left: `${end}%`, paddingLeft: 4 };\n return <span className=\"absolute top-1.5 whitespace-nowrap tabular-nums text-muted-foreground\" style={position}>{text}</span>;\n}\n\nfunction SpanDetail({ index, span, host, onSelect }: { index: TraceIndex; span: Span; host: Span | undefined; onSelect: (id: string) => void }) {\n const c = category(span);\n const ancestors: Span[] = [];\n for (let p = span.parentId ? index.byId.get(span.parentId) : undefined; p; p = p.parentId ? index.byId.get(p.parentId) : undefined) ancestors.unshift(p);\n const attributes = Object.entries(span.attributes ?? {});\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n {ancestors.length > 0 && (\n <p className=\"flex flex-wrap items-center gap-1 text-xs text-muted-foreground\">\n {ancestors.map(a => (\n <span key={a.spanId} className=\"inline-flex items-center gap-1\">\n <button type=\"button\" className=\"hover:underline\" onClick={() => onSelect(a.spanId)}>{shortOperation(a.operation)}</button>\n <Icon icon={UiChevronRight} />\n </span>\n ))}\n </p>\n )}\n <h3 className=\"flex items-center gap-2 text-base font-semibold\" title={span.operation}>\n <Tinted icon={CATEGORY_ICON[c]} color={CATEGORY_COLOR[c]} />\n <span className=\"truncate\">{shortOperation(span.operation)}</span>\n </h3>\n <div className=\"flex flex-wrap items-center gap-1.5 text-xs\">\n <Badge variant=\"soft\" size=\"sm\">{CATEGORY_LABEL[c]}</Badge>\n {span.kind && <Badge variant=\"outline\" size=\"sm\">{span.kind}</Badge>}\n {isError(span) && <Badge tone=\"danger\" variant=\"soft\" size=\"sm\">error</Badge>}\n <span className=\"tabular-nums text-muted-foreground\">{duration(span.durationMs)} · starts at +{duration(index.offsetMs(span))}</span>\n <span className=\"ml-auto inline-flex items-center gap-1 text-muted-foreground\"><code>{span.spanId}</code><CopyButton value={span.spanId} label=\"Copy span ID\" /></span>\n </div>\n </div>\n {host && (\n <Callout variant=\"warning\" title=\"Likely mis-parented\">\n <p className=\"text-sm\">Runs entirely inside <button type=\"button\" className=\"underline\" onClick={() => onSelect(host.spanId)}>{shortOperation(host.operation)}</button> but its parent is {span.parentId ? shortOperation(index.byId.get(span.parentId)?.operation ?? span.parentId) : \"missing\"}.</p>\n </Callout>\n )}\n {c === \"agent\" && <AgentCard index={index} span={span} />}\n {c === \"llm\" && <LlmCard span={span} />}\n {c === \"db\" && <DbCard span={span} />}\n <Section title={`All attributes (${attributes.length})`} defaultOpen={c === \"other\"}>\n <Properties renderLabel={key => <code className=\"text-xs\">{key}</code>} items={attributes.map(([key, value]) => ({ key, value }))} />\n </Section>\n {span.otlp && <Section title=\"OpenTelemetry metadata\" defaultOpen={false}><CodeBlock language=\"json\" source={JSON.stringify(span.otlp, null, 2)} jsonDefaultOpenDepth={4} copyable /></Section>}\n <Section title={`Resource (${Object.keys(span.resource ?? {}).length})`} defaultOpen={false}>\n <Properties renderLabel={key => <code className=\"text-xs\">{key}</code>} items={Object.entries(span.resource ?? {}).map(([key, value]) => ({ key, value }))} />\n </Section>\n </div>\n );\n}\n\n"],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ const require_button = require("../../../components/button.cjs");
2
+ const require_SearchInput = require("../../../components/SearchInput.cjs");
3
+ const require_OperationList = require("./OperationList.cjs");
4
+ const require_QueryBar = require("./QueryBar.cjs");
5
+ const require_TraceResults = require("./TraceResults.cjs");
6
+ let react = require("react");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ // src/data/traces/otel/OtelTraceSearch.tsx
9
+ function OtelTraceSearch({ value, result, sources, runs = [], loading = false, error, onChange, onOpen, href, onCancel, onRetry, allowRecords = true }) {
10
+ const [jump, setJump] = (0, react.useState)("");
11
+ const [notice, setNotice] = (0, react.useState)();
12
+ const [cancelled, setCancelled] = (0, react.useState)(false);
13
+ const [elapsed, setElapsed] = (0, react.useState)(0);
14
+ (0, react.useEffect)(() => {
15
+ if (!loading) return;
16
+ setCancelled(false);
17
+ const start = Date.now();
18
+ setElapsed(0);
19
+ const timer = setInterval(() => setElapsed(Date.now() - start), 100);
20
+ return () => clearInterval(timer);
21
+ }, [loading]);
22
+ const operations = Object.keys(value.operations ?? {});
23
+ const selected = operations.length === 0 ? "" : operations.length === 1 && value.operations?.[operations[0]] === "include" ? operations[0] : void 0;
24
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
25
+ className: "flex min-h-0 min-w-0 flex-col gap-3",
26
+ children: [
27
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
28
+ className: "flex flex-wrap items-center justify-between gap-2",
29
+ onSubmit: (event) => {
30
+ event.preventDefault();
31
+ if (!/^(?:[a-f0-9]{16}|[a-f0-9]{32})$/i.test(jump.trim())) return setNotice("A trace ID is 16 or 32 hex characters.");
32
+ setNotice(void 0);
33
+ onOpen(jump.trim().toLowerCase());
34
+ },
35
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
36
+ className: "text-xl font-semibold",
37
+ children: "Traces"
38
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39
+ className: "flex min-w-0 gap-2",
40
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_SearchInput.SearchInput, {
41
+ shortcut: null,
42
+ "aria-label": "Trace ID",
43
+ placeholder: "Jump to trace ID",
44
+ value: jump,
45
+ onChange: setJump
46
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
47
+ type: "submit",
48
+ variant: "outline",
49
+ children: "Open"
50
+ })]
51
+ })]
52
+ }),
53
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_QueryBar.QueryBar, {
54
+ value,
55
+ sources,
56
+ runs,
57
+ allowRecords,
58
+ onChange,
59
+ onError: setNotice,
60
+ ...result ? { result } : {}
61
+ }),
62
+ notice && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
63
+ role: "alert",
64
+ children: notice
65
+ }),
66
+ loading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
67
+ role: "status",
68
+ className: "flex items-center gap-2 text-sm",
69
+ children: [
70
+ "Searching… ",
71
+ (elapsed / 1e3).toFixed(1),
72
+ " s ",
73
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
74
+ size: "sm",
75
+ variant: "ghost",
76
+ onClick: () => {
77
+ setCancelled(true);
78
+ onCancel();
79
+ },
80
+ children: "Cancel"
81
+ })
82
+ ]
83
+ }),
84
+ cancelled && !loading && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
85
+ role: "status",
86
+ children: ["Search cancelled. Any results shown are from the previous search. ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
87
+ size: "sm",
88
+ variant: "outline",
89
+ onClick: onRetry,
90
+ children: "Search again"
91
+ })]
92
+ }),
93
+ error && result && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
94
+ role: "status",
95
+ children: "Showing results from the previous search."
96
+ }),
97
+ error && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
98
+ role: "alert",
99
+ children: [
100
+ error,
101
+ " ",
102
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
103
+ size: "sm",
104
+ variant: "outline",
105
+ onClick: onRetry,
106
+ children: "Retry"
107
+ })
108
+ ]
109
+ }),
110
+ result && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
111
+ className: `flex min-h-0 min-w-0 flex-wrap items-start gap-4 ${loading ? "opacity-50" : ""}`,
112
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
113
+ className: "min-w-0 max-w-[26rem] flex-[1_1_20rem]",
114
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OperationList.OperationList, {
115
+ stats: result.rootOperations,
116
+ selected,
117
+ hideSingle: (value.minSpans ?? 0) >= 2,
118
+ onSelect: (operation) => onChange({
119
+ operations: operation ? { [operation]: "include" } : {},
120
+ ...result.rootOperations.find((stat) => stat.operation === operation)?.singleSpan ? { minSpans: void 0 } : {}
121
+ })
122
+ })
123
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
124
+ className: "min-w-0 flex-[999_1_40rem] space-y-3",
125
+ children: [
126
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TraceResults.ResultSummary, { result }),
127
+ result.traces.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TraceResults.Scatter, {
128
+ traces: result.traces,
129
+ onOpen
130
+ }),
131
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TraceResults.ResultTable, {
132
+ traces: result.traces,
133
+ href,
134
+ onOpen,
135
+ now: Date.now()
136
+ })
137
+ ]
138
+ })]
139
+ })
140
+ ]
141
+ });
142
+ }
143
+ exports.OtelTraceSearch = OtelTraceSearch;
144
+
145
+ //# sourceMappingURL=OtelTraceSearch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtelTraceSearch.cjs","names":["useState","SearchInput","Button","QueryBar","OperationList","ResultSummary","Scatter","ResultTable"],"sources":["../../../../src/data/traces/otel/OtelTraceSearch.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button, SearchInput } from \"../../../components\";\nimport { OperationList } from \"./OperationList\";\nimport { QueryBar } from \"./QueryBar\";\nimport { ResultSummary, ResultTable, Scatter } from \"./TraceResults\";\nimport type { SearchValues, SearchResult, Source } from \"./api\";\n\nexport function OtelTraceSearch({ value, result, sources, runs = [], loading = false, error, onChange, onOpen, href, onCancel, onRetry, allowRecords = true }: {\n value: SearchValues; result?: SearchResult; sources: Source[]; runs?: string[];\n loading?: boolean; error?: string; onChange: (value: Partial<SearchValues>) => void;\n onOpen: (id: string) => void; href: (id: string) => string; onCancel: () => void; onRetry: () => void;\n allowRecords?: boolean;\n}) {\n const [jump, setJump] = useState(\"\");\n const [notice, setNotice] = useState<string>();\n const [cancelled, setCancelled] = useState(false);\n const [elapsed, setElapsed] = useState(0);\n useEffect(() => {\n if (!loading) return;\n setCancelled(false);\n const start = Date.now();\n setElapsed(0);\n const timer = setInterval(() => setElapsed(Date.now() - start), 100);\n return () => clearInterval(timer);\n }, [loading]);\n const operations = Object.keys(value.operations ?? {});\n const selected = operations.length === 0 ? \"\" : operations.length === 1 && value.operations?.[operations[0]!] === \"include\" ? operations[0] : undefined;\n return <section className=\"flex min-h-0 min-w-0 flex-col gap-3\">\n <form className=\"flex flex-wrap items-center justify-between gap-2\" onSubmit={event => {\n event.preventDefault();\n if (!/^(?:[a-f0-9]{16}|[a-f0-9]{32})$/i.test(jump.trim())) return setNotice(\"A trace ID is 16 or 32 hex characters.\");\n setNotice(undefined); onOpen(jump.trim().toLowerCase());\n }}>\n <h2 className=\"text-xl font-semibold\">Traces</h2>\n <div className=\"flex min-w-0 gap-2\"><SearchInput shortcut={null} aria-label=\"Trace ID\" placeholder=\"Jump to trace ID\" value={jump} onChange={setJump} /><Button type=\"submit\" variant=\"outline\">Open</Button></div>\n </form>\n <QueryBar value={value} sources={sources} runs={runs} allowRecords={allowRecords} onChange={onChange} onError={setNotice} {...(result ? { result } : {})} />\n {notice && <p role=\"alert\">{notice}</p>}\n {loading && <div role=\"status\" className=\"flex items-center gap-2 text-sm\">Searching… {(elapsed / 1000).toFixed(1)} s <Button size=\"sm\" variant=\"ghost\" onClick={() => { setCancelled(true); onCancel(); }}>Cancel</Button></div>}\n {cancelled && !loading && <p role=\"status\">Search cancelled. Any results shown are from the previous search. <Button size=\"sm\" variant=\"outline\" onClick={onRetry}>Search again</Button></p>}\n {error && result && <p role=\"status\">Showing results from the previous search.</p>}\n {error && <div role=\"alert\">{error} <Button size=\"sm\" variant=\"outline\" onClick={onRetry}>Retry</Button></div>}\n {result && <div className={`flex min-h-0 min-w-0 flex-wrap items-start gap-4 ${loading ? \"opacity-50\" : \"\"}`}>\n <div className=\"min-w-0 max-w-[26rem] flex-[1_1_20rem]\"><OperationList stats={result.rootOperations} selected={selected} hideSingle={(value.minSpans ?? 0) >= 2} onSelect={operation => onChange({ operations: operation ? { [operation]: \"include\" } : {}, ...(result.rootOperations.find(stat => stat.operation === operation)?.singleSpan ? { minSpans: undefined } : {}) })} /></div>\n <div className=\"min-w-0 flex-[999_1_40rem] space-y-3\"><ResultSummary result={result} />{result.traces.length > 0 && <Scatter traces={result.traces} onOpen={onOpen} />}<ResultTable traces={result.traces} href={href} onOpen={onOpen} now={Date.now()} /></div>\n </div>}\n </section>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { SearchValues, SearchResult, Source } from './api.js';
2
+ export declare function OtelTraceSearch({ value, result, sources, runs, loading, error, onChange, onOpen, href, onCancel, onRetry, allowRecords }: {
3
+ value: SearchValues;
4
+ result?: SearchResult;
5
+ sources: Source[];
6
+ runs?: string[];
7
+ loading?: boolean;
8
+ error?: string;
9
+ onChange: (value: Partial<SearchValues>) => void;
10
+ onOpen: (id: string) => void;
11
+ href: (id: string) => string;
12
+ onCancel: () => void;
13
+ onRetry: () => void;
14
+ allowRecords?: boolean;
15
+ }): import("react").JSX.Element;
16
+ //# sourceMappingURL=OtelTraceSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtelTraceSearch.d.ts","sourceRoot":"","sources":["../../../../src/data/traces/otel/OtelTraceSearch.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEhE,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAS,EAAE,OAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAmB,EAAE,EAAE;IAC7J,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACpF,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IACtG,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,+BAmCA"}
@@ -0,0 +1,145 @@
1
+ import { Button } from "../../../components/button.js";
2
+ import { SearchInput } from "../../../components/SearchInput.js";
3
+ import { OperationList } from "./OperationList.js";
4
+ import { QueryBar } from "./QueryBar.js";
5
+ import { ResultSummary, ResultTable, Scatter } from "./TraceResults.js";
6
+ import { useEffect, useState } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ // src/data/traces/otel/OtelTraceSearch.tsx
9
+ function OtelTraceSearch({ value, result, sources, runs = [], loading = false, error, onChange, onOpen, href, onCancel, onRetry, allowRecords = true }) {
10
+ const [jump, setJump] = useState("");
11
+ const [notice, setNotice] = useState();
12
+ const [cancelled, setCancelled] = useState(false);
13
+ const [elapsed, setElapsed] = useState(0);
14
+ useEffect(() => {
15
+ if (!loading) return;
16
+ setCancelled(false);
17
+ const start = Date.now();
18
+ setElapsed(0);
19
+ const timer = setInterval(() => setElapsed(Date.now() - start), 100);
20
+ return () => clearInterval(timer);
21
+ }, [loading]);
22
+ const operations = Object.keys(value.operations ?? {});
23
+ const selected = operations.length === 0 ? "" : operations.length === 1 && value.operations?.[operations[0]] === "include" ? operations[0] : void 0;
24
+ return /* @__PURE__ */ jsxs("section", {
25
+ className: "flex min-h-0 min-w-0 flex-col gap-3",
26
+ children: [
27
+ /* @__PURE__ */ jsxs("form", {
28
+ className: "flex flex-wrap items-center justify-between gap-2",
29
+ onSubmit: (event) => {
30
+ event.preventDefault();
31
+ if (!/^(?:[a-f0-9]{16}|[a-f0-9]{32})$/i.test(jump.trim())) return setNotice("A trace ID is 16 or 32 hex characters.");
32
+ setNotice(void 0);
33
+ onOpen(jump.trim().toLowerCase());
34
+ },
35
+ children: [/* @__PURE__ */ jsx("h2", {
36
+ className: "text-xl font-semibold",
37
+ children: "Traces"
38
+ }), /* @__PURE__ */ jsxs("div", {
39
+ className: "flex min-w-0 gap-2",
40
+ children: [/* @__PURE__ */ jsx(SearchInput, {
41
+ shortcut: null,
42
+ "aria-label": "Trace ID",
43
+ placeholder: "Jump to trace ID",
44
+ value: jump,
45
+ onChange: setJump
46
+ }), /* @__PURE__ */ jsx(Button, {
47
+ type: "submit",
48
+ variant: "outline",
49
+ children: "Open"
50
+ })]
51
+ })]
52
+ }),
53
+ /* @__PURE__ */ jsx(QueryBar, {
54
+ value,
55
+ sources,
56
+ runs,
57
+ allowRecords,
58
+ onChange,
59
+ onError: setNotice,
60
+ ...result ? { result } : {}
61
+ }),
62
+ notice && /* @__PURE__ */ jsx("p", {
63
+ role: "alert",
64
+ children: notice
65
+ }),
66
+ loading && /* @__PURE__ */ jsxs("div", {
67
+ role: "status",
68
+ className: "flex items-center gap-2 text-sm",
69
+ children: [
70
+ "Searching… ",
71
+ (elapsed / 1e3).toFixed(1),
72
+ " s ",
73
+ /* @__PURE__ */ jsx(Button, {
74
+ size: "sm",
75
+ variant: "ghost",
76
+ onClick: () => {
77
+ setCancelled(true);
78
+ onCancel();
79
+ },
80
+ children: "Cancel"
81
+ })
82
+ ]
83
+ }),
84
+ cancelled && !loading && /* @__PURE__ */ jsxs("p", {
85
+ role: "status",
86
+ children: ["Search cancelled. Any results shown are from the previous search. ", /* @__PURE__ */ jsx(Button, {
87
+ size: "sm",
88
+ variant: "outline",
89
+ onClick: onRetry,
90
+ children: "Search again"
91
+ })]
92
+ }),
93
+ error && result && /* @__PURE__ */ jsx("p", {
94
+ role: "status",
95
+ children: "Showing results from the previous search."
96
+ }),
97
+ error && /* @__PURE__ */ jsxs("div", {
98
+ role: "alert",
99
+ children: [
100
+ error,
101
+ " ",
102
+ /* @__PURE__ */ jsx(Button, {
103
+ size: "sm",
104
+ variant: "outline",
105
+ onClick: onRetry,
106
+ children: "Retry"
107
+ })
108
+ ]
109
+ }),
110
+ result && /* @__PURE__ */ jsxs("div", {
111
+ className: `flex min-h-0 min-w-0 flex-wrap items-start gap-4 ${loading ? "opacity-50" : ""}`,
112
+ children: [/* @__PURE__ */ jsx("div", {
113
+ className: "min-w-0 max-w-[26rem] flex-[1_1_20rem]",
114
+ children: /* @__PURE__ */ jsx(OperationList, {
115
+ stats: result.rootOperations,
116
+ selected,
117
+ hideSingle: (value.minSpans ?? 0) >= 2,
118
+ onSelect: (operation) => onChange({
119
+ operations: operation ? { [operation]: "include" } : {},
120
+ ...result.rootOperations.find((stat) => stat.operation === operation)?.singleSpan ? { minSpans: void 0 } : {}
121
+ })
122
+ })
123
+ }), /* @__PURE__ */ jsxs("div", {
124
+ className: "min-w-0 flex-[999_1_40rem] space-y-3",
125
+ children: [
126
+ /* @__PURE__ */ jsx(ResultSummary, { result }),
127
+ result.traces.length > 0 && /* @__PURE__ */ jsx(Scatter, {
128
+ traces: result.traces,
129
+ onOpen
130
+ }),
131
+ /* @__PURE__ */ jsx(ResultTable, {
132
+ traces: result.traces,
133
+ href,
134
+ onOpen,
135
+ now: Date.now()
136
+ })
137
+ ]
138
+ })]
139
+ })
140
+ ]
141
+ });
142
+ }
143
+ export { OtelTraceSearch };
144
+
145
+ //# sourceMappingURL=OtelTraceSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtelTraceSearch.js","names":[],"sources":["../../../../src/data/traces/otel/OtelTraceSearch.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button, SearchInput } from \"../../../components\";\nimport { OperationList } from \"./OperationList\";\nimport { QueryBar } from \"./QueryBar\";\nimport { ResultSummary, ResultTable, Scatter } from \"./TraceResults\";\nimport type { SearchValues, SearchResult, Source } from \"./api\";\n\nexport function OtelTraceSearch({ value, result, sources, runs = [], loading = false, error, onChange, onOpen, href, onCancel, onRetry, allowRecords = true }: {\n value: SearchValues; result?: SearchResult; sources: Source[]; runs?: string[];\n loading?: boolean; error?: string; onChange: (value: Partial<SearchValues>) => void;\n onOpen: (id: string) => void; href: (id: string) => string; onCancel: () => void; onRetry: () => void;\n allowRecords?: boolean;\n}) {\n const [jump, setJump] = useState(\"\");\n const [notice, setNotice] = useState<string>();\n const [cancelled, setCancelled] = useState(false);\n const [elapsed, setElapsed] = useState(0);\n useEffect(() => {\n if (!loading) return;\n setCancelled(false);\n const start = Date.now();\n setElapsed(0);\n const timer = setInterval(() => setElapsed(Date.now() - start), 100);\n return () => clearInterval(timer);\n }, [loading]);\n const operations = Object.keys(value.operations ?? {});\n const selected = operations.length === 0 ? \"\" : operations.length === 1 && value.operations?.[operations[0]!] === \"include\" ? operations[0] : undefined;\n return <section className=\"flex min-h-0 min-w-0 flex-col gap-3\">\n <form className=\"flex flex-wrap items-center justify-between gap-2\" onSubmit={event => {\n event.preventDefault();\n if (!/^(?:[a-f0-9]{16}|[a-f0-9]{32})$/i.test(jump.trim())) return setNotice(\"A trace ID is 16 or 32 hex characters.\");\n setNotice(undefined); onOpen(jump.trim().toLowerCase());\n }}>\n <h2 className=\"text-xl font-semibold\">Traces</h2>\n <div className=\"flex min-w-0 gap-2\"><SearchInput shortcut={null} aria-label=\"Trace ID\" placeholder=\"Jump to trace ID\" value={jump} onChange={setJump} /><Button type=\"submit\" variant=\"outline\">Open</Button></div>\n </form>\n <QueryBar value={value} sources={sources} runs={runs} allowRecords={allowRecords} onChange={onChange} onError={setNotice} {...(result ? { result } : {})} />\n {notice && <p role=\"alert\">{notice}</p>}\n {loading && <div role=\"status\" className=\"flex items-center gap-2 text-sm\">Searching… {(elapsed / 1000).toFixed(1)} s <Button size=\"sm\" variant=\"ghost\" onClick={() => { setCancelled(true); onCancel(); }}>Cancel</Button></div>}\n {cancelled && !loading && <p role=\"status\">Search cancelled. Any results shown are from the previous search. <Button size=\"sm\" variant=\"outline\" onClick={onRetry}>Search again</Button></p>}\n {error && result && <p role=\"status\">Showing results from the previous search.</p>}\n {error && <div role=\"alert\">{error} <Button size=\"sm\" variant=\"outline\" onClick={onRetry}>Retry</Button></div>}\n {result && <div className={`flex min-h-0 min-w-0 flex-wrap items-start gap-4 ${loading ? \"opacity-50\" : \"\"}`}>\n <div className=\"min-w-0 max-w-[26rem] flex-[1_1_20rem]\"><OperationList stats={result.rootOperations} selected={selected} hideSingle={(value.minSpans ?? 0) >= 2} onSelect={operation => onChange({ operations: operation ? { [operation]: \"include\" } : {}, ...(result.rootOperations.find(stat => stat.operation === operation)?.singleSpan ? { minSpans: undefined } : {}) })} /></div>\n <div className=\"min-w-0 flex-[999_1_40rem] space-y-3\"><ResultSummary result={result} />{result.traces.length > 0 && <Scatter traces={result.traces} onOpen={onOpen} />}<ResultTable traces={result.traces} href={href} onOpen={onOpen} now={Date.now()} /></div>\n </div>}\n </section>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ const require_button = require("../../../components/button.cjs");
2
+ const require_OtelTraceDetail = require("./OtelTraceDetail.cjs");
3
+ const require_TraceResults = require("./TraceResults.cjs");
4
+ const require_span_traces = require("./span-traces.cjs");
5
+ let react = require("react");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ // src/data/traces/otel/OtelTraceTable.tsx
8
+ function OtelTraceTable({ spans, selectedTraceId, selectedSpanId, onSelectTrace, onSelectSpan, traceHref, ...tableProps }) {
9
+ const result = (0, react.useMemo)(() => {
10
+ try {
11
+ return { traces: require_span_traces.spanTraces(spans) };
12
+ } catch (error) {
13
+ return { error: error instanceof Error ? error.message : String(error) };
14
+ }
15
+ }, [spans]);
16
+ const selected = result.traces?.find((trace) => trace.summary.traceId === selectedTraceId);
17
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
18
+ className: "min-h-0 min-w-0 space-y-3",
19
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
20
+ className: "text-sm text-muted-foreground",
21
+ children: "Traces from loaded rows. Filters and paging can leave traces incomplete."
22
+ }), result.error ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
23
+ role: "alert",
24
+ children: ["Cannot render traces: ", result.error]
25
+ }) : selectedTraceId ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
26
+ variant: "link",
27
+ onClick: () => onSelectTrace(),
28
+ children: "Back to traces"
29
+ }), selected ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OtelTraceDetail.OtelTraceDetail, {
30
+ trace: selected,
31
+ ...selectedSpanId ? { selectedSpanId } : {},
32
+ onSelectSpan
33
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
34
+ role: "status",
35
+ children: "This trace is not in the loaded rows. Return to traces or adjust the profile filters."
36
+ })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TraceResults.ResultTable, {
37
+ traces: result.traces.map((trace) => trace.summary),
38
+ href: traceHref,
39
+ onOpen: onSelectTrace,
40
+ now: Date.now(),
41
+ tableProps
42
+ })]
43
+ });
44
+ }
45
+ exports.OtelTraceTable = OtelTraceTable;
46
+
47
+ //# sourceMappingURL=OtelTraceTable.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtelTraceTable.cjs","names":["useMemo","spanTraces","_Fragment","Button","OtelTraceDetail","ResultTable"],"sources":["../../../../src/data/traces/otel/OtelTraceTable.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Button } from \"../../../components\";\nimport type { DataTableProps } from \"../../DataTable\";\nimport { OtelTraceDetail } from \"./OtelTraceDetail\";\nimport { ResultTable } from \"./TraceResults\";\nimport type { Span, Summary } from \"./api\";\nimport { spanTraces } from \"./span-traces\";\n\nexport type OtelTraceTableProps = Pick<DataTableProps<Summary>, \"externalFilters\" | \"externalSearch\" | \"externalTimeRange\" | \"pagination\" | \"infinite\" | \"loading\"> & {\n spans: readonly Span[];\n selectedTraceId?: string;\n selectedSpanId?: string;\n onSelectTrace: (id?: string) => void;\n onSelectSpan: (id: string) => void;\n traceHref: (id: string) => string;\n};\n\nexport function OtelTraceTable({ spans, selectedTraceId, selectedSpanId, onSelectTrace, onSelectSpan, traceHref, ...tableProps }: OtelTraceTableProps) {\n const result = useMemo(() => {\n try { return { traces: spanTraces(spans) }; }\n catch (error) { return { error: error instanceof Error ? error.message : String(error) }; }\n }, [spans]);\n const selected = result.traces?.find(trace => trace.summary.traceId === selectedTraceId);\n return <div className=\"min-h-0 min-w-0 space-y-3\">\n <p className=\"text-sm text-muted-foreground\">Traces from loaded rows. Filters and paging can leave traces incomplete.</p>\n {result.error ? <p role=\"alert\">Cannot render traces: {result.error}</p> : selectedTraceId ? <>\n <Button variant=\"link\" onClick={() => onSelectTrace()}>Back to traces</Button>\n {selected ? <OtelTraceDetail trace={selected} {...(selectedSpanId ? { selectedSpanId } : {})} onSelectSpan={onSelectSpan} /> : <p role=\"status\">This trace is not in the loaded rows. Return to traces or adjust the profile filters.</p>}\n </> : <ResultTable traces={result.traces!.map(trace => trace.summary)} href={traceHref} onOpen={onSelectTrace} now={Date.now()} tableProps={tableProps} />}\n </div>;\n}\n"],"mappings":";;;;;;;AAiBA,SAAgB,eAAe,EAAE,OAAO,iBAAiB,gBAAgB,eAAe,cAAc,WAAW,GAAG,cAAmC;CACrJ,MAAM,UAAA,GAASA,MAAAA,QAAAA,OAAc;EAC3B,IAAI;GAAE,OAAO,EAAE,QAAQC,oBAAAA,WAAW,KAAK,EAAE;EAAG,SACrC,OAAO;GAAE,OAAO,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;EAAG;CAC5F,GAAG,CAAC,KAAK,CAAC;CACV,MAAM,WAAW,OAAO,QAAQ,MAAK,UAAS,MAAM,QAAQ,YAAY,eAAe;CACvF,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;GAAG,WAAU;GAAgC,UAAA;EAA2E,CAAA,GACvH,OAAO,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;GAAG,MAAK;GAAR,UAAA,CAAgB,0BAAuB,OAAO,KAAS;EAAI,CAAA,IAAA,kBAAkB,iBAAA,GAAA,kBAAA,KAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAA,CAC3F,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;GAAQ,SAAQ;GAAO,eAAe,cAAc;GAAG,UAAA;EAAsB,CAAA,GAC5E,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAACC,wBAAAA,iBAAD;GAAiB,OAAO;GAAU,GAAK,iBAAiB,EAAE,eAAe,IAAI,CAAC;GAAkB;EAAe,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;GAAG,MAAK;GAAS,UAAA;EAAwF,CAAA,CACxO,EAAA,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAACC,qBAAAA,aAAD;GAAa,QAAQ,OAAO,OAAQ,KAAI,UAAS,MAAM,OAAO;GAAG,MAAM;GAAW,QAAQ;GAAe,KAAK,KAAK,IAAI;GAAe;EAAa,CAAA,CACtJ;;AACP"}
@@ -0,0 +1,12 @@
1
+ import { DataTableProps } from '../../DataTable.js';
2
+ import { Span, Summary } from './api.js';
3
+ export type OtelTraceTableProps = Pick<DataTableProps<Summary>, "externalFilters" | "externalSearch" | "externalTimeRange" | "pagination" | "infinite" | "loading"> & {
4
+ spans: readonly Span[];
5
+ selectedTraceId?: string;
6
+ selectedSpanId?: string;
7
+ onSelectTrace: (id?: string) => void;
8
+ onSelectSpan: (id: string) => void;
9
+ traceHref: (id: string) => string;
10
+ };
11
+ export declare function OtelTraceTable({ spans, selectedTraceId, selectedSpanId, onSelectTrace, onSelectSpan, traceHref, ...tableProps }: OtelTraceTableProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=OtelTraceTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtelTraceTable.d.ts","sourceRoot":"","sources":["../../../../src/data/traces/otel/OtelTraceTable.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG3C,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC,GAAG;IACpK,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,EAAE,mBAAmB,+BAapJ"}
@@ -0,0 +1,47 @@
1
+ import { Button } from "../../../components/button.js";
2
+ import { OtelTraceDetail } from "./OtelTraceDetail.js";
3
+ import { ResultTable } from "./TraceResults.js";
4
+ import { spanTraces } from "./span-traces.js";
5
+ import { useMemo } from "react";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
+ // src/data/traces/otel/OtelTraceTable.tsx
8
+ function OtelTraceTable({ spans, selectedTraceId, selectedSpanId, onSelectTrace, onSelectSpan, traceHref, ...tableProps }) {
9
+ const result = useMemo(() => {
10
+ try {
11
+ return { traces: spanTraces(spans) };
12
+ } catch (error) {
13
+ return { error: error instanceof Error ? error.message : String(error) };
14
+ }
15
+ }, [spans]);
16
+ const selected = result.traces?.find((trace) => trace.summary.traceId === selectedTraceId);
17
+ return /* @__PURE__ */ jsxs("div", {
18
+ className: "min-h-0 min-w-0 space-y-3",
19
+ children: [/* @__PURE__ */ jsx("p", {
20
+ className: "text-sm text-muted-foreground",
21
+ children: "Traces from loaded rows. Filters and paging can leave traces incomplete."
22
+ }), result.error ? /* @__PURE__ */ jsxs("p", {
23
+ role: "alert",
24
+ children: ["Cannot render traces: ", result.error]
25
+ }) : selectedTraceId ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Button, {
26
+ variant: "link",
27
+ onClick: () => onSelectTrace(),
28
+ children: "Back to traces"
29
+ }), selected ? /* @__PURE__ */ jsx(OtelTraceDetail, {
30
+ trace: selected,
31
+ ...selectedSpanId ? { selectedSpanId } : {},
32
+ onSelectSpan
33
+ }) : /* @__PURE__ */ jsx("p", {
34
+ role: "status",
35
+ children: "This trace is not in the loaded rows. Return to traces or adjust the profile filters."
36
+ })] }) : /* @__PURE__ */ jsx(ResultTable, {
37
+ traces: result.traces.map((trace) => trace.summary),
38
+ href: traceHref,
39
+ onOpen: onSelectTrace,
40
+ now: Date.now(),
41
+ tableProps
42
+ })]
43
+ });
44
+ }
45
+ export { OtelTraceTable };
46
+
47
+ //# sourceMappingURL=OtelTraceTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtelTraceTable.js","names":["_Fragment"],"sources":["../../../../src/data/traces/otel/OtelTraceTable.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Button } from \"../../../components\";\nimport type { DataTableProps } from \"../../DataTable\";\nimport { OtelTraceDetail } from \"./OtelTraceDetail\";\nimport { ResultTable } from \"./TraceResults\";\nimport type { Span, Summary } from \"./api\";\nimport { spanTraces } from \"./span-traces\";\n\nexport type OtelTraceTableProps = Pick<DataTableProps<Summary>, \"externalFilters\" | \"externalSearch\" | \"externalTimeRange\" | \"pagination\" | \"infinite\" | \"loading\"> & {\n spans: readonly Span[];\n selectedTraceId?: string;\n selectedSpanId?: string;\n onSelectTrace: (id?: string) => void;\n onSelectSpan: (id: string) => void;\n traceHref: (id: string) => string;\n};\n\nexport function OtelTraceTable({ spans, selectedTraceId, selectedSpanId, onSelectTrace, onSelectSpan, traceHref, ...tableProps }: OtelTraceTableProps) {\n const result = useMemo(() => {\n try { return { traces: spanTraces(spans) }; }\n catch (error) { return { error: error instanceof Error ? error.message : String(error) }; }\n }, [spans]);\n const selected = result.traces?.find(trace => trace.summary.traceId === selectedTraceId);\n return <div className=\"min-h-0 min-w-0 space-y-3\">\n <p className=\"text-sm text-muted-foreground\">Traces from loaded rows. Filters and paging can leave traces incomplete.</p>\n {result.error ? <p role=\"alert\">Cannot render traces: {result.error}</p> : selectedTraceId ? <>\n <Button variant=\"link\" onClick={() => onSelectTrace()}>Back to traces</Button>\n {selected ? <OtelTraceDetail trace={selected} {...(selectedSpanId ? { selectedSpanId } : {})} onSelectSpan={onSelectSpan} /> : <p role=\"status\">This trace is not in the loaded rows. Return to traces or adjust the profile filters.</p>}\n </> : <ResultTable traces={result.traces!.map(trace => trace.summary)} href={traceHref} onOpen={onSelectTrace} now={Date.now()} tableProps={tableProps} />}\n </div>;\n}\n"],"mappings":";;;;;;;AAiBA,SAAgB,eAAe,EAAE,OAAO,iBAAiB,gBAAgB,eAAe,cAAc,WAAW,GAAG,cAAmC;CACrJ,MAAM,SAAS,cAAc;EAC3B,IAAI;GAAE,OAAO,EAAE,QAAQ,WAAW,KAAK,EAAE;EAAG,SACrC,OAAO;GAAE,OAAO,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;EAAG;CAC5F,GAAG,CAAC,KAAK,CAAC;CACV,MAAM,WAAW,OAAO,QAAQ,MAAK,UAAS,MAAM,QAAQ,YAAY,eAAe;CACvF,OAAO,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACL,oBAAC,KAAD;GAAG,WAAU;GAAgC,UAAA;EAA2E,CAAA,GACvH,OAAO,QAAQ,qBAAC,KAAD;GAAG,MAAK;GAAR,UAAA,CAAgB,0BAAuB,OAAO,KAAS;EAAI,CAAA,IAAA,kBAAkB,qBAAAA,YAAA,EAAA,UAAA,CAC3F,oBAAC,QAAD;GAAQ,SAAQ;GAAO,eAAe,cAAc;GAAG,UAAA;EAAsB,CAAA,GAC5E,WAAW,oBAAC,iBAAD;GAAiB,OAAO;GAAU,GAAK,iBAAiB,EAAE,eAAe,IAAI,CAAC;GAAkB;EAAe,CAAA,IAAI,oBAAC,KAAD;GAAG,MAAK;GAAS,UAAA;EAAwF,CAAA,CACxO,EAAA,CAAA,IAAI,oBAAC,aAAD;GAAa,QAAQ,OAAO,OAAQ,KAAI,UAAS,MAAM,OAAO;GAAG,MAAM;GAAW,QAAQ;GAAe,KAAK,KAAK,IAAI;GAAe;EAAa,CAAA,CACtJ;;AACP"}