@anvia/studio 0.7.14 → 0.7.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +13 -1
- package/dist/index.js +43 -7
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/agents-page-nyn87qWN.js +2 -0
- package/dist/ui/assets/agents-page-nyn87qWN.js.map +1 -0
- package/dist/ui/assets/anvia.png +0 -0
- package/dist/ui/assets/evals-page-CrS8Nw5a.js +2 -0
- package/dist/ui/assets/{evals-page-w-gdHmQ3.js.map → evals-page-CrS8Nw5a.js.map} +1 -1
- package/dist/ui/assets/index-D5lHtsjb.js +154 -0
- package/dist/ui/assets/index-D5lHtsjb.js.map +1 -0
- package/dist/ui/assets/index-Dl647xDC.css +1 -0
- package/dist/ui/assets/knowledge-page-bW8GeV7O.js +2 -0
- package/dist/ui/assets/knowledge-page-bW8GeV7O.js.map +1 -0
- package/dist/ui/assets/logo.png +0 -0
- package/dist/ui/assets/mcps-page-CQV4bt_B.js +2 -0
- package/dist/ui/assets/mcps-page-CQV4bt_B.js.map +1 -0
- package/dist/ui/assets/memory-page-BCS0r7-V.js +2 -0
- package/dist/ui/assets/memory-page-BCS0r7-V.js.map +1 -0
- package/dist/ui/assets/pipelines-page-COYYrCkj.js +8 -0
- package/dist/ui/assets/pipelines-page-COYYrCkj.js.map +1 -0
- package/dist/ui/assets/{renderers-CIC1VVRv.js → renderers-m-gqGocU.js} +2 -2
- package/dist/ui/assets/{renderers-CIC1VVRv.js.map → renderers-m-gqGocU.js.map} +1 -1
- package/dist/ui/assets/{sessions-page-CmDz8RxM.js → sessions-page-DozrArmB.js} +2 -2
- package/dist/ui/assets/{sessions-page-CmDz8RxM.js.map → sessions-page-DozrArmB.js.map} +1 -1
- package/dist/ui/assets/status-page-BLRlLRKt.js +2 -0
- package/dist/ui/assets/status-page-BLRlLRKt.js.map +1 -0
- package/dist/ui/assets/tool-runner-BB55tqKT.js +2 -0
- package/dist/ui/assets/tool-runner-BB55tqKT.js.map +1 -0
- package/dist/ui/assets/tools-page-JpNgNaFG.js +2 -0
- package/dist/ui/assets/tools-page-JpNgNaFG.js.map +1 -0
- package/dist/ui/assets/trace-browser-41yNH-qC.js +10 -0
- package/dist/ui/assets/{trace-browser-DaE4vnXd.js.map → trace-browser-41yNH-qC.js.map} +1 -1
- package/dist/ui/assets/transcript-item-DGNb8jMo.js +3 -0
- package/dist/ui/assets/transcript-item-DGNb8jMo.js.map +1 -0
- package/dist/ui/index.html +12 -7
- package/package.json +4 -4
- package/dist/ui/assets/agents-page-B8Tw2e11.js +0 -2
- package/dist/ui/assets/agents-page-B8Tw2e11.js.map +0 -1
- package/dist/ui/assets/evals-page-w-gdHmQ3.js +0 -2
- package/dist/ui/assets/index-BImv2lI7.js +0 -154
- package/dist/ui/assets/index-BImv2lI7.js.map +0 -1
- package/dist/ui/assets/index-C3lio5tU.css +0 -1
- package/dist/ui/assets/knowledge-page-Diqg4sSt.js +0 -2
- package/dist/ui/assets/knowledge-page-Diqg4sSt.js.map +0 -1
- package/dist/ui/assets/mcps-page-XTpTg88A.js +0 -2
- package/dist/ui/assets/mcps-page-XTpTg88A.js.map +0 -1
- package/dist/ui/assets/memory-page-DXesSt0M.js +0 -2
- package/dist/ui/assets/memory-page-DXesSt0M.js.map +0 -1
- package/dist/ui/assets/pipelines-page-Bk0Qm7db.js +0 -8
- package/dist/ui/assets/pipelines-page-Bk0Qm7db.js.map +0 -1
- package/dist/ui/assets/status-page-oWsYfXZZ.js +0 -2
- package/dist/ui/assets/status-page-oWsYfXZZ.js.map +0 -1
- package/dist/ui/assets/tools-page-C-ht7C6S.js +0 -2
- package/dist/ui/assets/tools-page-C-ht7C6S.js.map +0 -1
- package/dist/ui/assets/trace-browser-DaE4vnXd.js +0 -10
- package/dist/ui/assets/transcript-item-BqGgawoe.js +0 -3
- package/dist/ui/assets/transcript-item-BqGgawoe.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e,r as t,s as n,t as r}from"./utils-BN2yP0LH.js";import{t as i}from"./badge-BH7gz3tB.js";var a=n(e(),1),o=t();function s(e){let[t,n]=(0,a.useState)({});(0,a.useEffect)(()=>{let t=!1;async function r(){let r=await Promise.all(e.agents.map(async e=>{try{let t=await fetch(`/agents/${encodeURIComponent(e.id)}/runtime`);return t.ok?[e.id,await t.json()]:[e.id,void 0]}catch{return[e.id,void 0]}}));t||n(Object.fromEntries(r))}return r(),()=>{t=!0}},[e.agents]);let r=y(e.agents,t);return(0,o.jsxs)(`section`,{className:`grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55`,"aria-label":`Agents`,children:[(0,o.jsx)(`header`,{className:`bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur`,children:(0,o.jsxs)(`div`,{className:`grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1`,children:[(0,o.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,o.jsx)(`h1`,{className:`m-0 text-2xl font-semibold leading-none tracking-tight text-foreground`,children:`Studio`}),(0,o.jsx)(`p`,{className:`m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground`,children:`Registered agents and the runtime capabilities exposed to Studio.`})]}),(0,o.jsxs)(`div`,{className:`flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start`,children:[(0,o.jsx)(m,{label:`agents`,value:e.agents.length}),(0,o.jsx)(m,{label:`tools`,value:r.tools}),(0,o.jsx)(m,{label:`context`,value:r.context}),(0,o.jsx)(m,{label:`prompts`,value:r.prompts})]})]})}),(0,o.jsx)(`div`,{className:`min-h-0 overflow-auto pb-6 pl-4 pr-6`,children:(0,o.jsx)(`div`,{className:`grid w-full`,children:e.agents.length===0?(0,o.jsx)(`div`,{className:`grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center`,children:(0,o.jsxs)(`div`,{className:`grid max-w-md gap-2`,children:[(0,o.jsx)(`h2`,{className:`m-0 text-base font-semibold text-foreground`,children:`No agents`}),(0,o.jsx)(`p`,{className:`m-0 text-sm leading-6 text-muted-foreground`,children:`Studio has no registered agents to inspect.`})]})}):(0,o.jsx)(c,{agents:e.agents,runtimeByAgentId:t,selectedAgentId:e.selectedAgentId})})})]})}function c(e){return(0,o.jsx)(`div`,{className:`min-w-[980px]`,children:(0,o.jsxs)(`table`,{className:`w-full border-separate border-spacing-0 text-left`,children:[(0,o.jsx)(`thead`,{className:`sticky top-0 z-10 bg-background/95 backdrop-blur`,children:(0,o.jsxs)(`tr`,{children:[(0,o.jsx)(u,{children:`Agent`}),(0,o.jsx)(u,{children:`Model`}),(0,o.jsx)(u,{children:`Runtime`}),(0,o.jsx)(u,{children:`Capabilities`})]})}),(0,o.jsx)(`tbody`,{children:e.agents.map(t=>(0,o.jsx)(l,{agent:t,active:t.id===e.selectedAgentId,runtime:e.runtimeByAgentId[t.id]},t.id))})]})})}function l(e){let t=e.runtime,n=t===void 0?`Runtime unavailable`:t.model===void 0?`No model reported`:b(t.model);return(0,o.jsxs)(`tr`,{children:[(0,o.jsx)(d,{children:(0,o.jsxs)(`div`,{className:`grid min-w-0 gap-1.5`,children:[(0,o.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,o.jsx)(`span`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.agent.name??e.agent.id}),e.active?(0,o.jsx)(i,{className:h,children:`selected`}):null]}),(0,o.jsx)(`span`,{className:`min-w-0 break-all text-xs font-medium leading-5 text-muted-foreground`,children:e.agent.id}),(0,o.jsx)(`p`,{className:`m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground`,children:e.agent.description??`No description`})]})}),(0,o.jsx)(d,{children:(0,o.jsx)(`span`,{className:r(`block max-w-[260px] truncate text-sm leading-6`,t===void 0?`text-muted-foreground`:`text-foreground`),title:n,children:n})}),(0,o.jsx)(d,{children:t===void 0?(0,o.jsx)(`span`,{className:`text-sm leading-6 text-muted-foreground`,children:`Waiting for summary`}):(0,o.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,o.jsx)(f,{label:`tools`,value:t.toolCount}),(0,o.jsx)(f,{label:`mcp`,value:t.mcpToolCount}),(0,o.jsx)(f,{label:`context`,value:t.staticContextCount+t.dynamicContextCount}),(0,o.jsx)(f,{label:`observers`,value:t.observerCount}),(0,o.jsx)(f,{label:`prompts`,value:e.agent.quickPrompts.length})]})}),(0,o.jsx)(d,{children:t===void 0?(0,o.jsx)(`span`,{className:`text-sm leading-6 text-muted-foreground`,children:`Not loaded`}):(0,o.jsxs)(`div`,{className:`flex min-w-0 flex-wrap gap-2`,children:[(0,o.jsx)(p,{enabled:t.hasMemory,children:`memory`}),(0,o.jsx)(p,{enabled:t.hasHook,children:`hook`}),(0,o.jsx)(p,{enabled:t.hasOutputSchema,children:`schema`}),t.defaultMaxTurns===void 0?null:(0,o.jsxs)(i,{className:v,children:[t.defaultMaxTurns,` turns`]})]})})]})}function u(e){return(0,o.jsx)(`th`,{className:`border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0`,children:e.children})}function d(e){return(0,o.jsx)(`td`,{className:`border-b border-border/70 py-3.5 pr-5 align-top first:pl-0`,children:e.children})}function f(e){return(0,o.jsxs)(`span`,{className:`inline-flex min-h-7 items-center gap-1.5 rounded-md bg-muted/25 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,o.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}function p(e){return(0,o.jsx)(i,{className:e.enabled?g:_,children:e.children})}function m(e){return(0,o.jsxs)(`span`,{className:`inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground`,children:[(0,o.jsx)(`span`,{className:`font-semibold tabular-nums text-foreground`,children:e.value}),e.label]})}var h=`border-border/80 bg-muted/45 text-foreground`,g=`border-border/80 bg-muted/35 text-foreground`,_=`border-transparent bg-transparent text-muted-foreground/60`,v=`border-border/80 bg-muted/35 text-muted-foreground`;function y(e,t){return e.reduce((e,n)=>{let r=t[n.id];return e.prompts+=n.quickPrompts.length,r!==void 0&&(e.tools+=r.toolCount+r.mcpToolCount,e.context+=r.staticContextCount+r.dynamicContextCount),e},{context:0,prompts:0,tools:0})}function b(e){if(e===null)return`null`;if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return String(e);if(Array.isArray(e))return`[${e.length}]`;if(typeof e==`object`){let t=x(e,`model`)??x(e,`defaultModel`),n=x(e,`provider`),r=x(e,`id`)??x(e,`name`),i=t??r;return n!==void 0&&i!==void 0&&n!==i?`${n} / ${i}`:i??n??`Custom model`}return``}function x(e,t){let n=e;return typeof n[t]==`string`?n[t]:void 0}export{s as AgentsPage};
|
|
2
|
+
//# sourceMappingURL=agents-page-nyn87qWN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-page-nyn87qWN.js","names":[],"sources":["../../../src/ui/app/modules/agents/agents-page.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useState } from \"react\";\nimport type { StudioAgentRuntimeSummary, StudioConfig } from \"../../../../types\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { cn } from \"../../lib/utils\";\n\nexport function AgentsPage(props: { agents: StudioConfig[\"agents\"]; selectedAgentId: string }) {\n const [runtimeByAgentId, setRuntimeByAgentId] = useState<\n Record<string, StudioAgentRuntimeSummary | undefined>\n >({});\n\n useEffect(() => {\n let cancelled = false;\n async function loadRuntimeSummaries() {\n const entries = await Promise.all(\n props.agents.map(async (agent) => {\n try {\n const response = await fetch(`/agents/${encodeURIComponent(agent.id)}/runtime`);\n if (!response.ok) {\n return [agent.id, undefined] as const;\n }\n return [agent.id, (await response.json()) as StudioAgentRuntimeSummary] as const;\n } catch {\n return [agent.id, undefined] as const;\n }\n }),\n );\n if (!cancelled) {\n setRuntimeByAgentId(Object.fromEntries(entries));\n }\n }\n void loadRuntimeSummaries();\n return () => {\n cancelled = true;\n };\n }, [props.agents]);\n\n const totals = registryTotals(props.agents, runtimeByAgentId);\n\n return (\n <section\n className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/55\"\n aria-label=\"Agents\"\n >\n <header className=\"bg-background/70 pb-3 pl-4 pr-6 pt-4 backdrop-blur\">\n <div className=\"grid w-full grid-cols-[minmax(0,1fr)_auto] items-end gap-4 max-md:grid-cols-1\">\n <div className=\"grid min-w-0 gap-2\">\n <h1 className=\"m-0 text-2xl font-semibold leading-none tracking-tight text-foreground\">\n Studio\n </h1>\n <p className=\"m-0 max-w-[62ch] text-sm leading-6 text-muted-foreground\">\n Registered agents and the runtime capabilities exposed to Studio.\n </p>\n </div>\n <div className=\"flex min-w-0 flex-wrap justify-end gap-2 max-md:justify-start\">\n <HeaderMetric label=\"agents\" value={props.agents.length} />\n <HeaderMetric label=\"tools\" value={totals.tools} />\n <HeaderMetric label=\"context\" value={totals.context} />\n <HeaderMetric label=\"prompts\" value={totals.prompts} />\n </div>\n </div>\n </header>\n\n <div className=\"min-h-0 overflow-auto pb-6 pl-4 pr-6\">\n <div className=\"grid w-full\">\n {props.agents.length === 0 ? (\n <div className=\"grid min-h-80 place-items-center rounded-xl border border-dashed border-border/80 bg-card/35 px-6 text-center\">\n <div className=\"grid max-w-md gap-2\">\n <h2 className=\"m-0 text-base font-semibold text-foreground\">No agents</h2>\n <p className=\"m-0 text-sm leading-6 text-muted-foreground\">\n Studio has no registered agents to inspect.\n </p>\n </div>\n </div>\n ) : (\n <AgentRegistryTable\n agents={props.agents}\n runtimeByAgentId={runtimeByAgentId}\n selectedAgentId={props.selectedAgentId}\n />\n )}\n </div>\n </div>\n </section>\n );\n}\n\ntype RuntimeByAgentId = Record<string, StudioAgentRuntimeSummary | undefined>;\n\nfunction AgentRegistryTable(props: {\n agents: StudioConfig[\"agents\"];\n runtimeByAgentId: RuntimeByAgentId;\n selectedAgentId: string;\n}) {\n return (\n <div className=\"min-w-[980px]\">\n <table className=\"w-full border-separate border-spacing-0 text-left\">\n <thead className=\"sticky top-0 z-10 bg-background/95 backdrop-blur\">\n <tr>\n <TableHead>Agent</TableHead>\n <TableHead>Model</TableHead>\n <TableHead>Runtime</TableHead>\n <TableHead>Capabilities</TableHead>\n </tr>\n </thead>\n <tbody>\n {props.agents.map((agent) => (\n <AgentRegistryRow\n agent={agent}\n active={agent.id === props.selectedAgentId}\n key={agent.id}\n runtime={props.runtimeByAgentId[agent.id]}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction AgentRegistryRow(props: {\n agent: StudioConfig[\"agents\"][number];\n runtime: StudioAgentRuntimeSummary | undefined;\n active: boolean;\n}) {\n const runtime = props.runtime;\n const modelLabel =\n runtime === undefined\n ? \"Runtime unavailable\"\n : runtime.model === undefined\n ? \"No model reported\"\n : formatModelValue(runtime.model);\n\n return (\n <tr>\n <TableCell>\n <div className=\"grid min-w-0 gap-1.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.agent.name ?? props.agent.id}\n </span>\n {props.active ? <Badge className={selectedBadge}>selected</Badge> : null}\n </div>\n <span className=\"min-w-0 break-all text-xs font-medium leading-5 text-muted-foreground\">\n {props.agent.id}\n </span>\n <p className=\"m-0 max-w-[64ch] truncate text-sm leading-6 text-muted-foreground\">\n {props.agent.description ?? \"No description\"}\n </p>\n </div>\n </TableCell>\n <TableCell>\n <span\n className={cn(\n \"block max-w-[260px] truncate text-sm leading-6\",\n runtime === undefined ? \"text-muted-foreground\" : \"text-foreground\",\n )}\n title={modelLabel}\n >\n {modelLabel}\n </span>\n </TableCell>\n <TableCell>\n {runtime === undefined ? (\n <span className=\"text-sm leading-6 text-muted-foreground\">Waiting for summary</span>\n ) : (\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <MetricPill label=\"tools\" value={runtime.toolCount} />\n <MetricPill label=\"mcp\" value={runtime.mcpToolCount} />\n <MetricPill\n label=\"context\"\n value={runtime.staticContextCount + runtime.dynamicContextCount}\n />\n <MetricPill label=\"observers\" value={runtime.observerCount} />\n <MetricPill label=\"prompts\" value={props.agent.quickPrompts.length} />\n </div>\n )}\n </TableCell>\n <TableCell>\n {runtime === undefined ? (\n <span className=\"text-sm leading-6 text-muted-foreground\">Not loaded</span>\n ) : (\n <div className=\"flex min-w-0 flex-wrap gap-2\">\n <CapabilityBadge enabled={runtime.hasMemory}>memory</CapabilityBadge>\n <CapabilityBadge enabled={runtime.hasHook}>hook</CapabilityBadge>\n <CapabilityBadge enabled={runtime.hasOutputSchema}>schema</CapabilityBadge>\n {runtime.defaultMaxTurns === undefined ? null : (\n <Badge className={neutralBadge}>{runtime.defaultMaxTurns} turns</Badge>\n )}\n </div>\n )}\n </TableCell>\n </tr>\n );\n}\n\nfunction TableHead(props: { children: string }) {\n return (\n <th className=\"border-b border-border/80 py-2.5 pr-5 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground first:pl-0\">\n {props.children}\n </th>\n );\n}\n\nfunction TableCell(props: { children: ReactNode }) {\n return (\n <td className=\"border-b border-border/70 py-3.5 pr-5 align-top first:pl-0\">{props.children}</td>\n );\n}\n\nfunction MetricPill(props: { label: string; value: number }) {\n return (\n <span className=\"inline-flex min-h-7 items-center gap-1.5 rounded-md bg-muted/25 px-2.5 text-xs font-medium text-muted-foreground\">\n <span className=\"font-semibold tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nfunction CapabilityBadge(props: { enabled: boolean; children: string }) {\n return <Badge className={props.enabled ? enabledBadge : disabledBadge}>{props.children}</Badge>;\n}\n\nfunction HeaderMetric(props: { label: string; value: number }) {\n return (\n <span className=\"inline-flex h-8 items-center gap-2 rounded-md border border-border/70 bg-background/45 px-2.5 text-xs font-medium text-muted-foreground\">\n <span className=\"font-semibold tabular-nums text-foreground\">{props.value}</span>\n {props.label}\n </span>\n );\n}\n\nconst selectedBadge = \"border-border/80 bg-muted/45 text-foreground\";\nconst enabledBadge = \"border-border/80 bg-muted/35 text-foreground\";\nconst disabledBadge = \"border-transparent bg-transparent text-muted-foreground/60\";\nconst neutralBadge = \"border-border/80 bg-muted/35 text-muted-foreground\";\n\nfunction registryTotals(agents: StudioConfig[\"agents\"], runtimeByAgentId: RuntimeByAgentId) {\n return agents.reduce(\n (totals, agent) => {\n const runtime = runtimeByAgentId[agent.id];\n totals.prompts += agent.quickPrompts.length;\n if (runtime !== undefined) {\n totals.tools += runtime.toolCount + runtime.mcpToolCount;\n totals.context += runtime.staticContextCount + runtime.dynamicContextCount;\n }\n return totals;\n },\n { context: 0, prompts: 0, tools: 0 },\n );\n}\n\nfunction formatModelValue(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.length}]`;\n }\n if (typeof value === \"object\") {\n const model = objectString(value, \"model\") ?? objectString(value, \"defaultModel\");\n const provider = objectString(value, \"provider\");\n const id = objectString(value, \"id\") ?? objectString(value, \"name\");\n const modelName = model ?? id;\n\n if (provider !== undefined && modelName !== undefined && provider !== modelName) {\n return `${provider} / ${modelName}`;\n }\n return modelName ?? provider ?? \"Custom model\";\n }\n return \"\";\n}\n\nfunction objectString(value: object, key: string): string | undefined {\n const record = value as Record<string, unknown>;\n return typeof record[key] === \"string\" ? record[key] : undefined;\n}\n"],"mappings":"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"}
|
package/dist/ui/assets/anvia.png
CHANGED
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./utils-BN2yP0LH.js";import{t}from"./PlayIcon-Culan3xL.js";import{F as n,I as r,a as i,c as a,d as o,f as s,i as c,l,n as u,o as d,r as f,u as p}from"./index-D5lHtsjb.js";var m=e();function h(e){let t=e.evals.find(t=>t.id===e.selectedEvalId)??e.evals[0];return(0,m.jsx)(c,{children:(0,m.jsx)(`div`,{className:`grid min-h-0 min-w-0 pb-6 pr-6`,children:(0,m.jsxs)(d,{className:`grid content-start gap-5 overflow-auto p-6`,children:[(0,m.jsxs)(`header`,{className:`flex min-w-0 items-start justify-between gap-4 border-b border-border/80 pb-5`,children:[(0,m.jsxs)(`div`,{className:`min-w-0`,children:[(0,m.jsx)(`p`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:`Evals`}),(0,m.jsx)(`h1`,{className:`m-0 mt-2 text-2xl font-semibold tracking-tight text-foreground`,children:t?.name??`Eval suite`}),(0,m.jsx)(`p`,{className:`m-0 mt-2 max-w-2xl text-sm leading-6 text-muted-foreground`,children:t?.description??`Inspect eval datasets, metrics, run configuration, and per-case outcomes.`})]}),(0,m.jsx)(g,{disabled:!e.enabled||t===void 0||e.runState===`running`,label:e.runState===`running`?`Running`:`Run`,onRun:e.onRun})]}),(0,m.jsxs)(`div`,{className:`grid gap-5 lg:grid-cols-[340px_minmax(0,1fr)]`,children:[(0,m.jsxs)(`aside`,{className:`grid content-start gap-4 border-r border-border/80 pr-5 max-lg:border-b max-lg:border-r-0 max-lg:pb-5 max-lg:pr-0`,children:[(0,m.jsxs)(`label`,{className:`grid gap-2`,htmlFor:`eval-suite-select`,children:[(0,m.jsx)(`span`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:`Suite`}),(0,m.jsxs)(a,{value:t?.id??``,onValueChange:e.onSelectEval,children:[(0,m.jsx)(o,{id:`eval-suite-select`,className:`h-9 w-full rounded-lg border-border/80 bg-background text-xs hover:border-muted-foreground/60 focus:border-muted-foreground/70 focus:ring-muted-foreground/20`,children:(0,m.jsx)(s,{placeholder:`Select eval`})}),(0,m.jsx)(l,{children:e.evals.map(e=>(0,m.jsx)(p,{value:e.id,children:e.name},e.id))})]})]}),t===void 0?null:(0,m.jsx)(_,{suite:t,enabled:e.enabled})]}),(0,m.jsx)(`main`,{className:`min-w-0`,children:t===void 0?(0,m.jsx)(u,{className:`min-h-0`,title:`No eval suites`,text:`0 eval suite records are available in this Studio runtime.`}):e.result===void 0?(0,m.jsx)(v,{suite:t,enabled:e.enabled,runState:e.runState}):(0,m.jsx)(w,{result:e.result,suite:t})})]})]})})})}function g(e){return(0,m.jsxs)(r,{className:`h-9 shrink-0 gap-1.5 rounded-lg border border-white bg-white px-3 text-sm font-semibold text-black shadow-none hover:border-white hover:bg-white/90 hover:text-black disabled:border-border disabled:bg-muted disabled:text-muted-foreground [&_svg]:!size-3`,disabled:e.disabled,onClick:e.onRun,variant:`ghost`,children:[(0,m.jsx)(n,{icon:t,"aria-hidden":`true`}),e.label]})}function _(e){let t=z(e.suite.metadata),n=e.suite.casePreviewCount??e.suite.casePreviews?.length??0;return(0,m.jsxs)(`div`,{className:`grid gap-4`,children:[(0,m.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,m.jsx)(f,{label:`Cases`,value:String(e.suite.caseCount)}),(0,m.jsx)(f,{label:`Metrics`,value:String(e.suite.metricNames.length)}),(0,m.jsx)(f,{label:`Concurrency`,value:String(e.suite.concurrency??1)}),(0,m.jsx)(f,{label:`Previewed`,value:`${n}/${e.suite.caseCount}`})]}),(0,m.jsxs)(`section`,{className:`grid gap-3 rounded-xl border border-border/70 bg-background/45 p-4`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`h2`,{className:`m-0 text-sm font-semibold text-foreground`,children:`Run readiness`}),(0,m.jsx)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:e.enabled?`This suite is available in the current Studio runtime.`:`Eval routes are not available in the current Studio runtime.`})]}),(0,m.jsxs)(`div`,{className:`grid gap-2 text-xs text-muted-foreground`,children:[(0,m.jsx)(A,{label:`Suite id`,value:e.suite.id}),(0,m.jsx)(A,{label:`Metadata keys`,value:t.length>0?t.join(`, `):`None`})]})]})]})}function v(e){return(0,m.jsxs)(`div`,{className:`grid gap-4`,children:[(0,m.jsxs)(`section`,{className:`grid gap-4 rounded-xl border border-border/80 bg-background/45 p-5`,children:[(0,m.jsxs)(`div`,{className:`grid gap-1`,children:[(0,m.jsx)(M,{children:`What this eval tests`}),(0,m.jsx)(`p`,{className:`m-0 max-w-3xl text-sm leading-6 text-foreground`,children:e.suite.description??`This suite has no description. Use the dataset and metric definitions below to inspect coverage before running it.`})]}),(0,m.jsx)(O,{metadata:e.suite.metadata})]}),(0,m.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,1.35fr)_minmax(320px,0.65fr)]`,children:[(0,m.jsx)(y,{suite:e.suite}),(0,m.jsxs)(`div`,{className:`grid content-start gap-4`,children:[(0,m.jsx)(x,{metrics:e.suite.metricSummaries,metricNames:e.suite.metricNames}),(0,m.jsx)(C,{suite:e.suite,enabled:e.enabled,runState:e.runState})]})]})]})}function y(e){let t=e.suite.casePreviews??[];return(0,m.jsxs)(`section`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5`,children:[(0,m.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(M,{children:`Dataset preview`}),(0,m.jsxs)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:[`Showing `,t.length,` of `,e.suite.caseCount,` cases.`]})]}),(0,m.jsxs)(`span`,{className:`rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold text-muted-foreground`,children:[e.suite.caseCount,` cases`]})]}),t.length===0?(0,m.jsx)(j,{children:`No dataset preview is available for this suite.`}):(0,m.jsx)(`div`,{className:`grid gap-3`,children:t.map(e=>(0,m.jsx)(b,{testCase:e},e.id))})]})}function b(e){return(0,m.jsxs)(`article`,{className:`grid gap-3 rounded-xl border border-border/70 bg-card/35 p-4`,children:[(0,m.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,m.jsx)(`h3`,{className:`m-0 truncate text-sm font-semibold text-foreground`,children:e.testCase.id}),e.testCase.metadataKeys===void 0?null:(0,m.jsxs)(`span`,{className:`shrink-0 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground`,children:[e.testCase.metadataKeys.length,` metadata`]})]}),(0,m.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,m.jsx)(k,{label:`Input`,value:e.testCase.input,emptyText:`No input preview`}),(0,m.jsx)(k,{label:`Expected`,value:e.testCase.expected,emptyText:`No expected value`})]})]})}function x(e){let t=e.metrics??e.metricNames.map(e=>({name:e}));return(0,m.jsxs)(`section`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(M,{children:`Metrics`}),(0,m.jsx)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:`Scoring functions that evaluate every case output.`})]}),t.length===0?(0,m.jsx)(j,{children:`No metrics are configured for this suite.`}):(0,m.jsx)(`div`,{className:`grid gap-2`,children:t.map(e=>(0,m.jsx)(S,{metric:e},e.name))})]})}function S(e){let t=[e.metric.dataType,e.metric.configId===void 0?void 0:`config ${e.metric.configId}`,e.metric.scoreConfigId===void 0?void 0:`score ${e.metric.scoreConfigId}`,e.metric.metadataKeys===void 0?void 0:`${e.metric.metadataKeys.length} metadata`].filter(Boolean);return(0,m.jsxs)(`div`,{className:`rounded-lg border border-border/70 bg-card/35 px-3 py-3`,children:[(0,m.jsx)(`div`,{className:` text-sm font-semibold text-foreground`,children:e.metric.name}),(0,m.jsx)(`div`,{className:`mt-1 text-xs leading-5 text-muted-foreground`,children:t.length>0?t.join(` / `):`No metric metadata`})]})}function C(e){return(0,m.jsxs)(`section`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(M,{children:`Run configuration`}),(0,m.jsxs)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:[`This run will execute `,e.suite.caseCount,` cases across`,` `,e.suite.metricNames.length,` metrics.`]})]}),(0,m.jsxs)(`div`,{className:`grid gap-2 text-xs text-muted-foreground`,children:[(0,m.jsx)(A,{label:`Concurrency`,value:String(e.suite.concurrency??1)}),(0,m.jsx)(A,{label:`Status`,value:e.enabled?e.runState:`Unavailable`})]})]})}function w(e){let t=P(e.result.result),n=Array.isArray(t.results)?t.results:[];return(0,m.jsxs)(`article`,{className:`grid gap-4`,children:[(0,m.jsxs)(`section`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5`,children:[(0,m.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-start justify-between gap-3`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(M,{children:`Run summary`}),(0,m.jsxs)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:[e.result.runId,` / `,new Date(e.result.startedAt).toLocaleTimeString()]})]}),(0,m.jsx)(`span`,{className:`rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground`,children:e.suite.name})]}),(0,m.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-4`,children:[(0,m.jsx)(f,{label:`Passed`,value:String(t.passed??0)}),(0,m.jsx)(f,{label:`Failed`,value:String(t.failed??0)}),(0,m.jsx)(f,{label:`Invalid`,value:String(t.invalid??0)}),(0,m.jsx)(f,{label:`Duration`,value:`${t.durationMs??e.result.durationMs}ms`})]})]}),(0,m.jsxs)(`section`,{className:`grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5`,children:[(0,m.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-start justify-between gap-3`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(M,{children:`Case results`}),(0,m.jsx)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:`Each case shows the prompt, expected answer, model output, then metric judgments.`})]}),(0,m.jsxs)(`span`,{className:`rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold text-muted-foreground`,children:[n.length,` cases`]})]}),n.length===0?(0,m.jsx)(j,{children:`No per-case results were returned by this eval run.`}):(0,m.jsx)(`div`,{className:`grid gap-4`,children:n.map((e,t)=>(0,m.jsx)(T,{index:t,result:e},F(e,t)))})]}),(0,m.jsx)(N,{title:`Raw result`,value:e.result.result})]})}function T(e){let t=V(e.result.case)?e.result.case:{},n=Array.isArray(e.result.metrics)?e.result.metrics:[],r=typeof t.id==`string`?t.id:`case-${e.index+1}`,i=I(n),a=L(i);return(0,m.jsxs)(`article`,{className:`overflow-hidden rounded-xl border border-border/70 bg-card/35`,children:[(0,m.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-start justify-between gap-4 border-b border-border/70 bg-background/35 px-4 py-4`,children:[(0,m.jsxs)(`div`,{className:`flex min-w-0 items-start gap-3`,children:[(0,m.jsx)(`span`,{className:`flex h-7 min-w-7 items-center justify-center rounded-lg border border-border/80 bg-card/70 text-xs font-semibold text-muted-foreground`,children:e.index+1}),(0,m.jsxs)(`div`,{className:`min-w-0`,children:[(0,m.jsx)(`h3`,{className:`m-0 truncate text-base font-semibold text-foreground`,children:r}),(0,m.jsxs)(`p`,{className:`m-0 mt-1 text-xs leading-5 text-muted-foreground`,children:[n.length,` metric outcomes / `,i.passed,` pass / `,i.failed,` fail /`,` `,i.invalid,` invalid`]})]})]}),(0,m.jsx)(D,{children:a})]}),(0,m.jsxs)(`div`,{className:`grid gap-4 p-4`,children:[(0,m.jsxs)(`section`,{className:`grid gap-3`,children:[(0,m.jsx)(M,{children:`Test case`}),(0,m.jsxs)(`div`,{className:`grid gap-3 xl:grid-cols-[minmax(0,1.15fr)_minmax(0,0.85fr)]`,children:[(0,m.jsx)(k,{label:`Input`,value:t.input,emptyText:`No input`}),(0,m.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2 xl:grid-cols-1`,children:[(0,m.jsx)(k,{label:`Expected`,value:t.expected,emptyText:`No expected value`}),(0,m.jsx)(k,{label:`Output`,value:e.result.output,emptyText:`No output`})]})]})]}),e.result.targetError===void 0?null:(0,m.jsx)(k,{label:`Target error`,value:e.result.targetError,emptyText:`No target error`}),(0,m.jsxs)(`section`,{className:`grid gap-3`,children:[(0,m.jsx)(M,{children:`Metric judgments`}),n.length===0?(0,m.jsx)(j,{children:`No metric results were returned for this case.`}):(0,m.jsxs)(`div`,{className:`overflow-hidden rounded-lg border border-border/70 bg-background/45`,children:[(0,m.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_96px_96px] gap-3 border-b border-border/70 px-3 py-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:[(0,m.jsx)(`span`,{children:`Metric`}),(0,m.jsx)(`span`,{children:`Score`}),(0,m.jsx)(`span`,{className:`text-right`,children:`Status`})]}),(0,m.jsx)(`div`,{className:`grid`,children:n.map((e,t)=>(0,m.jsx)(E,{index:t,metric:e},R(e)))})]})]})]})]})}function E(e){let t=V(e.metric.outcome)?e.metric.outcome:{},n=typeof t.outcome==`string`?t.outcome:`unknown`,r=Array.isArray(e.metric.reporterErrors)?e.metric.reporterErrors:[];return(0,m.jsxs)(`div`,{className:`grid grid-cols-[minmax(0,1fr)_96px_96px] gap-3 border-b border-border/60 px-3 py-3 last:border-b-0`,children:[(0,m.jsxs)(`div`,{className:`min-w-0`,children:[(0,m.jsx)(`div`,{className:`truncate text-sm font-semibold text-foreground`,children:e.metric.metricName??`metric-${e.index+1}`}),(0,m.jsx)(`div`,{className:`mt-1 text-xs leading-5 text-muted-foreground`,children:typeof t.comment==`string`?t.comment:typeof t.reason==`string`?t.reason:`No comment`}),r.length>0?(0,m.jsx)(`pre`,{className:`m-0 mt-2 whitespace-pre-wrap break-words rounded-md border border-border/70 bg-card/45 p-2 text-xs leading-5 text-muted-foreground`,children:B(r)}):null]}),(0,m.jsx)(`div`,{className:` text-xs leading-6 text-foreground`,children:`score`in t?B(t.score):`n/a`}),(0,m.jsx)(`div`,{className:`flex justify-end`,children:(0,m.jsx)(D,{children:n})})]})}function D(e){return(0,m.jsx)(i,{className:`h-7 rounded-md bg-card/70 text-foreground`,children:e.children})}function O(e){let t=V(e.metadata)?Object.entries(e.metadata):[];return t.length===0?(0,m.jsx)(j,{children:`No suite metadata was provided.`}):(0,m.jsxs)(`div`,{className:`grid gap-2 rounded-xl border border-border/70 bg-card/35 p-4`,children:[(0,m.jsx)(M,{children:`Suite metadata`}),(0,m.jsx)(`div`,{className:`grid gap-2 text-xs text-muted-foreground`,children:t.map(([e,t])=>(0,m.jsx)(A,{label:e,value:B(t)},e))})]})}function k(e){let t=e.value!==void 0;return(0,m.jsxs)(`div`,{className:`min-w-0 rounded-lg border border-border/70 bg-background/45 p-3`,children:[(0,m.jsx)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground`,children:e.label}),(0,m.jsx)(`pre`,{className:`m-0 mt-2 whitespace-pre-wrap break-words text-xs leading-5 text-foreground`,children:t?B(e.value):e.emptyText})]})}function A(e){return(0,m.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-3`,children:[(0,m.jsx)(`span`,{className:`shrink-0 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground`,children:e.label}),(0,m.jsx)(`span`,{className:`min-w-0 break-words text-right text-xs text-foreground`,children:e.value})]})}function j(e){return(0,m.jsx)(`div`,{className:`rounded-lg border border-border/70 bg-card/35 p-3 text-sm leading-6 text-muted-foreground`,children:e.children})}function M(e){return(0,m.jsx)(`h2`,{className:`m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.children})}function N(e){return(0,m.jsxs)(`details`,{className:`rounded-xl border border-border/80 bg-background/45 p-5`,children:[(0,m.jsx)(`summary`,{className:`cursor-pointer text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground`,children:e.title}),(0,m.jsx)(`pre`,{className:`mt-3 max-h-[45vh] overflow-auto whitespace-pre-wrap break-words rounded-lg border border-border/70 bg-card/35 p-3 text-xs leading-5 text-foreground`,children:B(e.value)})]})}function P(e){return V(e)?e:{}}function F(e,t){let n=V(e.case)?e.case:{};return typeof n.id==`string`?n.id:`case-${t+1}`}function I(e){return e.reduce((e,t)=>{let n=V(t.outcome)?t.outcome.outcome:void 0;return n===`pass`&&(e.passed+=1),n===`fail`&&(e.failed+=1),n===`invalid`&&(e.invalid+=1),e},{passed:0,failed:0,invalid:0})}function L(e){return e.failed>0?`fail`:e.invalid>0?`invalid`:e.passed>0?`pass`:`unknown`}function R(e){return typeof e.metricName==`string`&&e.metricName.length>0?e.metricName:B(e)}function z(e){return V(e)?Object.keys(e).filter(t=>e[t]!==void 0):[]}function B(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function V(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{h as EvalsPage};
|
|
2
|
+
//# sourceMappingURL=evals-page-CrS8Nw5a.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evals-page-w-gdHmQ3.js","names":[],"sources":["../../../src/ui/app/modules/evals/evals-page.tsx"],"sourcesContent":["import { PlayIcon } from \"@hugeicons/core-free-icons\";\nimport type React from \"react\";\nimport type {\n StudioEvalCasePreview,\n StudioEvalMetricSummary,\n StudioEvalRunResponse,\n StudioEvalSuiteConfig,\n} from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n StudioEmptyState,\n StudioMetric,\n StudioPageShell,\n StudioStatusBadge,\n StudioSurface,\n} from \"../../components/ui/studio\";\n\nexport function EvalsPage(props: {\n evals: StudioEvalSuiteConfig[];\n selectedEvalId: string;\n enabled: boolean;\n runState: \"idle\" | \"running\";\n result: StudioEvalRunResponse | undefined;\n onSelectEval: (evalId: string) => void;\n onRun: () => void;\n}) {\n const selected = props.evals.find((suite) => suite.id === props.selectedEvalId) ?? props.evals[0];\n\n return (\n <StudioPageShell>\n <div className=\"grid min-h-0 min-w-0 pb-6 pr-6\">\n <StudioSurface className=\"grid content-start gap-5 overflow-auto p-6\">\n <header className=\"flex min-w-0 items-start justify-between gap-4 border-b border-border/80 pb-5\">\n <div className=\"min-w-0\">\n <p className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Evals\n </p>\n <h1 className=\"m-0 mt-2 text-2xl font-semibold tracking-tight text-foreground\">\n {selected?.name ?? \"Eval suite\"}\n </h1>\n <p className=\"m-0 mt-2 max-w-2xl text-sm leading-6 text-muted-foreground\">\n {selected?.description ??\n \"Inspect eval datasets, metrics, run configuration, and per-case outcomes.\"}\n </p>\n </div>\n <RunButton\n disabled={!props.enabled || selected === undefined || props.runState === \"running\"}\n label={props.runState === \"running\" ? \"Running\" : \"Run\"}\n onRun={props.onRun}\n />\n </header>\n\n <div className=\"grid gap-5 lg:grid-cols-[340px_minmax(0,1fr)]\">\n <aside className=\"grid content-start gap-4 border-r border-border/80 pr-5 max-lg:border-b max-lg:border-r-0 max-lg:pb-5 max-lg:pr-0\">\n <label className=\"grid gap-2\" htmlFor=\"eval-suite-select\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Suite\n </span>\n <Select value={selected?.id ?? \"\"} onValueChange={props.onSelectEval}>\n <SelectTrigger\n id=\"eval-suite-select\"\n className=\"h-9 w-full rounded-lg border-border/80 bg-background text-xs hover:border-muted-foreground/60 focus:border-muted-foreground/70 focus:ring-muted-foreground/20\"\n >\n <SelectValue placeholder=\"Select eval\" />\n </SelectTrigger>\n <SelectContent>\n {props.evals.map((suite) => (\n <SelectItem key={suite.id} value={suite.id}>\n {suite.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n\n {selected === undefined ? null : (\n <SuiteOverview suite={selected} enabled={props.enabled} />\n )}\n </aside>\n\n <main className=\"min-w-0\">\n {selected === undefined ? (\n <StudioEmptyState\n className=\"min-h-0\"\n title=\"No eval suites\"\n text=\"0 eval suite records are available in this Studio runtime.\"\n />\n ) : props.result === undefined ? (\n <BeforeRun suite={selected} enabled={props.enabled} runState={props.runState} />\n ) : (\n <EvalResult result={props.result} suite={selected} />\n )}\n </main>\n </div>\n </StudioSurface>\n </div>\n </StudioPageShell>\n );\n}\n\nfunction RunButton(props: { disabled: boolean; label: string; onRun: () => void }) {\n return (\n <Button\n className=\"h-9 shrink-0 gap-1.5 rounded-lg border border-white bg-white px-3 text-sm font-semibold text-black shadow-none hover:border-white hover:bg-white/90 hover:text-black disabled:border-border disabled:bg-muted disabled:text-muted-foreground [&_svg]:!size-3\"\n disabled={props.disabled}\n onClick={props.onRun}\n variant=\"ghost\"\n >\n <StudioIcon icon={PlayIcon} aria-hidden=\"true\" />\n {props.label}\n </Button>\n );\n}\n\nfunction SuiteOverview(props: { suite: StudioEvalSuiteConfig; enabled: boolean }) {\n const metadataKeys = objectKeys(props.suite.metadata);\n const previewCount = props.suite.casePreviewCount ?? props.suite.casePreviews?.length ?? 0;\n\n return (\n <div className=\"grid gap-4\">\n <div className=\"grid grid-cols-2 gap-2\">\n <StudioMetric label=\"Cases\" value={String(props.suite.caseCount)} />\n <StudioMetric label=\"Metrics\" value={String(props.suite.metricNames.length)} />\n <StudioMetric label=\"Concurrency\" value={String(props.suite.concurrency ?? 1)} />\n <StudioMetric label=\"Previewed\" value={`${previewCount}/${props.suite.caseCount}`} />\n </div>\n\n <section className=\"grid gap-3 rounded-xl border border-border/70 bg-background/45 p-4\">\n <div>\n <h2 className=\"m-0 text-sm font-semibold text-foreground\">Run readiness</h2>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n {props.enabled\n ? \"This suite is available in the current Studio runtime.\"\n : \"Eval routes are not available in the current Studio runtime.\"}\n </p>\n </div>\n <div className=\"grid gap-2 text-xs text-muted-foreground\">\n <KeyValue label=\"Suite id\" value={props.suite.id} />\n <KeyValue\n label=\"Metadata keys\"\n value={metadataKeys.length > 0 ? metadataKeys.join(\", \") : \"None\"}\n />\n </div>\n </section>\n </div>\n );\n}\n\nfunction BeforeRun(props: {\n suite: StudioEvalSuiteConfig;\n enabled: boolean;\n runState: \"idle\" | \"running\";\n}) {\n return (\n <div className=\"grid gap-4\">\n <section className=\"grid gap-4 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"grid gap-1\">\n <SectionLabel>What this eval tests</SectionLabel>\n <p className=\"m-0 max-w-3xl text-sm leading-6 text-foreground\">\n {props.suite.description ??\n \"This suite has no description. Use the dataset and metric definitions below to inspect coverage before running it.\"}\n </p>\n </div>\n <MetadataBlock metadata={props.suite.metadata} />\n </section>\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.35fr)_minmax(320px,0.65fr)]\">\n <DatasetPreview suite={props.suite} />\n <div className=\"grid content-start gap-4\">\n <MetricsPanel\n metrics={props.suite.metricSummaries}\n metricNames={props.suite.metricNames}\n />\n <RunSetup suite={props.suite} enabled={props.enabled} runState={props.runState} />\n </div>\n </div>\n </div>\n );\n}\n\nfunction DatasetPreview(props: { suite: StudioEvalSuiteConfig }) {\n const previews = props.suite.casePreviews ?? [];\n\n return (\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <SectionLabel>Dataset preview</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Showing {previews.length} of {props.suite.caseCount} cases.\n </p>\n </div>\n <span className=\"rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold text-muted-foreground\">\n {props.suite.caseCount} cases\n </span>\n </div>\n\n {previews.length === 0 ? (\n <MutedPanel>No dataset preview is available for this suite.</MutedPanel>\n ) : (\n <div className=\"grid gap-3\">\n {previews.map((testCase) => (\n <CasePreviewCard key={testCase.id} testCase={testCase} />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CasePreviewCard(props: { testCase: StudioEvalCasePreview }) {\n return (\n <article className=\"grid gap-3 rounded-xl border border-border/70 bg-card/35 p-4\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <h3 className=\"m-0 truncate text-sm font-semibold text-foreground\">{props.testCase.id}</h3>\n {props.testCase.metadataKeys === undefined ? null : (\n <span className=\"shrink-0 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.testCase.metadataKeys.length} metadata\n </span>\n )}\n </div>\n <div className=\"grid gap-3 md:grid-cols-2\">\n <ValuePanel label=\"Input\" value={props.testCase.input} emptyText=\"No input preview\" />\n <ValuePanel\n label=\"Expected\"\n value={props.testCase.expected}\n emptyText=\"No expected value\"\n />\n </div>\n </article>\n );\n}\n\nfunction MetricsPanel(props: {\n metrics: StudioEvalMetricSummary[] | undefined;\n metricNames: string[];\n}) {\n const metrics =\n props.metrics ??\n props.metricNames.map(\n (name): StudioEvalMetricSummary => ({\n name,\n }),\n );\n\n return (\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div>\n <SectionLabel>Metrics</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Scoring functions that evaluate every case output.\n </p>\n </div>\n {metrics.length === 0 ? (\n <MutedPanel>No metrics are configured for this suite.</MutedPanel>\n ) : (\n <div className=\"grid gap-2\">\n {metrics.map((metric) => (\n <MetricSummaryRow key={metric.name} metric={metric} />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction MetricSummaryRow(props: { metric: StudioEvalMetricSummary }) {\n const details = [\n props.metric.dataType,\n props.metric.configId === undefined ? undefined : `config ${props.metric.configId}`,\n props.metric.scoreConfigId === undefined ? undefined : `score ${props.metric.scoreConfigId}`,\n props.metric.metadataKeys === undefined\n ? undefined\n : `${props.metric.metadataKeys.length} metadata`,\n ].filter(Boolean);\n\n return (\n <div className=\"rounded-lg border border-border/70 bg-card/35 px-3 py-3\">\n <div className=\" text-sm font-semibold text-foreground\">{props.metric.name}</div>\n <div className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {details.length > 0 ? details.join(\" / \") : \"No metric metadata\"}\n </div>\n </div>\n );\n}\n\nfunction RunSetup(props: {\n suite: StudioEvalSuiteConfig;\n enabled: boolean;\n runState: \"idle\" | \"running\";\n}) {\n return (\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div>\n <SectionLabel>Run configuration</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n This run will execute {props.suite.caseCount} cases across{\" \"}\n {props.suite.metricNames.length} metrics.\n </p>\n </div>\n <div className=\"grid gap-2 text-xs text-muted-foreground\">\n <KeyValue label=\"Concurrency\" value={String(props.suite.concurrency ?? 1)} />\n <KeyValue label=\"Status\" value={props.enabled ? props.runState : \"Unavailable\"} />\n </div>\n </section>\n );\n}\n\nfunction EvalResult(props: { result: StudioEvalRunResponse; suite: StudioEvalSuiteConfig }) {\n const result = runResult(props.result.result);\n const cases = Array.isArray(result.results) ? result.results : [];\n\n return (\n <article className=\"grid gap-4\">\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-3\">\n <div>\n <SectionLabel>Run summary</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n {props.result.runId} / {new Date(props.result.startedAt).toLocaleTimeString()}\n </p>\n </div>\n <span className=\"rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.suite.name}\n </span>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-4\">\n <StudioMetric label=\"Passed\" value={String(result.passed ?? 0)} />\n <StudioMetric label=\"Failed\" value={String(result.failed ?? 0)} />\n <StudioMetric label=\"Invalid\" value={String(result.invalid ?? 0)} />\n <StudioMetric\n label=\"Duration\"\n value={`${result.durationMs ?? props.result.durationMs}ms`}\n />\n </div>\n </section>\n\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-3\">\n <div>\n <SectionLabel>Case results</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Each case shows the prompt, expected answer, model output, then metric judgments.\n </p>\n </div>\n <span className=\"rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold text-muted-foreground\">\n {cases.length} cases\n </span>\n </div>\n {cases.length === 0 ? (\n <MutedPanel>No per-case results were returned by this eval run.</MutedPanel>\n ) : (\n <div className=\"grid gap-4\">\n {cases.map((testCase, index) => (\n <CaseResultCard\n index={index}\n key={caseResultKey(testCase, index)}\n result={testCase}\n />\n ))}\n </div>\n )}\n </section>\n\n <RawDetails title=\"Raw result\" value={props.result.result} />\n </article>\n );\n}\n\nfunction CaseResultCard(props: { index: number; result: EvalCaseRunResult }) {\n const testCase = isRecord(props.result.case) ? props.result.case : {};\n const metrics = Array.isArray(props.result.metrics) ? props.result.metrics : [];\n const caseId = typeof testCase.id === \"string\" ? testCase.id : `case-${props.index + 1}`;\n const counts = metricOutcomeCounts(metrics);\n const primaryStatus = casePrimaryStatus(counts);\n\n return (\n <article className=\"overflow-hidden rounded-xl border border-border/70 bg-card/35\">\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-4 border-b border-border/70 bg-background/35 px-4 py-4\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span className=\"flex h-7 min-w-7 items-center justify-center rounded-lg border border-border/80 bg-card/70 text-xs font-semibold text-muted-foreground\">\n {props.index + 1}\n </span>\n <div className=\"min-w-0\">\n <h3 className=\"m-0 truncate text-base font-semibold text-foreground\">{caseId}</h3>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n {metrics.length} metric outcomes / {counts.passed} pass / {counts.failed} fail /{\" \"}\n {counts.invalid} invalid\n </p>\n </div>\n </div>\n <StatusBadge>{primaryStatus}</StatusBadge>\n </div>\n\n <div className=\"grid gap-4 p-4\">\n <section className=\"grid gap-3\">\n <SectionLabel>Test case</SectionLabel>\n <div className=\"grid gap-3 xl:grid-cols-[minmax(0,1.15fr)_minmax(0,0.85fr)]\">\n <ValuePanel label=\"Input\" value={testCase.input} emptyText=\"No input\" />\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-1\">\n <ValuePanel\n label=\"Expected\"\n value={testCase.expected}\n emptyText=\"No expected value\"\n />\n <ValuePanel label=\"Output\" value={props.result.output} emptyText=\"No output\" />\n </div>\n </div>\n </section>\n\n {props.result.targetError === undefined ? null : (\n <ValuePanel\n label=\"Target error\"\n value={props.result.targetError}\n emptyText=\"No target error\"\n />\n )}\n\n <section className=\"grid gap-3\">\n <SectionLabel>Metric judgments</SectionLabel>\n {metrics.length === 0 ? (\n <MutedPanel>No metric results were returned for this case.</MutedPanel>\n ) : (\n <div className=\"overflow-hidden rounded-lg border border-border/70 bg-background/45\">\n <div className=\"grid grid-cols-[minmax(0,1fr)_96px_96px] gap-3 border-b border-border/70 px-3 py-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n <span>Metric</span>\n <span>Score</span>\n <span className=\"text-right\">Status</span>\n </div>\n <div className=\"grid\">\n {metrics.map((metric, index) => (\n <MetricOutcomeRow index={index} key={metricOutcomeKey(metric)} metric={metric} />\n ))}\n </div>\n </div>\n )}\n </section>\n </div>\n </article>\n );\n}\n\nfunction MetricOutcomeRow(props: { index: number; metric: EvalMetricRunResult }) {\n const outcome = isRecord(props.metric.outcome) ? props.metric.outcome : {};\n const status = typeof outcome.outcome === \"string\" ? outcome.outcome : \"unknown\";\n const reporterErrors = Array.isArray(props.metric.reporterErrors)\n ? props.metric.reporterErrors\n : [];\n\n return (\n <div className=\"grid grid-cols-[minmax(0,1fr)_96px_96px] gap-3 border-b border-border/60 px-3 py-3 last:border-b-0\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-foreground\">\n {props.metric.metricName ?? `metric-${props.index + 1}`}\n </div>\n <div className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {typeof outcome.comment === \"string\"\n ? outcome.comment\n : typeof outcome.reason === \"string\"\n ? outcome.reason\n : \"No comment\"}\n </div>\n {reporterErrors.length > 0 ? (\n <pre className=\"m-0 mt-2 whitespace-pre-wrap break-words rounded-md border border-border/70 bg-card/45 p-2 text-xs leading-5 text-muted-foreground\">\n {formatValue(reporterErrors)}\n </pre>\n ) : null}\n </div>\n <div className=\" text-xs leading-6 text-foreground\">\n {\"score\" in outcome ? formatValue(outcome.score) : \"n/a\"}\n </div>\n <div className=\"flex justify-end\">\n <StatusBadge>{status}</StatusBadge>\n </div>\n </div>\n );\n}\n\nfunction StatusBadge(props: { children: React.ReactNode }) {\n return (\n <StudioStatusBadge className=\"h-7 rounded-md bg-card/70 text-foreground\">\n {props.children}\n </StudioStatusBadge>\n );\n}\n\nfunction MetadataBlock(props: { metadata: unknown }) {\n const entries = isRecord(props.metadata) ? Object.entries(props.metadata) : [];\n if (entries.length === 0) {\n return <MutedPanel>No suite metadata was provided.</MutedPanel>;\n }\n\n return (\n <div className=\"grid gap-2 rounded-xl border border-border/70 bg-card/35 p-4\">\n <SectionLabel>Suite metadata</SectionLabel>\n <div className=\"grid gap-2 text-xs text-muted-foreground\">\n {entries.map(([key, value]) => (\n <KeyValue key={key} label={key} value={formatValue(value)} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ValuePanel(props: { label: string; value: unknown; emptyText: string }) {\n const hasValue = props.value !== undefined;\n\n return (\n <div className=\"min-w-0 rounded-lg border border-border/70 bg-background/45 p-3\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.label}\n </div>\n <pre className=\"m-0 mt-2 whitespace-pre-wrap break-words text-xs leading-5 text-foreground\">\n {hasValue ? formatValue(props.value) : props.emptyText}\n </pre>\n </div>\n );\n}\n\nfunction KeyValue(props: { label: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <span className=\"shrink-0 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 break-words text-right text-xs text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction MutedPanel(props: { children: React.ReactNode }) {\n return (\n <div className=\"rounded-lg border border-border/70 bg-card/35 p-3 text-sm leading-6 text-muted-foreground\">\n {props.children}\n </div>\n );\n}\n\nfunction SectionLabel(props: { children: React.ReactNode }) {\n return (\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.children}\n </h2>\n );\n}\n\nfunction RawDetails(props: { title: string; value: unknown }) {\n return (\n <details className=\"rounded-xl border border-border/80 bg-background/45 p-5\">\n <summary className=\"cursor-pointer text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.title}\n </summary>\n <pre className=\"mt-3 max-h-[45vh] overflow-auto whitespace-pre-wrap break-words rounded-lg border border-border/70 bg-card/35 p-3 text-xs leading-5 text-foreground\">\n {formatValue(props.value)}\n </pre>\n </details>\n );\n}\n\ntype EvalSuiteRunResult = {\n passed?: number;\n failed?: number;\n invalid?: number;\n durationMs?: number;\n results?: EvalCaseRunResult[];\n};\n\ntype EvalCaseRunResult = {\n case?: unknown;\n output?: unknown;\n targetError?: unknown;\n metrics?: EvalMetricRunResult[];\n};\n\ntype EvalMetricRunResult = {\n metricName?: string;\n outcome?: unknown;\n reporterErrors?: unknown[];\n};\n\nfunction runResult(value: unknown): EvalSuiteRunResult {\n return isRecord(value) ? (value as EvalSuiteRunResult) : {};\n}\n\nfunction caseResultKey(result: EvalCaseRunResult, index: number): string {\n const testCase = isRecord(result.case) ? result.case : {};\n return typeof testCase.id === \"string\" ? testCase.id : `case-${index + 1}`;\n}\n\nfunction metricOutcomeCounts(metrics: EvalMetricRunResult[]): {\n passed: number;\n failed: number;\n invalid: number;\n} {\n return metrics.reduce(\n (counts, metric) => {\n const outcome = isRecord(metric.outcome) ? metric.outcome.outcome : undefined;\n if (outcome === \"pass\") {\n counts.passed += 1;\n }\n if (outcome === \"fail\") {\n counts.failed += 1;\n }\n if (outcome === \"invalid\") {\n counts.invalid += 1;\n }\n return counts;\n },\n { passed: 0, failed: 0, invalid: 0 },\n );\n}\n\nfunction casePrimaryStatus(counts: { passed: number; failed: number; invalid: number }): string {\n if (counts.failed > 0) {\n return \"fail\";\n }\n if (counts.invalid > 0) {\n return \"invalid\";\n }\n if (counts.passed > 0) {\n return \"pass\";\n }\n return \"unknown\";\n}\n\nfunction metricOutcomeKey(result: EvalMetricRunResult): string {\n if (typeof result.metricName === \"string\" && result.metricName.length > 0) {\n return result.metricName;\n }\n return formatValue(result);\n}\n\nfunction objectKeys(value: unknown): string[] {\n return isRecord(value) ? Object.keys(value).filter((key) => value[key] !== undefined) : [];\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"mappings":"6MAyBA,SAAgB,EAAU,EAQvB,CACD,IAAM,EAAW,EAAM,MAAM,KAAM,GAAU,EAAM,KAAO,EAAM,eAAe,EAAI,EAAM,MAAM,GAE/F,OACE,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2CACb,EAAA,EAAA,MAAC,EAAD,CAAe,UAAU,sDAAzB,EACE,EAAA,EAAA,MAAC,SAAD,CAAQ,UAAU,yFAAlB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mBAAf,EACE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,uFAA8E,QAEvF,CAAA,EACJ,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,0EACX,GAAU,MAAQ,aAChB,CAAA,EACL,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sEACV,GAAU,aACT,4EACA,CAAA,CACA,IACN,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,CAAC,EAAM,SAAW,IAAa,IAAA,IAAa,EAAM,WAAa,UACzE,MAAO,EAAM,WAAa,UAAY,UAAY,MAClD,MAAO,EAAM,MACb,CAAA,CACK,IAET,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yDAAf,EACE,EAAA,EAAA,MAAC,QAAD,CAAO,UAAU,6HAAjB,EACE,EAAA,EAAA,MAAC,QAAD,CAAO,UAAU,aAAa,QAAQ,6BAAtC,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oFAA2E,QAEpF,CAAA,EACP,EAAA,EAAA,MAAC,EAAD,CAAQ,MAAO,GAAU,IAAM,GAAI,cAAe,EAAM,sBAAxD,EACE,EAAA,EAAA,KAAC,EAAD,CACE,GAAG,oBACH,UAAU,0KAEV,EAAA,EAAA,KAAC,EAAD,CAAa,YAAY,cAAgB,CAAA,CAC3B,CAAA,EAChB,EAAA,EAAA,KAAC,EAAD,CAAA,SACG,EAAM,MAAM,IAAK,IAChB,EAAA,EAAA,KAAC,EAAD,CAA2B,MAAO,EAAM,YACrC,EAAM,KACI,CAFI,EAAM,GAEV,CACb,CACY,CAAA,CACT,GACH,GAEP,IAAa,IAAA,GAAY,MACxB,EAAA,EAAA,KAAC,EAAD,CAAe,MAAO,EAAU,QAAS,EAAM,QAAW,CAAA,CAEtD,IAER,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,mBACb,IAAa,IAAA,IACZ,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,UACV,MAAM,iBACN,KAAK,6DACL,CAAA,CACA,EAAM,SAAW,IAAA,IACnB,EAAA,EAAA,KAAC,EAAD,CAAW,MAAO,EAAU,QAAS,EAAM,QAAS,SAAU,EAAM,SAAY,CAAA,EAEhF,EAAA,EAAA,KAAC,EAAD,CAAY,OAAQ,EAAM,OAAQ,MAAO,EAAY,CAAA,CAElD,CAAA,CACH,GACQ,GACZ,CAAA,CACU,CAAA,CAItB,SAAS,EAAU,EAAgE,CACjF,OACE,EAAA,EAAA,MAAC,EAAD,CACE,UAAU,+PACV,SAAU,EAAM,SAChB,QAAS,EAAM,MACf,QAAQ,iBAJV,EAME,EAAA,EAAA,KAAC,EAAD,CAAY,KAAM,EAAU,cAAY,OAAS,CAAA,CAChD,EAAM,MACA,GAIb,SAAS,EAAc,EAA2D,CAChF,IAAM,EAAe,EAAW,EAAM,MAAM,SAAS,CAC/C,EAAe,EAAM,MAAM,kBAAoB,EAAM,MAAM,cAAc,QAAU,EAEzF,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sBAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,QAAQ,MAAO,OAAO,EAAM,MAAM,UAAU,CAAI,CAAA,EACpE,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,UAAU,MAAO,OAAO,EAAM,MAAM,YAAY,OAAO,CAAI,CAAA,EAC/E,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,cAAc,MAAO,OAAO,EAAM,MAAM,aAAe,EAAE,CAAI,CAAA,EACjF,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,YAAY,MAAO,GAAG,EAAa,GAAG,EAAM,MAAM,YAAe,CAAA,CACjF,IAEN,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,8EAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,qDAA4C,gBAAkB,CAAA,EAC5E,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,4DACV,EAAM,QACH,yDACA,+DACF,CAAA,CACA,CAAA,CAAA,EACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oDAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAU,MAAM,WAAW,MAAO,EAAM,MAAM,GAAM,CAAA,EACpD,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,gBACN,MAAO,EAAa,OAAS,EAAI,EAAa,KAAK,KAAK,CAAG,OAC3D,CAAA,CACE,GACE,GACN,GAIV,SAAS,EAAU,EAIhB,CACD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sBAAf,EACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,8EAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sBAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,uBAAmC,CAAA,EACjD,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,2DACV,EAAM,MAAM,aACX,qHACA,CAAA,CACA,IACN,EAAA,EAAA,KAAC,EAAD,CAAe,SAAU,EAAM,MAAM,SAAY,CAAA,CACzC,IAEV,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2EAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAgB,MAAO,EAAM,MAAS,CAAA,EACtC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,MAAM,gBACrB,YAAa,EAAM,MAAM,YACzB,CAAA,EACF,EAAA,EAAA,KAAC,EAAD,CAAU,MAAO,EAAM,MAAO,QAAS,EAAM,QAAS,SAAU,EAAM,SAAY,CAAA,CAC9E,GACF,GACF,GAIV,SAAS,EAAe,EAAyC,CAC/D,IAAM,EAAW,EAAM,MAAM,cAAgB,EAAE,CAE/C,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,8EAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kDAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,kBAA8B,CAAA,EAC5C,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,4DAAb,CAAgE,WACrD,EAAS,OAAO,OAAK,EAAM,MAAM,UAAU,UAClD,GACA,CAAA,CAAA,EACN,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,iHAAhB,CACG,EAAM,MAAM,UAAU,SAClB,GACH,GAEL,EAAS,SAAW,GACnB,EAAA,EAAA,KAAC,EAAD,CAAA,SAAY,kDAA4D,CAAA,EAExE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACZ,EAAS,IAAK,IACb,EAAA,EAAA,KAAC,EAAD,CAA6C,WAAY,CAAnC,EAAS,GAA0B,CACzD,CACE,CAAA,CAEA,GAId,SAAS,EAAgB,EAA4C,CACnE,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,wEAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2DAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,8DAAsD,EAAM,SAAS,GAAQ,CAAA,CAC1F,EAAM,SAAS,eAAiB,IAAA,GAAY,MAC3C,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,4FAAhB,CACG,EAAM,SAAS,aAAa,OAAO,YAC/B,GAEL,IACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAY,MAAM,QAAQ,MAAO,EAAM,SAAS,MAAO,UAAU,mBAAqB,CAAA,EACtF,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,WACN,MAAO,EAAM,SAAS,SACtB,UAAU,oBACV,CAAA,CACE,GACE,GAId,SAAS,EAAa,EAGnB,CACD,IAAM,EACJ,EAAM,SACN,EAAM,YAAY,IACf,IAAmC,CAClC,OACD,EACF,CAEH,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,8EAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,UAAsB,CAAA,EACpC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,4DAAmD,qDAE5D,CAAA,CACA,CAAA,CAAA,CACL,EAAQ,SAAW,GAClB,EAAA,EAAA,KAAC,EAAD,CAAA,SAAY,4CAAsD,CAAA,EAElE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACZ,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAC,EAAD,CAA4C,SAAU,CAA/B,EAAO,KAAwB,CACtD,CACE,CAAA,CAEA,GAId,SAAS,EAAiB,EAA4C,CACpE,IAAM,EAAU,CACd,EAAM,OAAO,SACb,EAAM,OAAO,WAAa,IAAA,GAAY,IAAA,GAAY,UAAU,EAAM,OAAO,WACzE,EAAM,OAAO,gBAAkB,IAAA,GAAY,IAAA,GAAY,SAAS,EAAM,OAAO,gBAC7E,EAAM,OAAO,eAAiB,IAAA,GAC1B,IAAA,GACA,GAAG,EAAM,OAAO,aAAa,OAAO,WACzC,CAAC,OAAO,QAAQ,CAEjB,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mEAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,kDAA0C,EAAM,OAAO,KAAW,CAAA,EACjF,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wDACZ,EAAQ,OAAS,EAAI,EAAQ,KAAK,MAAM,CAAG,qBACxC,CAAA,CACF,GAIV,SAAS,EAAS,EAIf,CACD,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,8EAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,oBAAgC,CAAA,EAC9C,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,4DAAb,CAAgE,yBACvC,EAAM,MAAM,UAAU,gBAAc,IAC1D,EAAM,MAAM,YAAY,OAAO,YAC9B,GACA,CAAA,CAAA,EACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oDAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAU,MAAM,cAAc,MAAO,OAAO,EAAM,MAAM,aAAe,EAAE,CAAI,CAAA,EAC7E,EAAA,EAAA,KAAC,EAAD,CAAU,MAAM,SAAS,MAAO,EAAM,QAAU,EAAM,SAAW,cAAiB,CAAA,CAC9E,GACE,GAId,SAAS,EAAW,EAAwE,CAC1F,IAAM,EAAS,EAAU,EAAM,OAAO,OAAO,CACvC,EAAQ,MAAM,QAAQ,EAAO,QAAQ,CAAG,EAAO,QAAU,EAAE,CAEjE,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,sBAAnB,EACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,8EAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oEAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,cAA0B,CAAA,EACxC,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,4DAAb,CACG,EAAM,OAAO,MAAM,MAAI,IAAI,KAAK,EAAM,OAAO,UAAU,CAAC,oBAAoB,CAC3E,GACA,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,6IACb,EAAM,MAAM,KACR,CAAA,CACH,IACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,SAAS,MAAO,OAAO,EAAO,QAAU,EAAE,CAAI,CAAA,EAClE,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,SAAS,MAAO,OAAO,EAAO,QAAU,EAAE,CAAI,CAAA,EAClE,EAAA,EAAA,KAAC,EAAD,CAAc,MAAM,UAAU,MAAO,OAAO,EAAO,SAAW,EAAE,CAAI,CAAA,EACpE,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,WACN,MAAO,GAAG,EAAO,YAAc,EAAM,OAAO,WAAW,IACvD,CAAA,CACE,GACE,IAEV,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,8EAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oEAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,eAA2B,CAAA,EACzC,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,4DAAmD,oFAE5D,CAAA,CACA,CAAA,CAAA,EACN,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,iHAAhB,CACG,EAAM,OAAO,SACT,GACH,GACL,EAAM,SAAW,GAChB,EAAA,EAAA,KAAC,EAAD,CAAA,SAAY,sDAAgE,CAAA,EAE5E,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sBACZ,EAAM,KAAK,EAAU,KACpB,EAAA,EAAA,KAAC,EAAD,CACS,QAEP,OAAQ,EACR,CAFK,EAAc,EAAU,EAAM,CAEnC,CACF,CACE,CAAA,CAEA,IAEV,EAAA,EAAA,KAAC,EAAD,CAAY,MAAM,aAAa,MAAO,EAAM,OAAO,OAAU,CAAA,CACrD,GAId,SAAS,EAAe,EAAqD,CAC3E,IAAM,EAAW,EAAS,EAAM,OAAO,KAAK,CAAG,EAAM,OAAO,KAAO,EAAE,CAC/D,EAAU,MAAM,QAAQ,EAAM,OAAO,QAAQ,CAAG,EAAM,OAAO,QAAU,EAAE,CACzE,EAAS,OAAO,EAAS,IAAO,SAAW,EAAS,GAAK,QAAQ,EAAM,MAAQ,IAC/E,EAAS,EAAoB,EAAQ,CACrC,EAAgB,EAAkB,EAAO,CAE/C,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,yEAAnB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yHAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,kJACb,EAAM,MAAQ,EACV,CAAA,EACP,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mBAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,gEAAwD,EAAY,CAAA,EAClF,EAAA,EAAA,MAAC,IAAD,CAAG,UAAU,4DAAb,CACG,EAAQ,OAAO,sBAAoB,EAAO,OAAO,WAAS,EAAO,OAAO,UAAQ,IAChF,EAAO,QAAQ,WACd,GACA,GACF,IACN,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,EAA4B,CAAA,CACtC,IAEN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0BAAf,EACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,sBAAnB,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,YAAwB,CAAA,EACtC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,uEAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAY,MAAM,QAAQ,MAAO,EAAS,MAAO,UAAU,WAAa,CAAA,EACxE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oDAAf,EACE,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,WACN,MAAO,EAAS,SAChB,UAAU,oBACV,CAAA,EACF,EAAA,EAAA,KAAC,EAAD,CAAY,MAAM,SAAS,MAAO,EAAM,OAAO,OAAQ,UAAU,YAAc,CAAA,CAC3E,GACF,GACE,GAET,EAAM,OAAO,cAAgB,IAAA,GAAY,MACxC,EAAA,EAAA,KAAC,EAAD,CACE,MAAM,eACN,MAAO,EAAM,OAAO,YACpB,UAAU,kBACV,CAAA,EAGJ,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,sBAAnB,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,mBAA+B,CAAA,CAC5C,EAAQ,SAAW,GAClB,EAAA,EAAA,KAAC,EAAD,CAAA,SAAY,iDAA2D,CAAA,EAEvE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+EAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sKAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAA,SAAM,SAAa,CAAA,EACnB,EAAA,EAAA,KAAC,OAAD,CAAA,SAAM,QAAY,CAAA,EAClB,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,sBAAa,SAAa,CAAA,CACtC,IACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gBACZ,EAAQ,KAAK,EAAQ,KACpB,EAAA,EAAA,KAAC,EAAD,CAAyB,QAA8C,SAAU,CAA5C,EAAiB,EAAO,CAAoB,CACjF,CACE,CAAA,CACF,GAEA,GACN,GACE,GAId,SAAS,EAAiB,EAAuD,CAC/E,IAAM,EAAU,EAAS,EAAM,OAAO,QAAQ,CAAG,EAAM,OAAO,QAAU,EAAE,CACpE,EAAS,OAAO,EAAQ,SAAY,SAAW,EAAQ,QAAU,UACjE,EAAiB,MAAM,QAAQ,EAAM,OAAO,eAAe,CAC7D,EAAM,OAAO,eACb,EAAE,CAEN,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,8GAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mBAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0DACZ,EAAM,OAAO,YAAc,UAAU,EAAM,MAAQ,IAChD,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wDACZ,OAAO,EAAQ,SAAY,SACxB,EAAQ,QACR,OAAO,EAAQ,QAAW,SACxB,EAAQ,OACR,aACF,CAAA,CACL,EAAe,OAAS,GACvB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,8IACZ,EAAY,EAAe,CACxB,CAAA,CACJ,KACA,IACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,8CACZ,UAAW,EAAU,EAAY,EAAQ,MAAM,CAAG,MAC/C,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,EAAqB,CAAA,CAC/B,CAAA,CACF,GAIV,SAAS,EAAY,EAAsC,CACzD,OACE,EAAA,EAAA,KAAC,EAAD,CAAmB,UAAU,qDAC1B,EAAM,SACW,CAAA,CAIxB,SAAS,EAAc,EAA8B,CACnD,IAAM,EAAU,EAAS,EAAM,SAAS,CAAG,OAAO,QAAQ,EAAM,SAAS,CAAG,EAAE,CAK9E,OAJI,EAAQ,SAAW,GACd,EAAA,EAAA,KAAC,EAAD,CAAA,SAAY,kCAA4C,CAAA,EAI/D,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wEAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAc,iBAA6B,CAAA,EAC3C,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,oDACZ,EAAQ,KAAK,CAAC,EAAK,MAClB,EAAA,EAAA,KAAC,EAAD,CAAoB,MAAO,EAAK,MAAO,EAAY,EAAM,CAAI,CAA9C,EAA8C,CAC7D,CACE,CAAA,CACF,GAIV,SAAS,EAAW,EAA6D,CAC/E,IAAM,EAAW,EAAM,QAAU,IAAA,GAEjC,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2EAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,oFACZ,EAAM,MACH,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,sFACZ,EAAW,EAAY,EAAM,MAAM,CAAG,EAAM,UACzC,CAAA,CACF,GAIV,SAAS,EAAS,EAAyC,CACzD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0DAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,4FACb,EAAM,MACF,CAAA,EACP,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,kEAA0D,EAAM,MAAa,CAAA,CACzF,GAIV,SAAS,EAAW,EAAsC,CACxD,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qGACZ,EAAM,SACH,CAAA,CAIV,SAAS,EAAa,EAAsC,CAC1D,OACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,uFACX,EAAM,SACJ,CAAA,CAIT,SAAS,EAAW,EAA0C,CAC5D,OACE,EAAA,EAAA,MAAC,UAAD,CAAS,UAAU,mEAAnB,EACE,EAAA,EAAA,KAAC,UAAD,CAAS,UAAU,kGAChB,EAAM,MACC,CAAA,EACV,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+JACZ,EAAY,EAAM,MAAM,CACrB,CAAA,CACE,GAyBd,SAAS,EAAU,EAAoC,CACrD,OAAO,EAAS,EAAM,CAAI,EAA+B,EAAE,CAG7D,SAAS,EAAc,EAA2B,EAAuB,CACvE,IAAM,EAAW,EAAS,EAAO,KAAK,CAAG,EAAO,KAAO,EAAE,CACzD,OAAO,OAAO,EAAS,IAAO,SAAW,EAAS,GAAK,QAAQ,EAAQ,IAGzE,SAAS,EAAoB,EAI3B,CACA,OAAO,EAAQ,QACZ,EAAQ,IAAW,CAClB,IAAM,EAAU,EAAS,EAAO,QAAQ,CAAG,EAAO,QAAQ,QAAU,IAAA,GAUpE,OATI,IAAY,SACd,EAAO,QAAU,GAEf,IAAY,SACd,EAAO,QAAU,GAEf,IAAY,YACd,EAAO,SAAW,GAEb,GAET,CAAE,OAAQ,EAAG,OAAQ,EAAG,QAAS,EAAG,CACrC,CAGH,SAAS,EAAkB,EAAqE,CAU9F,OATI,EAAO,OAAS,EACX,OAEL,EAAO,QAAU,EACZ,UAEL,EAAO,OAAS,EACX,OAEF,UAGT,SAAS,EAAiB,EAAqC,CAI7D,OAHI,OAAO,EAAO,YAAe,UAAY,EAAO,WAAW,OAAS,EAC/D,EAAO,WAET,EAAY,EAAO,CAG5B,SAAS,EAAW,EAA0B,CAC5C,OAAO,EAAS,EAAM,CAAG,OAAO,KAAK,EAAM,CAAC,OAAQ,GAAQ,EAAM,KAAS,IAAA,GAAU,CAAG,EAAE,CAG5F,SAAS,EAAY,EAAwB,CAC3C,GAAI,OAAO,GAAU,SACnB,OAAO,EAET,GAAI,CACF,OAAO,KAAK,UAAU,EAAO,KAAM,EAAE,MAC/B,CACN,OAAO,OAAO,EAAM,EAIxB,SAAS,EAAS,EAAkD,CAClE,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,EAAM"}
|
|
1
|
+
{"version":3,"file":"evals-page-CrS8Nw5a.js","names":[],"sources":["../../../src/ui/app/modules/evals/evals-page.tsx"],"sourcesContent":["import { PlayIcon } from \"@hugeicons/core-free-icons\";\nimport type React from \"react\";\nimport type {\n StudioEvalCasePreview,\n StudioEvalMetricSummary,\n StudioEvalRunResponse,\n StudioEvalSuiteConfig,\n} from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n StudioEmptyState,\n StudioMetric,\n StudioPageShell,\n StudioStatusBadge,\n StudioSurface,\n} from \"../../components/ui/studio\";\n\nexport function EvalsPage(props: {\n evals: StudioEvalSuiteConfig[];\n selectedEvalId: string;\n enabled: boolean;\n runState: \"idle\" | \"running\";\n result: StudioEvalRunResponse | undefined;\n onSelectEval: (evalId: string) => void;\n onRun: () => void;\n}) {\n const selected = props.evals.find((suite) => suite.id === props.selectedEvalId) ?? props.evals[0];\n\n return (\n <StudioPageShell>\n <div className=\"grid min-h-0 min-w-0 pb-6 pr-6\">\n <StudioSurface className=\"grid content-start gap-5 overflow-auto p-6\">\n <header className=\"flex min-w-0 items-start justify-between gap-4 border-b border-border/80 pb-5\">\n <div className=\"min-w-0\">\n <p className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n Evals\n </p>\n <h1 className=\"m-0 mt-2 text-2xl font-semibold tracking-tight text-foreground\">\n {selected?.name ?? \"Eval suite\"}\n </h1>\n <p className=\"m-0 mt-2 max-w-2xl text-sm leading-6 text-muted-foreground\">\n {selected?.description ??\n \"Inspect eval datasets, metrics, run configuration, and per-case outcomes.\"}\n </p>\n </div>\n <RunButton\n disabled={!props.enabled || selected === undefined || props.runState === \"running\"}\n label={props.runState === \"running\" ? \"Running\" : \"Run\"}\n onRun={props.onRun}\n />\n </header>\n\n <div className=\"grid gap-5 lg:grid-cols-[340px_minmax(0,1fr)]\">\n <aside className=\"grid content-start gap-4 border-r border-border/80 pr-5 max-lg:border-b max-lg:border-r-0 max-lg:pb-5 max-lg:pr-0\">\n <label className=\"grid gap-2\" htmlFor=\"eval-suite-select\">\n <span className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n Suite\n </span>\n <Select value={selected?.id ?? \"\"} onValueChange={props.onSelectEval}>\n <SelectTrigger\n id=\"eval-suite-select\"\n className=\"h-9 w-full rounded-lg border-border/80 bg-background text-xs hover:border-muted-foreground/60 focus:border-muted-foreground/70 focus:ring-muted-foreground/20\"\n >\n <SelectValue placeholder=\"Select eval\" />\n </SelectTrigger>\n <SelectContent>\n {props.evals.map((suite) => (\n <SelectItem key={suite.id} value={suite.id}>\n {suite.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n\n {selected === undefined ? null : (\n <SuiteOverview suite={selected} enabled={props.enabled} />\n )}\n </aside>\n\n <main className=\"min-w-0\">\n {selected === undefined ? (\n <StudioEmptyState\n className=\"min-h-0\"\n title=\"No eval suites\"\n text=\"0 eval suite records are available in this Studio runtime.\"\n />\n ) : props.result === undefined ? (\n <BeforeRun suite={selected} enabled={props.enabled} runState={props.runState} />\n ) : (\n <EvalResult result={props.result} suite={selected} />\n )}\n </main>\n </div>\n </StudioSurface>\n </div>\n </StudioPageShell>\n );\n}\n\nfunction RunButton(props: { disabled: boolean; label: string; onRun: () => void }) {\n return (\n <Button\n className=\"h-9 shrink-0 gap-1.5 rounded-lg border border-white bg-white px-3 text-sm font-semibold text-black shadow-none hover:border-white hover:bg-white/90 hover:text-black disabled:border-border disabled:bg-muted disabled:text-muted-foreground [&_svg]:!size-3\"\n disabled={props.disabled}\n onClick={props.onRun}\n variant=\"ghost\"\n >\n <StudioIcon icon={PlayIcon} aria-hidden=\"true\" />\n {props.label}\n </Button>\n );\n}\n\nfunction SuiteOverview(props: { suite: StudioEvalSuiteConfig; enabled: boolean }) {\n const metadataKeys = objectKeys(props.suite.metadata);\n const previewCount = props.suite.casePreviewCount ?? props.suite.casePreviews?.length ?? 0;\n\n return (\n <div className=\"grid gap-4\">\n <div className=\"grid grid-cols-2 gap-2\">\n <StudioMetric label=\"Cases\" value={String(props.suite.caseCount)} />\n <StudioMetric label=\"Metrics\" value={String(props.suite.metricNames.length)} />\n <StudioMetric label=\"Concurrency\" value={String(props.suite.concurrency ?? 1)} />\n <StudioMetric label=\"Previewed\" value={`${previewCount}/${props.suite.caseCount}`} />\n </div>\n\n <section className=\"grid gap-3 rounded-xl border border-border/70 bg-background/45 p-4\">\n <div>\n <h2 className=\"m-0 text-sm font-semibold text-foreground\">Run readiness</h2>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n {props.enabled\n ? \"This suite is available in the current Studio runtime.\"\n : \"Eval routes are not available in the current Studio runtime.\"}\n </p>\n </div>\n <div className=\"grid gap-2 text-xs text-muted-foreground\">\n <KeyValue label=\"Suite id\" value={props.suite.id} />\n <KeyValue\n label=\"Metadata keys\"\n value={metadataKeys.length > 0 ? metadataKeys.join(\", \") : \"None\"}\n />\n </div>\n </section>\n </div>\n );\n}\n\nfunction BeforeRun(props: {\n suite: StudioEvalSuiteConfig;\n enabled: boolean;\n runState: \"idle\" | \"running\";\n}) {\n return (\n <div className=\"grid gap-4\">\n <section className=\"grid gap-4 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"grid gap-1\">\n <SectionLabel>What this eval tests</SectionLabel>\n <p className=\"m-0 max-w-3xl text-sm leading-6 text-foreground\">\n {props.suite.description ??\n \"This suite has no description. Use the dataset and metric definitions below to inspect coverage before running it.\"}\n </p>\n </div>\n <MetadataBlock metadata={props.suite.metadata} />\n </section>\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1.35fr)_minmax(320px,0.65fr)]\">\n <DatasetPreview suite={props.suite} />\n <div className=\"grid content-start gap-4\">\n <MetricsPanel\n metrics={props.suite.metricSummaries}\n metricNames={props.suite.metricNames}\n />\n <RunSetup suite={props.suite} enabled={props.enabled} runState={props.runState} />\n </div>\n </div>\n </div>\n );\n}\n\nfunction DatasetPreview(props: { suite: StudioEvalSuiteConfig }) {\n const previews = props.suite.casePreviews ?? [];\n\n return (\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <SectionLabel>Dataset preview</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Showing {previews.length} of {props.suite.caseCount} cases.\n </p>\n </div>\n <span className=\"rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold text-muted-foreground\">\n {props.suite.caseCount} cases\n </span>\n </div>\n\n {previews.length === 0 ? (\n <MutedPanel>No dataset preview is available for this suite.</MutedPanel>\n ) : (\n <div className=\"grid gap-3\">\n {previews.map((testCase) => (\n <CasePreviewCard key={testCase.id} testCase={testCase} />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CasePreviewCard(props: { testCase: StudioEvalCasePreview }) {\n return (\n <article className=\"grid gap-3 rounded-xl border border-border/70 bg-card/35 p-4\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <h3 className=\"m-0 truncate text-sm font-semibold text-foreground\">{props.testCase.id}</h3>\n {props.testCase.metadataKeys === undefined ? null : (\n <span className=\"shrink-0 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.testCase.metadataKeys.length} metadata\n </span>\n )}\n </div>\n <div className=\"grid gap-3 md:grid-cols-2\">\n <ValuePanel label=\"Input\" value={props.testCase.input} emptyText=\"No input preview\" />\n <ValuePanel\n label=\"Expected\"\n value={props.testCase.expected}\n emptyText=\"No expected value\"\n />\n </div>\n </article>\n );\n}\n\nfunction MetricsPanel(props: {\n metrics: StudioEvalMetricSummary[] | undefined;\n metricNames: string[];\n}) {\n const metrics =\n props.metrics ??\n props.metricNames.map(\n (name): StudioEvalMetricSummary => ({\n name,\n }),\n );\n\n return (\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div>\n <SectionLabel>Metrics</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Scoring functions that evaluate every case output.\n </p>\n </div>\n {metrics.length === 0 ? (\n <MutedPanel>No metrics are configured for this suite.</MutedPanel>\n ) : (\n <div className=\"grid gap-2\">\n {metrics.map((metric) => (\n <MetricSummaryRow key={metric.name} metric={metric} />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction MetricSummaryRow(props: { metric: StudioEvalMetricSummary }) {\n const details = [\n props.metric.dataType,\n props.metric.configId === undefined ? undefined : `config ${props.metric.configId}`,\n props.metric.scoreConfigId === undefined ? undefined : `score ${props.metric.scoreConfigId}`,\n props.metric.metadataKeys === undefined\n ? undefined\n : `${props.metric.metadataKeys.length} metadata`,\n ].filter(Boolean);\n\n return (\n <div className=\"rounded-lg border border-border/70 bg-card/35 px-3 py-3\">\n <div className=\" text-sm font-semibold text-foreground\">{props.metric.name}</div>\n <div className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {details.length > 0 ? details.join(\" / \") : \"No metric metadata\"}\n </div>\n </div>\n );\n}\n\nfunction RunSetup(props: {\n suite: StudioEvalSuiteConfig;\n enabled: boolean;\n runState: \"idle\" | \"running\";\n}) {\n return (\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div>\n <SectionLabel>Run configuration</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n This run will execute {props.suite.caseCount} cases across{\" \"}\n {props.suite.metricNames.length} metrics.\n </p>\n </div>\n <div className=\"grid gap-2 text-xs text-muted-foreground\">\n <KeyValue label=\"Concurrency\" value={String(props.suite.concurrency ?? 1)} />\n <KeyValue label=\"Status\" value={props.enabled ? props.runState : \"Unavailable\"} />\n </div>\n </section>\n );\n}\n\nfunction EvalResult(props: { result: StudioEvalRunResponse; suite: StudioEvalSuiteConfig }) {\n const result = runResult(props.result.result);\n const cases = Array.isArray(result.results) ? result.results : [];\n\n return (\n <article className=\"grid gap-4\">\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-3\">\n <div>\n <SectionLabel>Run summary</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n {props.result.runId} / {new Date(props.result.startedAt).toLocaleTimeString()}\n </p>\n </div>\n <span className=\"rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.suite.name}\n </span>\n </div>\n <div className=\"grid gap-2 sm:grid-cols-4\">\n <StudioMetric label=\"Passed\" value={String(result.passed ?? 0)} />\n <StudioMetric label=\"Failed\" value={String(result.failed ?? 0)} />\n <StudioMetric label=\"Invalid\" value={String(result.invalid ?? 0)} />\n <StudioMetric\n label=\"Duration\"\n value={`${result.durationMs ?? props.result.durationMs}ms`}\n />\n </div>\n </section>\n\n <section className=\"grid gap-3 rounded-xl border border-border/80 bg-background/45 p-5\">\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-3\">\n <div>\n <SectionLabel>Case results</SectionLabel>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n Each case shows the prompt, expected answer, model output, then metric judgments.\n </p>\n </div>\n <span className=\"rounded-lg border border-border/80 bg-card/60 px-2.5 py-1 text-xs font-semibold text-muted-foreground\">\n {cases.length} cases\n </span>\n </div>\n {cases.length === 0 ? (\n <MutedPanel>No per-case results were returned by this eval run.</MutedPanel>\n ) : (\n <div className=\"grid gap-4\">\n {cases.map((testCase, index) => (\n <CaseResultCard\n index={index}\n key={caseResultKey(testCase, index)}\n result={testCase}\n />\n ))}\n </div>\n )}\n </section>\n\n <RawDetails title=\"Raw result\" value={props.result.result} />\n </article>\n );\n}\n\nfunction CaseResultCard(props: { index: number; result: EvalCaseRunResult }) {\n const testCase = isRecord(props.result.case) ? props.result.case : {};\n const metrics = Array.isArray(props.result.metrics) ? props.result.metrics : [];\n const caseId = typeof testCase.id === \"string\" ? testCase.id : `case-${props.index + 1}`;\n const counts = metricOutcomeCounts(metrics);\n const primaryStatus = casePrimaryStatus(counts);\n\n return (\n <article className=\"overflow-hidden rounded-xl border border-border/70 bg-card/35\">\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-4 border-b border-border/70 bg-background/35 px-4 py-4\">\n <div className=\"flex min-w-0 items-start gap-3\">\n <span className=\"flex h-7 min-w-7 items-center justify-center rounded-lg border border-border/80 bg-card/70 text-xs font-semibold text-muted-foreground\">\n {props.index + 1}\n </span>\n <div className=\"min-w-0\">\n <h3 className=\"m-0 truncate text-base font-semibold text-foreground\">{caseId}</h3>\n <p className=\"m-0 mt-1 text-xs leading-5 text-muted-foreground\">\n {metrics.length} metric outcomes / {counts.passed} pass / {counts.failed} fail /{\" \"}\n {counts.invalid} invalid\n </p>\n </div>\n </div>\n <StatusBadge>{primaryStatus}</StatusBadge>\n </div>\n\n <div className=\"grid gap-4 p-4\">\n <section className=\"grid gap-3\">\n <SectionLabel>Test case</SectionLabel>\n <div className=\"grid gap-3 xl:grid-cols-[minmax(0,1.15fr)_minmax(0,0.85fr)]\">\n <ValuePanel label=\"Input\" value={testCase.input} emptyText=\"No input\" />\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-1\">\n <ValuePanel\n label=\"Expected\"\n value={testCase.expected}\n emptyText=\"No expected value\"\n />\n <ValuePanel label=\"Output\" value={props.result.output} emptyText=\"No output\" />\n </div>\n </div>\n </section>\n\n {props.result.targetError === undefined ? null : (\n <ValuePanel\n label=\"Target error\"\n value={props.result.targetError}\n emptyText=\"No target error\"\n />\n )}\n\n <section className=\"grid gap-3\">\n <SectionLabel>Metric judgments</SectionLabel>\n {metrics.length === 0 ? (\n <MutedPanel>No metric results were returned for this case.</MutedPanel>\n ) : (\n <div className=\"overflow-hidden rounded-lg border border-border/70 bg-background/45\">\n <div className=\"grid grid-cols-[minmax(0,1fr)_96px_96px] gap-3 border-b border-border/70 px-3 py-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n <span>Metric</span>\n <span>Score</span>\n <span className=\"text-right\">Status</span>\n </div>\n <div className=\"grid\">\n {metrics.map((metric, index) => (\n <MetricOutcomeRow index={index} key={metricOutcomeKey(metric)} metric={metric} />\n ))}\n </div>\n </div>\n )}\n </section>\n </div>\n </article>\n );\n}\n\nfunction MetricOutcomeRow(props: { index: number; metric: EvalMetricRunResult }) {\n const outcome = isRecord(props.metric.outcome) ? props.metric.outcome : {};\n const status = typeof outcome.outcome === \"string\" ? outcome.outcome : \"unknown\";\n const reporterErrors = Array.isArray(props.metric.reporterErrors)\n ? props.metric.reporterErrors\n : [];\n\n return (\n <div className=\"grid grid-cols-[minmax(0,1fr)_96px_96px] gap-3 border-b border-border/60 px-3 py-3 last:border-b-0\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-foreground\">\n {props.metric.metricName ?? `metric-${props.index + 1}`}\n </div>\n <div className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {typeof outcome.comment === \"string\"\n ? outcome.comment\n : typeof outcome.reason === \"string\"\n ? outcome.reason\n : \"No comment\"}\n </div>\n {reporterErrors.length > 0 ? (\n <pre className=\"m-0 mt-2 whitespace-pre-wrap break-words rounded-md border border-border/70 bg-card/45 p-2 text-xs leading-5 text-muted-foreground\">\n {formatValue(reporterErrors)}\n </pre>\n ) : null}\n </div>\n <div className=\" text-xs leading-6 text-foreground\">\n {\"score\" in outcome ? formatValue(outcome.score) : \"n/a\"}\n </div>\n <div className=\"flex justify-end\">\n <StatusBadge>{status}</StatusBadge>\n </div>\n </div>\n );\n}\n\nfunction StatusBadge(props: { children: React.ReactNode }) {\n return (\n <StudioStatusBadge className=\"h-7 rounded-md bg-card/70 text-foreground\">\n {props.children}\n </StudioStatusBadge>\n );\n}\n\nfunction MetadataBlock(props: { metadata: unknown }) {\n const entries = isRecord(props.metadata) ? Object.entries(props.metadata) : [];\n if (entries.length === 0) {\n return <MutedPanel>No suite metadata was provided.</MutedPanel>;\n }\n\n return (\n <div className=\"grid gap-2 rounded-xl border border-border/70 bg-card/35 p-4\">\n <SectionLabel>Suite metadata</SectionLabel>\n <div className=\"grid gap-2 text-xs text-muted-foreground\">\n {entries.map(([key, value]) => (\n <KeyValue key={key} label={key} value={formatValue(value)} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ValuePanel(props: { label: string; value: unknown; emptyText: string }) {\n const hasValue = props.value !== undefined;\n\n return (\n <div className=\"min-w-0 rounded-lg border border-border/70 bg-background/45 p-3\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.label}\n </div>\n <pre className=\"m-0 mt-2 whitespace-pre-wrap break-words text-xs leading-5 text-foreground\">\n {hasValue ? formatValue(props.value) : props.emptyText}\n </pre>\n </div>\n );\n}\n\nfunction KeyValue(props: { label: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <span className=\"shrink-0 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {props.label}\n </span>\n <span className=\"min-w-0 break-words text-right text-xs text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction MutedPanel(props: { children: React.ReactNode }) {\n return (\n <div className=\"rounded-lg border border-border/70 bg-card/35 p-3 text-sm leading-6 text-muted-foreground\">\n {props.children}\n </div>\n );\n}\n\nfunction SectionLabel(props: { children: React.ReactNode }) {\n return (\n <h2 className=\"m-0 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.children}\n </h2>\n );\n}\n\nfunction RawDetails(props: { title: string; value: unknown }) {\n return (\n <details className=\"rounded-xl border border-border/80 bg-background/45 p-5\">\n <summary className=\"cursor-pointer text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.title}\n </summary>\n <pre className=\"mt-3 max-h-[45vh] overflow-auto whitespace-pre-wrap break-words rounded-lg border border-border/70 bg-card/35 p-3 text-xs leading-5 text-foreground\">\n {formatValue(props.value)}\n </pre>\n </details>\n );\n}\n\ntype EvalSuiteRunResult = {\n passed?: number;\n failed?: number;\n invalid?: number;\n durationMs?: number;\n results?: EvalCaseRunResult[];\n};\n\ntype EvalCaseRunResult = {\n case?: unknown;\n output?: unknown;\n targetError?: unknown;\n metrics?: EvalMetricRunResult[];\n};\n\ntype EvalMetricRunResult = {\n metricName?: string;\n outcome?: unknown;\n reporterErrors?: unknown[];\n};\n\nfunction runResult(value: unknown): EvalSuiteRunResult {\n return isRecord(value) ? (value as EvalSuiteRunResult) : {};\n}\n\nfunction caseResultKey(result: EvalCaseRunResult, index: number): string {\n const testCase = isRecord(result.case) ? result.case : {};\n return typeof testCase.id === \"string\" ? testCase.id : `case-${index + 1}`;\n}\n\nfunction metricOutcomeCounts(metrics: EvalMetricRunResult[]): {\n passed: number;\n failed: number;\n invalid: number;\n} {\n return metrics.reduce(\n (counts, metric) => {\n const outcome = isRecord(metric.outcome) ? metric.outcome.outcome : undefined;\n if (outcome === \"pass\") {\n counts.passed += 1;\n }\n if (outcome === \"fail\") {\n counts.failed += 1;\n }\n if (outcome === \"invalid\") {\n counts.invalid += 1;\n }\n return counts;\n },\n { passed: 0, failed: 0, invalid: 0 },\n );\n}\n\nfunction casePrimaryStatus(counts: { passed: number; failed: number; invalid: number }): string {\n if (counts.failed > 0) {\n return \"fail\";\n }\n if (counts.invalid > 0) {\n return \"invalid\";\n }\n if (counts.passed > 0) {\n return \"pass\";\n }\n return \"unknown\";\n}\n\nfunction metricOutcomeKey(result: EvalMetricRunResult): string {\n if (typeof result.metricName === \"string\" && result.metricName.length > 0) {\n return result.metricName;\n }\n return formatValue(result);\n}\n\nfunction objectKeys(value: unknown): string[] {\n return isRecord(value) ? Object.keys(value).filter((key) => value[key] !== undefined) : [];\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"mappings":"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"}
|