@anvia/studio 0.7.38 → 0.7.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/ui/assets/{agents-page-BdDnlVyJ.js → agents-page-DQSUqZIF.js} +2 -2
  2. package/dist/ui/assets/{agents-page-BdDnlVyJ.js.map → agents-page-DQSUqZIF.js.map} +1 -1
  3. package/dist/ui/assets/{badge-CeTBFuRX.js → badge-DFrH2vyb.js} +1 -1
  4. package/dist/ui/assets/{badge-CeTBFuRX.js.map → badge-DFrH2vyb.js.map} +1 -1
  5. package/dist/ui/assets/{chunk-HU55YP24-CBgJL7lU.js → chunk-TIV3WFSR-BCFNcVBW.js} +1 -1
  6. package/dist/ui/assets/{chunk-HU55YP24-CBgJL7lU.js.map → chunk-TIV3WFSR-BCFNcVBW.js.map} +1 -1
  7. package/dist/ui/assets/evals-page-TgqTalZG.js +2 -0
  8. package/dist/ui/assets/{evals-page-BmTgQBv0.js.map → evals-page-TgqTalZG.js.map} +1 -1
  9. package/dist/ui/assets/index-CaB9mtgz.js +56 -0
  10. package/dist/ui/assets/index-CaB9mtgz.js.map +1 -0
  11. package/dist/ui/assets/knowledge-page-G2p0MC9Q.js +2 -0
  12. package/dist/ui/assets/{knowledge-page-DslSMRHu.js.map → knowledge-page-G2p0MC9Q.js.map} +1 -1
  13. package/dist/ui/assets/{mcps-page-BXjUENcS.js → mcps-page-BTofFyB1.js} +2 -2
  14. package/dist/ui/assets/{mcps-page-BXjUENcS.js.map → mcps-page-BTofFyB1.js.map} +1 -1
  15. package/dist/ui/assets/{memory-page-DAsgFJT2.js → memory-page-Dyv23uzY.js} +2 -2
  16. package/dist/ui/assets/{memory-page-DAsgFJT2.js.map → memory-page-Dyv23uzY.js.map} +1 -1
  17. package/dist/ui/assets/{pipelines-page-DtxX27Jz.css → pipelines-page-DLioOiRN.css} +1 -1
  18. package/dist/ui/assets/pipelines-page-DdItgiZv.js +8 -0
  19. package/dist/ui/assets/pipelines-page-DdItgiZv.js.map +1 -0
  20. package/dist/ui/assets/renderers-Cr02ATaq.js +93 -0
  21. package/dist/ui/assets/renderers-Cr02ATaq.js.map +1 -0
  22. package/dist/ui/assets/sandboxes-page-DqkqS92e.js +2 -0
  23. package/dist/ui/assets/sandboxes-page-DqkqS92e.js.map +1 -0
  24. package/dist/ui/assets/sessions-page-kJcWll7-.js +2 -0
  25. package/dist/ui/assets/sessions-page-kJcWll7-.js.map +1 -0
  26. package/dist/ui/assets/{status-page-BjcUSlw5.js → status-page-RKMaWBCx.js} +2 -2
  27. package/dist/ui/assets/{status-page-BjcUSlw5.js.map → status-page-RKMaWBCx.js.map} +1 -1
  28. package/dist/ui/assets/{tool-runner-MaS0O-R0.js → tool-runner-9bssZrO4.js} +2 -2
  29. package/dist/ui/assets/{tool-runner-MaS0O-R0.js.map → tool-runner-9bssZrO4.js.map} +1 -1
  30. package/dist/ui/assets/{tools-page-owaTKYO7.js → tools-page-Mu5-Dl6L.js} +2 -2
  31. package/dist/ui/assets/{tools-page-owaTKYO7.js.map → tools-page-Mu5-Dl6L.js.map} +1 -1
  32. package/dist/ui/assets/trace-browser-BT1WTtkX.js +10 -0
  33. package/dist/ui/assets/trace-browser-BT1WTtkX.js.map +1 -0
  34. package/dist/ui/assets/transcript-item-B0HTdQVL.js +3 -0
  35. package/dist/ui/assets/transcript-item-B0HTdQVL.js.map +1 -0
  36. package/dist/ui/index.html +2 -2
  37. package/package.json +15 -15
  38. package/dist/ui/assets/PathIcon-B7p7vF2d.js +0 -2
  39. package/dist/ui/assets/PathIcon-B7p7vF2d.js.map +0 -1
  40. package/dist/ui/assets/PlayIcon-Dt2gGfiW.js +0 -2
  41. package/dist/ui/assets/PlayIcon-Dt2gGfiW.js.map +0 -1
  42. package/dist/ui/assets/RefreshIcon-BOrxG7tt.js +0 -2
  43. package/dist/ui/assets/RefreshIcon-BOrxG7tt.js.map +0 -1
  44. package/dist/ui/assets/evals-page-BmTgQBv0.js +0 -2
  45. package/dist/ui/assets/index-CVaGs3Mg.js +0 -56
  46. package/dist/ui/assets/index-CVaGs3Mg.js.map +0 -1
  47. package/dist/ui/assets/knowledge-page-DslSMRHu.js +0 -2
  48. package/dist/ui/assets/pipelines-page-DPfbYugP.js +0 -8
  49. package/dist/ui/assets/pipelines-page-DPfbYugP.js.map +0 -1
  50. package/dist/ui/assets/renderers-Cvw2zSQ7.js +0 -85
  51. package/dist/ui/assets/renderers-Cvw2zSQ7.js.map +0 -1
  52. package/dist/ui/assets/sandboxes-page-D4OaKCZP.js +0 -2
  53. package/dist/ui/assets/sandboxes-page-D4OaKCZP.js.map +0 -1
  54. package/dist/ui/assets/sessions-page-CczZ85AR.js +0 -2
  55. package/dist/ui/assets/sessions-page-CczZ85AR.js.map +0 -1
  56. package/dist/ui/assets/trace-browser-BxEFkW7o.js +0 -10
  57. package/dist/ui/assets/trace-browser-BxEFkW7o.js.map +0 -1
  58. package/dist/ui/assets/transcript-item-CNHIhoYq.js +0 -3
  59. package/dist/ui/assets/transcript-item-CNHIhoYq.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-browser-BT1WTtkX.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.15_@types+react-dom@19.2.3_@types+react@19.2.14__@types_fcf6346bf7cced7a778e2412c877d1d8/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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"}
@@ -0,0 +1,3 @@
1
+ import{i as e,r as t,s as n,t as r}from"./utils-BN2yP0LH.js";import{n as i}from"./format-D43vTqrO.js";import{G as a,I as o,J as s,L as c,Y as l,n as u,nt as d,st as f,t as p}from"./index-CaB9mtgz.js";import{t as m}from"./badge-DFrH2vyb.js";import{i as h,r as g}from"./renderers-Cr02ATaq.js";var _=n(e(),1),v=t(),y=(0,_.memo)(function(e){let t=e.displayText??(`text`in e.entry?e.entry.text:``);if(e.entry.kind===`reasoning`)return(0,v.jsxs)(`article`,{className:`max-w-205 justify-self-start text-muted-foreground`,"data-entry-id":String(e.entry.entryId),children:[(0,v.jsx)(`div`,{className:`mb-1 text-xs font-semibold uppercase text-muted-foreground`,children:`Reasoning`}),(0,v.jsx)(g,{live:e.live,size:`base`,text:t})]});if(e.entry.kind===`tool`)return(0,v.jsx)(j,{entry:e.entry,decidingApprovals:e.decidingApprovals,answeringQuestions:e.answeringQuestions,onApprovalDecision:e.onApprovalDecision,onQuestionAnswer:e.onQuestionAnswer});let n=e.entry.role===`assistant`?e.entry.traceId:void 0,i=e.entry.role===`assistant`&&A(t),a=e.entry.role===`assistant`&&`tone`in e.entry&&e.entry.tone===`error`,o=e.entry.role===`assistant`&&`tone`in e.entry&&e.entry.tone===`pending`,s=e.entry.role===`assistant`&&!o&&e.entry.text.trim().length>0,c=e.entry.durationMs??e.metrics?.durationMs,l=s||e.workingStartedAt!==void 0||c!==void 0;return e.entry.role===`user`?(0,v.jsxs)(`article`,{className:`grid w-fit max-w-[min(64ch,82%)] justify-items-end justify-self-end self-start text-foreground`,"data-entry-id":String(e.entry.entryId),children:[e.entry.text.trim().length===0?null:(0,v.jsx)(`div`,{className:`rounded-2xl bg-muted/55 px-4 py-2.5 shadow-sm shadow-black/[0.04] dark:bg-white/[0.08] dark:shadow-black/20`,children:(0,v.jsx)(g,{size:`base`,text:e.entry.text})}),e.entry.attachments===void 0?null:(0,v.jsx)(k,{attachments:e.entry.attachments})]}):(0,v.jsxs)(`article`,{className:r(`self-start`,i?`w-full max-w-full`:`max-w-[min(82ch,100%)]`,e.entry.role===`assistant`&&r(`justify-self-start text-foreground`,a&&`text-destructive`)),"data-entry-id":String(e.entry.entryId),children:[o?(0,v.jsx)(O,{}):null,t.trim().length===0?null:(0,v.jsx)(g,{live:e.live,size:`base`,text:t}),l?(0,v.jsx)(b,{metrics:e.metrics,showActions:s,text:e.entry.text,traceId:n,durationMs:e.workingStartedAt===void 0?c:void 0,startedAt:e.workingStartedAt,onOpenTrace:e.onOpenTrace}):null]})});function b(e){let[t,n]=(0,_.useState)(!1),r=e.traceId;async function i(){if(!(typeof navigator>`u`||navigator.clipboard===void 0))try{await navigator.clipboard.writeText(e.text),n(!0),window.setTimeout(()=>n(!1),1200)}catch{n(!1)}}return(0,v.jsxs)(`div`,{className:`mt-3 flex min-w-0 items-center gap-1.5`,children:[e.showActions?(0,v.jsx)(c,{"aria-label":t?`Response copied`:`Copy response`,className:`h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground`,title:t?`Copied`:`Copy response`,type:`button`,variant:`ghost`,onClick:()=>void i(),children:(0,v.jsx)(o,{icon:t?l:s,"aria-hidden":`true`})}):null,e.showActions?(0,v.jsxs)(`div`,{className:`group relative`,children:[(0,v.jsx)(c,{"aria-label":`Response metrics`,className:`h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground`,title:T(e.metrics),type:`button`,variant:`ghost`,children:(0,v.jsx)(o,{icon:a,"aria-hidden":`true`})}),(0,v.jsx)(`div`,{className:`pointer-events-none absolute left-0 top-full z-30 mt-2 hidden w-64 rounded-lg border border-border/90 bg-popover p-3 text-popover-foreground shadow-xl shadow-black/25 group-focus-within:grid group-hover:grid`,role:`tooltip`,children:(0,v.jsx)(x,{metrics:e.metrics})})]}):null,!e.showActions||r===void 0?null:(0,v.jsx)(c,{"aria-label":`Open trace ${r}`,className:`h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground`,title:`Open trace ${r}`,type:`button`,variant:`ghost`,onClick:()=>e.onOpenTrace(r),children:(0,v.jsx)(o,{icon:d,"aria-hidden":`true`})}),(0,v.jsx)(p,{className:e.showActions?`ml-1.5`:void 0,durationMs:e.durationMs,startedAt:e.startedAt})]})}function x(e){let t=C(e.metrics);return(0,v.jsxs)(`div`,{className:`grid min-w-0 gap-2 text-xs leading-5`,children:[(0,v.jsx)(`div`,{className:`font-semibold text-foreground`,children:`Response metrics`}),(0,v.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,v.jsx)(S,{label:`Cost`,value:`Unavailable`}),t.length===0?(0,v.jsx)(`div`,{className:`text-muted-foreground`,children:`No usage metrics yet`}):t.map(e=>(0,v.jsx)(S,{label:e.label,value:e.value},e.label))]})]})}function S(e){return(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,v.jsx)(`span`,{className:`text-muted-foreground`,children:e.label}),(0,v.jsx)(`span`,{className:`shrink-0 font-medium tabular-nums text-foreground`,children:e.value})]})}function C(e){let t=[],n=e?.usage;return n?.totalTokens!==void 0&&t.push({label:`Total`,value:`${E(n.totalTokens)} tokens`}),n?.inputTokens!==void 0&&t.push({label:`Input`,value:E(n.inputTokens)}),n?.outputTokens!==void 0&&t.push({label:`Output`,value:E(n.outputTokens)}),w(t,`Cached`,n,`cachedInputTokens`),w(t,`Cache create`,n,`cacheCreationInputTokens`),e?.durationMs!==void 0&&t.push({label:`Duration`,value:D(e.durationMs)}),t}function w(e,t,n,r){let i=n?.[r];i!==void 0&&i>0&&e.push({label:t,value:E(i)})}function T(e){let t=C(e);return t.length===0?`Cost unavailable. No usage metrics yet.`:[`Cost unavailable`,...t.map(e=>`${e.label}: ${e.value}`)].join(`. `)}function E(e){return e.toLocaleString()}function D(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}function O(){return(0,v.jsxs)(`div`,{"aria-label":`Assistant is responding`,className:`inline-flex h-9 min-h-9 items-center gap-2 rounded-xl border border-border/70 bg-muted/35 px-3 text-muted-foreground shadow-sm`,role:`status`,children:[(0,v.jsxs)(`span`,{className:`flex items-center gap-1`,"aria-hidden":`true`,children:[(0,v.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-foreground`}),(0,v.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:150ms]`}),(0,v.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:300ms]`})]}),(0,v.jsx)(`span`,{className:` text-xs font-semibold uppercase text-muted-foreground`,children:`Thinking`})]})}function k(e){return(0,v.jsx)(`div`,{className:`mt-2 flex max-w-full flex-wrap gap-2`,children:e.attachments.map((e,t)=>{let n=`${e.kind}-${e.name??e.mediaType??t}-${t}`;if(e.kind===`image`){let t=e.url??(e.data===void 0?void 0:`data:${e.mediaType??`image/png`};base64,${e.data}`);return(0,v.jsx)(`div`,{className:`overflow-hidden rounded-lg border border-border/80 bg-card/80`,children:t===void 0?(0,v.jsx)(`div`,{className:`grid h-20 w-24 place-items-center px-2 text-center text-xs text-muted-foreground`,children:`Image`}):(0,v.jsx)(`img`,{alt:e.name??`Attached image`,className:`h-20 w-24 object-cover`,src:t})},n)}return(0,v.jsx)(`span`,{className:`inline-flex max-w-full items-center gap-1.5 rounded-lg border border-border/80 bg-card/80 px-2 py-1 text-xs font-medium text-muted-foreground`,children:(0,v.jsx)(`span`,{className:`min-w-0 truncate`,children:e.name??e.mediaType??`Document`})},n)})})}function A(e){let t=e.split(`
2
+ `);return t.some((e,n)=>{let r=t[n+1];return e.includes(`|`)&&r!==void 0&&/^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/.test(r)})}function j(e){let[t,n]=(0,_.useState)(e.entry.approval?.status!==`pending`&&e.entry.question?.status!==`pending`),i=e.entry.approval,a=e.entry.question,s=e.entry.childEvents??[],l=e.entry.args!==void 0||e.entry.result!==void 0||s.length>0||i!==void 0||a!==void 0,u=i?.status===`pending`,d=a?.status===`pending`,p=i?.status===`cancelled`||a?.status===`cancelled`,g=i!==void 0&&e.decidingApprovals.has(i.id),y=a!==void 0&&e.answeringQuestions.has(a.id);return(0,v.jsxs)(`article`,{className:`w-full justify-self-start overflow-hidden rounded-xl border border-border/80 bg-card/90 text-foreground shadow-sm shadow-black/20`,"data-entry-id":String(e.entry.entryId),children:[(0,v.jsxs)(`div`,{className:r(`flex min-w-0 items-center gap-2 px-3 py-2.5`,!t&&l&&`bg-muted/20`),children:[(0,v.jsxs)(c,{"aria-expanded":!t,className:`h-auto min-h-0 min-w-0 flex-1 justify-between border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit`,type:`button`,variant:`ghost`,onClick:()=>n(e=>!e),children:[(0,v.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(`span`,{className:`grid h-6 w-4 shrink-0 place-items-center text-foreground`,children:(0,v.jsx)(o,{icon:f,className:`h-3.5 w-3.5`,"aria-hidden":`true`})}),(0,v.jsx)(`strong`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.entry.toolName})]}),u?null:(0,v.jsx)(`span`,{className:`ml-auto shrink-0 text-xs font-medium text-muted-foreground`,children:t?`Show`:`Hide`})]}),u&&i!==void 0?(0,v.jsx)(L,{disabled:g,onDecision:t=>e.onApprovalDecision(i.id,t)}):null,d?(0,v.jsx)(m,{className:`border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground`,children:`Waiting for input`}):null,p?(0,v.jsx)(m,{className:`border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-muted-foreground`,children:`Cancelled`}):null,u||d?(0,v.jsx)(c,{"aria-expanded":!t,className:`h-7 min-h-7 px-2 text-xs font-medium`,size:`sm`,type:`button`,variant:`ghost`,onClick:()=>n(e=>!e),children:t?`Show`:`Hide`}):null]}),t||!l?null:(0,v.jsxs)(`div`,{className:`grid gap-3 p-3`,children:[i===void 0?null:(0,v.jsx)(I,{approval:i}),a===void 0?null:(0,v.jsx)(N,{disabled:y,question:a,onAnswer:t=>e.onQuestionAnswer(a.id,t)}),a!==void 0||e.entry.args===void 0?null:(0,v.jsx)(h,{title:`Input`,value:e.entry.args}),s.length===0?null:(0,v.jsx)(M,{events:s}),a!==void 0||e.entry.result===void 0?null:(0,v.jsx)(h,{title:`Output`,value:e.entry.result})]})]})}function M(e){return(0,v.jsxs)(`div`,{className:`overflow-hidden rounded-xl border border-border/80 bg-background/65`,children:[(0,v.jsx)(`div`,{className:`bg-muted/20 px-3 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:`Subagent activity`}),(0,v.jsx)(`div`,{className:`grid gap-3 p-3`,children:e.events.map(e=>{let t=e.agentName??e.agentId;return e.kind===`message`||e.kind===`reasoning`?(0,v.jsxs)(`div`,{className:`grid gap-1 rounded-xl border border-border/80 bg-card/90 p-3`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(m,{className:`border-border bg-muted px-1.5 py-0.5 text-xs uppercase text-muted-foreground`,children:e.kind===`reasoning`?`Reasoning`:`Response`}),(0,v.jsx)(`span`,{className:`min-w-0 truncate text-xs font-semibold text-muted-foreground`,children:t})]}),(0,v.jsx)(g,{size:`base`,text:e.text})]},`${e.kind}-${e.agentId}-${e.text}`):(0,v.jsxs)(`div`,{className:`grid gap-2 rounded-xl border border-border/80 bg-card/90 p-3`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(m,{className:`border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground`,children:`Tool`}),(0,v.jsxs)(`span`,{className:`min-w-0 truncate text-xs font-semibold text-muted-foreground`,children:[t,` / `,e.toolName]})]}),e.args===void 0?null:(0,v.jsx)(h,{title:`Input`,value:e.args}),e.result===void 0?null:(0,v.jsx)(h,{title:`Output`,value:e.result})]},`${e.kind}-${e.agentId}-${e.toolName}-${e.callId??e.args??e.result??``}`)})})]})}function N(e){let[t,n]=(0,_.useState)({}),[r,i]=(0,_.useState)(0),a=e.question.status===`pending`,o=e.question.questions.length,s=e.question.questions.map(e=>{let n=t[e.id],r=n?.customValue?.trim()??``,i=r.length>0?r:n?.answer,a={questionId:e.id,answer:i?.trim()??``};return n?.choice!==void 0&&(a.choice=n.choice),r.length>0&&(a.custom=!0),a}),l=o===0?0:Math.min(r,o-1),u=e.question.questions[l],d=s[l]?.answer??``,f=s.filter(e=>e.answer.length>0).length,p=d.length>0,m=a&&s.every(e=>e.answer.length>0),h=l===0,g=l>=o-1;if(u===void 0)return(0,v.jsx)(`div`,{className:`rounded-xl border border-border bg-background p-4 text-sm font-medium text-muted-foreground`,children:`No questions`});let y=()=>i(e=>Math.max(0,e-1)),b=()=>i(t=>Math.min(e.question.questions.length-1,t+1)),x=(e,t)=>n(n=>({...n,[e]:t}));return(0,v.jsxs)(`div`,{className:`grid gap-3`,children:[e.question.status===`cancelled`?(0,v.jsx)(`div`,{className:`rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5 text-sm font-medium text-muted-foreground`,children:`Question cancelled`}):null,(0,v.jsx)(P,{disabled:e.disabled||!a,index:l,total:o,question:u,value:t[u.id],answer:e.question.answers?.find(e=>e.questionId===u.id),onChange:e=>x(u.id,e),onAdvance:g?void 0:b},u.id),a?(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2`,children:[(0,v.jsxs)(`div`,{className:`min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground`,children:[f,`/`,o,` answered`]}),(0,v.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[h?null:(0,v.jsx)(c,{type:`button`,variant:`secondary`,onClick:y,children:`Back`}),g?(0,v.jsx)(c,{className:`h-9 min-h-9 px-4`,disabled:e.disabled||!m,type:`button`,onClick:()=>e.onAnswer(s),children:`Submit answers`}):(0,v.jsx)(c,{className:`h-9 min-h-9 px-4`,disabled:e.disabled||!p,type:`button`,onClick:b,children:`Next question`})]})]}):o>1?(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2`,children:[(0,v.jsx)(`div`,{className:`min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-foreground`,children:`Answered`}),(0,v.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[(0,v.jsx)(c,{disabled:h,type:`button`,variant:`secondary`,onClick:y,children:`Back`}),(0,v.jsx)(c,{disabled:g,type:`button`,variant:`secondary`,onClick:b,children:`Next`})]})]}):null]})}function P(e){let t=e.answer?.answer,n=F(e.value),i=t===void 0?n.length>0?`Ready`:`Waiting`:`Answered`;return(0,v.jsxs)(`section`,{className:`grid gap-4 rounded-xl border border-border/80 bg-background/70 p-4`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4`,children:[(0,v.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,v.jsxs)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground`,children:[`Question `,e.index+1,` of `,e.total]}),(0,v.jsx)(`h3`,{className:`m-0 text-base font-semibold leading-7 text-foreground [overflow-wrap:anywhere]`,children:e.question.question})]}),(0,v.jsx)(`span`,{className:r(`shrink-0 text-xs font-semibold uppercase tracking-[0.18em]`,i===`Answered`&&`text-foreground`,i===`Ready`&&`text-foreground`,i===`Waiting`&&`text-muted-foreground`),children:i})]}),t===void 0?null:(0,v.jsx)(`div`,{className:`rounded-lg border border-border/70 bg-muted/45 px-3 py-2 text-sm font-medium text-foreground`,children:t}),t===void 0&&e.question.choices.length>0?(0,v.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.question.choices.map(t=>{let n=e.value?.choice===t.value;return(0,v.jsx)(c,{className:r(`h-8 min-h-8 px-3 text-xs`,n&&`border-foreground/45`),disabled:e.disabled,size:`sm`,type:`button`,variant:n?`default`:`secondary`,onClick:()=>{e.onChange({answer:t.value,choice:t.value,customValue:e.value?.customValue??``}),e.onAdvance?.()},children:t.label},t.value)})}):null,t===void 0?(0,v.jsx)(u,{className:`min-h-24 text-sm`,disabled:e.disabled,placeholder:`Type a custom answer`,rows:3,value:e.value?.customValue??``,onChange:t=>e.onChange({...e.value,customValue:t.currentTarget.value})}):null]})}function F(e){let t=e?.customValue?.trim()??``;return t.length>0?t:e?.answer?.trim()??``}function I(e){return(0,v.jsxs)(`div`,{className:`grid gap-2 rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(m,{className:r(`border-border/70 bg-background/60 px-1.5 py-0.5 text-xs uppercase text-muted-foreground`,e.approval.status===`approved`&&`text-foreground`,e.approval.status===`rejected`&&`text-destructive`),children:`Approval`}),(0,v.jsx)(`div`,{className:`min-w-0`,children:(0,v.jsx)(`div`,{className:`text-sm font-medium text-foreground`,children:i(e.approval)})})]}),e.approval.reason===void 0?null:(0,v.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]`,children:e.approval.reason})]})}function L(e){return(0,v.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 rounded-lg border border-border/80 bg-background/55 p-0.5`,children:[(0,v.jsx)(c,{className:`h-7 min-h-7 rounded-md border-0 bg-transparent px-2.5 text-xs text-muted-foreground shadow-none hover:bg-destructive/10 hover:text-destructive`,disabled:e.disabled,size:`sm`,type:`button`,variant:`ghost`,onClick:()=>e.onDecision(!1),children:`Reject`}),(0,v.jsx)(c,{className:`h-7 min-h-7 rounded-md px-2.5 text-xs`,disabled:e.disabled,size:`sm`,type:`button`,onClick:()=>e.onDecision(!0),children:`Approve`})]})}export{y as TranscriptItem};
3
+ //# sourceMappingURL=transcript-item-B0HTdQVL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-item-B0HTdQVL.js","names":[],"sources":["../../../src/ui/app/modules/playground/transcript-item.tsx"],"sourcesContent":["import {\n ChartBarLineIcon,\n Copy01Icon,\n CopyCheckIcon,\n PathIcon,\n Wrench01Icon,\n} from \"@hugeicons/core-free-icons\";\nimport { memo, useState } from \"react\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { cn } from \"../../lib/utils\";\nimport { approvalLabel } from \"../shared/format\";\nimport { MarkdownText, ToolPayload } from \"../shared/renderers\";\nimport type { ToolApproval, ToolMessage, ToolQuestion, TranscriptEntry } from \"../shared/types\";\nimport type { AssistantResponseMetrics, ResponseUsageMetrics } from \"./response-metrics\";\nimport { WorkingDuration } from \"./working-duration\";\n\nexport const TranscriptItem = memo(function TranscriptItem(props: {\n entry: TranscriptEntry;\n displayText?: string | undefined;\n live?: boolean | undefined;\n metrics?: AssistantResponseMetrics | undefined;\n workingStartedAt?: number | undefined;\n decidingApprovals: Set<string>;\n answeringQuestions: Set<string>;\n onApprovalDecision: (approvalId: string, approved: boolean) => void;\n onQuestionAnswer: (\n questionId: string,\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n onOpenTrace: (traceId: string) => void;\n}) {\n const displayText = props.displayText ?? (\"text\" in props.entry ? props.entry.text : \"\");\n if (props.entry.kind === \"reasoning\") {\n return (\n <article\n className=\"max-w-205 justify-self-start text-muted-foreground\"\n data-entry-id={String(props.entry.entryId)}\n >\n <div className=\"mb-1 text-xs font-semibold uppercase text-muted-foreground\">Reasoning</div>\n <MarkdownText live={props.live} size=\"base\" text={displayText} />\n </article>\n );\n }\n\n if (props.entry.kind === \"tool\") {\n return (\n <ToolEntry\n entry={props.entry}\n decidingApprovals={props.decidingApprovals}\n answeringQuestions={props.answeringQuestions}\n onApprovalDecision={props.onApprovalDecision}\n onQuestionAnswer={props.onQuestionAnswer}\n />\n );\n }\n\n const traceId = props.entry.role === \"assistant\" ? props.entry.traceId : undefined;\n const hasTable = props.entry.role === \"assistant\" && hasMarkdownTable(displayText);\n const isError =\n props.entry.role === \"assistant\" && \"tone\" in props.entry && props.entry.tone === \"error\";\n const isPending =\n props.entry.role === \"assistant\" && \"tone\" in props.entry && props.entry.tone === \"pending\";\n const showAssistantActions =\n props.entry.role === \"assistant\" && !isPending && props.entry.text.trim().length > 0;\n const persistedDurationMs = props.entry.durationMs ?? props.metrics?.durationMs;\n const showAssistantFooter =\n showAssistantActions ||\n props.workingStartedAt !== undefined ||\n persistedDurationMs !== undefined;\n\n if (props.entry.role === \"user\") {\n return (\n <article\n className=\"grid w-fit max-w-[min(64ch,82%)] justify-items-end justify-self-end self-start text-foreground\"\n data-entry-id={String(props.entry.entryId)}\n >\n {props.entry.text.trim().length === 0 ? null : (\n <div className=\"rounded-2xl bg-muted/55 px-4 py-2.5 shadow-sm shadow-black/[0.04] dark:bg-white/[0.08] dark:shadow-black/20\">\n <MarkdownText size=\"base\" text={props.entry.text} />\n </div>\n )}\n {props.entry.attachments !== undefined ? (\n <MessageAttachments attachments={props.entry.attachments} />\n ) : null}\n </article>\n );\n }\n\n return (\n <article\n className={cn(\n \"self-start\",\n hasTable ? \"w-full max-w-full\" : \"max-w-[min(82ch,100%)]\",\n props.entry.role === \"assistant\" &&\n cn(\"justify-self-start text-foreground\", isError && \"text-destructive\"),\n )}\n data-entry-id={String(props.entry.entryId)}\n >\n {isPending ? <AssistantLoadingIndicator /> : null}\n {displayText.trim().length === 0 ? null : (\n <MarkdownText live={props.live} size=\"base\" text={displayText} />\n )}\n {showAssistantFooter ? (\n <AssistantResponseFooter\n metrics={props.metrics}\n showActions={showAssistantActions}\n text={props.entry.text}\n traceId={traceId}\n durationMs={props.workingStartedAt === undefined ? persistedDurationMs : undefined}\n startedAt={props.workingStartedAt}\n onOpenTrace={props.onOpenTrace}\n />\n ) : null}\n </article>\n );\n});\n\nfunction AssistantResponseFooter(props: {\n durationMs?: number | undefined;\n metrics?: AssistantResponseMetrics | undefined;\n showActions: boolean;\n startedAt?: number | undefined;\n text: string;\n traceId?: string | undefined;\n onOpenTrace: (traceId: string) => void;\n}) {\n const [copied, setCopied] = useState(false);\n const traceId = props.traceId;\n\n async function copyResponse() {\n if (typeof navigator === \"undefined\" || navigator.clipboard === undefined) {\n return;\n }\n try {\n await navigator.clipboard.writeText(props.text);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n setCopied(false);\n }\n }\n\n return (\n <div className=\"mt-3 flex min-w-0 items-center gap-1.5\">\n {props.showActions ? (\n <Button\n aria-label={copied ? \"Response copied\" : \"Copy response\"}\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={copied ? \"Copied\" : \"Copy response\"}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => void copyResponse()}\n >\n <StudioIcon icon={copied ? CopyCheckIcon : Copy01Icon} aria-hidden=\"true\" />\n </Button>\n ) : null}\n {props.showActions ? (\n <div className=\"group relative\">\n <Button\n aria-label=\"Response metrics\"\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={metricsTitle(props.metrics)}\n type=\"button\"\n variant=\"ghost\"\n >\n <StudioIcon icon={ChartBarLineIcon} aria-hidden=\"true\" />\n </Button>\n <div\n className=\"pointer-events-none absolute left-0 top-full z-30 mt-2 hidden w-64 rounded-lg border border-border/90 bg-popover p-3 text-popover-foreground shadow-xl shadow-black/25 group-focus-within:grid group-hover:grid\"\n role=\"tooltip\"\n >\n <ResponseMetricsTooltip metrics={props.metrics} />\n </div>\n </div>\n ) : null}\n {!props.showActions || traceId === undefined ? null : (\n <Button\n aria-label={`Open trace ${traceId}`}\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={`Open trace ${traceId}`}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenTrace(traceId)}\n >\n <StudioIcon icon={PathIcon} aria-hidden=\"true\" />\n </Button>\n )}\n <WorkingDuration\n className={props.showActions ? \"ml-1.5\" : undefined}\n durationMs={props.durationMs}\n startedAt={props.startedAt}\n />\n </div>\n );\n}\n\nfunction ResponseMetricsTooltip(props: { metrics?: AssistantResponseMetrics | undefined }) {\n const rows = responseMetricRows(props.metrics);\n return (\n <div className=\"grid min-w-0 gap-2 text-xs leading-5\">\n <div className=\"font-semibold text-foreground\">Response metrics</div>\n <div className=\"grid min-w-0 gap-1\">\n <MetricRow label=\"Cost\" value=\"Unavailable\" />\n {rows.length === 0 ? (\n <div className=\"text-muted-foreground\">No usage metrics yet</div>\n ) : (\n rows.map((row) => <MetricRow label={row.label} value={row.value} key={row.label} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction MetricRow(props: { label: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">{props.label}</span>\n <span className=\"shrink-0 font-medium tabular-nums text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction responseMetricRows(metrics: AssistantResponseMetrics | undefined): Array<{\n label: string;\n value: string;\n}> {\n const rows: Array<{ label: string; value: string }> = [];\n const usage = metrics?.usage;\n if (usage?.totalTokens !== undefined) {\n rows.push({ label: \"Total\", value: `${formatMetricNumber(usage.totalTokens)} tokens` });\n }\n if (usage?.inputTokens !== undefined) {\n rows.push({ label: \"Input\", value: formatMetricNumber(usage.inputTokens) });\n }\n if (usage?.outputTokens !== undefined) {\n rows.push({ label: \"Output\", value: formatMetricNumber(usage.outputTokens) });\n }\n pushOptionalUsageRow(rows, \"Cached\", usage, \"cachedInputTokens\");\n pushOptionalUsageRow(rows, \"Cache create\", usage, \"cacheCreationInputTokens\");\n if (metrics?.durationMs !== undefined) {\n rows.push({ label: \"Duration\", value: formatResponseDuration(metrics.durationMs) });\n }\n return rows;\n}\n\nfunction pushOptionalUsageRow(\n rows: Array<{ label: string; value: string }>,\n label: string,\n usage: ResponseUsageMetrics | undefined,\n key: keyof ResponseUsageMetrics,\n) {\n const value = usage?.[key];\n if (value !== undefined && value > 0) {\n rows.push({ label, value: formatMetricNumber(value) });\n }\n}\n\nfunction metricsTitle(metrics: AssistantResponseMetrics | undefined): string {\n const rows = responseMetricRows(metrics);\n if (rows.length === 0) {\n return \"Cost unavailable. No usage metrics yet.\";\n }\n return [\"Cost unavailable\", ...rows.map((row) => `${row.label}: ${row.value}`)].join(\". \");\n}\n\nfunction formatMetricNumber(value: number): string {\n return value.toLocaleString();\n}\n\nfunction formatResponseDuration(value: number): string {\n if (value < 1000) {\n return `${value}ms`;\n }\n return `${(value / 1000).toFixed(1)}s`;\n}\n\nfunction AssistantLoadingIndicator() {\n return (\n <div\n aria-label=\"Assistant is responding\"\n className=\"inline-flex h-9 min-h-9 items-center gap-2 rounded-xl border border-border/70 bg-muted/35 px-3 text-muted-foreground shadow-sm\"\n role=\"status\"\n >\n <span className=\"flex items-center gap-1\" aria-hidden=\"true\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground\" />\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:150ms]\" />\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:300ms]\" />\n </span>\n <span className=\" text-xs font-semibold uppercase text-muted-foreground\">Thinking</span>\n </div>\n );\n}\n\nfunction MessageAttachments(props: {\n attachments: NonNullable<Extract<TranscriptEntry, { kind: \"message\" }>[\"attachments\"]>;\n}) {\n return (\n <div className=\"mt-2 flex max-w-full flex-wrap gap-2\">\n {props.attachments.map((attachment, index) => {\n const key = `${attachment.kind}-${attachment.name ?? attachment.mediaType ?? index}-${index}`;\n if (attachment.kind === \"image\") {\n const src =\n attachment.url ??\n (attachment.data === undefined\n ? undefined\n : `data:${attachment.mediaType ?? \"image/png\"};base64,${attachment.data}`);\n return (\n <div\n className=\"overflow-hidden rounded-lg border border-border/80 bg-card/80\"\n key={key}\n >\n {src === undefined ? (\n <div className=\"grid h-20 w-24 place-items-center px-2 text-center text-xs text-muted-foreground\">\n Image\n </div>\n ) : (\n <img\n alt={attachment.name ?? \"Attached image\"}\n className=\"h-20 w-24 object-cover\"\n src={src}\n />\n )}\n </div>\n );\n }\n return (\n <span\n className=\"inline-flex max-w-full items-center gap-1.5 rounded-lg border border-border/80 bg-card/80 px-2 py-1 text-xs font-medium text-muted-foreground\"\n key={key}\n >\n <span className=\"min-w-0 truncate\">\n {attachment.name ?? attachment.mediaType ?? \"Document\"}\n </span>\n </span>\n );\n })}\n </div>\n );\n}\n\nfunction hasMarkdownTable(text: string): boolean {\n const lines = text.split(\"\\n\");\n return lines.some((line, index) => {\n const next = lines[index + 1];\n return (\n line.includes(\"|\") &&\n next !== undefined &&\n /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)+\\|?\\s*$/.test(next)\n );\n });\n}\n\nfunction ToolEntry(props: {\n entry: ToolMessage;\n decidingApprovals: Set<string>;\n answeringQuestions: Set<string>;\n onApprovalDecision: (approvalId: string, approved: boolean) => void;\n onQuestionAnswer: (\n questionId: string,\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n}) {\n const [collapsed, setCollapsed] = useState(\n props.entry.approval?.status !== \"pending\" && props.entry.question?.status !== \"pending\",\n );\n const approval = props.entry.approval;\n const question = props.entry.question;\n const childEvents = props.entry.childEvents ?? [];\n const hasPayload =\n props.entry.args !== undefined ||\n props.entry.result !== undefined ||\n childEvents.length > 0 ||\n approval !== undefined ||\n question !== undefined;\n const pendingApproval = approval?.status === \"pending\";\n const pendingQuestion = question?.status === \"pending\";\n const cancelledInteraction = approval?.status === \"cancelled\" || question?.status === \"cancelled\";\n const deciding = approval !== undefined && props.decidingApprovals.has(approval.id);\n const answering = question !== undefined && props.answeringQuestions.has(question.id);\n\n return (\n <article\n className=\"w-full justify-self-start overflow-hidden rounded-xl border border-border/80 bg-card/90 text-foreground shadow-sm shadow-black/20\"\n data-entry-id={String(props.entry.entryId)}\n >\n <div\n className={cn(\n \"flex min-w-0 items-center gap-2 px-3 py-2.5\",\n !collapsed && hasPayload && \"bg-muted/20\",\n )}\n >\n <Button\n aria-expanded={!collapsed}\n className=\"h-auto min-h-0 min-w-0 flex-1 justify-between border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setCollapsed((current) => !current)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"grid h-6 w-4 shrink-0 place-items-center text-foreground\">\n <StudioIcon icon={Wrench01Icon} className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </span>\n <strong className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.entry.toolName}\n </strong>\n </span>\n {pendingApproval ? null : (\n <span className=\"ml-auto shrink-0 text-xs font-medium text-muted-foreground\">\n {collapsed ? \"Show\" : \"Hide\"}\n </span>\n )}\n </Button>\n {pendingApproval && approval !== undefined ? (\n <ToolApprovalActions\n disabled={deciding}\n onDecision={(approved) => props.onApprovalDecision(approval.id, approved)}\n />\n ) : null}\n {pendingQuestion ? (\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground\">\n Waiting for input\n </Badge>\n ) : null}\n {cancelledInteraction ? (\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-muted-foreground\">\n Cancelled\n </Badge>\n ) : null}\n {pendingApproval || pendingQuestion ? (\n <Button\n aria-expanded={!collapsed}\n className=\"h-7 min-h-7 px-2 text-xs font-medium\"\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setCollapsed((current) => !current)}\n >\n {collapsed ? \"Show\" : \"Hide\"}\n </Button>\n ) : null}\n </div>\n {collapsed || !hasPayload ? null : (\n <div className=\"grid gap-3 p-3\">\n {approval === undefined ? null : <ToolApprovalPanel approval={approval} />}\n {question === undefined ? null : (\n <ToolQuestionPanel\n disabled={answering}\n question={question}\n onAnswer={(answers) => props.onQuestionAnswer(question.id, answers)}\n />\n )}\n {question !== undefined || props.entry.args === undefined ? null : (\n <ToolPayload title=\"Input\" value={props.entry.args} />\n )}\n {childEvents.length === 0 ? null : <ChildAgentActivity events={childEvents} />}\n {question !== undefined || props.entry.result === undefined ? null : (\n <ToolPayload title=\"Output\" value={props.entry.result} />\n )}\n </div>\n )}\n </article>\n );\n}\n\nfunction ChildAgentActivity(props: { events: NonNullable<ToolMessage[\"childEvents\"]> }) {\n return (\n <div className=\"overflow-hidden rounded-xl border border-border/80 bg-background/65\">\n <div className=\"bg-muted/20 px-3 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n Subagent activity\n </div>\n <div className=\"grid gap-3 p-3\">\n {props.events.map((event) => {\n const agentLabel = event.agentName ?? event.agentId;\n if (event.kind === \"message\" || event.kind === \"reasoning\") {\n return (\n <div\n className=\"grid gap-1 rounded-xl border border-border/80 bg-card/90 p-3\"\n key={`${event.kind}-${event.agentId}-${event.text}`}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge className=\"border-border bg-muted px-1.5 py-0.5 text-xs uppercase text-muted-foreground\">\n {event.kind === \"reasoning\" ? \"Reasoning\" : \"Response\"}\n </Badge>\n <span className=\"min-w-0 truncate text-xs font-semibold text-muted-foreground\">\n {agentLabel}\n </span>\n </div>\n <MarkdownText size=\"base\" text={event.text} />\n </div>\n );\n }\n return (\n <div\n className=\"grid gap-2 rounded-xl border border-border/80 bg-card/90 p-3\"\n key={`${event.kind}-${event.agentId}-${event.toolName}-${event.callId ?? event.args ?? event.result ?? \"\"}`}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground\">\n Tool\n </Badge>\n <span className=\"min-w-0 truncate text-xs font-semibold text-muted-foreground\">\n {agentLabel} / {event.toolName}\n </span>\n </div>\n {event.args === undefined ? null : <ToolPayload title=\"Input\" value={event.args} />}\n {event.result === undefined ? null : (\n <ToolPayload title=\"Output\" value={event.result} />\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ToolQuestionPanel(props: {\n question: ToolQuestion;\n disabled: boolean;\n onAnswer: (\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n}) {\n const [values, setValues] = useState<Record<string, QuestionDraft>>({});\n const [activeQuestionIndex, setActiveQuestionIndex] = useState(0);\n const pending = props.question.status === \"pending\";\n const total = props.question.questions.length;\n\n const answers = props.question.questions.map((question) => {\n const draft = values[question.id];\n const customAnswer = draft?.customValue?.trim() ?? \"\";\n const answer = customAnswer.length > 0 ? customAnswer : draft?.answer;\n const normalized: { questionId: string; answer: string; choice?: string; custom?: boolean } = {\n questionId: question.id,\n answer: answer?.trim() ?? \"\",\n };\n if (draft?.choice !== undefined) normalized.choice = draft.choice;\n if (customAnswer.length > 0) normalized.custom = true;\n return normalized;\n });\n const activeIndex = total === 0 ? 0 : Math.min(activeQuestionIndex, total - 1);\n const activeQuestion = props.question.questions[activeIndex];\n const activeAnswer = answers[activeIndex]?.answer ?? \"\";\n const answeredCount = answers.filter((answer) => answer.answer.length > 0).length;\n const canAdvance = activeAnswer.length > 0;\n const canSubmit = pending && answers.every((answer) => answer.answer.length > 0);\n const firstQuestion = activeIndex === 0;\n const lastQuestion = activeIndex >= total - 1;\n\n if (activeQuestion === undefined) {\n return (\n <div className=\"rounded-xl border border-border bg-background p-4 text-sm font-medium text-muted-foreground\">\n No questions\n </div>\n );\n }\n\n const goPrevious = () => setActiveQuestionIndex((current) => Math.max(0, current - 1));\n const goNext = () =>\n setActiveQuestionIndex((current) => Math.min(props.question.questions.length - 1, current + 1));\n const updateDraft = (questionId: string, value: QuestionDraft) =>\n setValues((current) => ({\n ...current,\n [questionId]: value,\n }));\n\n return (\n <div className=\"grid gap-3\">\n {props.question.status === \"cancelled\" ? (\n <div className=\"rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5 text-sm font-medium text-muted-foreground\">\n Question cancelled\n </div>\n ) : null}\n <QuestionPromptControl\n key={activeQuestion.id}\n disabled={props.disabled || !pending}\n index={activeIndex}\n total={total}\n question={activeQuestion}\n value={values[activeQuestion.id]}\n answer={props.question.answers?.find((answer) => answer.questionId === activeQuestion.id)}\n onChange={(value) => updateDraft(activeQuestion.id, value)}\n onAdvance={lastQuestion ? undefined : goNext}\n />\n {pending ? (\n <div className=\"flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2\">\n <div className=\"min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n {answeredCount}/{total} answered\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {firstQuestion ? null : (\n <Button type=\"button\" variant=\"secondary\" onClick={goPrevious}>\n Back\n </Button>\n )}\n {lastQuestion ? (\n <Button\n className=\"h-9 min-h-9 px-4\"\n disabled={props.disabled || !canSubmit}\n type=\"button\"\n onClick={() => props.onAnswer(answers)}\n >\n Submit answers\n </Button>\n ) : (\n <Button\n className=\"h-9 min-h-9 px-4\"\n disabled={props.disabled || !canAdvance}\n type=\"button\"\n onClick={goNext}\n >\n Next question\n </Button>\n )}\n </div>\n </div>\n ) : total > 1 ? (\n <div className=\"flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2\">\n <div className=\"min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-foreground\">\n Answered\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button disabled={firstQuestion} type=\"button\" variant=\"secondary\" onClick={goPrevious}>\n Back\n </Button>\n <Button disabled={lastQuestion} type=\"button\" variant=\"secondary\" onClick={goNext}>\n Next\n </Button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype QuestionDraft = {\n answer?: string;\n choice?: string;\n customValue?: string;\n};\n\nfunction QuestionPromptControl(props: {\n question: ToolQuestion[\"questions\"][number];\n value: QuestionDraft | undefined;\n answer: NonNullable<ToolQuestion[\"answers\"]>[number] | undefined;\n disabled: boolean;\n index: number;\n total: number;\n onChange: (value: QuestionDraft) => void;\n onAdvance: (() => void) | undefined;\n}) {\n const submittedAnswer = props.answer?.answer;\n const draftAnswer = questionDraftAnswer(props.value);\n const state =\n submittedAnswer !== undefined ? \"Answered\" : draftAnswer.length > 0 ? \"Ready\" : \"Waiting\";\n\n return (\n <section className=\"grid gap-4 rounded-xl border border-border/80 bg-background/70 p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n Question {props.index + 1} of {props.total}\n </div>\n <h3 className=\"m-0 text-base font-semibold leading-7 text-foreground [overflow-wrap:anywhere]\">\n {props.question.question}\n </h3>\n </div>\n <span\n className={cn(\n \"shrink-0 text-xs font-semibold uppercase tracking-[0.18em]\",\n state === \"Answered\" && \"text-foreground\",\n state === \"Ready\" && \"text-foreground\",\n state === \"Waiting\" && \"text-muted-foreground\",\n )}\n >\n {state}\n </span>\n </div>\n {submittedAnswer === undefined ? null : (\n <div className=\"rounded-lg border border-border/70 bg-muted/45 px-3 py-2 text-sm font-medium text-foreground\">\n {submittedAnswer}\n </div>\n )}\n {submittedAnswer !== undefined ? null : props.question.choices.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {props.question.choices.map((choice) => {\n const active = props.value?.choice === choice.value;\n return (\n <Button\n key={choice.value}\n className={cn(\"h-8 min-h-8 px-3 text-xs\", active && \"border-foreground/45\")}\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n variant={active ? \"default\" : \"secondary\"}\n onClick={() => {\n props.onChange({\n answer: choice.value,\n choice: choice.value,\n customValue: props.value?.customValue ?? \"\",\n });\n props.onAdvance?.();\n }}\n >\n {choice.label}\n </Button>\n );\n })}\n </div>\n ) : null}\n {submittedAnswer !== undefined ? null : (\n <Textarea\n className=\"min-h-24 text-sm\"\n disabled={props.disabled}\n placeholder=\"Type a custom answer\"\n rows={3}\n value={props.value?.customValue ?? \"\"}\n onChange={(event) =>\n props.onChange({\n ...props.value,\n customValue: event.currentTarget.value,\n })\n }\n />\n )}\n </section>\n );\n}\n\nfunction questionDraftAnswer(value: QuestionDraft | undefined): string {\n const customAnswer = value?.customValue?.trim() ?? \"\";\n return customAnswer.length > 0 ? customAnswer : (value?.answer?.trim() ?? \"\");\n}\n\nfunction ToolApprovalPanel(props: { approval: ToolApproval }) {\n return (\n <div className=\"grid gap-2 rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge\n className={cn(\n \"border-border/70 bg-background/60 px-1.5 py-0.5 text-xs uppercase text-muted-foreground\",\n props.approval.status === \"approved\" && \"text-foreground\",\n props.approval.status === \"rejected\" && \"text-destructive\",\n )}\n >\n Approval\n </Badge>\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{approvalLabel(props.approval)}</div>\n </div>\n </div>\n {props.approval.reason === undefined ? null : (\n <div className=\"text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]\">\n {props.approval.reason}\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolApprovalActions(props: {\n disabled: boolean;\n onDecision: (approved: boolean) => void;\n}) {\n return (\n <div className=\"flex shrink-0 items-center gap-1 rounded-lg border border-border/80 bg-background/55 p-0.5\">\n <Button\n className=\"h-7 min-h-7 rounded-md border-0 bg-transparent px-2.5 text-xs text-muted-foreground shadow-none hover:bg-destructive/10 hover:text-destructive\"\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onDecision(false)}\n >\n Reject\n </Button>\n <Button\n className=\"h-7 min-h-7 rounded-md px-2.5 text-xs\"\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n onClick={() => props.onDecision(true)}\n >\n Approve\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -9,9 +9,9 @@
9
9
  content="Professional Studio interface for Anvia agents, sessions, tools, knowledge, and traces."
10
10
  />
11
11
  <link rel="icon" type="image/png" href="/ui/assets/anvia.png" />
12
- <script type="module" crossorigin src="/ui/assets/index-CVaGs3Mg.js"></script>
12
+ <script type="module" crossorigin src="/ui/assets/index-CaB9mtgz.js"></script>
13
13
  <link rel="modulepreload" crossorigin href="/ui/assets/utils-BN2yP0LH.js">
14
- <link rel="modulepreload" crossorigin href="/ui/assets/chunk-HU55YP24-CBgJL7lU.js">
14
+ <link rel="modulepreload" crossorigin href="/ui/assets/chunk-TIV3WFSR-BCFNcVBW.js">
15
15
  <link rel="modulepreload" crossorigin href="/ui/assets/format-D43vTqrO.js">
16
16
  <link rel="stylesheet" crossorigin href="/ui/assets/index-CQmSyO8y.css">
17
17
  </head>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/studio",
3
- "version": "0.7.38",
3
+ "version": "0.7.40",
4
4
  "description": "Studio UI and HTTP runtime for Anvia agents.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -26,26 +26,26 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "@hono/node-server": "^2.0.8",
30
- "@hugeicons/core-free-icons": "^4.2.2",
29
+ "@hono/node-server": "^2.0.11",
30
+ "@hugeicons/core-free-icons": "^4.2.3",
31
31
  "@hugeicons/react": "^1.1.9",
32
- "@radix-ui/react-alert-dialog": "^1.1.18",
33
- "@radix-ui/react-dialog": "^1.1.18",
34
- "@radix-ui/react-scroll-area": "^1.2.13",
35
- "@radix-ui/react-select": "^2.3.2",
36
- "@radix-ui/react-separator": "^1.1.11",
32
+ "@radix-ui/react-alert-dialog": "^1.1.20",
33
+ "@radix-ui/react-dialog": "^1.1.20",
34
+ "@radix-ui/react-scroll-area": "^1.2.15",
35
+ "@radix-ui/react-select": "^2.3.4",
36
+ "@radix-ui/react-separator": "^1.1.12",
37
37
  "@radix-ui/react-slot": "^1.3.0",
38
- "@tanstack/react-router": "1.170.17",
39
- "@xyflow/react": "^12.11.1",
38
+ "@tanstack/react-router": "1.170.18",
39
+ "@xyflow/react": "^12.11.2",
40
40
  "class-variance-authority": "^0.7.1",
41
41
  "clsx": "^2.1.1",
42
- "hono": "^4.12.27",
42
+ "hono": "^4.12.31",
43
43
  "react": "^19.2.7",
44
44
  "react-dom": "^19.2.7",
45
45
  "tailwind-merge": "^3.6.0",
46
- "@anvia/react": "0.9.1",
47
- "@anvia/react-ui": "0.6.0",
48
- "@anvia/server": "0.5.12"
46
+ "@anvia/server": "0.5.13",
47
+ "@anvia/react": "0.9.2",
48
+ "@anvia/react-ui": "0.6.1"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@tailwindcss/typography": "^0.5.19",
@@ -60,7 +60,7 @@
60
60
  "vite": "^8.0.10",
61
61
  "vitest": "^4.0.8",
62
62
  "zod": "^4.4.3",
63
- "@anvia/core": "0.14.0"
63
+ "@anvia/core": "0.15.0"
64
64
  },
65
65
  "peerDependencies": {
66
66
  "@anvia/core": ">=0.13.4 <1.0.0"
@@ -1,2 +0,0 @@
1
- var e=[[`path`,{d:`M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}],[`path`,{d:`M11 13.4625C14 14.955 17 12.8198 17 10.3934C17 7.96698 14.7614 6 12 6C9.23858 6 7 7.96698 7 10.3934C7 11.3826 7.37209 12.2955 8 13.0298M11 13.4625V9.90523M11 13.4625V15.8456C11 16.8264 11 17.3168 10.7732 17.5868C10.1251 18.3583 9 17.9399 8.5 17.2275`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`1`}]];export{e as t};
2
- //# sourceMappingURL=PathIcon-B7p7vF2d.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PathIcon-B7p7vF2d.js","names":[],"sources":["../../../../../node_modules/.pnpm/@hugeicons+core-free-icons@4.2.2/node_modules/@hugeicons/core-free-icons/dist/esm/PathIcon.js"],"sourcesContent":["const PathIcon = [\n [\"path\", { d: \"M2.5 12C2.5 7.52166 2.5 5.28249 3.89124 3.89124C5.28249 2.5 7.52166 2.5 12 2.5C16.4783 2.5 18.7175 2.5 20.1088 3.89124C21.5 5.28249 21.5 7.52166 21.5 12C21.5 16.4783 21.5 18.7175 20.1088 20.1088C18.7175 21.5 16.4783 21.5 12 21.5C7.52166 21.5 5.28249 21.5 3.89124 20.1088C2.5 18.7175 2.5 16.4783 2.5 12Z\", stroke: \"currentColor\", strokeLinejoin: \"round\", strokeWidth: \"1.5\", key: \"0\" }],\n [\"path\", { d: \"M11 13.4625C14 14.955 17 12.8198 17 10.3934C17 7.96698 14.7614 6 12 6C9.23858 6 7 7.96698 7 10.3934C7 11.3826 7.37209 12.2955 8 13.0298M11 13.4625V9.90523M11 13.4625V15.8456C11 16.8264 11 17.3168 10.7732 17.5868C10.1251 18.3583 9 17.9399 8.5 17.2275\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"1.5\", key: \"1\" }]\n];\n\nexport { PathIcon as default };\n//# sourceMappingURL=PathIcon.js.map\n"],"x_google_ignoreList":[0],"mappings":"AAAA,IAAM,EAAW,CACf,CAAC,OAAQ,CAAE,EAAG,iTAAkT,OAAQ,eAAgB,eAAgB,QAAS,YAAa,MAAO,IAAK,IAAK,CAAC,CAChZ,CAAC,OAAQ,CAAE,EAAG,4PAA6P,OAAQ,eAAgB,cAAe,QAAS,eAAgB,QAAS,YAAa,MAAO,IAAK,IAAK,CAAC,CACpX"}
@@ -1,2 +0,0 @@
1
- var e=[[`path`,{d:`M18.8906 12.846C18.5371 14.189 16.8667 15.138 13.5257 17.0361C10.296 18.8709 8.6812 19.7884 7.37983 19.4196C6.8418 19.2671 6.35159 18.9776 5.95624 18.5787C5 17.6139 5 15.7426 5 12C5 8.2574 5 6.3861 5.95624 5.42132C6.35159 5.02245 6.8418 4.73288 7.37983 4.58042C8.6812 4.21165 10.296 5.12907 13.5257 6.96393C16.8667 8.86197 18.5371 9.811 18.8906 11.154C19.0365 11.7084 19.0365 12.2916 18.8906 12.846Z`,stroke:`currentColor`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}]];export{e as t};
2
- //# sourceMappingURL=PlayIcon-Dt2gGfiW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PlayIcon-Dt2gGfiW.js","names":[],"sources":["../../../../../node_modules/.pnpm/@hugeicons+core-free-icons@4.2.2/node_modules/@hugeicons/core-free-icons/dist/esm/PlayIcon.js"],"sourcesContent":["const PlayIcon = [\n [\"path\", { d: \"M18.8906 12.846C18.5371 14.189 16.8667 15.138 13.5257 17.0361C10.296 18.8709 8.6812 19.7884 7.37983 19.4196C6.8418 19.2671 6.35159 18.9776 5.95624 18.5787C5 17.6139 5 15.7426 5 12C5 8.2574 5 6.3861 5.95624 5.42132C6.35159 5.02245 6.8418 4.73288 7.37983 4.58042C8.6812 4.21165 10.296 5.12907 13.5257 6.96393C16.8667 8.86197 18.5371 9.811 18.8906 11.154C19.0365 11.7084 19.0365 12.2916 18.8906 12.846Z\", stroke: \"currentColor\", strokeLinejoin: \"round\", strokeWidth: \"1.5\", key: \"0\" }]\n];\n\nexport { PlayIcon as default };\n//# sourceMappingURL=PlayIcon.js.map\n"],"x_google_ignoreList":[0],"mappings":"AAAA,IAAM,EAAW,CACf,CAAC,OAAQ,CAAE,EAAG,kZAAmZ,OAAQ,eAAgB,eAAgB,QAAS,YAAa,MAAO,IAAK,IAAK,CAAC,CAClf"}
@@ -1,2 +0,0 @@
1
- var e=[[`path`,{d:`M20.0092 2V5.13219C20.0092 5.42605 19.6418 5.55908 19.4537 5.33333C17.6226 3.2875 14.9617 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C17.5228 22 22 17.5228 22 12`,stroke:`currentColor`,strokeLinecap:`round`,strokeLinejoin:`round`,strokeWidth:`1.5`,key:`0`}]];export{e as t};
2
- //# sourceMappingURL=RefreshIcon-BOrxG7tt.js.map