@anvia/studio 0.7.41 → 0.7.42
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/dist/ui/assets/{chunk-TIV3WFSR-BCFNcVBW.js → chunk-R6QERZAB-CzentEUZ.js} +2 -2
- package/dist/ui/assets/chunk-R6QERZAB-CzentEUZ.js.map +1 -0
- package/dist/ui/assets/{evals-page-CtsKzSlO.js → evals-page-CR1zsWxS.js} +2 -2
- package/dist/ui/assets/{evals-page-CtsKzSlO.js.map → evals-page-CR1zsWxS.js.map} +1 -1
- package/dist/ui/assets/{index-Br02DQhZ.js → index-C66C9CGh.js} +5 -5
- package/dist/ui/assets/{index-Br02DQhZ.js.map → index-C66C9CGh.js.map} +1 -1
- package/dist/ui/assets/{knowledge-page-4XUY0A05.js → knowledge-page-t_dYi3c5.js} +2 -2
- package/dist/ui/assets/{knowledge-page-4XUY0A05.js.map → knowledge-page-t_dYi3c5.js.map} +1 -1
- package/dist/ui/assets/{mcps-page-D2bfql9X.js → mcps-page-Cd2dn0-7.js} +2 -2
- package/dist/ui/assets/{mcps-page-D2bfql9X.js.map → mcps-page-Cd2dn0-7.js.map} +1 -1
- package/dist/ui/assets/{memory-page-Bv_jKRIe.js → memory-page-f80T-0fS.js} +2 -2
- package/dist/ui/assets/{memory-page-Bv_jKRIe.js.map → memory-page-f80T-0fS.js.map} +1 -1
- package/dist/ui/assets/{pipelines-page-Ccc7drvi.js → pipelines-page-DMWimh3n.js} +2 -2
- package/dist/ui/assets/{pipelines-page-Ccc7drvi.js.map → pipelines-page-DMWimh3n.js.map} +1 -1
- package/dist/ui/assets/{sandboxes-page-lr90zS3G.js → sandboxes-page-CtS1MtOm.js} +2 -2
- package/dist/ui/assets/{sandboxes-page-lr90zS3G.js.map → sandboxes-page-CtS1MtOm.js.map} +1 -1
- package/dist/ui/assets/{sessions-page-_9Crnndq.js → sessions-page-DPx8oYf3.js} +2 -2
- package/dist/ui/assets/{sessions-page-_9Crnndq.js.map → sessions-page-DPx8oYf3.js.map} +1 -1
- package/dist/ui/assets/{status-page-BguURb9e.js → status-page-CP-rdN2T.js} +2 -2
- package/dist/ui/assets/{status-page-BguURb9e.js.map → status-page-CP-rdN2T.js.map} +1 -1
- package/dist/ui/assets/{tool-runner-Doo0UBcS.js → tool-runner-CKSY-Xu1.js} +2 -2
- package/dist/ui/assets/{tool-runner-Doo0UBcS.js.map → tool-runner-CKSY-Xu1.js.map} +1 -1
- package/dist/ui/assets/{tools-page-Bl4RGn6w.js → tools-page-BgP8S9Cm.js} +2 -2
- package/dist/ui/assets/{tools-page-Bl4RGn6w.js.map → tools-page-BgP8S9Cm.js.map} +1 -1
- package/dist/ui/assets/{trace-browser-B-5APgrF.js → trace-browser-CJNK5BWY.js} +2 -2
- package/dist/ui/assets/{trace-browser-B-5APgrF.js.map → trace-browser-CJNK5BWY.js.map} +1 -1
- package/dist/ui/assets/{transcript-item-oaLLzHaS.js → transcript-item-BO57NvIn.js} +2 -2
- package/dist/ui/assets/{transcript-item-oaLLzHaS.js.map → transcript-item-BO57NvIn.js.map} +1 -1
- package/dist/ui/index.html +2 -2
- package/package.json +4 -4
- package/dist/ui/assets/chunk-TIV3WFSR-BCFNcVBW.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-browser-B-5APgrF.js","names":["ScrollArea","Fragment"],"sources":["../../../src/ui/app/modules/tracing/trace-browser-detail.tsx","../../../src/ui/app/components/ui/card.tsx","../../../../../node_modules/.pnpm/@radix-ui+react-scroll-area@1.2.18_@types+react-dom@19.2.3_@types+react@19.2.14__@types_65a050057147dec78e053f767925828d/node_modules/@radix-ui/react-scroll-area/dist/index.mjs","../../../src/ui/app/components/ui/scroll-area.tsx","../../../src/ui/app/modules/tracing/trace-browser.tsx"],"sourcesContent":["import {\n ArrowDown01Icon,\n ArrowRight01Icon,\n ArrowTurnBackwardIcon,\n ChatIcon,\n CpuIcon,\n GitBranchIcon,\n PathIcon,\n Robot01Icon,\n Settings02Icon,\n Wrench01Icon,\n} from \"@hugeicons/core-free-icons\";\nimport { useState } from \"react\";\nimport type { StudioTrace } from \"../../../../types\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { formatToolValue, formatTraceTime, formatUsage } from \"../shared/format\";\nimport { isRecord } from \"../shared/object\";\nimport { messageText } from \"../shared/transcript\";\nimport type { TraceInspectorKey, TraceObservationItem } from \"../shared/types\";\n\nexport function rawTraceJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2) ?? \"undefined\";\n } catch {\n return String(value);\n }\n}\n\nexport function TraceJsonTree(props: { value: unknown }) {\n return (\n <div className=\"overflow-x-auto rounded-lg bg-card/85 px-4 py-4 text-sm leading-6 text-foreground\">\n <JsonNode depth={0} path=\"$\" value={props.value} />\n </div>\n );\n}\n\nconst jsonIndentSize = 16;\nconst jsonDisclosureGutter = 20;\n\nfunction JsonNode(props: {\n arrayIndex?: number | undefined;\n depth: number;\n path: string;\n propertyKey?: string | undefined;\n trailingComma?: boolean | undefined;\n value: unknown;\n}) {\n if (isJsonBranch(props.value)) {\n return (\n <JsonBranch\n arrayIndex={props.arrayIndex}\n depth={props.depth}\n path={props.path}\n propertyKey={props.propertyKey}\n trailingComma={props.trailingComma}\n value={props.value}\n />\n );\n }\n\n return (\n <div\n className=\"min-w-max whitespace-pre\"\n style={{ paddingLeft: `${jsonContentIndent(props.depth)}px` }}\n >\n <JsonNodeLabel arrayIndex={props.arrayIndex} propertyKey={props.propertyKey} />\n <JsonPrimitive value={props.value} />\n {props.trailingComma ? <span className=\"text-foreground\">,</span> : null}\n </div>\n );\n}\n\nfunction JsonBranch(props: {\n arrayIndex?: number | undefined;\n depth: number;\n path: string;\n propertyKey?: string | undefined;\n trailingComma?: boolean | undefined;\n value: Record<string, unknown> | unknown[];\n}) {\n const [open, setOpen] = useState(props.depth === 0);\n const arrayValue = Array.isArray(props.value) ? props.value : undefined;\n const entries =\n arrayValue === undefined\n ? Object.entries(props.value as Record<string, unknown>)\n : arrayValue.map((item, index): [string, unknown] => [String(index), item]);\n const opening = arrayValue === undefined ? \"{\" : \"[\";\n const closing = arrayValue === undefined ? \"}\" : \"]\";\n const collapsed = arrayValue === undefined ? \"{…}\" : \"[…]\";\n\n if (entries.length === 0) {\n return (\n <div\n className=\"min-w-max whitespace-pre\"\n style={{ paddingLeft: `${jsonContentIndent(props.depth)}px` }}\n >\n <JsonNodeLabel arrayIndex={props.arrayIndex} propertyKey={props.propertyKey} />\n <span className=\"text-foreground\">\n {opening}\n {closing}\n {props.trailingComma ? \",\" : \"\"}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"grid min-w-max\">\n <button\n aria-expanded={open}\n className=\"grid min-w-max grid-cols-[16px_auto] items-center gap-1 rounded-lg py-0.5 pr-2 text-left transition duration-200 hover:bg-accent/45 hover:text-accent-foreground\"\n onClick={() => setOpen((current) => !current)}\n style={{ paddingLeft: `${props.depth * jsonIndentSize}px` }}\n type=\"button\"\n >\n <span className=\"grid h-4 w-4 place-items-center text-muted-foreground [&_svg]:h-3 [&_svg]:w-3\">\n {open ? (\n <StudioIcon icon={ArrowDown01Icon} aria-hidden=\"true\" />\n ) : (\n <StudioIcon icon={ArrowRight01Icon} aria-hidden=\"true\" />\n )}\n </span>\n <span className=\"whitespace-pre\">\n <JsonNodeLabel arrayIndex={props.arrayIndex} propertyKey={props.propertyKey} />\n {open ? (\n <span className=\"text-foreground\">{opening}</span>\n ) : (\n <span className=\"text-muted-foreground\">{collapsed}</span>\n )}\n {!open && props.trailingComma ? <span className=\"text-foreground\">,</span> : null}\n </span>\n </button>\n {open ? (\n <>\n {entries.map(([key, value], index) => (\n <JsonNode\n arrayIndex={arrayValue === undefined ? undefined : Number(key)}\n depth={props.depth + 1}\n key={`${props.path}.${key}`}\n path={`${props.path}.${key}`}\n propertyKey={arrayValue === undefined ? key : undefined}\n trailingComma={index < entries.length - 1}\n value={value}\n />\n ))}\n <div\n className=\"min-w-max whitespace-pre text-foreground\"\n style={{ paddingLeft: `${jsonContentIndent(props.depth)}px` }}\n >\n {closing}\n {props.trailingComma ? \",\" : \"\"}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n\nfunction jsonContentIndent(depth: number): number {\n return depth * jsonIndentSize + jsonDisclosureGutter;\n}\n\nfunction JsonNodeLabel(props: {\n arrayIndex?: number | undefined;\n propertyKey?: string | undefined;\n}) {\n if (props.propertyKey !== undefined) {\n return (\n <>\n <span className=\"text-muted-foreground\">{JSON.stringify(props.propertyKey)}</span>\n <span className=\"text-foreground\">: </span>\n </>\n );\n }\n if (props.arrayIndex !== undefined) {\n return (\n <>\n <span className=\"text-muted-foreground\">[{props.arrayIndex}]</span>\n <span className=\"text-foreground\"> </span>\n </>\n );\n }\n return null;\n}\n\nfunction JsonPrimitive(props: { value: unknown }) {\n if (typeof props.value === \"string\") {\n return <span className=\"text-foreground\">{JSON.stringify(props.value)}</span>;\n }\n if (typeof props.value === \"number\") {\n return <span className=\"text-foreground\">{String(props.value)}</span>;\n }\n if (typeof props.value === \"boolean\") {\n return <span className=\"text-chart-4\">{String(props.value)}</span>;\n }\n if (props.value === null) {\n return <span className=\"text-muted-foreground\">null</span>;\n }\n if (props.value === undefined) {\n return <span className=\"text-muted-foreground\">undefined</span>;\n }\n return <span className=\"text-foreground\">{rawTraceJson(props.value)}</span>;\n}\n\nfunction isJsonBranch(value: unknown): value is Record<string, unknown> | unknown[] {\n return Array.isArray(value) || isRecord(value);\n}\n\nexport function jsonSyntaxTokens(\n json: string,\n): Array<{ text: string; type: JsonTokenType; start: number }> {\n const tokenPattern =\n /(\"(?:\\\\u[\\da-fA-F]{4}|\\\\[^u]|[^\\\\\"])*\"(?=\\s*:)|\"(?:\\\\u[\\da-fA-F]{4}|\\\\[^u]|[^\\\\\"])*\"|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|\\btrue\\b|\\bfalse\\b|\\bnull\\b)/g;\n const tokens: Array<{ text: string; type: JsonTokenType; start: number }> = [];\n let cursor = 0;\n for (const match of json.matchAll(tokenPattern)) {\n const text = match[0];\n const index = match.index ?? 0;\n if (index > cursor) {\n tokens.push({ text: json.slice(cursor, index), type: \"plain\", start: cursor });\n }\n tokens.push({\n text,\n type: jsonTokenType(text, json.slice(index + text.length)),\n start: index,\n });\n cursor = index + text.length;\n }\n if (cursor < json.length) {\n tokens.push({ text: json.slice(cursor), type: \"plain\", start: cursor });\n }\n return tokens;\n}\n\ntype JsonTokenType = \"plain\" | \"key\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n\nfunction jsonTokenType(text: string, followingText: string): JsonTokenType {\n if (text.startsWith('\"')) {\n return followingText.trimStart().startsWith(\":\") ? \"key\" : \"string\";\n }\n if (text === \"true\" || text === \"false\") {\n return \"boolean\";\n }\n if (text === \"null\") {\n return \"null\";\n }\n return \"number\";\n}\n\nexport function isNeutralTraceRow(row: { label: string }): boolean {\n return row.label === \"Message Id\";\n}\n\nexport function TraceRowIcon(props: { label: string }) {\n const className = \"h-3.5 w-3.5 shrink-0\";\n switch (props.label) {\n case \"System prompt\":\n return <StudioIcon icon={Settings02Icon} aria-hidden=\"true\" className={className} />;\n case \"Prompt\":\n return <StudioIcon icon={ChatIcon} aria-hidden=\"true\" className={className} />;\n case \"Output\":\n case \"Assistant output\":\n return <StudioIcon icon={ArrowTurnBackwardIcon} aria-hidden=\"true\" className={className} />;\n default:\n return null;\n }\n}\n\nexport function plainTraceValue(\n title: string,\n value: unknown,\n): Array<{ label: string; text: string }> {\n if (title === \"Output\") {\n const outputRows = plainTraceOutput(value);\n if (outputRows.length > 0) {\n return outputRows;\n }\n }\n const messageRows = plainTraceInput(value, title);\n if (messageRows.length > 0) {\n return messageRows;\n }\n if (!isRecord(value)) {\n return [{ label: title, text: plainTraceText(value) }];\n }\n\n const rows: Array<{ label: string; text: string }> = [];\n for (const [key, item] of Object.entries(value)) {\n const nestedMessages = plainTraceInput(item, key);\n if (nestedMessages.length > 0) {\n rows.push(...nestedMessages);\n continue;\n }\n rows.push({ label: traceLabelText(key), text: plainTraceText(item) });\n }\n return rows.length > 0 ? rows : [{ label: title, text: \"Empty object\" }];\n}\n\nfunction plainTraceOutput(value: unknown): Array<{ label: string; text: string }> {\n if (!isRecord(value)) {\n return [];\n }\n const rows: Array<{ label: string; text: string }> = [];\n const choiceRows = plainTraceInput(value.choice, \"choice\");\n rows.push(...choiceRows);\n if (typeof value.messageId === \"string\" && value.messageId.length > 0) {\n rows.push({ label: \"Message Id\", text: value.messageId });\n }\n return rows;\n}\n\nfunction plainTraceInput(\n value: unknown,\n parentKey?: string,\n): Array<{ label: string; text: string }> {\n if (typeof value === \"string\" && parentKey === undefined) {\n return [{ label: \"Value\", text: value }];\n }\n if (Array.isArray(value)) {\n if (parentKey === \"chatHistory\") {\n return chatHistoryRows(value);\n }\n if (parentKey === \"history\") {\n return conversationHistoryRows(value);\n }\n return value\n .map((item, index) => ({\n label: traceArrayItemLabel(item, index, parentKey),\n text: messageText(item) || formatToolValue(item),\n }))\n .filter((item) => item.text.length > 0);\n }\n if (!isRecord(value)) {\n return [];\n }\n\n const chatHistory = Array.isArray(value.chatHistory) ? value.chatHistory : undefined;\n if (chatHistory !== undefined) {\n const rows = systemPromptRows(value);\n rows.push(...plainTraceInput(chatHistory, \"chatHistory\"));\n return rows;\n }\n\n if (Array.isArray(value.prompt)) {\n return plainTraceInput(value.prompt, \"prompt\");\n }\n\n const rows: Array<{ label: string; text: string }> = [];\n rows.push(...systemPromptRows(value));\n\n const history = Array.isArray(value.history) ? value.history : [];\n if (history.length > 0) {\n rows.push(...plainTraceInput(history, \"history\"));\n }\n\n const promptText = messageText(value.prompt);\n if (promptText.length > 0) {\n rows.push({ label: history.length > 0 ? \"Current prompt\" : \"Prompt\", text: promptText });\n }\n\n return rows;\n}\n\nfunction chatHistoryRows(value: unknown[]): Array<{ label: string; text: string }> {\n const messages = value\n .map((item, index) => ({\n label: traceArrayItemLabel(item, index, \"chatHistory\"),\n text: messageText(item) || formatToolValue(item),\n }))\n .filter((item) => item.text.length > 0);\n const current = messages.at(-1);\n const history = messages.slice(0, -1);\n const rows: Array<{ label: string; text: string }> = [];\n if (history.length > 0) {\n rows.push({\n label: `Conversation history (${history.length})`,\n text: history.map((item, index) => `${index + 1}. ${item.label}\\n${item.text}`).join(\"\\n\\n\"),\n });\n }\n if (current !== undefined) {\n rows.push({\n label: history.length > 0 ? \"Current prompt\" : \"Prompt\",\n text: current.text,\n });\n }\n return rows;\n}\n\nfunction conversationHistoryRows(value: unknown[]): Array<{ label: string; text: string }> {\n const messages = value\n .map((item, index) => ({\n label: traceArrayItemLabel(item, index, \"history\"),\n text: messageText(item) || formatToolValue(item),\n }))\n .filter((item) => item.text.length > 0);\n if (messages.length === 0) {\n return [];\n }\n return [\n {\n label: `Conversation history (${messages.length})`,\n text: messages.map((item, index) => `${index + 1}. ${item.label}\\n${item.text}`).join(\"\\n\\n\"),\n },\n ];\n}\n\nfunction traceArrayItemLabel(item: unknown, index: number, parentKey: string | undefined): string {\n if (isRecord(item)) {\n const type = typeof item.type === \"string\" ? item.type : undefined;\n if (parentKey === \"choice\") {\n if (type === \"text\") {\n return \"Assistant output\";\n }\n if (type === \"reasoning\") {\n return \"Reasoning\";\n }\n }\n if (type === \"reasoning\") {\n return \"Reasoning\";\n }\n if (typeof item.role === \"string\") {\n return traceLabelText(item.role);\n }\n if (type !== undefined) {\n return traceLabelText(type);\n }\n }\n\n const prefix = parentKey === undefined ? \"Item\" : `${traceLabelText(parentKey)} item`;\n return `${prefix} ${index + 1}`;\n}\n\nfunction traceLabelText(value: string): string {\n return value\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .trim()\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n}\n\nfunction systemPromptRows(value: Record<string, unknown>): Array<{ label: string; text: string }> {\n const instructions = value.instructions;\n if (typeof instructions !== \"string\" || instructions.trim().length === 0) {\n return [];\n }\n return [{ label: \"System prompt\", text: instructions }];\n}\n\nfunction plainTraceText(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function traceTurns(trace: StudioTrace): Array<{\n turn: number;\n observations: TraceObservationItem[];\n durationMs?: number;\n}> {\n const grouped = new Map<number, TraceObservationItem[]>();\n for (const observation of trace.observations) {\n const turn = Number.isFinite(observation.turn) ? observation.turn : grouped.size + 1;\n grouped.set(turn, [...(grouped.get(turn) ?? []), observation]);\n }\n return [...grouped.entries()]\n .sort(([left], [right]) => left - right)\n .map(([turn, observations]) => ({\n turn,\n observations,\n durationMs: observations.reduce(\n (total, observation) => total + (observation.durationMs ?? 0),\n 0,\n ),\n }));\n}\n\nexport type TraceObservationNode = {\n observation: TraceObservationItem;\n children: TraceObservationNode[];\n};\n\nexport function traceObservationTree(observations: TraceObservationItem[]): TraceObservationNode[] {\n const nodes = new Map<string, TraceObservationNode>();\n for (const observation of observations) {\n nodes.set(observation.id, { observation, children: [] });\n }\n\n const roots: TraceObservationNode[] = [];\n for (const observation of observations) {\n const node = nodes.get(observation.id);\n if (node === undefined) {\n continue;\n }\n const parentId = observation.parentObservationId;\n const parent = parentId === undefined ? undefined : nodes.get(parentId);\n if (parent === undefined) {\n roots.push(node);\n } else {\n parent.children.push(node);\n }\n }\n return roots;\n}\n\nexport function selectedTraceDetail(\n trace: StudioTrace,\n turns: Array<{ turn: number; observations: TraceObservationItem[]; durationMs?: number }>,\n activeKey: TraceInspectorKey,\n): {\n title: string;\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"];\n startedAt: string;\n durationMs: number | undefined;\n firstDeltaMs: number | undefined;\n usage: string;\n input?: unknown;\n output?: unknown;\n error?: unknown;\n metadata: unknown;\n} {\n if (activeKey === \"agent\") {\n return {\n title: \"agent.run\",\n tone: \"agent\",\n startedAt: formatTraceTime(trace.startedAt),\n durationMs: trace.durationMs,\n firstDeltaMs: firstDeltaMsFromObservations(trace.observations),\n usage: formatUsage(trace.usage),\n input: trace.input,\n output: trace.output,\n error: trace.error,\n metadata: traceDetailMetadata(trace),\n };\n }\n if (activeKey.startsWith(\"turn:\")) {\n const turnNumber = Number(activeKey.slice(\"turn:\".length));\n const turn = turns.find((item) => item.turn === turnNumber);\n return {\n title: `turn.${Number.isFinite(turnNumber) ? turnNumber : 1}`,\n tone: \"turn\",\n startedAt: formatTraceTime(turn?.observations[0]?.startedAt ?? trace.startedAt),\n durationMs: turn?.durationMs,\n firstDeltaMs: firstDeltaMsFromObservations(turn?.observations ?? []),\n usage: turnUsageText(turn?.observations ?? []),\n input: turn?.observations[0]?.input,\n output: turn?.observations.at(-1)?.output,\n metadata: turnDetailMetadata(turnNumber, turn?.observations ?? []),\n };\n }\n if (activeKey.startsWith(\"observation:\")) {\n const observationId = activeKey.slice(\"observation:\".length);\n const observation = trace.observations.find((item) => item.id === observationId);\n if (observation !== undefined) {\n return {\n title: traceObservationLabel(observation),\n tone: observation.kind,\n startedAt: formatTraceTime(observation.startedAt),\n durationMs: observation.durationMs,\n firstDeltaMs: firstDeltaMsFromMetadata(observation.metadata),\n usage: observationUsageText(observation),\n input: observation.input,\n output: observation.output,\n error: observation.error,\n metadata: observationDetailMetadata(observation),\n };\n }\n }\n return {\n title: trace.name ?? \"Agent\",\n tone: \"trace\",\n startedAt: formatTraceTime(trace.startedAt),\n durationMs: trace.durationMs,\n firstDeltaMs: firstDeltaMsFromObservations(trace.observations),\n usage: formatUsage(trace.usage),\n input: trace.input,\n output: trace.output,\n error: trace.error,\n metadata: traceDetailMetadata(trace),\n };\n}\n\nexport function traceDetailMetadata(trace: StudioTrace): Record<string, unknown> {\n const metadata = isRecord(trace.metadata) ? trace.metadata : {};\n const traceGroup = compactTraceMetadata({\n status: trace.status,\n traceId: trace.trace?.traceId ?? trace.id,\n observationId: trace.trace?.observationId,\n sessionId: trace.sessionId,\n observationCount: trace.observationCount,\n messageCount: traceMessageCount(metadata.messages),\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n });\n return compactTraceMetadata({\n ...metadata,\n status: trace.status,\n traceId: trace.trace?.traceId ?? trace.id,\n observationId: trace.trace?.observationId,\n sessionId: trace.sessionId,\n observationCount: trace.observationCount,\n messageCount: traceMessageCount(metadata.messages),\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n trace: isRecord(metadata.trace) ? metadata.trace : traceGroup,\n });\n}\n\nfunction turnDetailMetadata(\n turn: number,\n observations: TraceObservationItem[],\n): Record<string, unknown> {\n return compactTraceMetadata({\n turn,\n observationCount: observations.length,\n generationCount: observations.filter((observation) => observation.kind === \"generation\").length,\n toolCount: observations.filter((observation) => observation.kind === \"tool\").length,\n agentCount: observations.filter((observation) => observation.kind === \"agent\").length,\n firstDeltaMs: firstDeltaMsFromObservations(observations),\n status: observationStatusSummary(observations),\n startedAt: observations[0]?.startedAt,\n endedAt: observations.at(-1)?.endedAt,\n });\n}\n\nexport function observationDetailMetadata(\n observation: TraceObservationItem,\n): Record<string, unknown> {\n const metadata = isRecord(observation.metadata) ? observation.metadata : {};\n const base = compactTraceMetadata({\n ...metadata,\n status: observation.status,\n kind: observation.kind,\n turn: observation.turn,\n parentObservationId: observation.parentObservationId ?? null,\n startedAt: observation.startedAt,\n endedAt: observation.endedAt ?? null,\n durationMs: observation.durationMs,\n });\n return compactTraceMetadata({\n ...base,\n trace: isRecord(base.trace)\n ? base.trace\n : compactTraceMetadata({\n status: observation.status,\n kind: observation.kind,\n turn: observation.turn,\n parentObservationId: observation.parentObservationId ?? null,\n startedAt: observation.startedAt,\n endedAt: observation.endedAt ?? null,\n durationMs: observation.durationMs,\n }),\n modelInfo: isRecord(base.modelInfo) ? base.modelInfo : modelInfoMetadata(base),\n modelCall: isRecord(base.modelCall) ? base.modelCall : modelCallMetadata(base),\n response: isRecord(base.response) ? base.response : responseMetadata(base),\n tools: isRecord(base.tools) ? base.tools : toolsMetadata(base),\n timing: isRecord(base.timing) ? base.timing : timingMetadata(base),\n });\n}\n\nfunction modelInfoMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n provider: metadata.provider,\n model: metadata.model,\n requestedModel: metadata.requestedModel,\n defaultModel: metadata.defaultModel,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction modelCallMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const request = compactTraceMetadata({\n messageCount: metadata.historyCount,\n documentCount: metadata.documentCount,\n toolCount: metadata.toolCount,\n toolNames: metadata.toolNames,\n temperature: metadata.temperature,\n maxTokens: metadata.maxTokens,\n toolChoice: metadata.toolChoice,\n hasOutputSchema: metadata.hasOutputSchema,\n additionalParamKeys: metadata.additionalParamKeys,\n });\n const group = compactTraceMetadata({\n request: Object.keys(request).length === 0 ? undefined : request,\n providerRequest: metadata.providerRequest,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction responseMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n messageId: metadata.messageId,\n usage: metadata.usage,\n providerResponse: metadata.providerResponse,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction toolsMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n count: metadata.toolCount,\n names: metadata.toolNames,\n toolChoice: metadata.toolChoice,\n internalCallId: metadata.internalCallId,\n toolCallId: metadata.toolCallId,\n skipped: metadata.skipped,\n description: metadata.toolDescription,\n parameterKeys: metadata.parameterKeys,\n requiredParameterKeys: metadata.requiredParameterKeys,\n approvalRequired: metadata.approvalRequired,\n mcpServerName: metadata.mcpServerName,\n argumentBytes: metadata.argumentBytes,\n resultBytes: metadata.resultBytes,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction timingMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n firstDeltaMs: metadata.firstDeltaMs,\n durationMs: metadata.durationMs,\n startedAt: metadata.startedAt,\n endedAt: metadata.endedAt,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nexport function observationStatusSummary(observations: TraceObservationItem[]): string {\n if (observations.length === 0) {\n return \"empty\";\n }\n if (observations.some((observation) => observation.status === \"error\")) {\n return \"error\";\n }\n if (observations.some((observation) => observation.status === \"running\")) {\n return \"running\";\n }\n return \"success\";\n}\n\nfunction traceMessageCount(value: unknown): number | undefined {\n return Array.isArray(value) ? value.length : undefined;\n}\n\nexport function compactTraceMetadata(values: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined));\n}\n\nexport function traceObservationLabel(observation: TraceObservationItem): string {\n if (observation.kind === \"agent\") {\n return observation.name;\n }\n return observation.kind === \"tool\" ? `tool.${observation.name}` : observation.name;\n}\n\nexport function firstDeltaMsFromObservations(\n observations: TraceObservationItem[],\n): number | undefined {\n for (const observation of observations) {\n const firstDeltaMs = firstDeltaMsFromMetadata(observation.metadata);\n if (firstDeltaMs !== undefined) {\n return firstDeltaMs;\n }\n }\n return undefined;\n}\n\nfunction firstDeltaMsFromMetadata(metadata: unknown): number | undefined {\n if (!isRecord(metadata) || typeof metadata.firstDeltaMs !== \"number\") {\n return undefined;\n }\n return metadata.firstDeltaMs;\n}\n\nexport function statusDotClass(status: StudioTrace[\"status\"]): string {\n switch (status) {\n case \"success\":\n return \"bg-foreground\";\n case \"error\":\n return \"bg-destructive\";\n case \"running\":\n return \"bg-muted-foreground\";\n }\n}\n\nexport function TraceToneIcon(props: {\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"];\n}) {\n switch (props.tone) {\n case \"trace\":\n return <StudioIcon icon={PathIcon} aria-hidden=\"true\" />;\n case \"agent\":\n return <StudioIcon icon={Robot01Icon} aria-hidden=\"true\" />;\n case \"turn\":\n return <StudioIcon icon={GitBranchIcon} aria-hidden=\"true\" />;\n case \"generation\":\n return <StudioIcon icon={CpuIcon} aria-hidden=\"true\" />;\n case \"tool\":\n return <StudioIcon icon={Wrench01Icon} aria-hidden=\"true\" />;\n }\n}\n\nexport function traceToneIconClass(\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"],\n): string {\n switch (tone) {\n case \"trace\":\n return \"bg-foreground text-background\";\n case \"agent\":\n return \"bg-muted-foreground text-background\";\n case \"turn\":\n return \"bg-chart-4 text-background\";\n case \"generation\":\n return \"bg-foreground text-background\";\n case \"tool\":\n return \"bg-destructive text-background\";\n }\n}\n\nexport function observationUsageText(observation: TraceObservationItem): string {\n if (!isRecord(observation.output) || !isRecord(observation.output.usage)) {\n return \"\";\n }\n return formatUsageValue(observation.output.usage);\n}\n\nexport function turnUsageText(observations: TraceObservationItem[]): string {\n const totals = observations\n .map(observationUsageText)\n .filter((usage) => usage.length > 0)\n .join(\" + \");\n return totals;\n}\n\nfunction formatUsageValue(value: Record<string, unknown>): string {\n const input = typeof value.inputTokens === \"number\" ? value.inputTokens : 0;\n const output = typeof value.outputTokens === \"number\" ? value.outputTokens : 0;\n const total = typeof value.totalTokens === \"number\" ? value.totalTokens : input + output;\n if (total === 0) {\n return \"\";\n }\n return `${input} -> ${output} (Σ ${total})`;\n}\n","import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"rounded-xl border border-border/80 bg-card/95 text-card-foreground shadow-sm shadow-black/20\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"grid gap-1.5 p-4\", className)} {...props} />;\n}\n\nexport function CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"p-4 pt-0\", className)} {...props} />;\n}\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/scroll-area.tsx\nimport * as React2 from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// src/use-state-machine.ts\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n__name(useStateMachine, \"useStateMachine\");\n\n// src/scroll-area.tsx\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar SCROLL_AREA_NAME = \"ScrollArea\";\nvar [createScrollAreaContext, createScrollAreaScope] = createContextScope(SCROLL_AREA_NAME);\nvar [ScrollAreaProvider, useScrollAreaContext] = createScrollAreaContext(SCROLL_AREA_NAME);\nvar ScrollArea = /* @__PURE__ */ React2.forwardRef(\n /* @__PURE__ */ __name(function ScrollArea2(props, forwardedRef) {\n const {\n __scopeScrollArea,\n type = \"hover\",\n dir,\n scrollHideDelay = 600,\n ...scrollAreaProps\n } = props;\n const [scrollArea, setScrollArea] = React2.useState(null);\n const [viewport, setViewport] = React2.useState(null);\n const [content, setContent] = React2.useState(null);\n const [scrollbarX, setScrollbarX] = React2.useState(null);\n const [scrollbarY, setScrollbarY] = React2.useState(null);\n const [cornerWidth, setCornerWidth] = React2.useState(0);\n const [cornerHeight, setCornerHeight] = React2.useState(0);\n const [scrollbarXEnabled, setScrollbarXEnabled] = React2.useState(false);\n const [scrollbarYEnabled, setScrollbarYEnabled] = React2.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, setScrollArea);\n const direction = useDirection(dir);\n return /* @__PURE__ */ jsx(\n ScrollAreaProvider,\n {\n scope: __scopeScrollArea,\n type,\n dir: direction,\n scrollHideDelay,\n scrollArea,\n viewport,\n onViewportChange: setViewport,\n content,\n onContentChange: setContent,\n scrollbarX,\n onScrollbarXChange: setScrollbarX,\n scrollbarXEnabled,\n onScrollbarXEnabledChange: setScrollbarXEnabled,\n scrollbarY,\n onScrollbarYChange: setScrollbarY,\n scrollbarYEnabled,\n onScrollbarYEnabledChange: setScrollbarYEnabled,\n onCornerWidthChange: setCornerWidth,\n onCornerHeightChange: setCornerHeight,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n ...scrollAreaProps,\n ref: composedRefs,\n style: {\n position: \"relative\",\n // Pass corner sizes as CSS vars to reduce re-renders of context consumers\n \"--radix-scroll-area-corner-width\": cornerWidth + \"px\",\n \"--radix-scroll-area-corner-height\": cornerHeight + \"px\",\n ...props.style\n }\n }\n )\n }\n );\n }, \"ScrollArea\")\n);\nvar VIEWPORT_NAME = \"ScrollAreaViewport\";\nvar ScrollAreaViewport = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaViewport2(props, forwardedRef) {\n const { __scopeScrollArea, children, nonce, ...viewportProps } = props;\n const context = useScrollAreaContext(VIEWPORT_NAME, __scopeScrollArea);\n const ref = React2.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(ScrollAreaViewportStyle, { nonce }),\n /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-scroll-area-viewport\": \"\",\n ...viewportProps,\n ref: composedRefs,\n style: {\n /**\n * We don't support `visible` because the intention is to have at least one scrollbar\n * if this component is used and `visible` will behave like `auto` in that case\n * https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#description\n *\n * We don't handle `auto` because the intention is for the native implementation\n * to be hidden if using this component. We just want to ensure the node is scrollable\n * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent\n * the browser from having to work out whether to render native scrollbars or not,\n * we tell it to with the intention of hiding them in CSS.\n */\n overflowX: context.scrollbarXEnabled ? \"scroll\" : \"hidden\",\n overflowY: context.scrollbarYEnabled ? \"scroll\" : \"hidden\",\n ...props.style\n },\n children: /* @__PURE__ */ jsx(\"div\", { ref: context.onContentChange, style: { minWidth: \"100%\", display: \"table\" }, children })\n }\n )\n ] });\n }, \"ScrollAreaViewport\")\n);\nvar ScrollAreaViewportStyle = /* @__PURE__ */ React2.memo(\n /* @__PURE__ */ __name(function ScrollAreaViewportStyle2({ nonce }) {\n return /* @__PURE__ */ jsx(\n \"style\",\n {\n dangerouslySetInnerHTML: {\n __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`\n },\n nonce\n }\n );\n }, \"ScrollAreaViewportStyle\"),\n (prevProps, nextProps) => prevProps.nonce === nextProps.nonce\n);\nvar SCROLLBAR_NAME = \"ScrollAreaScrollbar\";\nvar ScrollAreaScrollbar = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaScrollbar2(props, forwardedRef) {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n const isHorizontal = props.orientation === \"horizontal\";\n React2.useEffect(() => {\n isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n return () => {\n isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n };\n }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n return context.type === \"hover\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarHover, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"scroll\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarScroll, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"auto\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarAuto, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"always\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarVisible, { ...scrollbarProps, ref: forwardedRef, \"data-state\": \"visible\" }) : null;\n }, \"ScrollAreaScrollbar\")\n);\nvar ScrollAreaScrollbarHover = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarHover2(props, forwardedRef) {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [visible, setVisible] = React2.useState(false);\n React2.useEffect(() => {\n const scrollArea = context.scrollArea;\n let hideTimer = 0;\n if (scrollArea) {\n const handlePointerEnter = /* @__PURE__ */ __name(() => {\n window.clearTimeout(hideTimer);\n setVisible(true);\n }, \"handlePointerEnter\");\n const handlePointerLeave = /* @__PURE__ */ __name(() => {\n hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n }, \"handlePointerLeave\");\n scrollArea.addEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.addEventListener(\"pointerleave\", handlePointerLeave);\n return () => {\n window.clearTimeout(hideTimer);\n scrollArea.removeEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.removeEventListener(\"pointerleave\", handlePointerLeave);\n };\n }\n }, [context.scrollArea, context.scrollHideDelay]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarAuto,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n}, \"ScrollAreaScrollbarHover\"));\nvar ScrollAreaScrollbarScroll = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarScroll2(props, forwardedRef) {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const isHorizontal = props.orientation === \"horizontal\";\n const debounceScrollEnd = useDebounceCallback(() => send(\"SCROLL_END\"), 100);\n const [state, send] = useStateMachine(\"hidden\", {\n hidden: {\n SCROLL: \"scrolling\"\n },\n scrolling: {\n SCROLL_END: \"idle\",\n POINTER_ENTER: \"interacting\"\n },\n interacting: {\n SCROLL: \"interacting\",\n POINTER_LEAVE: \"idle\"\n },\n idle: {\n HIDE: \"hidden\",\n SCROLL: \"scrolling\",\n POINTER_ENTER: \"interacting\"\n }\n });\n React2.useEffect(() => {\n if (state === \"idle\") {\n const hideTimer = window.setTimeout(() => send(\"HIDE\"), context.scrollHideDelay);\n return () => window.clearTimeout(hideTimer);\n }\n }, [state, context.scrollHideDelay, send]);\n React2.useEffect(() => {\n const viewport = context.viewport;\n const scrollDirection = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n if (viewport) {\n let prevScrollPos = viewport[scrollDirection];\n const handleScroll = /* @__PURE__ */ __name(() => {\n const scrollPos = viewport[scrollDirection];\n const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n if (hasScrollInDirectionChanged) {\n send(\"SCROLL\");\n debounceScrollEnd();\n }\n prevScrollPos = scrollPos;\n }, \"handleScroll\");\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [context.viewport, isHorizontal, send, debounceScrollEnd]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || state !== \"hidden\", children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": state === \"hidden\" ? \"hidden\" : \"visible\",\n ...scrollbarProps,\n ref: forwardedRef,\n onPointerEnter: composeEventHandlers(props.onPointerEnter, () => send(\"POINTER_ENTER\")),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => send(\"POINTER_LEAVE\"))\n }\n ) });\n}, \"ScrollAreaScrollbarScroll\"));\nvar ScrollAreaScrollbarAuto = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarAuto2(props, forwardedRef) {\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { forceMount, ...scrollbarProps } = props;\n const [visible, setVisible] = React2.useState(false);\n const isHorizontal = props.orientation === \"horizontal\";\n const handleResize = useDebounceCallback(() => {\n if (context.viewport) {\n const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n setVisible(isHorizontal ? isOverflowX : isOverflowY);\n }\n }, 10);\n useResizeObserver(context.viewport, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n}, \"ScrollAreaScrollbarAuto\"));\nvar ScrollAreaScrollbarVisible = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarVisible2(props, forwardedRef) {\n const { orientation = \"vertical\", ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const thumbRef = React2.useRef(null);\n const pointerOffsetRef = React2.useRef(0);\n const [sizes, setSizes] = React2.useState({\n content: 0,\n viewport: 0,\n scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 }\n });\n const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n const commonProps = {\n ...scrollbarProps,\n sizes,\n onSizesChange: setSizes,\n hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n onThumbChange: /* @__PURE__ */ __name((thumb) => thumbRef.current = thumb, \"onThumbChange\"),\n onThumbPointerUp: /* @__PURE__ */ __name(() => pointerOffsetRef.current = 0, \"onThumbPointerUp\"),\n onThumbPointerDown: /* @__PURE__ */ __name((pointerPos) => pointerOffsetRef.current = pointerPos, \"onThumbPointerDown\")\n };\n function getScrollPosition(pointerPos, dir) {\n return getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);\n }\n __name(getScrollPosition, \"getScrollPosition\");\n if (orientation === \"horizontal\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarX,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollLeft;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes, context.dir);\n thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollLeft = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) {\n context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);\n }\n }\n }\n );\n }\n if (orientation === \"vertical\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarY,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollTop;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollTop = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);\n }\n }\n );\n }\n return null;\n}, \"ScrollAreaScrollbarVisible\"));\nvar ScrollAreaScrollbarX = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarX2(props, forwardedRef) {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"horizontal\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n bottom: 0,\n left: context.dir === \"rtl\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n right: context.dir === \"ltr\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n \"--radix-scroll-area-thumb-width\": getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.x),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.x),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollLeft + event.deltaX;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollWidth,\n viewport: context.viewport.offsetWidth,\n scrollbar: {\n size: ref.current.clientWidth,\n paddingStart: toInt(computedStyle.paddingLeft),\n paddingEnd: toInt(computedStyle.paddingRight)\n }\n });\n }\n }\n }\n );\n}, \"ScrollAreaScrollbarX\"));\nvar ScrollAreaScrollbarY = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarY2(props, forwardedRef) {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"vertical\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n top: 0,\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: \"var(--radix-scroll-area-corner-height)\",\n \"--radix-scroll-area-thumb-height\": getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.y),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.y),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollTop + event.deltaY;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollHeight,\n viewport: context.viewport.offsetHeight,\n scrollbar: {\n size: ref.current.clientHeight,\n paddingStart: toInt(computedStyle.paddingTop),\n paddingEnd: toInt(computedStyle.paddingBottom)\n }\n });\n }\n }\n }\n );\n}, \"ScrollAreaScrollbarY\"));\nvar [ScrollbarProvider, useScrollbarContext] = createScrollAreaContext(SCROLLBAR_NAME);\nvar ScrollAreaScrollbarImpl = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarImpl2(props, forwardedRef) {\n const {\n __scopeScrollArea,\n sizes,\n hasThumb,\n onThumbChange,\n onThumbPointerUp,\n onThumbPointerDown,\n onThumbPositionChange,\n onDragScroll,\n onWheelScroll,\n onResize,\n ...scrollbarProps\n } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, __scopeScrollArea);\n const [scrollbar, setScrollbar] = React2.useState(null);\n const composeRefs = useComposedRefs(forwardedRef, setScrollbar);\n const rectRef = React2.useRef(null);\n const prevWebkitUserSelectRef = React2.useRef(\"\");\n const viewport = context.viewport;\n const maxScrollPos = sizes.content - sizes.viewport;\n const handleWheelScroll = useCallbackRef(onWheelScroll);\n const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n const handleResize = useDebounceCallback(onResize, 10);\n function handleDragScroll(event) {\n if (rectRef.current) {\n const x = event.clientX - rectRef.current.left;\n const y = event.clientY - rectRef.current.top;\n onDragScroll({ x, y });\n }\n }\n __name(handleDragScroll, \"handleDragScroll\");\n React2.useEffect(() => {\n const handleWheel = /* @__PURE__ */ __name((event) => {\n const element = event.target;\n const isScrollbarWheel = scrollbar?.contains(element);\n if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);\n }, \"handleWheel\");\n document.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => document.removeEventListener(\"wheel\", handleWheel, { passive: false });\n }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n React2.useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n useResizeObserver(scrollbar, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(\n ScrollbarProvider,\n {\n scope: __scopeScrollArea,\n scrollbar,\n hasThumb,\n onThumbChange: useCallbackRef(onThumbChange),\n onThumbPointerUp: useCallbackRef(onThumbPointerUp),\n onThumbPositionChange: handleThumbPositionChange,\n onThumbPointerDown: useCallbackRef(onThumbPointerDown),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...scrollbarProps,\n ref: composeRefs,\n style: { position: \"absolute\", ...scrollbarProps.style },\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const mainPointer = 0;\n if (event.button === mainPointer) {\n const element = event.target;\n element.setPointerCapture(event.pointerId);\n rectRef.current = scrollbar.getBoundingClientRect();\n prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n document.body.style.webkitUserSelect = \"none\";\n if (context.viewport) context.viewport.style.scrollBehavior = \"auto\";\n handleDragScroll(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, handleDragScroll),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const element = event.target;\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n if (context.viewport) context.viewport.style.scrollBehavior = \"\";\n rectRef.current = null;\n })\n }\n )\n }\n );\n}, \"ScrollAreaScrollbarImpl\"));\nvar THUMB_NAME = \"ScrollAreaThumb\";\nvar ScrollAreaThumb = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaThumb2(props, forwardedRef) {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext(THUMB_NAME, props.__scopeScrollArea);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || scrollbarContext.hasThumb, children: /* @__PURE__ */ jsx(ScrollAreaThumbImpl, { ref: forwardedRef, ...thumbProps }) });\n }, \"ScrollAreaThumb\")\n);\nvar ScrollAreaThumbImpl = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaThumbImpl2(props, forwardedRef) {\n const { __scopeScrollArea, style, ...thumbProps } = props;\n const scrollAreaContext = useScrollAreaContext(THUMB_NAME, __scopeScrollArea);\n const scrollbarContext = useScrollbarContext(THUMB_NAME, __scopeScrollArea);\n const { onThumbPositionChange } = scrollbarContext;\n const composedRef = useComposedRefs(forwardedRef, scrollbarContext.onThumbChange);\n const removeUnlinkedScrollListenerRef = React2.useRef(void 0);\n const debounceScrollEnd = useDebounceCallback(() => {\n if (removeUnlinkedScrollListenerRef.current) {\n removeUnlinkedScrollListenerRef.current();\n removeUnlinkedScrollListenerRef.current = void 0;\n }\n }, 100);\n React2.useEffect(() => {\n const viewport = scrollAreaContext.viewport;\n if (viewport) {\n const handleScroll = /* @__PURE__ */ __name(() => {\n debounceScrollEnd();\n if (!removeUnlinkedScrollListenerRef.current) {\n const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n removeUnlinkedScrollListenerRef.current = listener;\n onThumbPositionChange();\n }\n }, \"handleScroll\");\n onThumbPositionChange();\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": scrollbarContext.hasThumb ? \"visible\" : \"hidden\",\n ...thumbProps,\n ref: composedRef,\n style: {\n width: \"var(--radix-scroll-area-thumb-width)\",\n height: \"var(--radix-scroll-area-thumb-height)\",\n ...style\n },\n onPointerDownCapture: composeEventHandlers(props.onPointerDownCapture, (event) => {\n const thumb = event.target;\n const thumbRect = thumb.getBoundingClientRect();\n const x = event.clientX - thumbRect.left;\n const y = event.clientY - thumbRect.top;\n scrollbarContext.onThumbPointerDown({ x, y });\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)\n }\n );\n }, \"ScrollAreaThumbImpl\")\n);\nvar CORNER_NAME = \"ScrollAreaCorner\";\nvar ScrollAreaCorner = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaCorner2(props, forwardedRef) {\n const context = useScrollAreaContext(CORNER_NAME, props.__scopeScrollArea);\n const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);\n const hasCorner = context.type !== \"scroll\" && hasBothScrollbarsVisible;\n return hasCorner ? /* @__PURE__ */ jsx(ScrollAreaCornerImpl, { ...props, ref: forwardedRef }) : null;\n }, \"ScrollAreaCorner\")\n);\nvar ScrollAreaCornerImpl = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaCornerImpl2(props, forwardedRef) {\n const { __scopeScrollArea, ...cornerProps } = props;\n const context = useScrollAreaContext(CORNER_NAME, __scopeScrollArea);\n const [width, setWidth] = React2.useState(0);\n const [height, setHeight] = React2.useState(0);\n const hasSize = Boolean(width && height);\n const { onCornerWidthChange, onCornerHeightChange } = context;\n useResizeObserver(context.scrollbarX, () => {\n const height2 = context.scrollbarX?.offsetHeight || 0;\n context.onCornerHeightChange(height2);\n setHeight(height2);\n });\n useResizeObserver(context.scrollbarY, () => {\n const width2 = context.scrollbarY?.offsetWidth || 0;\n context.onCornerWidthChange(width2);\n setWidth(width2);\n });\n React2.useEffect(() => {\n return () => {\n onCornerWidthChange(0);\n onCornerHeightChange(0);\n };\n }, [onCornerWidthChange, onCornerHeightChange]);\n return hasSize ? /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...cornerProps,\n ref: forwardedRef,\n style: {\n width,\n height,\n position: \"absolute\",\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: 0,\n ...props.style\n }\n }\n ) : null;\n}, \"ScrollAreaCornerImpl\"));\nfunction toInt(value) {\n return value ? parseInt(value, 10) : 0;\n}\n__name(toInt, \"toInt\");\nfunction getThumbRatio(viewportSize, contentSize) {\n const ratio = viewportSize / contentSize;\n return isNaN(ratio) ? 0 : ratio;\n}\n__name(getThumbRatio, \"getThumbRatio\");\nfunction getThumbSize(sizes) {\n const ratio = getThumbRatio(sizes.viewport, sizes.content);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n return Math.max(thumbSize, 18);\n}\n__name(getThumbSize, \"getThumbSize\");\nfunction getScrollPositionFromPointer(pointerPos, pointerOffset, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const thumbCenter = thumbSizePx / 2;\n const offset = pointerOffset || thumbCenter;\n const thumbOffsetFromEnd = thumbSizePx - offset;\n const minPointerPos = sizes.scrollbar.paddingStart + offset;\n const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n const maxScrollPos = sizes.content - sizes.viewport;\n const scrollRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange);\n return interpolate(pointerPos);\n}\n__name(getScrollPositionFromPointer, \"getScrollPositionFromPointer\");\nfunction getThumbOffsetFromScroll(scrollPos, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n const maxScrollPos = sizes.content - sizes.viewport;\n const maxThumbPos = scrollbar - thumbSizePx;\n const scrollClampRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange);\n const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n return interpolate(scrollWithoutMomentum);\n}\n__name(getThumbOffsetFromScroll, \"getThumbOffsetFromScroll\");\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\n__name(linearScale, \"linearScale\");\nfunction isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {\n return scrollPos > 0 && scrollPos < maxScrollPos;\n}\n__name(isScrollingWithinScrollbarBounds, \"isScrollingWithinScrollbarBounds\");\nvar addUnlinkedScrollListener = /* @__PURE__ */ __name((node, handler = () => {\n}) => {\n let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n let rAF = 0;\n (/* @__PURE__ */ __name((function loop() {\n const position = { left: node.scrollLeft, top: node.scrollTop };\n const isHorizontalScroll = prevPosition.left !== position.left;\n const isVerticalScroll = prevPosition.top !== position.top;\n if (isHorizontalScroll || isVerticalScroll) handler();\n prevPosition = position;\n rAF = window.requestAnimationFrame(loop);\n }), \"loop\"))();\n return () => window.cancelAnimationFrame(rAF);\n}, \"addUnlinkedScrollListener\");\nfunction useDebounceCallback(callback, delay) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React2.useRef(0);\n React2.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);\n return React2.useCallback(() => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(handleCallback, delay);\n }, [handleCallback, delay]);\n}\n__name(useDebounceCallback, \"useDebounceCallback\");\nfunction useResizeObserver(element, onResize) {\n const handleResize = useCallbackRef(onResize);\n useLayoutEffect(() => {\n let rAF = 0;\n if (element) {\n const resizeObserver = new ResizeObserver(() => {\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return () => {\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [element, handleResize]);\n}\n__name(useResizeObserver, \"useResizeObserver\");\nvar Root = ScrollArea;\nvar Viewport = ScrollAreaViewport;\nvar Scrollbar = ScrollAreaScrollbar;\nvar Thumb = ScrollAreaThumb;\nvar Corner = ScrollAreaCorner;\nexport {\n Corner,\n Root,\n ScrollArea,\n ScrollAreaCorner,\n ScrollAreaScrollbar,\n ScrollAreaThumb,\n ScrollAreaViewport,\n Scrollbar,\n Thumb,\n Viewport,\n createScrollAreaScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root className={cn(\"relative overflow-hidden\", className)} {...props}>\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent p-px\",\n orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent p-px\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-lg bg-muted-foreground/40\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n","import { ArrowLeft02Icon } from \"@hugeicons/core-free-icons\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n firstDeltaMsFromObservations,\n isNeutralTraceRow,\n observationUsageText,\n plainTraceValue,\n selectedTraceDetail,\n statusDotClass,\n TraceJsonTree,\n type TraceObservationNode,\n TraceRowIcon,\n TraceToneIcon,\n traceObservationLabel,\n traceObservationTree,\n traceToneIconClass,\n traceTurns,\n} from \"./trace-browser-detail\";\n\nexport {\n compactTraceMetadata,\n firstDeltaMsFromObservations,\n jsonSyntaxTokens,\n observationDetailMetadata,\n observationStatusSummary,\n observationUsageText,\n plainTraceValue,\n rawTraceJson,\n selectedTraceDetail,\n traceDetailMetadata,\n traceObservationLabel,\n traceObservationTree,\n traceTurns,\n turnUsageText,\n} from \"./trace-browser-detail\";\n\nimport type { StudioConfig, StudioTrace } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { Card } from \"../../components/ui/card\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { ScrollArea } from \"../../components/ui/scroll-area\";\nimport { cn } from \"../../lib/utils\";\nimport { emptyFallback, formatDuration, formatTraceDate, traceAgentLabel } from \"../shared/format\";\nimport type { TraceInspectorKey, TraceLoadState, TraceObservationItem } from \"../shared/types\";\n\nexport function TraceBrowser(props: {\n agents: StudioConfig[\"agents\"];\n traces: StudioTrace[];\n tracesEnabled: boolean;\n traceLoadState: TraceLoadState;\n selectedTraceId: string;\n traceSessionDetailId: string | undefined;\n onRefresh: () => void;\n onSelectTrace: (traceId: string) => void;\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n if (!props.tracesEnabled) {\n return (\n <div className=\"w-full rounded-lg border border-dashed border-border p-8 text-sm font-medium text-muted-foreground\">\n Tracing is disabled\n </div>\n );\n }\n\n const selectedTrace =\n props.selectedTraceId.length === 0\n ? undefined\n : props.traces.find((trace) => trace.id === props.selectedTraceId);\n const selectedSessionTraces =\n selectedTrace === undefined || props.traceSessionDetailId !== selectedTrace.sessionId\n ? []\n : props.traces.filter((trace) => trace.sessionId === selectedTrace.sessionId);\n\n return (\n <section\n className=\"grid h-full min-h-0 w-full content-stretch pb-6 pl-0 pr-6\"\n aria-label=\"Tracing\"\n >\n {props.selectedTraceId.length === 0 ? (\n <TraceTable\n agents={props.agents}\n traces={props.traces}\n traceLoadState={props.traceLoadState}\n onSelectTrace={props.onSelectTrace}\n />\n ) : (\n <TraceDetailRoute\n selectedTrace={selectedTrace}\n selectedSessionTraces={selectedSessionTraces}\n selectedTraceId={props.selectedTraceId}\n traceLoadState={props.traceLoadState}\n onBack={() => props.onSelectTrace(\"\")}\n onShowSessionTraces={props.onShowSessionTraces}\n />\n )}\n </section>\n );\n}\n\nfunction TraceTable(props: {\n agents: StudioConfig[\"agents\"];\n traces: StudioTrace[];\n traceLoadState: TraceLoadState;\n onSelectTrace: (traceId: string) => void;\n}) {\n return (\n <Card\n className=\"min-h-0 overflow-hidden rounded-xl border-border/80 bg-card/80\"\n aria-label=\"Traces\"\n >\n <ScrollArea className=\"h-full min-h-0\">\n <div className=\"grid min-w-280 gap-1 p-2\">\n <div className=\"sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_150px_120px_120px_120px_120px_110px_90px] items-center gap-4 rounded-lg border border-border/60 bg-card/95 px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur\">\n <span>Trace</span>\n <span>Session</span>\n <span>Agent</span>\n <span>Status</span>\n <span>Started</span>\n <span>Duration</span>\n <span>First delta</span>\n <span>Events</span>\n </div>\n {props.traceLoadState === \"loading\" && props.traces.length === 0 ? (\n <div className=\"px-5 py-4 text-sm font-medium text-muted-foreground\">\n Loading traces\n </div>\n ) : null}\n {props.traceLoadState === \"idle\" && props.traces.length === 0 ? (\n <div className=\"px-5 py-4 text-sm font-medium text-muted-foreground\">\n No traces found\n </div>\n ) : null}\n {props.traces.map((trace) => (\n <Button\n className=\"grid h-auto min-h-14 w-full grid-cols-[minmax(220px,1.3fr)_150px_120px_120px_120px_120px_110px_90px] items-center justify-start gap-4 whitespace-normal rounded-lg border border-transparent bg-transparent px-4 py-2.5 text-left text-muted-foreground shadow-none transition duration-200 hover:border-border/70 hover:bg-accent/70 hover:text-accent-foreground\"\n type=\"button\"\n variant=\"ghost\"\n key={trace.id}\n onClick={() => props.onSelectTrace(trace.id)}\n >\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {trace.id}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">{trace.sessionId}</span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {traceAgentLabel(props.agents, trace)}\n </span>\n <span className=\"flex min-w-0 items-center gap-2 text-xs font-medium capitalize\">\n <span\n className={cn(\"h-2.5 w-2.5 shrink-0 rounded-lg\", statusDotClass(trace.status))}\n />\n <span className=\"min-w-0 truncate\">{trace.status}</span>\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {formatTraceDate(trace.startedAt)}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {emptyFallback(formatDuration(trace.durationMs))}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {emptyFallback(formatDuration(firstDeltaMsFromObservations(trace.observations)))}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium tabular-nums\">\n {trace.observationCount}\n </span>\n </Button>\n ))}\n </div>\n </ScrollArea>\n </Card>\n );\n}\n\nfunction TraceDetailRoute(props: {\n selectedTrace: StudioTrace | undefined;\n selectedSessionTraces: StudioTrace[];\n selectedTraceId: string;\n traceLoadState: TraceLoadState;\n onBack: () => void;\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n return (\n <div className=\"grid h-full min-h-0 min-w-0 grid-rows-[auto_minmax(0,1fr)] gap-2 overflow-hidden rounded-xl border border-border/80 bg-card/70 p-2 shadow-sm\">\n <header className=\"grid min-h-16 grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 overflow-hidden rounded-lg border border-border/60 bg-card/95 px-4 py-3\">\n <Button\n aria-label=\"Back to traces\"\n className=\"h-8 min-h-8 w-8 text-muted-foreground hover:text-foreground\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={props.onBack}\n >\n <StudioIcon icon={ArrowLeft02Icon} aria-hidden=\"true\" />\n </Button>\n <div className=\"grid min-w-0 gap-1\">\n <strong className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.selectedTrace?.name ?? \"Trace detail\"}\n </strong>\n <span className=\"flex min-w-0 items-center gap-2 overflow-hidden text-xs font-medium text-muted-foreground\">\n {props.selectedTrace === undefined ? (\n props.traceLoadState === \"loading\" ? (\n \"Loading trace\"\n ) : (\n \"Trace not found\"\n )\n ) : (\n <>\n <span\n className={cn(\n \"h-2 w-2 shrink-0 rounded-lg\",\n statusDotClass(props.selectedTrace.status),\n )}\n />\n <span className=\"shrink-0 capitalize\">{props.selectedTrace.status}</span>\n <span className=\"shrink-0\" aria-hidden=\"true\">\n /\n </span>\n <span className=\"min-w-0 flex-1 truncate\">\n Session <span className=\" font-semibold\">{props.selectedTrace.sessionId}</span>\n </span>\n </>\n )}\n </span>\n </div>\n <span className=\"hidden max-w-[42vw] truncate rounded-lg bg-muted px-2 py-1 text-xs font-medium text-muted-foreground md:block\">\n {props.selectedTraceId}\n </span>\n </header>\n <div className=\"min-h-0 min-w-0 overflow-hidden\">\n {props.selectedTrace === undefined ? (\n <Card className=\"grid h-full place-items-center rounded-lg border-border bg-card p-6 text-sm font-medium text-muted-foreground\">\n {props.traceLoadState === \"loading\" ? \"Loading trace\" : \"Trace not found\"}\n </Card>\n ) : (\n <TracePanel\n traces={\n props.selectedSessionTraces.length > 0\n ? props.selectedSessionTraces\n : [props.selectedTrace]\n }\n onShowSessionTraces={props.onShowSessionTraces}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction TracePanel(props: {\n traces: StudioTrace[];\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n const orderedTraces = useMemo(\n () =>\n [...props.traces].sort(\n (left, right) => Date.parse(left.startedAt) - Date.parse(right.startedAt),\n ),\n [props.traces],\n );\n const firstTraceId = orderedTraces[0]?.id ?? \"\";\n const [activeTraceId, setActiveTraceId] = useState(firstTraceId);\n const [activeKey, setActiveKey] = useState<TraceInspectorKey>(\"trace\");\n useEffect(() => {\n setActiveTraceId(firstTraceId);\n setActiveKey(\"trace\");\n }, [firstTraceId]);\n\n const activeTrace = orderedTraces.find((trace) => trace.id === activeTraceId) ?? orderedTraces[0];\n const turns = activeTrace === undefined ? [] : traceTurns(activeTrace);\n const selectTimelineItem = (traceId: string, key: TraceInspectorKey) => {\n setActiveTraceId(traceId);\n setActiveKey(key);\n };\n\n if (activeTrace === undefined) {\n return (\n <section\n className=\"grid h-full min-h-0 w-full place-items-center text-sm font-medium text-muted-foreground\"\n aria-label=\"Traces\"\n >\n No trace selected\n </section>\n );\n }\n\n return (\n <section\n className=\"grid h-full min-h-0 w-full content-stretch overflow-hidden\"\n aria-label=\"Traces\"\n >\n <div className=\"grid h-full min-h-0 grid-cols-[320px_minmax(0,1fr)] overflow-hidden max-md:grid-cols-1\">\n <nav\n className=\"grid min-h-0 auto-rows-min content-start overflow-auto border-r border-border/80 bg-card/35 pr-2 max-md:max-h-80 max-md:border-b max-md:border-r-0\"\n aria-label=\"Trace timeline\"\n >\n <div className=\"sticky top-0 z-30 flex min-h-11 items-center justify-between bg-card/90 py-0 pl-0 pr-5 text-xs font-medium text-muted-foreground backdrop-blur\">\n <span>Search</span>\n <strong className=\"text-foreground\">Timeline</strong>\n </div>\n {orderedTraces.map((trace) => {\n const traceActive = activeTrace.id === trace.id;\n const traceTurnItems = traceTurns(trace);\n return (\n <div className=\"contents\" key={trace.id}>\n <TraceTreeRow\n active={traceActive && activeKey === \"trace\"}\n ancestorLevels={[]}\n hasChildren={true}\n isLastSibling={true}\n level={0}\n tone=\"trace\"\n title={trace.name ?? \"Agent\"}\n subtitle={formatDuration(trace.durationMs)}\n onSelect={() => selectTimelineItem(trace.id, \"trace\")}\n />\n <TraceTreeRow\n active={traceActive && activeKey === \"agent\"}\n ancestorLevels={[]}\n hasChildren={traceTurnItems.length > 0}\n isLastSibling={true}\n level={1}\n tone=\"agent\"\n title=\"agent.run\"\n subtitle={formatDuration(trace.durationMs)}\n onSelect={() => selectTimelineItem(trace.id, \"agent\")}\n />\n {traceTurnItems.map((turn) => (\n <div className=\"contents\" key={`${trace.id}:turn:${turn.turn}`}>\n <TraceTreeRow\n active={traceActive && activeKey === `turn:${turn.turn}`}\n ancestorLevels={[]}\n hasChildren={turn.observations.length > 0}\n isLastSibling={turn.turn === traceTurnItems.at(-1)?.turn}\n level={2}\n tone=\"turn\"\n title={`turn.${turn.turn}`}\n subtitle={formatDuration(turn.durationMs)}\n onSelect={() => selectTimelineItem(trace.id, `turn:${turn.turn}`)}\n />\n <TraceObservationRows\n activeKey={activeKey}\n isLastTurn={turn.turn === traceTurnItems.at(-1)?.turn}\n observations={turn.observations}\n onSelect={(observationId) =>\n selectTimelineItem(trace.id, `observation:${observationId}`)\n }\n traceActive={traceActive}\n />\n </div>\n ))}\n </div>\n );\n })}\n </nav>\n <TraceDetailPane\n trace={activeTrace}\n turns={turns}\n activeKey={activeKey}\n onShowSessionTraces={props.onShowSessionTraces}\n />\n </div>\n </section>\n );\n}\n\nfunction TraceTreeRow(props: {\n active: boolean;\n ancestorLevels: number[];\n hasChildren: boolean;\n isLastSibling: boolean;\n level: number;\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"];\n title: string;\n subtitle: string;\n onSelect: () => void;\n}) {\n const levelOffset = 22;\n const baseLeft = 12;\n const iconSize = 20;\n const iconCenter = baseLeft + iconSize / 2;\n const lineTop = 18;\n const xForLevel = (level: number) => iconCenter + level * levelOffset;\n\n return (\n <Button\n className={cn(\n \"relative grid h-auto min-h-0 w-full min-w-0 grid-cols-[20px_minmax(0,1fr)] items-start justify-start gap-2 whitespace-normal rounded-lg border-0 bg-transparent px-3 py-2.5 text-left text-muted-foreground shadow-none transition duration-200 hover:bg-accent/70 hover:text-accent-foreground\",\n props.active && \"bg-muted/45 text-foreground hover:bg-muted/45 hover:text-foreground\",\n )}\n type=\"button\"\n variant=\"ghost\"\n onClick={props.onSelect}\n style={{ paddingLeft: `${baseLeft + props.level * levelOffset}px` }}\n >\n {props.ancestorLevels.map((level) => (\n <span\n className=\"pointer-events-none absolute inset-y-0 w-px bg-muted-foreground/35\"\n style={{ left: `${xForLevel(level)}px` }}\n aria-hidden=\"true\"\n key={`ancestor-line-${level}`}\n />\n ))}\n {props.level > 0 ? (\n <>\n <span\n className=\"pointer-events-none absolute top-0 w-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level - 1)}px`,\n height: `${lineTop}px`,\n }}\n aria-hidden=\"true\"\n />\n {props.isLastSibling ? null : (\n <span\n className=\"pointer-events-none absolute bottom-0 w-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level - 1)}px`,\n top: `${lineTop}px`,\n }}\n aria-hidden=\"true\"\n />\n )}\n <span\n className=\"pointer-events-none absolute h-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level - 1)}px`,\n top: `${lineTop}px`,\n width: `${levelOffset}px`,\n }}\n aria-hidden=\"true\"\n />\n </>\n ) : null}\n {props.hasChildren ? (\n <span\n className=\"pointer-events-none absolute bottom-0 w-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level)}px`,\n top: `${lineTop}px`,\n }}\n aria-hidden=\"true\"\n />\n ) : null}\n <span\n className={cn(\n \"relative z-10 grid h-5 w-5 place-items-center rounded-lg bg-transparent [&_svg]:h-3 [&_svg]:w-3 [&_svg]:opacity-100\",\n traceToneIconClass(props.tone),\n )}\n >\n <TraceToneIcon tone={props.tone} />\n </span>\n <span className=\"grid min-w-0 gap-0.5\">\n <strong className=\"min-w-0 truncate text-sm font-medium leading-5 text-current\">\n {props.title}\n </strong>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {props.subtitle}\n </span>\n </span>\n </Button>\n );\n}\n\nfunction TraceObservationRows(props: {\n activeKey: TraceInspectorKey;\n isLastTurn: boolean;\n observations: TraceObservationItem[];\n traceActive: boolean;\n onSelect: (observationId: string) => void;\n}) {\n const roots = traceObservationTree(props.observations);\n return (\n <>\n {roots.map((node, index) => (\n <TraceObservationNodeRow\n activeKey={props.activeKey}\n ancestorLevels={props.isLastTurn ? [] : [1]}\n isLastSibling={index === roots.length - 1}\n key={node.observation.id}\n level={3}\n node={node}\n onSelect={props.onSelect}\n traceActive={props.traceActive}\n />\n ))}\n </>\n );\n}\n\nfunction TraceObservationNodeRow(props: {\n activeKey: TraceInspectorKey;\n ancestorLevels: number[];\n isLastSibling: boolean;\n level: number;\n node: TraceObservationNode;\n traceActive: boolean;\n onSelect: (observationId: string) => void;\n}) {\n const usageText = observationUsageText(props.node.observation);\n const childAncestorLevels = props.isLastSibling\n ? props.ancestorLevels\n : [...props.ancestorLevels, props.level];\n return (\n <>\n <TraceTreeRow\n active={props.traceActive && props.activeKey === `observation:${props.node.observation.id}`}\n ancestorLevels={props.ancestorLevels}\n hasChildren={props.node.children.length > 0}\n isLastSibling={props.isLastSibling}\n level={props.level}\n tone={props.node.observation.kind}\n title={traceObservationLabel(props.node.observation)}\n subtitle={\n usageText.length > 0\n ? `${formatDuration(props.node.observation.durationMs)} · ${usageText}`\n : formatDuration(props.node.observation.durationMs)\n }\n onSelect={() => props.onSelect(props.node.observation.id)}\n />\n {props.node.children.map((child, index) => (\n <TraceObservationNodeRow\n activeKey={props.activeKey}\n ancestorLevels={childAncestorLevels}\n isLastSibling={index === props.node.children.length - 1}\n key={child.observation.id}\n level={props.level + 1}\n node={child}\n onSelect={props.onSelect}\n traceActive={props.traceActive}\n />\n ))}\n </>\n );\n}\n\nfunction TraceDetailPane(props: {\n trace: StudioTrace;\n turns: Array<{ turn: number; observations: TraceObservationItem[]; durationMs?: number }>;\n activeKey: TraceInspectorKey;\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n const selected = selectedTraceDetail(props.trace, props.turns, props.activeKey);\n return (\n <section\n className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-card/70\"\n aria-label=\"Trace detail\"\n >\n <header className=\"border-b border-border/60 bg-card/70 px-6 py-5\">\n <div className=\"grid min-w-0 gap-5\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span\n className={cn(\n \"grid h-8 w-8 shrink-0 place-items-center rounded-lg bg-foreground text-background [&_svg]:h-4 [&_svg]:w-4 [&_svg]:opacity-100\",\n selected.tone !== \"trace\" && \"bg-muted text-foreground\",\n traceToneIconClass(selected.tone),\n )}\n >\n <TraceToneIcon tone={selected.tone} />\n </span>\n <div className=\"grid min-w-0 gap-1\">\n <h2 className=\"m-0 min-w-0 truncate text-2xl font-semibold leading-none tracking-[-0.01em] text-foreground\">\n {selected.title}\n </h2>\n <div className=\" text-xs font-medium text-muted-foreground\">\n {selected.startedAt}\n </div>\n </div>\n </div>\n </div>\n <div className=\"grid min-w-0 grid-cols-[repeat(auto-fit,minmax(150px,1fr))] gap-2\">\n <TraceMetric label=\"Duration\" value={formatDuration(selected.durationMs)} />\n {selected.firstDeltaMs === undefined ? null : (\n <TraceMetric label=\"First delta\" value={formatDuration(selected.firstDeltaMs)} />\n )}\n {selected.usage.length === 0 ? null : (\n <TraceMetric label=\"Usage\" value={selected.usage} />\n )}\n <button\n className=\"grid min-w-0 gap-1 rounded-lg bg-card/85 px-4 py-3 text-left transition duration-200 hover:bg-accent hover:text-accent-foreground\"\n type=\"button\"\n onClick={() => props.onShowSessionTraces(props.trace.sessionId)}\n >\n <span className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Session\n </span>\n <span className=\"min-w-0 truncate text-sm font-semibold text-current\">\n {props.trace.sessionId}\n </span>\n </button>\n </div>\n </div>\n </header>\n <div className=\"min-w-0 overflow-auto\">\n <div className=\"grid min-w-0 content-start gap-6 p-6\">\n {selected.input === undefined ? null : (\n <TraceDataSection title=\"Input\" value={selected.input} />\n )}\n {selected.output === undefined ? null : (\n <TraceDataSection title=\"Output\" value={selected.output} tone=\"success\" />\n )}\n {selected.error === undefined ? null : (\n <TraceDataSection title=\"Error\" value={selected.error} tone=\"error\" />\n )}\n <TraceDataSection title=\"Metadata\" value={selected.metadata} rawJson />\n </div>\n </div>\n </section>\n );\n}\n\nfunction TraceMetric(props: { label: string; value: string }) {\n return (\n <div className=\"grid min-w-0 gap-1 rounded-lg bg-card/85 px-4 py-3\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction TraceDataSection(props: {\n title: string;\n value: unknown;\n tone?: \"success\" | \"error\";\n compact?: boolean;\n rawJson?: boolean;\n}) {\n const rows = plainTraceValue(props.title, props.value);\n return (\n <section className=\"grid min-w-0 gap-3\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"m-0 text-lg font-semibold leading-tight text-foreground\">{props.title}</h3>\n <span className=\"h-px flex-1 bg-border/80\" aria-hidden=\"true\" />\n </div>\n {props.rawJson ? (\n <TraceJsonTree value={props.value} />\n ) : (\n <div className=\"grid min-w-0 gap-3\">\n {rows.map((item) => (\n <article\n className={cn(\n \"grid min-w-0 gap-3 rounded-lg bg-card/85 px-4 py-4\",\n props.compact &&\n \"grid-cols-[150px_minmax(0,1fr)] items-start gap-4 max-lg:grid-cols-1\",\n )}\n key={`${item.label}-${item.text}`}\n >\n <span className=\"flex min-w-0 items-center gap-2 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n <TraceRowIcon label={item.label} />\n {item.label}\n </span>\n <TraceRowContent compact={props.compact} item={item} tone={props.tone} />\n </article>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction TraceRowContent(props: {\n compact?: boolean | undefined;\n item: { label: string; text: string };\n tone?: \"success\" | \"error\" | undefined;\n}) {\n const historyItems = conversationHistoryItems(props.item);\n if (historyItems.length > 0) {\n return (\n <div className=\"grid min-w-0 gap-5\">\n {historyItems.map((item) => (\n <div className=\"grid min-w-0 gap-2\" key={`${item.index}-${item.role}-${item.text}`}>\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\" text-xs font-semibold tabular-nums text-muted-foreground\">\n {item.index}\n </span>\n <Badge\n className={cn(\n \"px-1.5 py-0.5\",\n item.role === \"User\" &&\n \"border-border/80 bg-muted-foreground/15 text-muted-foreground\",\n item.role === \"Assistant\" && \"border-border/80 bg-foreground/15 text-foreground\",\n item.role === \"Tool\" &&\n \"border-destructive/40 bg-destructive/15 text-destructive\",\n )}\n >\n {item.role}\n </Badge>\n </div>\n <p className=\"m-0 whitespace-pre-wrap text-sm leading-7 text-foreground [overflow-wrap:anywhere]\">\n {item.text}\n </p>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <p\n className={cn(\n \"m-0 whitespace-pre-wrap text-sm leading-7 text-foreground [overflow-wrap:anywhere]\",\n props.compact && \" text-sm leading-6\",\n props.tone === \"success\" && !isNeutralTraceRow(props.item) && \"text-foreground\",\n props.tone === \"error\" && \"text-destructive\",\n )}\n >\n {props.item.text}\n </p>\n );\n}\n\nfunction conversationHistoryItems(row: {\n label: string;\n text: string;\n}): Array<{ index: string; role: string; text: string }> {\n if (!row.label.startsWith(\"Conversation history\")) {\n return [];\n }\n return row.text\n .split(\"\\n\\n\")\n .flatMap((block): Array<{ index: string; role: string; text: string }> => {\n const [heading, ...content] = block.split(\"\\n\");\n const match = /^(\\d+)\\.\\s+(.+)$/.exec(heading ?? \"\");\n if (match === null) {\n return [];\n }\n return [\n {\n index: match[1] ?? \"\",\n role: match[2] ?? \"Message\",\n text: content.join(\"\\n\"),\n },\n ];\n });\n}\n"],"x_google_ignoreList":[2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trace-browser-CJNK5BWY.js","names":["ScrollArea","Fragment"],"sources":["../../../src/ui/app/modules/tracing/trace-browser-detail.tsx","../../../src/ui/app/components/ui/card.tsx","../../../../../node_modules/.pnpm/@radix-ui+react-scroll-area@1.2.18_@types+react-dom@19.2.3_@types+react@19.2.14__@types_65a050057147dec78e053f767925828d/node_modules/@radix-ui/react-scroll-area/dist/index.mjs","../../../src/ui/app/components/ui/scroll-area.tsx","../../../src/ui/app/modules/tracing/trace-browser.tsx"],"sourcesContent":["import {\n ArrowDown01Icon,\n ArrowRight01Icon,\n ArrowTurnBackwardIcon,\n ChatIcon,\n CpuIcon,\n GitBranchIcon,\n PathIcon,\n Robot01Icon,\n Settings02Icon,\n Wrench01Icon,\n} from \"@hugeicons/core-free-icons\";\nimport { useState } from \"react\";\nimport type { StudioTrace } from \"../../../../types\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { formatToolValue, formatTraceTime, formatUsage } from \"../shared/format\";\nimport { isRecord } from \"../shared/object\";\nimport { messageText } from \"../shared/transcript\";\nimport type { TraceInspectorKey, TraceObservationItem } from \"../shared/types\";\n\nexport function rawTraceJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2) ?? \"undefined\";\n } catch {\n return String(value);\n }\n}\n\nexport function TraceJsonTree(props: { value: unknown }) {\n return (\n <div className=\"overflow-x-auto rounded-lg bg-card/85 px-4 py-4 text-sm leading-6 text-foreground\">\n <JsonNode depth={0} path=\"$\" value={props.value} />\n </div>\n );\n}\n\nconst jsonIndentSize = 16;\nconst jsonDisclosureGutter = 20;\n\nfunction JsonNode(props: {\n arrayIndex?: number | undefined;\n depth: number;\n path: string;\n propertyKey?: string | undefined;\n trailingComma?: boolean | undefined;\n value: unknown;\n}) {\n if (isJsonBranch(props.value)) {\n return (\n <JsonBranch\n arrayIndex={props.arrayIndex}\n depth={props.depth}\n path={props.path}\n propertyKey={props.propertyKey}\n trailingComma={props.trailingComma}\n value={props.value}\n />\n );\n }\n\n return (\n <div\n className=\"min-w-max whitespace-pre\"\n style={{ paddingLeft: `${jsonContentIndent(props.depth)}px` }}\n >\n <JsonNodeLabel arrayIndex={props.arrayIndex} propertyKey={props.propertyKey} />\n <JsonPrimitive value={props.value} />\n {props.trailingComma ? <span className=\"text-foreground\">,</span> : null}\n </div>\n );\n}\n\nfunction JsonBranch(props: {\n arrayIndex?: number | undefined;\n depth: number;\n path: string;\n propertyKey?: string | undefined;\n trailingComma?: boolean | undefined;\n value: Record<string, unknown> | unknown[];\n}) {\n const [open, setOpen] = useState(props.depth === 0);\n const arrayValue = Array.isArray(props.value) ? props.value : undefined;\n const entries =\n arrayValue === undefined\n ? Object.entries(props.value as Record<string, unknown>)\n : arrayValue.map((item, index): [string, unknown] => [String(index), item]);\n const opening = arrayValue === undefined ? \"{\" : \"[\";\n const closing = arrayValue === undefined ? \"}\" : \"]\";\n const collapsed = arrayValue === undefined ? \"{…}\" : \"[…]\";\n\n if (entries.length === 0) {\n return (\n <div\n className=\"min-w-max whitespace-pre\"\n style={{ paddingLeft: `${jsonContentIndent(props.depth)}px` }}\n >\n <JsonNodeLabel arrayIndex={props.arrayIndex} propertyKey={props.propertyKey} />\n <span className=\"text-foreground\">\n {opening}\n {closing}\n {props.trailingComma ? \",\" : \"\"}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"grid min-w-max\">\n <button\n aria-expanded={open}\n className=\"grid min-w-max grid-cols-[16px_auto] items-center gap-1 rounded-lg py-0.5 pr-2 text-left transition duration-200 hover:bg-accent/45 hover:text-accent-foreground\"\n onClick={() => setOpen((current) => !current)}\n style={{ paddingLeft: `${props.depth * jsonIndentSize}px` }}\n type=\"button\"\n >\n <span className=\"grid h-4 w-4 place-items-center text-muted-foreground [&_svg]:h-3 [&_svg]:w-3\">\n {open ? (\n <StudioIcon icon={ArrowDown01Icon} aria-hidden=\"true\" />\n ) : (\n <StudioIcon icon={ArrowRight01Icon} aria-hidden=\"true\" />\n )}\n </span>\n <span className=\"whitespace-pre\">\n <JsonNodeLabel arrayIndex={props.arrayIndex} propertyKey={props.propertyKey} />\n {open ? (\n <span className=\"text-foreground\">{opening}</span>\n ) : (\n <span className=\"text-muted-foreground\">{collapsed}</span>\n )}\n {!open && props.trailingComma ? <span className=\"text-foreground\">,</span> : null}\n </span>\n </button>\n {open ? (\n <>\n {entries.map(([key, value], index) => (\n <JsonNode\n arrayIndex={arrayValue === undefined ? undefined : Number(key)}\n depth={props.depth + 1}\n key={`${props.path}.${key}`}\n path={`${props.path}.${key}`}\n propertyKey={arrayValue === undefined ? key : undefined}\n trailingComma={index < entries.length - 1}\n value={value}\n />\n ))}\n <div\n className=\"min-w-max whitespace-pre text-foreground\"\n style={{ paddingLeft: `${jsonContentIndent(props.depth)}px` }}\n >\n {closing}\n {props.trailingComma ? \",\" : \"\"}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n\nfunction jsonContentIndent(depth: number): number {\n return depth * jsonIndentSize + jsonDisclosureGutter;\n}\n\nfunction JsonNodeLabel(props: {\n arrayIndex?: number | undefined;\n propertyKey?: string | undefined;\n}) {\n if (props.propertyKey !== undefined) {\n return (\n <>\n <span className=\"text-muted-foreground\">{JSON.stringify(props.propertyKey)}</span>\n <span className=\"text-foreground\">: </span>\n </>\n );\n }\n if (props.arrayIndex !== undefined) {\n return (\n <>\n <span className=\"text-muted-foreground\">[{props.arrayIndex}]</span>\n <span className=\"text-foreground\"> </span>\n </>\n );\n }\n return null;\n}\n\nfunction JsonPrimitive(props: { value: unknown }) {\n if (typeof props.value === \"string\") {\n return <span className=\"text-foreground\">{JSON.stringify(props.value)}</span>;\n }\n if (typeof props.value === \"number\") {\n return <span className=\"text-foreground\">{String(props.value)}</span>;\n }\n if (typeof props.value === \"boolean\") {\n return <span className=\"text-chart-4\">{String(props.value)}</span>;\n }\n if (props.value === null) {\n return <span className=\"text-muted-foreground\">null</span>;\n }\n if (props.value === undefined) {\n return <span className=\"text-muted-foreground\">undefined</span>;\n }\n return <span className=\"text-foreground\">{rawTraceJson(props.value)}</span>;\n}\n\nfunction isJsonBranch(value: unknown): value is Record<string, unknown> | unknown[] {\n return Array.isArray(value) || isRecord(value);\n}\n\nexport function jsonSyntaxTokens(\n json: string,\n): Array<{ text: string; type: JsonTokenType; start: number }> {\n const tokenPattern =\n /(\"(?:\\\\u[\\da-fA-F]{4}|\\\\[^u]|[^\\\\\"])*\"(?=\\s*:)|\"(?:\\\\u[\\da-fA-F]{4}|\\\\[^u]|[^\\\\\"])*\"|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|\\btrue\\b|\\bfalse\\b|\\bnull\\b)/g;\n const tokens: Array<{ text: string; type: JsonTokenType; start: number }> = [];\n let cursor = 0;\n for (const match of json.matchAll(tokenPattern)) {\n const text = match[0];\n const index = match.index ?? 0;\n if (index > cursor) {\n tokens.push({ text: json.slice(cursor, index), type: \"plain\", start: cursor });\n }\n tokens.push({\n text,\n type: jsonTokenType(text, json.slice(index + text.length)),\n start: index,\n });\n cursor = index + text.length;\n }\n if (cursor < json.length) {\n tokens.push({ text: json.slice(cursor), type: \"plain\", start: cursor });\n }\n return tokens;\n}\n\ntype JsonTokenType = \"plain\" | \"key\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n\nfunction jsonTokenType(text: string, followingText: string): JsonTokenType {\n if (text.startsWith('\"')) {\n return followingText.trimStart().startsWith(\":\") ? \"key\" : \"string\";\n }\n if (text === \"true\" || text === \"false\") {\n return \"boolean\";\n }\n if (text === \"null\") {\n return \"null\";\n }\n return \"number\";\n}\n\nexport function isNeutralTraceRow(row: { label: string }): boolean {\n return row.label === \"Message Id\";\n}\n\nexport function TraceRowIcon(props: { label: string }) {\n const className = \"h-3.5 w-3.5 shrink-0\";\n switch (props.label) {\n case \"System prompt\":\n return <StudioIcon icon={Settings02Icon} aria-hidden=\"true\" className={className} />;\n case \"Prompt\":\n return <StudioIcon icon={ChatIcon} aria-hidden=\"true\" className={className} />;\n case \"Output\":\n case \"Assistant output\":\n return <StudioIcon icon={ArrowTurnBackwardIcon} aria-hidden=\"true\" className={className} />;\n default:\n return null;\n }\n}\n\nexport function plainTraceValue(\n title: string,\n value: unknown,\n): Array<{ label: string; text: string }> {\n if (title === \"Output\") {\n const outputRows = plainTraceOutput(value);\n if (outputRows.length > 0) {\n return outputRows;\n }\n }\n const messageRows = plainTraceInput(value, title);\n if (messageRows.length > 0) {\n return messageRows;\n }\n if (!isRecord(value)) {\n return [{ label: title, text: plainTraceText(value) }];\n }\n\n const rows: Array<{ label: string; text: string }> = [];\n for (const [key, item] of Object.entries(value)) {\n const nestedMessages = plainTraceInput(item, key);\n if (nestedMessages.length > 0) {\n rows.push(...nestedMessages);\n continue;\n }\n rows.push({ label: traceLabelText(key), text: plainTraceText(item) });\n }\n return rows.length > 0 ? rows : [{ label: title, text: \"Empty object\" }];\n}\n\nfunction plainTraceOutput(value: unknown): Array<{ label: string; text: string }> {\n if (!isRecord(value)) {\n return [];\n }\n const rows: Array<{ label: string; text: string }> = [];\n const choiceRows = plainTraceInput(value.choice, \"choice\");\n rows.push(...choiceRows);\n if (typeof value.messageId === \"string\" && value.messageId.length > 0) {\n rows.push({ label: \"Message Id\", text: value.messageId });\n }\n return rows;\n}\n\nfunction plainTraceInput(\n value: unknown,\n parentKey?: string,\n): Array<{ label: string; text: string }> {\n if (typeof value === \"string\" && parentKey === undefined) {\n return [{ label: \"Value\", text: value }];\n }\n if (Array.isArray(value)) {\n if (parentKey === \"chatHistory\") {\n return chatHistoryRows(value);\n }\n if (parentKey === \"history\") {\n return conversationHistoryRows(value);\n }\n return value\n .map((item, index) => ({\n label: traceArrayItemLabel(item, index, parentKey),\n text: messageText(item) || formatToolValue(item),\n }))\n .filter((item) => item.text.length > 0);\n }\n if (!isRecord(value)) {\n return [];\n }\n\n const chatHistory = Array.isArray(value.chatHistory) ? value.chatHistory : undefined;\n if (chatHistory !== undefined) {\n const rows = systemPromptRows(value);\n rows.push(...plainTraceInput(chatHistory, \"chatHistory\"));\n return rows;\n }\n\n if (Array.isArray(value.prompt)) {\n return plainTraceInput(value.prompt, \"prompt\");\n }\n\n const rows: Array<{ label: string; text: string }> = [];\n rows.push(...systemPromptRows(value));\n\n const history = Array.isArray(value.history) ? value.history : [];\n if (history.length > 0) {\n rows.push(...plainTraceInput(history, \"history\"));\n }\n\n const promptText = messageText(value.prompt);\n if (promptText.length > 0) {\n rows.push({ label: history.length > 0 ? \"Current prompt\" : \"Prompt\", text: promptText });\n }\n\n return rows;\n}\n\nfunction chatHistoryRows(value: unknown[]): Array<{ label: string; text: string }> {\n const messages = value\n .map((item, index) => ({\n label: traceArrayItemLabel(item, index, \"chatHistory\"),\n text: messageText(item) || formatToolValue(item),\n }))\n .filter((item) => item.text.length > 0);\n const current = messages.at(-1);\n const history = messages.slice(0, -1);\n const rows: Array<{ label: string; text: string }> = [];\n if (history.length > 0) {\n rows.push({\n label: `Conversation history (${history.length})`,\n text: history.map((item, index) => `${index + 1}. ${item.label}\\n${item.text}`).join(\"\\n\\n\"),\n });\n }\n if (current !== undefined) {\n rows.push({\n label: history.length > 0 ? \"Current prompt\" : \"Prompt\",\n text: current.text,\n });\n }\n return rows;\n}\n\nfunction conversationHistoryRows(value: unknown[]): Array<{ label: string; text: string }> {\n const messages = value\n .map((item, index) => ({\n label: traceArrayItemLabel(item, index, \"history\"),\n text: messageText(item) || formatToolValue(item),\n }))\n .filter((item) => item.text.length > 0);\n if (messages.length === 0) {\n return [];\n }\n return [\n {\n label: `Conversation history (${messages.length})`,\n text: messages.map((item, index) => `${index + 1}. ${item.label}\\n${item.text}`).join(\"\\n\\n\"),\n },\n ];\n}\n\nfunction traceArrayItemLabel(item: unknown, index: number, parentKey: string | undefined): string {\n if (isRecord(item)) {\n const type = typeof item.type === \"string\" ? item.type : undefined;\n if (parentKey === \"choice\") {\n if (type === \"text\") {\n return \"Assistant output\";\n }\n if (type === \"reasoning\") {\n return \"Reasoning\";\n }\n }\n if (type === \"reasoning\") {\n return \"Reasoning\";\n }\n if (typeof item.role === \"string\") {\n return traceLabelText(item.role);\n }\n if (type !== undefined) {\n return traceLabelText(type);\n }\n }\n\n const prefix = parentKey === undefined ? \"Item\" : `${traceLabelText(parentKey)} item`;\n return `${prefix} ${index + 1}`;\n}\n\nfunction traceLabelText(value: string): string {\n return value\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .trim()\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n}\n\nfunction systemPromptRows(value: Record<string, unknown>): Array<{ label: string; text: string }> {\n const instructions = value.instructions;\n if (typeof instructions !== \"string\" || instructions.trim().length === 0) {\n return [];\n }\n return [{ label: \"System prompt\", text: instructions }];\n}\n\nfunction plainTraceText(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function traceTurns(trace: StudioTrace): Array<{\n turn: number;\n observations: TraceObservationItem[];\n durationMs?: number;\n}> {\n const grouped = new Map<number, TraceObservationItem[]>();\n for (const observation of trace.observations) {\n const turn = Number.isFinite(observation.turn) ? observation.turn : grouped.size + 1;\n grouped.set(turn, [...(grouped.get(turn) ?? []), observation]);\n }\n return [...grouped.entries()]\n .sort(([left], [right]) => left - right)\n .map(([turn, observations]) => ({\n turn,\n observations,\n durationMs: observations.reduce(\n (total, observation) => total + (observation.durationMs ?? 0),\n 0,\n ),\n }));\n}\n\nexport type TraceObservationNode = {\n observation: TraceObservationItem;\n children: TraceObservationNode[];\n};\n\nexport function traceObservationTree(observations: TraceObservationItem[]): TraceObservationNode[] {\n const nodes = new Map<string, TraceObservationNode>();\n for (const observation of observations) {\n nodes.set(observation.id, { observation, children: [] });\n }\n\n const roots: TraceObservationNode[] = [];\n for (const observation of observations) {\n const node = nodes.get(observation.id);\n if (node === undefined) {\n continue;\n }\n const parentId = observation.parentObservationId;\n const parent = parentId === undefined ? undefined : nodes.get(parentId);\n if (parent === undefined) {\n roots.push(node);\n } else {\n parent.children.push(node);\n }\n }\n return roots;\n}\n\nexport function selectedTraceDetail(\n trace: StudioTrace,\n turns: Array<{ turn: number; observations: TraceObservationItem[]; durationMs?: number }>,\n activeKey: TraceInspectorKey,\n): {\n title: string;\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"];\n startedAt: string;\n durationMs: number | undefined;\n firstDeltaMs: number | undefined;\n usage: string;\n input?: unknown;\n output?: unknown;\n error?: unknown;\n metadata: unknown;\n} {\n if (activeKey === \"agent\") {\n return {\n title: \"agent.run\",\n tone: \"agent\",\n startedAt: formatTraceTime(trace.startedAt),\n durationMs: trace.durationMs,\n firstDeltaMs: firstDeltaMsFromObservations(trace.observations),\n usage: formatUsage(trace.usage),\n input: trace.input,\n output: trace.output,\n error: trace.error,\n metadata: traceDetailMetadata(trace),\n };\n }\n if (activeKey.startsWith(\"turn:\")) {\n const turnNumber = Number(activeKey.slice(\"turn:\".length));\n const turn = turns.find((item) => item.turn === turnNumber);\n return {\n title: `turn.${Number.isFinite(turnNumber) ? turnNumber : 1}`,\n tone: \"turn\",\n startedAt: formatTraceTime(turn?.observations[0]?.startedAt ?? trace.startedAt),\n durationMs: turn?.durationMs,\n firstDeltaMs: firstDeltaMsFromObservations(turn?.observations ?? []),\n usage: turnUsageText(turn?.observations ?? []),\n input: turn?.observations[0]?.input,\n output: turn?.observations.at(-1)?.output,\n metadata: turnDetailMetadata(turnNumber, turn?.observations ?? []),\n };\n }\n if (activeKey.startsWith(\"observation:\")) {\n const observationId = activeKey.slice(\"observation:\".length);\n const observation = trace.observations.find((item) => item.id === observationId);\n if (observation !== undefined) {\n return {\n title: traceObservationLabel(observation),\n tone: observation.kind,\n startedAt: formatTraceTime(observation.startedAt),\n durationMs: observation.durationMs,\n firstDeltaMs: firstDeltaMsFromMetadata(observation.metadata),\n usage: observationUsageText(observation),\n input: observation.input,\n output: observation.output,\n error: observation.error,\n metadata: observationDetailMetadata(observation),\n };\n }\n }\n return {\n title: trace.name ?? \"Agent\",\n tone: \"trace\",\n startedAt: formatTraceTime(trace.startedAt),\n durationMs: trace.durationMs,\n firstDeltaMs: firstDeltaMsFromObservations(trace.observations),\n usage: formatUsage(trace.usage),\n input: trace.input,\n output: trace.output,\n error: trace.error,\n metadata: traceDetailMetadata(trace),\n };\n}\n\nexport function traceDetailMetadata(trace: StudioTrace): Record<string, unknown> {\n const metadata = isRecord(trace.metadata) ? trace.metadata : {};\n const traceGroup = compactTraceMetadata({\n status: trace.status,\n traceId: trace.trace?.traceId ?? trace.id,\n observationId: trace.trace?.observationId,\n sessionId: trace.sessionId,\n observationCount: trace.observationCount,\n messageCount: traceMessageCount(metadata.messages),\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n });\n return compactTraceMetadata({\n ...metadata,\n status: trace.status,\n traceId: trace.trace?.traceId ?? trace.id,\n observationId: trace.trace?.observationId,\n sessionId: trace.sessionId,\n observationCount: trace.observationCount,\n messageCount: traceMessageCount(metadata.messages),\n startedAt: trace.startedAt,\n endedAt: trace.endedAt,\n durationMs: trace.durationMs,\n trace: isRecord(metadata.trace) ? metadata.trace : traceGroup,\n });\n}\n\nfunction turnDetailMetadata(\n turn: number,\n observations: TraceObservationItem[],\n): Record<string, unknown> {\n return compactTraceMetadata({\n turn,\n observationCount: observations.length,\n generationCount: observations.filter((observation) => observation.kind === \"generation\").length,\n toolCount: observations.filter((observation) => observation.kind === \"tool\").length,\n agentCount: observations.filter((observation) => observation.kind === \"agent\").length,\n firstDeltaMs: firstDeltaMsFromObservations(observations),\n status: observationStatusSummary(observations),\n startedAt: observations[0]?.startedAt,\n endedAt: observations.at(-1)?.endedAt,\n });\n}\n\nexport function observationDetailMetadata(\n observation: TraceObservationItem,\n): Record<string, unknown> {\n const metadata = isRecord(observation.metadata) ? observation.metadata : {};\n const base = compactTraceMetadata({\n ...metadata,\n status: observation.status,\n kind: observation.kind,\n turn: observation.turn,\n parentObservationId: observation.parentObservationId ?? null,\n startedAt: observation.startedAt,\n endedAt: observation.endedAt ?? null,\n durationMs: observation.durationMs,\n });\n return compactTraceMetadata({\n ...base,\n trace: isRecord(base.trace)\n ? base.trace\n : compactTraceMetadata({\n status: observation.status,\n kind: observation.kind,\n turn: observation.turn,\n parentObservationId: observation.parentObservationId ?? null,\n startedAt: observation.startedAt,\n endedAt: observation.endedAt ?? null,\n durationMs: observation.durationMs,\n }),\n modelInfo: isRecord(base.modelInfo) ? base.modelInfo : modelInfoMetadata(base),\n modelCall: isRecord(base.modelCall) ? base.modelCall : modelCallMetadata(base),\n response: isRecord(base.response) ? base.response : responseMetadata(base),\n tools: isRecord(base.tools) ? base.tools : toolsMetadata(base),\n timing: isRecord(base.timing) ? base.timing : timingMetadata(base),\n });\n}\n\nfunction modelInfoMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n provider: metadata.provider,\n model: metadata.model,\n requestedModel: metadata.requestedModel,\n defaultModel: metadata.defaultModel,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction modelCallMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const request = compactTraceMetadata({\n messageCount: metadata.historyCount,\n documentCount: metadata.documentCount,\n toolCount: metadata.toolCount,\n toolNames: metadata.toolNames,\n temperature: metadata.temperature,\n maxTokens: metadata.maxTokens,\n toolChoice: metadata.toolChoice,\n hasOutputSchema: metadata.hasOutputSchema,\n additionalParamKeys: metadata.additionalParamKeys,\n });\n const group = compactTraceMetadata({\n request: Object.keys(request).length === 0 ? undefined : request,\n providerRequest: metadata.providerRequest,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction responseMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n messageId: metadata.messageId,\n usage: metadata.usage,\n providerResponse: metadata.providerResponse,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction toolsMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n count: metadata.toolCount,\n names: metadata.toolNames,\n toolChoice: metadata.toolChoice,\n internalCallId: metadata.internalCallId,\n toolCallId: metadata.toolCallId,\n skipped: metadata.skipped,\n description: metadata.toolDescription,\n parameterKeys: metadata.parameterKeys,\n requiredParameterKeys: metadata.requiredParameterKeys,\n approvalRequired: metadata.approvalRequired,\n mcpServerName: metadata.mcpServerName,\n argumentBytes: metadata.argumentBytes,\n resultBytes: metadata.resultBytes,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nfunction timingMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const group = compactTraceMetadata({\n firstDeltaMs: metadata.firstDeltaMs,\n durationMs: metadata.durationMs,\n startedAt: metadata.startedAt,\n endedAt: metadata.endedAt,\n });\n return Object.keys(group).length === 0 ? undefined : group;\n}\n\nexport function observationStatusSummary(observations: TraceObservationItem[]): string {\n if (observations.length === 0) {\n return \"empty\";\n }\n if (observations.some((observation) => observation.status === \"error\")) {\n return \"error\";\n }\n if (observations.some((observation) => observation.status === \"running\")) {\n return \"running\";\n }\n return \"success\";\n}\n\nfunction traceMessageCount(value: unknown): number | undefined {\n return Array.isArray(value) ? value.length : undefined;\n}\n\nexport function compactTraceMetadata(values: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined));\n}\n\nexport function traceObservationLabel(observation: TraceObservationItem): string {\n if (observation.kind === \"agent\") {\n return observation.name;\n }\n return observation.kind === \"tool\" ? `tool.${observation.name}` : observation.name;\n}\n\nexport function firstDeltaMsFromObservations(\n observations: TraceObservationItem[],\n): number | undefined {\n for (const observation of observations) {\n const firstDeltaMs = firstDeltaMsFromMetadata(observation.metadata);\n if (firstDeltaMs !== undefined) {\n return firstDeltaMs;\n }\n }\n return undefined;\n}\n\nfunction firstDeltaMsFromMetadata(metadata: unknown): number | undefined {\n if (!isRecord(metadata) || typeof metadata.firstDeltaMs !== \"number\") {\n return undefined;\n }\n return metadata.firstDeltaMs;\n}\n\nexport function statusDotClass(status: StudioTrace[\"status\"]): string {\n switch (status) {\n case \"success\":\n return \"bg-foreground\";\n case \"error\":\n return \"bg-destructive\";\n case \"running\":\n return \"bg-muted-foreground\";\n }\n}\n\nexport function TraceToneIcon(props: {\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"];\n}) {\n switch (props.tone) {\n case \"trace\":\n return <StudioIcon icon={PathIcon} aria-hidden=\"true\" />;\n case \"agent\":\n return <StudioIcon icon={Robot01Icon} aria-hidden=\"true\" />;\n case \"turn\":\n return <StudioIcon icon={GitBranchIcon} aria-hidden=\"true\" />;\n case \"generation\":\n return <StudioIcon icon={CpuIcon} aria-hidden=\"true\" />;\n case \"tool\":\n return <StudioIcon icon={Wrench01Icon} aria-hidden=\"true\" />;\n }\n}\n\nexport function traceToneIconClass(\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"],\n): string {\n switch (tone) {\n case \"trace\":\n return \"bg-foreground text-background\";\n case \"agent\":\n return \"bg-muted-foreground text-background\";\n case \"turn\":\n return \"bg-chart-4 text-background\";\n case \"generation\":\n return \"bg-foreground text-background\";\n case \"tool\":\n return \"bg-destructive text-background\";\n }\n}\n\nexport function observationUsageText(observation: TraceObservationItem): string {\n if (!isRecord(observation.output) || !isRecord(observation.output.usage)) {\n return \"\";\n }\n return formatUsageValue(observation.output.usage);\n}\n\nexport function turnUsageText(observations: TraceObservationItem[]): string {\n const totals = observations\n .map(observationUsageText)\n .filter((usage) => usage.length > 0)\n .join(\" + \");\n return totals;\n}\n\nfunction formatUsageValue(value: Record<string, unknown>): string {\n const input = typeof value.inputTokens === \"number\" ? value.inputTokens : 0;\n const output = typeof value.outputTokens === \"number\" ? value.outputTokens : 0;\n const total = typeof value.totalTokens === \"number\" ? value.totalTokens : input + output;\n if (total === 0) {\n return \"\";\n }\n return `${input} -> ${output} (Σ ${total})`;\n}\n","import type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"rounded-xl border border-border/80 bg-card/95 text-card-foreground shadow-sm shadow-black/20\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"grid gap-1.5 p-4\", className)} {...props} />;\n}\n\nexport function CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"p-4 pt-0\", className)} {...props} />;\n}\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/scroll-area.tsx\nimport * as React2 from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { clamp } from \"@radix-ui/number\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// src/use-state-machine.ts\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n__name(useStateMachine, \"useStateMachine\");\n\n// src/scroll-area.tsx\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar SCROLL_AREA_NAME = \"ScrollArea\";\nvar [createScrollAreaContext, createScrollAreaScope] = createContextScope(SCROLL_AREA_NAME);\nvar [ScrollAreaProvider, useScrollAreaContext] = createScrollAreaContext(SCROLL_AREA_NAME);\nvar ScrollArea = /* @__PURE__ */ React2.forwardRef(\n /* @__PURE__ */ __name(function ScrollArea2(props, forwardedRef) {\n const {\n __scopeScrollArea,\n type = \"hover\",\n dir,\n scrollHideDelay = 600,\n ...scrollAreaProps\n } = props;\n const [scrollArea, setScrollArea] = React2.useState(null);\n const [viewport, setViewport] = React2.useState(null);\n const [content, setContent] = React2.useState(null);\n const [scrollbarX, setScrollbarX] = React2.useState(null);\n const [scrollbarY, setScrollbarY] = React2.useState(null);\n const [cornerWidth, setCornerWidth] = React2.useState(0);\n const [cornerHeight, setCornerHeight] = React2.useState(0);\n const [scrollbarXEnabled, setScrollbarXEnabled] = React2.useState(false);\n const [scrollbarYEnabled, setScrollbarYEnabled] = React2.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, setScrollArea);\n const direction = useDirection(dir);\n return /* @__PURE__ */ jsx(\n ScrollAreaProvider,\n {\n scope: __scopeScrollArea,\n type,\n dir: direction,\n scrollHideDelay,\n scrollArea,\n viewport,\n onViewportChange: setViewport,\n content,\n onContentChange: setContent,\n scrollbarX,\n onScrollbarXChange: setScrollbarX,\n scrollbarXEnabled,\n onScrollbarXEnabledChange: setScrollbarXEnabled,\n scrollbarY,\n onScrollbarYChange: setScrollbarY,\n scrollbarYEnabled,\n onScrollbarYEnabledChange: setScrollbarYEnabled,\n onCornerWidthChange: setCornerWidth,\n onCornerHeightChange: setCornerHeight,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n ...scrollAreaProps,\n ref: composedRefs,\n style: {\n position: \"relative\",\n // Pass corner sizes as CSS vars to reduce re-renders of context consumers\n \"--radix-scroll-area-corner-width\": cornerWidth + \"px\",\n \"--radix-scroll-area-corner-height\": cornerHeight + \"px\",\n ...props.style\n }\n }\n )\n }\n );\n }, \"ScrollArea\")\n);\nvar VIEWPORT_NAME = \"ScrollAreaViewport\";\nvar ScrollAreaViewport = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaViewport2(props, forwardedRef) {\n const { __scopeScrollArea, children, nonce, ...viewportProps } = props;\n const context = useScrollAreaContext(VIEWPORT_NAME, __scopeScrollArea);\n const ref = React2.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onViewportChange);\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(ScrollAreaViewportStyle, { nonce }),\n /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-radix-scroll-area-viewport\": \"\",\n ...viewportProps,\n ref: composedRefs,\n style: {\n /**\n * We don't support `visible` because the intention is to have at least one scrollbar\n * if this component is used and `visible` will behave like `auto` in that case\n * https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#description\n *\n * We don't handle `auto` because the intention is for the native implementation\n * to be hidden if using this component. We just want to ensure the node is scrollable\n * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent\n * the browser from having to work out whether to render native scrollbars or not,\n * we tell it to with the intention of hiding them in CSS.\n */\n overflowX: context.scrollbarXEnabled ? \"scroll\" : \"hidden\",\n overflowY: context.scrollbarYEnabled ? \"scroll\" : \"hidden\",\n ...props.style\n },\n children: /* @__PURE__ */ jsx(\"div\", { ref: context.onContentChange, style: { minWidth: \"100%\", display: \"table\" }, children })\n }\n )\n ] });\n }, \"ScrollAreaViewport\")\n);\nvar ScrollAreaViewportStyle = /* @__PURE__ */ React2.memo(\n /* @__PURE__ */ __name(function ScrollAreaViewportStyle2({ nonce }) {\n return /* @__PURE__ */ jsx(\n \"style\",\n {\n dangerouslySetInnerHTML: {\n __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`\n },\n nonce\n }\n );\n }, \"ScrollAreaViewportStyle\"),\n (prevProps, nextProps) => prevProps.nonce === nextProps.nonce\n);\nvar SCROLLBAR_NAME = \"ScrollAreaScrollbar\";\nvar ScrollAreaScrollbar = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaScrollbar2(props, forwardedRef) {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { onScrollbarXEnabledChange, onScrollbarYEnabledChange } = context;\n const isHorizontal = props.orientation === \"horizontal\";\n React2.useEffect(() => {\n isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);\n return () => {\n isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);\n };\n }, [isHorizontal, onScrollbarXEnabledChange, onScrollbarYEnabledChange]);\n return context.type === \"hover\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarHover, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"scroll\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarScroll, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"auto\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarAuto, { ...scrollbarProps, ref: forwardedRef, forceMount }) : context.type === \"always\" ? /* @__PURE__ */ jsx(ScrollAreaScrollbarVisible, { ...scrollbarProps, ref: forwardedRef, \"data-state\": \"visible\" }) : null;\n }, \"ScrollAreaScrollbar\")\n);\nvar ScrollAreaScrollbarHover = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarHover2(props, forwardedRef) {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [visible, setVisible] = React2.useState(false);\n React2.useEffect(() => {\n const scrollArea = context.scrollArea;\n let hideTimer = 0;\n if (scrollArea) {\n const handlePointerEnter = /* @__PURE__ */ __name(() => {\n window.clearTimeout(hideTimer);\n setVisible(true);\n }, \"handlePointerEnter\");\n const handlePointerLeave = /* @__PURE__ */ __name(() => {\n hideTimer = window.setTimeout(() => setVisible(false), context.scrollHideDelay);\n }, \"handlePointerLeave\");\n scrollArea.addEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.addEventListener(\"pointerleave\", handlePointerLeave);\n return () => {\n window.clearTimeout(hideTimer);\n scrollArea.removeEventListener(\"pointerenter\", handlePointerEnter);\n scrollArea.removeEventListener(\"pointerleave\", handlePointerLeave);\n };\n }\n }, [context.scrollArea, context.scrollHideDelay]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarAuto,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n}, \"ScrollAreaScrollbarHover\"));\nvar ScrollAreaScrollbarScroll = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarScroll2(props, forwardedRef) {\n const { forceMount, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const isHorizontal = props.orientation === \"horizontal\";\n const debounceScrollEnd = useDebounceCallback(() => send(\"SCROLL_END\"), 100);\n const [state, send] = useStateMachine(\"hidden\", {\n hidden: {\n SCROLL: \"scrolling\"\n },\n scrolling: {\n SCROLL_END: \"idle\",\n POINTER_ENTER: \"interacting\"\n },\n interacting: {\n SCROLL: \"interacting\",\n POINTER_LEAVE: \"idle\"\n },\n idle: {\n HIDE: \"hidden\",\n SCROLL: \"scrolling\",\n POINTER_ENTER: \"interacting\"\n }\n });\n React2.useEffect(() => {\n if (state === \"idle\") {\n const hideTimer = window.setTimeout(() => send(\"HIDE\"), context.scrollHideDelay);\n return () => window.clearTimeout(hideTimer);\n }\n }, [state, context.scrollHideDelay, send]);\n React2.useEffect(() => {\n const viewport = context.viewport;\n const scrollDirection = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n if (viewport) {\n let prevScrollPos = viewport[scrollDirection];\n const handleScroll = /* @__PURE__ */ __name(() => {\n const scrollPos = viewport[scrollDirection];\n const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;\n if (hasScrollInDirectionChanged) {\n send(\"SCROLL\");\n debounceScrollEnd();\n }\n prevScrollPos = scrollPos;\n }, \"handleScroll\");\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [context.viewport, isHorizontal, send, debounceScrollEnd]);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || state !== \"hidden\", children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": state === \"hidden\" ? \"hidden\" : \"visible\",\n ...scrollbarProps,\n ref: forwardedRef,\n onPointerEnter: composeEventHandlers(props.onPointerEnter, () => send(\"POINTER_ENTER\")),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => send(\"POINTER_LEAVE\"))\n }\n ) });\n}, \"ScrollAreaScrollbarScroll\"));\nvar ScrollAreaScrollbarAuto = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarAuto2(props, forwardedRef) {\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const { forceMount, ...scrollbarProps } = props;\n const [visible, setVisible] = React2.useState(false);\n const isHorizontal = props.orientation === \"horizontal\";\n const handleResize = useDebounceCallback(() => {\n if (context.viewport) {\n const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;\n const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;\n setVisible(isHorizontal ? isOverflowX : isOverflowY);\n }\n }, 10);\n useResizeObserver(context.viewport, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || visible, children: /* @__PURE__ */ jsx(\n ScrollAreaScrollbarVisible,\n {\n \"data-state\": visible ? \"visible\" : \"hidden\",\n ...scrollbarProps,\n ref: forwardedRef\n }\n ) });\n}, \"ScrollAreaScrollbarAuto\"));\nvar ScrollAreaScrollbarVisible = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarVisible2(props, forwardedRef) {\n const { orientation = \"vertical\", ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const thumbRef = React2.useRef(null);\n const pointerOffsetRef = React2.useRef(0);\n const [sizes, setSizes] = React2.useState({\n content: 0,\n viewport: 0,\n scrollbar: { size: 0, paddingStart: 0, paddingEnd: 0 }\n });\n const thumbRatio = getThumbRatio(sizes.viewport, sizes.content);\n const commonProps = {\n ...scrollbarProps,\n sizes,\n onSizesChange: setSizes,\n hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),\n onThumbChange: /* @__PURE__ */ __name((thumb) => thumbRef.current = thumb, \"onThumbChange\"),\n onThumbPointerUp: /* @__PURE__ */ __name(() => pointerOffsetRef.current = 0, \"onThumbPointerUp\"),\n onThumbPointerDown: /* @__PURE__ */ __name((pointerPos) => pointerOffsetRef.current = pointerPos, \"onThumbPointerDown\")\n };\n function getScrollPosition(pointerPos, dir) {\n return getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);\n }\n __name(getScrollPosition, \"getScrollPosition\");\n if (orientation === \"horizontal\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarX,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollLeft;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes, context.dir);\n thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollLeft = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) {\n context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);\n }\n }\n }\n );\n }\n if (orientation === \"vertical\") {\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarY,\n {\n ...commonProps,\n ref: forwardedRef,\n onThumbPositionChange: () => {\n if (context.viewport && thumbRef.current) {\n const scrollPos = context.viewport.scrollTop;\n const offset = getThumbOffsetFromScroll(scrollPos, sizes);\n thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;\n }\n },\n onWheelScroll: (scrollPos) => {\n if (context.viewport) context.viewport.scrollTop = scrollPos;\n },\n onDragScroll: (pointerPos) => {\n if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);\n }\n }\n );\n }\n return null;\n}, \"ScrollAreaScrollbarVisible\"));\nvar ScrollAreaScrollbarX = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarX2(props, forwardedRef) {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"horizontal\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n bottom: 0,\n left: context.dir === \"rtl\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n right: context.dir === \"ltr\" ? \"var(--radix-scroll-area-corner-width)\" : 0,\n \"--radix-scroll-area-thumb-width\": getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.x),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.x),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollLeft + event.deltaX;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollWidth,\n viewport: context.viewport.offsetWidth,\n scrollbar: {\n size: ref.current.clientWidth,\n paddingStart: toInt(computedStyle.paddingLeft),\n paddingEnd: toInt(computedStyle.paddingRight)\n }\n });\n }\n }\n }\n );\n}, \"ScrollAreaScrollbarX\"));\nvar ScrollAreaScrollbarY = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarY2(props, forwardedRef) {\n const { sizes, onSizesChange, ...scrollbarProps } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, props.__scopeScrollArea);\n const [computedStyle, setComputedStyle] = React2.useState();\n const ref = React2.useRef(null);\n const composeRefs = useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);\n React2.useEffect(() => {\n if (ref.current) setComputedStyle(getComputedStyle(ref.current));\n }, [ref]);\n return /* @__PURE__ */ jsx(\n ScrollAreaScrollbarImpl,\n {\n \"data-orientation\": \"vertical\",\n ...scrollbarProps,\n ref: composeRefs,\n sizes,\n style: {\n top: 0,\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: \"var(--radix-scroll-area-corner-height)\",\n \"--radix-scroll-area-thumb-height\": getThumbSize(sizes) + \"px\",\n ...props.style\n },\n onThumbPointerDown: (pointerPos) => props.onThumbPointerDown(pointerPos.y),\n onDragScroll: (pointerPos) => props.onDragScroll(pointerPos.y),\n onWheelScroll: (event, maxScrollPos) => {\n if (context.viewport) {\n const scrollPos = context.viewport.scrollTop + event.deltaY;\n props.onWheelScroll(scrollPos);\n if (isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) {\n event.preventDefault();\n }\n }\n },\n onResize: () => {\n if (ref.current && context.viewport && computedStyle) {\n onSizesChange({\n content: context.viewport.scrollHeight,\n viewport: context.viewport.offsetHeight,\n scrollbar: {\n size: ref.current.clientHeight,\n paddingStart: toInt(computedStyle.paddingTop),\n paddingEnd: toInt(computedStyle.paddingBottom)\n }\n });\n }\n }\n }\n );\n}, \"ScrollAreaScrollbarY\"));\nvar [ScrollbarProvider, useScrollbarContext] = createScrollAreaContext(SCROLLBAR_NAME);\nvar ScrollAreaScrollbarImpl = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaScrollbarImpl2(props, forwardedRef) {\n const {\n __scopeScrollArea,\n sizes,\n hasThumb,\n onThumbChange,\n onThumbPointerUp,\n onThumbPointerDown,\n onThumbPositionChange,\n onDragScroll,\n onWheelScroll,\n onResize,\n ...scrollbarProps\n } = props;\n const context = useScrollAreaContext(SCROLLBAR_NAME, __scopeScrollArea);\n const [scrollbar, setScrollbar] = React2.useState(null);\n const composeRefs = useComposedRefs(forwardedRef, setScrollbar);\n const rectRef = React2.useRef(null);\n const prevWebkitUserSelectRef = React2.useRef(\"\");\n const viewport = context.viewport;\n const maxScrollPos = sizes.content - sizes.viewport;\n const handleWheelScroll = useCallbackRef(onWheelScroll);\n const handleThumbPositionChange = useCallbackRef(onThumbPositionChange);\n const handleResize = useDebounceCallback(onResize, 10);\n function handleDragScroll(event) {\n if (rectRef.current) {\n const x = event.clientX - rectRef.current.left;\n const y = event.clientY - rectRef.current.top;\n onDragScroll({ x, y });\n }\n }\n __name(handleDragScroll, \"handleDragScroll\");\n React2.useEffect(() => {\n const handleWheel = /* @__PURE__ */ __name((event) => {\n const element = event.target;\n const isScrollbarWheel = scrollbar?.contains(element);\n if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);\n }, \"handleWheel\");\n document.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => document.removeEventListener(\"wheel\", handleWheel, { passive: false });\n }, [viewport, scrollbar, maxScrollPos, handleWheelScroll]);\n React2.useEffect(handleThumbPositionChange, [sizes, handleThumbPositionChange]);\n useResizeObserver(scrollbar, handleResize);\n useResizeObserver(context.content, handleResize);\n return /* @__PURE__ */ jsx(\n ScrollbarProvider,\n {\n scope: __scopeScrollArea,\n scrollbar,\n hasThumb,\n onThumbChange: useCallbackRef(onThumbChange),\n onThumbPointerUp: useCallbackRef(onThumbPointerUp),\n onThumbPositionChange: handleThumbPositionChange,\n onThumbPointerDown: useCallbackRef(onThumbPointerDown),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...scrollbarProps,\n ref: composeRefs,\n style: { position: \"absolute\", ...scrollbarProps.style },\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n const mainPointer = 0;\n if (event.button === mainPointer) {\n const element = event.target;\n element.setPointerCapture(event.pointerId);\n rectRef.current = scrollbar.getBoundingClientRect();\n prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;\n document.body.style.webkitUserSelect = \"none\";\n if (context.viewport) context.viewport.style.scrollBehavior = \"auto\";\n handleDragScroll(event);\n }\n }),\n onPointerMove: composeEventHandlers(props.onPointerMove, handleDragScroll),\n onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {\n const element = event.target;\n if (element.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId);\n }\n document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;\n if (context.viewport) context.viewport.style.scrollBehavior = \"\";\n rectRef.current = null;\n })\n }\n )\n }\n );\n}, \"ScrollAreaScrollbarImpl\"));\nvar THUMB_NAME = \"ScrollAreaThumb\";\nvar ScrollAreaThumb = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaThumb2(props, forwardedRef) {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext(THUMB_NAME, props.__scopeScrollArea);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || scrollbarContext.hasThumb, children: /* @__PURE__ */ jsx(ScrollAreaThumbImpl, { ref: forwardedRef, ...thumbProps }) });\n }, \"ScrollAreaThumb\")\n);\nvar ScrollAreaThumbImpl = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaThumbImpl2(props, forwardedRef) {\n const { __scopeScrollArea, style, ...thumbProps } = props;\n const scrollAreaContext = useScrollAreaContext(THUMB_NAME, __scopeScrollArea);\n const scrollbarContext = useScrollbarContext(THUMB_NAME, __scopeScrollArea);\n const { onThumbPositionChange } = scrollbarContext;\n const composedRef = useComposedRefs(forwardedRef, scrollbarContext.onThumbChange);\n const removeUnlinkedScrollListenerRef = React2.useRef(void 0);\n const debounceScrollEnd = useDebounceCallback(() => {\n if (removeUnlinkedScrollListenerRef.current) {\n removeUnlinkedScrollListenerRef.current();\n removeUnlinkedScrollListenerRef.current = void 0;\n }\n }, 100);\n React2.useEffect(() => {\n const viewport = scrollAreaContext.viewport;\n if (viewport) {\n const handleScroll = /* @__PURE__ */ __name(() => {\n debounceScrollEnd();\n if (!removeUnlinkedScrollListenerRef.current) {\n const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n removeUnlinkedScrollListenerRef.current = listener;\n onThumbPositionChange();\n }\n }, \"handleScroll\");\n onThumbPositionChange();\n viewport.addEventListener(\"scroll\", handleScroll);\n return () => viewport.removeEventListener(\"scroll\", handleScroll);\n }\n }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": scrollbarContext.hasThumb ? \"visible\" : \"hidden\",\n ...thumbProps,\n ref: composedRef,\n style: {\n width: \"var(--radix-scroll-area-thumb-width)\",\n height: \"var(--radix-scroll-area-thumb-height)\",\n ...style\n },\n onPointerDownCapture: composeEventHandlers(props.onPointerDownCapture, (event) => {\n const thumb = event.target;\n const thumbRect = thumb.getBoundingClientRect();\n const x = event.clientX - thumbRect.left;\n const y = event.clientY - thumbRect.top;\n scrollbarContext.onThumbPointerDown({ x, y });\n }),\n onPointerUp: composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)\n }\n );\n }, \"ScrollAreaThumbImpl\")\n);\nvar CORNER_NAME = \"ScrollAreaCorner\";\nvar ScrollAreaCorner = /* @__PURE__ */ React2.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function ScrollAreaCorner2(props, forwardedRef) {\n const context = useScrollAreaContext(CORNER_NAME, props.__scopeScrollArea);\n const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);\n const hasCorner = context.type !== \"scroll\" && hasBothScrollbarsVisible;\n return hasCorner ? /* @__PURE__ */ jsx(ScrollAreaCornerImpl, { ...props, ref: forwardedRef }) : null;\n }, \"ScrollAreaCorner\")\n);\nvar ScrollAreaCornerImpl = /* @__PURE__ */ React2.forwardRef(/* @__PURE__ */ __name(function ScrollAreaCornerImpl2(props, forwardedRef) {\n const { __scopeScrollArea, ...cornerProps } = props;\n const context = useScrollAreaContext(CORNER_NAME, __scopeScrollArea);\n const [width, setWidth] = React2.useState(0);\n const [height, setHeight] = React2.useState(0);\n const hasSize = Boolean(width && height);\n const { onCornerWidthChange, onCornerHeightChange } = context;\n useResizeObserver(context.scrollbarX, () => {\n const height2 = context.scrollbarX?.offsetHeight || 0;\n context.onCornerHeightChange(height2);\n setHeight(height2);\n });\n useResizeObserver(context.scrollbarY, () => {\n const width2 = context.scrollbarY?.offsetWidth || 0;\n context.onCornerWidthChange(width2);\n setWidth(width2);\n });\n React2.useEffect(() => {\n return () => {\n onCornerWidthChange(0);\n onCornerHeightChange(0);\n };\n }, [onCornerWidthChange, onCornerHeightChange]);\n return hasSize ? /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...cornerProps,\n ref: forwardedRef,\n style: {\n width,\n height,\n position: \"absolute\",\n right: context.dir === \"ltr\" ? 0 : void 0,\n left: context.dir === \"rtl\" ? 0 : void 0,\n bottom: 0,\n ...props.style\n }\n }\n ) : null;\n}, \"ScrollAreaCornerImpl\"));\nfunction toInt(value) {\n return value ? parseInt(value, 10) : 0;\n}\n__name(toInt, \"toInt\");\nfunction getThumbRatio(viewportSize, contentSize) {\n const ratio = viewportSize / contentSize;\n return isNaN(ratio) ? 0 : ratio;\n}\n__name(getThumbRatio, \"getThumbRatio\");\nfunction getThumbSize(sizes) {\n const ratio = getThumbRatio(sizes.viewport, sizes.content);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio;\n return Math.max(thumbSize, 18);\n}\n__name(getThumbSize, \"getThumbSize\");\nfunction getScrollPositionFromPointer(pointerPos, pointerOffset, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const thumbCenter = thumbSizePx / 2;\n const offset = pointerOffset || thumbCenter;\n const thumbOffsetFromEnd = thumbSizePx - offset;\n const minPointerPos = sizes.scrollbar.paddingStart + offset;\n const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;\n const maxScrollPos = sizes.content - sizes.viewport;\n const scrollRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const interpolate = linearScale([minPointerPos, maxPointerPos], scrollRange);\n return interpolate(pointerPos);\n}\n__name(getScrollPositionFromPointer, \"getScrollPositionFromPointer\");\nfunction getThumbOffsetFromScroll(scrollPos, sizes, dir = \"ltr\") {\n const thumbSizePx = getThumbSize(sizes);\n const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;\n const scrollbar = sizes.scrollbar.size - scrollbarPadding;\n const maxScrollPos = sizes.content - sizes.viewport;\n const maxThumbPos = scrollbar - thumbSizePx;\n const scrollClampRange = dir === \"ltr\" ? [0, maxScrollPos] : [maxScrollPos * -1, 0];\n const scrollWithoutMomentum = clamp(scrollPos, scrollClampRange);\n const interpolate = linearScale([0, maxScrollPos], [0, maxThumbPos]);\n return interpolate(scrollWithoutMomentum);\n}\n__name(getThumbOffsetFromScroll, \"getThumbOffsetFromScroll\");\nfunction linearScale(input, output) {\n return (value) => {\n if (input[0] === input[1] || output[0] === output[1]) return output[0];\n const ratio = (output[1] - output[0]) / (input[1] - input[0]);\n return output[0] + ratio * (value - input[0]);\n };\n}\n__name(linearScale, \"linearScale\");\nfunction isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {\n return scrollPos > 0 && scrollPos < maxScrollPos;\n}\n__name(isScrollingWithinScrollbarBounds, \"isScrollingWithinScrollbarBounds\");\nvar addUnlinkedScrollListener = /* @__PURE__ */ __name((node, handler = () => {\n}) => {\n let prevPosition = { left: node.scrollLeft, top: node.scrollTop };\n let rAF = 0;\n (/* @__PURE__ */ __name((function loop() {\n const position = { left: node.scrollLeft, top: node.scrollTop };\n const isHorizontalScroll = prevPosition.left !== position.left;\n const isVerticalScroll = prevPosition.top !== position.top;\n if (isHorizontalScroll || isVerticalScroll) handler();\n prevPosition = position;\n rAF = window.requestAnimationFrame(loop);\n }), \"loop\"))();\n return () => window.cancelAnimationFrame(rAF);\n}, \"addUnlinkedScrollListener\");\nfunction useDebounceCallback(callback, delay) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React2.useRef(0);\n React2.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);\n return React2.useCallback(() => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(handleCallback, delay);\n }, [handleCallback, delay]);\n}\n__name(useDebounceCallback, \"useDebounceCallback\");\nfunction useResizeObserver(element, onResize) {\n const handleResize = useCallbackRef(onResize);\n useLayoutEffect(() => {\n let rAF = 0;\n if (element) {\n const resizeObserver = new ResizeObserver(() => {\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return () => {\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [element, handleResize]);\n}\n__name(useResizeObserver, \"useResizeObserver\");\nvar Root = ScrollArea;\nvar Viewport = ScrollAreaViewport;\nvar Scrollbar = ScrollAreaScrollbar;\nvar Thumb = ScrollAreaThumb;\nvar Corner = ScrollAreaCorner;\nexport {\n Corner,\n Root,\n ScrollArea,\n ScrollAreaCorner,\n ScrollAreaScrollbar,\n ScrollAreaThumb,\n ScrollAreaViewport,\n Scrollbar,\n Thumb,\n Viewport,\n createScrollAreaScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport type * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root className={cn(\"relative overflow-hidden\", className)} {...props}>\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent p-px\",\n orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent p-px\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-lg bg-muted-foreground/40\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n","import { ArrowLeft02Icon } from \"@hugeicons/core-free-icons\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n firstDeltaMsFromObservations,\n isNeutralTraceRow,\n observationUsageText,\n plainTraceValue,\n selectedTraceDetail,\n statusDotClass,\n TraceJsonTree,\n type TraceObservationNode,\n TraceRowIcon,\n TraceToneIcon,\n traceObservationLabel,\n traceObservationTree,\n traceToneIconClass,\n traceTurns,\n} from \"./trace-browser-detail\";\n\nexport {\n compactTraceMetadata,\n firstDeltaMsFromObservations,\n jsonSyntaxTokens,\n observationDetailMetadata,\n observationStatusSummary,\n observationUsageText,\n plainTraceValue,\n rawTraceJson,\n selectedTraceDetail,\n traceDetailMetadata,\n traceObservationLabel,\n traceObservationTree,\n traceTurns,\n turnUsageText,\n} from \"./trace-browser-detail\";\n\nimport type { StudioConfig, StudioTrace } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { Card } from \"../../components/ui/card\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { ScrollArea } from \"../../components/ui/scroll-area\";\nimport { cn } from \"../../lib/utils\";\nimport { emptyFallback, formatDuration, formatTraceDate, traceAgentLabel } from \"../shared/format\";\nimport type { TraceInspectorKey, TraceLoadState, TraceObservationItem } from \"../shared/types\";\n\nexport function TraceBrowser(props: {\n agents: StudioConfig[\"agents\"];\n traces: StudioTrace[];\n tracesEnabled: boolean;\n traceLoadState: TraceLoadState;\n selectedTraceId: string;\n traceSessionDetailId: string | undefined;\n onRefresh: () => void;\n onSelectTrace: (traceId: string) => void;\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n if (!props.tracesEnabled) {\n return (\n <div className=\"w-full rounded-lg border border-dashed border-border p-8 text-sm font-medium text-muted-foreground\">\n Tracing is disabled\n </div>\n );\n }\n\n const selectedTrace =\n props.selectedTraceId.length === 0\n ? undefined\n : props.traces.find((trace) => trace.id === props.selectedTraceId);\n const selectedSessionTraces =\n selectedTrace === undefined || props.traceSessionDetailId !== selectedTrace.sessionId\n ? []\n : props.traces.filter((trace) => trace.sessionId === selectedTrace.sessionId);\n\n return (\n <section\n className=\"grid h-full min-h-0 w-full content-stretch pb-6 pl-0 pr-6\"\n aria-label=\"Tracing\"\n >\n {props.selectedTraceId.length === 0 ? (\n <TraceTable\n agents={props.agents}\n traces={props.traces}\n traceLoadState={props.traceLoadState}\n onSelectTrace={props.onSelectTrace}\n />\n ) : (\n <TraceDetailRoute\n selectedTrace={selectedTrace}\n selectedSessionTraces={selectedSessionTraces}\n selectedTraceId={props.selectedTraceId}\n traceLoadState={props.traceLoadState}\n onBack={() => props.onSelectTrace(\"\")}\n onShowSessionTraces={props.onShowSessionTraces}\n />\n )}\n </section>\n );\n}\n\nfunction TraceTable(props: {\n agents: StudioConfig[\"agents\"];\n traces: StudioTrace[];\n traceLoadState: TraceLoadState;\n onSelectTrace: (traceId: string) => void;\n}) {\n return (\n <Card\n className=\"min-h-0 overflow-hidden rounded-xl border-border/80 bg-card/80\"\n aria-label=\"Traces\"\n >\n <ScrollArea className=\"h-full min-h-0\">\n <div className=\"grid min-w-280 gap-1 p-2\">\n <div className=\"sticky top-0 z-10 grid min-h-11 grid-cols-[minmax(220px,1.3fr)_150px_120px_120px_120px_120px_110px_90px] items-center gap-4 rounded-lg border border-border/60 bg-card/95 px-4 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground backdrop-blur\">\n <span>Trace</span>\n <span>Session</span>\n <span>Agent</span>\n <span>Status</span>\n <span>Started</span>\n <span>Duration</span>\n <span>First delta</span>\n <span>Events</span>\n </div>\n {props.traceLoadState === \"loading\" && props.traces.length === 0 ? (\n <div className=\"px-5 py-4 text-sm font-medium text-muted-foreground\">\n Loading traces\n </div>\n ) : null}\n {props.traceLoadState === \"idle\" && props.traces.length === 0 ? (\n <div className=\"px-5 py-4 text-sm font-medium text-muted-foreground\">\n No traces found\n </div>\n ) : null}\n {props.traces.map((trace) => (\n <Button\n className=\"grid h-auto min-h-14 w-full grid-cols-[minmax(220px,1.3fr)_150px_120px_120px_120px_120px_110px_90px] items-center justify-start gap-4 whitespace-normal rounded-lg border border-transparent bg-transparent px-4 py-2.5 text-left text-muted-foreground shadow-none transition duration-200 hover:border-border/70 hover:bg-accent/70 hover:text-accent-foreground\"\n type=\"button\"\n variant=\"ghost\"\n key={trace.id}\n onClick={() => props.onSelectTrace(trace.id)}\n >\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {trace.id}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">{trace.sessionId}</span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {traceAgentLabel(props.agents, trace)}\n </span>\n <span className=\"flex min-w-0 items-center gap-2 text-xs font-medium capitalize\">\n <span\n className={cn(\"h-2.5 w-2.5 shrink-0 rounded-lg\", statusDotClass(trace.status))}\n />\n <span className=\"min-w-0 truncate\">{trace.status}</span>\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {formatTraceDate(trace.startedAt)}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {emptyFallback(formatDuration(trace.durationMs))}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium\">\n {emptyFallback(formatDuration(firstDeltaMsFromObservations(trace.observations)))}\n </span>\n <span className=\"min-w-0 truncate text-xs font-medium tabular-nums\">\n {trace.observationCount}\n </span>\n </Button>\n ))}\n </div>\n </ScrollArea>\n </Card>\n );\n}\n\nfunction TraceDetailRoute(props: {\n selectedTrace: StudioTrace | undefined;\n selectedSessionTraces: StudioTrace[];\n selectedTraceId: string;\n traceLoadState: TraceLoadState;\n onBack: () => void;\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n return (\n <div className=\"grid h-full min-h-0 min-w-0 grid-rows-[auto_minmax(0,1fr)] gap-2 overflow-hidden rounded-xl border border-border/80 bg-card/70 p-2 shadow-sm\">\n <header className=\"grid min-h-16 grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 overflow-hidden rounded-lg border border-border/60 bg-card/95 px-4 py-3\">\n <Button\n aria-label=\"Back to traces\"\n className=\"h-8 min-h-8 w-8 text-muted-foreground hover:text-foreground\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={props.onBack}\n >\n <StudioIcon icon={ArrowLeft02Icon} aria-hidden=\"true\" />\n </Button>\n <div className=\"grid min-w-0 gap-1\">\n <strong className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.selectedTrace?.name ?? \"Trace detail\"}\n </strong>\n <span className=\"flex min-w-0 items-center gap-2 overflow-hidden text-xs font-medium text-muted-foreground\">\n {props.selectedTrace === undefined ? (\n props.traceLoadState === \"loading\" ? (\n \"Loading trace\"\n ) : (\n \"Trace not found\"\n )\n ) : (\n <>\n <span\n className={cn(\n \"h-2 w-2 shrink-0 rounded-lg\",\n statusDotClass(props.selectedTrace.status),\n )}\n />\n <span className=\"shrink-0 capitalize\">{props.selectedTrace.status}</span>\n <span className=\"shrink-0\" aria-hidden=\"true\">\n /\n </span>\n <span className=\"min-w-0 flex-1 truncate\">\n Session <span className=\" font-semibold\">{props.selectedTrace.sessionId}</span>\n </span>\n </>\n )}\n </span>\n </div>\n <span className=\"hidden max-w-[42vw] truncate rounded-lg bg-muted px-2 py-1 text-xs font-medium text-muted-foreground md:block\">\n {props.selectedTraceId}\n </span>\n </header>\n <div className=\"min-h-0 min-w-0 overflow-hidden\">\n {props.selectedTrace === undefined ? (\n <Card className=\"grid h-full place-items-center rounded-lg border-border bg-card p-6 text-sm font-medium text-muted-foreground\">\n {props.traceLoadState === \"loading\" ? \"Loading trace\" : \"Trace not found\"}\n </Card>\n ) : (\n <TracePanel\n traces={\n props.selectedSessionTraces.length > 0\n ? props.selectedSessionTraces\n : [props.selectedTrace]\n }\n onShowSessionTraces={props.onShowSessionTraces}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction TracePanel(props: {\n traces: StudioTrace[];\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n const orderedTraces = useMemo(\n () =>\n [...props.traces].sort(\n (left, right) => Date.parse(left.startedAt) - Date.parse(right.startedAt),\n ),\n [props.traces],\n );\n const firstTraceId = orderedTraces[0]?.id ?? \"\";\n const [activeTraceId, setActiveTraceId] = useState(firstTraceId);\n const [activeKey, setActiveKey] = useState<TraceInspectorKey>(\"trace\");\n useEffect(() => {\n setActiveTraceId(firstTraceId);\n setActiveKey(\"trace\");\n }, [firstTraceId]);\n\n const activeTrace = orderedTraces.find((trace) => trace.id === activeTraceId) ?? orderedTraces[0];\n const turns = activeTrace === undefined ? [] : traceTurns(activeTrace);\n const selectTimelineItem = (traceId: string, key: TraceInspectorKey) => {\n setActiveTraceId(traceId);\n setActiveKey(key);\n };\n\n if (activeTrace === undefined) {\n return (\n <section\n className=\"grid h-full min-h-0 w-full place-items-center text-sm font-medium text-muted-foreground\"\n aria-label=\"Traces\"\n >\n No trace selected\n </section>\n );\n }\n\n return (\n <section\n className=\"grid h-full min-h-0 w-full content-stretch overflow-hidden\"\n aria-label=\"Traces\"\n >\n <div className=\"grid h-full min-h-0 grid-cols-[320px_minmax(0,1fr)] overflow-hidden max-md:grid-cols-1\">\n <nav\n className=\"grid min-h-0 auto-rows-min content-start overflow-auto border-r border-border/80 bg-card/35 pr-2 max-md:max-h-80 max-md:border-b max-md:border-r-0\"\n aria-label=\"Trace timeline\"\n >\n <div className=\"sticky top-0 z-30 flex min-h-11 items-center justify-between bg-card/90 py-0 pl-0 pr-5 text-xs font-medium text-muted-foreground backdrop-blur\">\n <span>Search</span>\n <strong className=\"text-foreground\">Timeline</strong>\n </div>\n {orderedTraces.map((trace) => {\n const traceActive = activeTrace.id === trace.id;\n const traceTurnItems = traceTurns(trace);\n return (\n <div className=\"contents\" key={trace.id}>\n <TraceTreeRow\n active={traceActive && activeKey === \"trace\"}\n ancestorLevels={[]}\n hasChildren={true}\n isLastSibling={true}\n level={0}\n tone=\"trace\"\n title={trace.name ?? \"Agent\"}\n subtitle={formatDuration(trace.durationMs)}\n onSelect={() => selectTimelineItem(trace.id, \"trace\")}\n />\n <TraceTreeRow\n active={traceActive && activeKey === \"agent\"}\n ancestorLevels={[]}\n hasChildren={traceTurnItems.length > 0}\n isLastSibling={true}\n level={1}\n tone=\"agent\"\n title=\"agent.run\"\n subtitle={formatDuration(trace.durationMs)}\n onSelect={() => selectTimelineItem(trace.id, \"agent\")}\n />\n {traceTurnItems.map((turn) => (\n <div className=\"contents\" key={`${trace.id}:turn:${turn.turn}`}>\n <TraceTreeRow\n active={traceActive && activeKey === `turn:${turn.turn}`}\n ancestorLevels={[]}\n hasChildren={turn.observations.length > 0}\n isLastSibling={turn.turn === traceTurnItems.at(-1)?.turn}\n level={2}\n tone=\"turn\"\n title={`turn.${turn.turn}`}\n subtitle={formatDuration(turn.durationMs)}\n onSelect={() => selectTimelineItem(trace.id, `turn:${turn.turn}`)}\n />\n <TraceObservationRows\n activeKey={activeKey}\n isLastTurn={turn.turn === traceTurnItems.at(-1)?.turn}\n observations={turn.observations}\n onSelect={(observationId) =>\n selectTimelineItem(trace.id, `observation:${observationId}`)\n }\n traceActive={traceActive}\n />\n </div>\n ))}\n </div>\n );\n })}\n </nav>\n <TraceDetailPane\n trace={activeTrace}\n turns={turns}\n activeKey={activeKey}\n onShowSessionTraces={props.onShowSessionTraces}\n />\n </div>\n </section>\n );\n}\n\nfunction TraceTreeRow(props: {\n active: boolean;\n ancestorLevels: number[];\n hasChildren: boolean;\n isLastSibling: boolean;\n level: number;\n tone: \"trace\" | \"agent\" | \"turn\" | StudioTrace[\"observations\"][number][\"kind\"];\n title: string;\n subtitle: string;\n onSelect: () => void;\n}) {\n const levelOffset = 22;\n const baseLeft = 12;\n const iconSize = 20;\n const iconCenter = baseLeft + iconSize / 2;\n const lineTop = 18;\n const xForLevel = (level: number) => iconCenter + level * levelOffset;\n\n return (\n <Button\n className={cn(\n \"relative grid h-auto min-h-0 w-full min-w-0 grid-cols-[20px_minmax(0,1fr)] items-start justify-start gap-2 whitespace-normal rounded-lg border-0 bg-transparent px-3 py-2.5 text-left text-muted-foreground shadow-none transition duration-200 hover:bg-accent/70 hover:text-accent-foreground\",\n props.active && \"bg-muted/45 text-foreground hover:bg-muted/45 hover:text-foreground\",\n )}\n type=\"button\"\n variant=\"ghost\"\n onClick={props.onSelect}\n style={{ paddingLeft: `${baseLeft + props.level * levelOffset}px` }}\n >\n {props.ancestorLevels.map((level) => (\n <span\n className=\"pointer-events-none absolute inset-y-0 w-px bg-muted-foreground/35\"\n style={{ left: `${xForLevel(level)}px` }}\n aria-hidden=\"true\"\n key={`ancestor-line-${level}`}\n />\n ))}\n {props.level > 0 ? (\n <>\n <span\n className=\"pointer-events-none absolute top-0 w-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level - 1)}px`,\n height: `${lineTop}px`,\n }}\n aria-hidden=\"true\"\n />\n {props.isLastSibling ? null : (\n <span\n className=\"pointer-events-none absolute bottom-0 w-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level - 1)}px`,\n top: `${lineTop}px`,\n }}\n aria-hidden=\"true\"\n />\n )}\n <span\n className=\"pointer-events-none absolute h-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level - 1)}px`,\n top: `${lineTop}px`,\n width: `${levelOffset}px`,\n }}\n aria-hidden=\"true\"\n />\n </>\n ) : null}\n {props.hasChildren ? (\n <span\n className=\"pointer-events-none absolute bottom-0 w-px bg-muted-foreground/35\"\n style={{\n left: `${xForLevel(props.level)}px`,\n top: `${lineTop}px`,\n }}\n aria-hidden=\"true\"\n />\n ) : null}\n <span\n className={cn(\n \"relative z-10 grid h-5 w-5 place-items-center rounded-lg bg-transparent [&_svg]:h-3 [&_svg]:w-3 [&_svg]:opacity-100\",\n traceToneIconClass(props.tone),\n )}\n >\n <TraceToneIcon tone={props.tone} />\n </span>\n <span className=\"grid min-w-0 gap-0.5\">\n <strong className=\"min-w-0 truncate text-sm font-medium leading-5 text-current\">\n {props.title}\n </strong>\n <span className=\"min-w-0 truncate text-xs font-medium text-muted-foreground\">\n {props.subtitle}\n </span>\n </span>\n </Button>\n );\n}\n\nfunction TraceObservationRows(props: {\n activeKey: TraceInspectorKey;\n isLastTurn: boolean;\n observations: TraceObservationItem[];\n traceActive: boolean;\n onSelect: (observationId: string) => void;\n}) {\n const roots = traceObservationTree(props.observations);\n return (\n <>\n {roots.map((node, index) => (\n <TraceObservationNodeRow\n activeKey={props.activeKey}\n ancestorLevels={props.isLastTurn ? [] : [1]}\n isLastSibling={index === roots.length - 1}\n key={node.observation.id}\n level={3}\n node={node}\n onSelect={props.onSelect}\n traceActive={props.traceActive}\n />\n ))}\n </>\n );\n}\n\nfunction TraceObservationNodeRow(props: {\n activeKey: TraceInspectorKey;\n ancestorLevels: number[];\n isLastSibling: boolean;\n level: number;\n node: TraceObservationNode;\n traceActive: boolean;\n onSelect: (observationId: string) => void;\n}) {\n const usageText = observationUsageText(props.node.observation);\n const childAncestorLevels = props.isLastSibling\n ? props.ancestorLevels\n : [...props.ancestorLevels, props.level];\n return (\n <>\n <TraceTreeRow\n active={props.traceActive && props.activeKey === `observation:${props.node.observation.id}`}\n ancestorLevels={props.ancestorLevels}\n hasChildren={props.node.children.length > 0}\n isLastSibling={props.isLastSibling}\n level={props.level}\n tone={props.node.observation.kind}\n title={traceObservationLabel(props.node.observation)}\n subtitle={\n usageText.length > 0\n ? `${formatDuration(props.node.observation.durationMs)} · ${usageText}`\n : formatDuration(props.node.observation.durationMs)\n }\n onSelect={() => props.onSelect(props.node.observation.id)}\n />\n {props.node.children.map((child, index) => (\n <TraceObservationNodeRow\n activeKey={props.activeKey}\n ancestorLevels={childAncestorLevels}\n isLastSibling={index === props.node.children.length - 1}\n key={child.observation.id}\n level={props.level + 1}\n node={child}\n onSelect={props.onSelect}\n traceActive={props.traceActive}\n />\n ))}\n </>\n );\n}\n\nfunction TraceDetailPane(props: {\n trace: StudioTrace;\n turns: Array<{ turn: number; observations: TraceObservationItem[]; durationMs?: number }>;\n activeKey: TraceInspectorKey;\n onShowSessionTraces: (sessionId: string) => void;\n}) {\n const selected = selectedTraceDetail(props.trace, props.turns, props.activeKey);\n return (\n <section\n className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-card/70\"\n aria-label=\"Trace detail\"\n >\n <header className=\"border-b border-border/60 bg-card/70 px-6 py-5\">\n <div className=\"grid min-w-0 gap-5\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <span\n className={cn(\n \"grid h-8 w-8 shrink-0 place-items-center rounded-lg bg-foreground text-background [&_svg]:h-4 [&_svg]:w-4 [&_svg]:opacity-100\",\n selected.tone !== \"trace\" && \"bg-muted text-foreground\",\n traceToneIconClass(selected.tone),\n )}\n >\n <TraceToneIcon tone={selected.tone} />\n </span>\n <div className=\"grid min-w-0 gap-1\">\n <h2 className=\"m-0 min-w-0 truncate text-2xl font-semibold leading-none tracking-[-0.01em] text-foreground\">\n {selected.title}\n </h2>\n <div className=\" text-xs font-medium text-muted-foreground\">\n {selected.startedAt}\n </div>\n </div>\n </div>\n </div>\n <div className=\"grid min-w-0 grid-cols-[repeat(auto-fit,minmax(150px,1fr))] gap-2\">\n <TraceMetric label=\"Duration\" value={formatDuration(selected.durationMs)} />\n {selected.firstDeltaMs === undefined ? null : (\n <TraceMetric label=\"First delta\" value={formatDuration(selected.firstDeltaMs)} />\n )}\n {selected.usage.length === 0 ? null : (\n <TraceMetric label=\"Usage\" value={selected.usage} />\n )}\n <button\n className=\"grid min-w-0 gap-1 rounded-lg bg-card/85 px-4 py-3 text-left transition duration-200 hover:bg-accent hover:text-accent-foreground\"\n type=\"button\"\n onClick={() => props.onShowSessionTraces(props.trace.sessionId)}\n >\n <span className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Session\n </span>\n <span className=\"min-w-0 truncate text-sm font-semibold text-current\">\n {props.trace.sessionId}\n </span>\n </button>\n </div>\n </div>\n </header>\n <div className=\"min-w-0 overflow-auto\">\n <div className=\"grid min-w-0 content-start gap-6 p-6\">\n {selected.input === undefined ? null : (\n <TraceDataSection title=\"Input\" value={selected.input} />\n )}\n {selected.output === undefined ? null : (\n <TraceDataSection title=\"Output\" value={selected.output} tone=\"success\" />\n )}\n {selected.error === undefined ? null : (\n <TraceDataSection title=\"Error\" value={selected.error} tone=\"error\" />\n )}\n <TraceDataSection title=\"Metadata\" value={selected.metadata} rawJson />\n </div>\n </div>\n </section>\n );\n}\n\nfunction TraceMetric(props: { label: string; value: string }) {\n return (\n <div className=\"grid min-w-0 gap-1 rounded-lg bg-card/85 px-4 py-3\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction TraceDataSection(props: {\n title: string;\n value: unknown;\n tone?: \"success\" | \"error\";\n compact?: boolean;\n rawJson?: boolean;\n}) {\n const rows = plainTraceValue(props.title, props.value);\n return (\n <section className=\"grid min-w-0 gap-3\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"m-0 text-lg font-semibold leading-tight text-foreground\">{props.title}</h3>\n <span className=\"h-px flex-1 bg-border/80\" aria-hidden=\"true\" />\n </div>\n {props.rawJson ? (\n <TraceJsonTree value={props.value} />\n ) : (\n <div className=\"grid min-w-0 gap-3\">\n {rows.map((item) => (\n <article\n className={cn(\n \"grid min-w-0 gap-3 rounded-lg bg-card/85 px-4 py-4\",\n props.compact &&\n \"grid-cols-[150px_minmax(0,1fr)] items-start gap-4 max-lg:grid-cols-1\",\n )}\n key={`${item.label}-${item.text}`}\n >\n <span className=\"flex min-w-0 items-center gap-2 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n <TraceRowIcon label={item.label} />\n {item.label}\n </span>\n <TraceRowContent compact={props.compact} item={item} tone={props.tone} />\n </article>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction TraceRowContent(props: {\n compact?: boolean | undefined;\n item: { label: string; text: string };\n tone?: \"success\" | \"error\" | undefined;\n}) {\n const historyItems = conversationHistoryItems(props.item);\n if (historyItems.length > 0) {\n return (\n <div className=\"grid min-w-0 gap-5\">\n {historyItems.map((item) => (\n <div className=\"grid min-w-0 gap-2\" key={`${item.index}-${item.role}-${item.text}`}>\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\" text-xs font-semibold tabular-nums text-muted-foreground\">\n {item.index}\n </span>\n <Badge\n className={cn(\n \"px-1.5 py-0.5\",\n item.role === \"User\" &&\n \"border-border/80 bg-muted-foreground/15 text-muted-foreground\",\n item.role === \"Assistant\" && \"border-border/80 bg-foreground/15 text-foreground\",\n item.role === \"Tool\" &&\n \"border-destructive/40 bg-destructive/15 text-destructive\",\n )}\n >\n {item.role}\n </Badge>\n </div>\n <p className=\"m-0 whitespace-pre-wrap text-sm leading-7 text-foreground [overflow-wrap:anywhere]\">\n {item.text}\n </p>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <p\n className={cn(\n \"m-0 whitespace-pre-wrap text-sm leading-7 text-foreground [overflow-wrap:anywhere]\",\n props.compact && \" text-sm leading-6\",\n props.tone === \"success\" && !isNeutralTraceRow(props.item) && \"text-foreground\",\n props.tone === \"error\" && \"text-destructive\",\n )}\n >\n {props.item.text}\n </p>\n );\n}\n\nfunction conversationHistoryItems(row: {\n label: string;\n text: string;\n}): Array<{ index: string; role: string; text: string }> {\n if (!row.label.startsWith(\"Conversation history\")) {\n return [];\n }\n return row.text\n .split(\"\\n\\n\")\n .flatMap((block): Array<{ index: string; role: string; text: string }> => {\n const [heading, ...content] = block.split(\"\\n\");\n const match = /^(\\d+)\\.\\s+(.+)$/.exec(heading ?? \"\");\n if (match === null) {\n return [];\n }\n return [\n {\n index: match[1] ?? \"\",\n role: match[2] ?? \"Message\",\n text: content.join(\"\\n\"),\n },\n ];\n });\n}\n"],"x_google_ignoreList":[2],"mappings":"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"}
|