@anvia/studio 0.7.50 → 0.7.52
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 +3 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/evals-page-CEs62ZfO.js +2 -0
- package/dist/ui/assets/evals-page-CEs62ZfO.js.map +1 -0
- package/dist/ui/assets/{index-BA0rdlcA.js → index-DY62pnOs.js} +4 -4
- package/dist/ui/assets/{index-BA0rdlcA.js.map → index-DY62pnOs.js.map} +1 -1
- package/dist/ui/assets/{knowledge-page-mjUIFz9M.js → knowledge-page-DMzsYo4t.js} +2 -2
- package/dist/ui/assets/{knowledge-page-mjUIFz9M.js.map → knowledge-page-DMzsYo4t.js.map} +1 -1
- package/dist/ui/assets/{mcps-page-Cc7DIAm6.js → mcps-page-ok-rle9j.js} +2 -2
- package/dist/ui/assets/{mcps-page-Cc7DIAm6.js.map → mcps-page-ok-rle9j.js.map} +1 -1
- package/dist/ui/assets/{memory-page-DQIj_bQD.js → memory-page-C7kQQjJR.js} +2 -2
- package/dist/ui/assets/{memory-page-DQIj_bQD.js.map → memory-page-C7kQQjJR.js.map} +1 -1
- package/dist/ui/assets/{pipelines-page-C-_Kz3Lk.js → pipelines-page-P3XgUxJA.js} +2 -2
- package/dist/ui/assets/{pipelines-page-C-_Kz3Lk.js.map → pipelines-page-P3XgUxJA.js.map} +1 -1
- package/dist/ui/assets/{sandboxes-page-DTIS-k4s.js → sandboxes-page-j51ihKpC.js} +2 -2
- package/dist/ui/assets/{sandboxes-page-DTIS-k4s.js.map → sandboxes-page-j51ihKpC.js.map} +1 -1
- package/dist/ui/assets/{sessions-page-BXgRMxf-.js → sessions-page-BBwN5yCL.js} +2 -2
- package/dist/ui/assets/{sessions-page-BXgRMxf-.js.map → sessions-page-BBwN5yCL.js.map} +1 -1
- package/dist/ui/assets/{status-page-C1lHztV8.js → status-page-BeUj83WX.js} +2 -2
- package/dist/ui/assets/{status-page-C1lHztV8.js.map → status-page-BeUj83WX.js.map} +1 -1
- package/dist/ui/assets/{tool-runner-FyfYw2ZF.js → tool-runner-DPD3YKe-.js} +2 -2
- package/dist/ui/assets/{tool-runner-FyfYw2ZF.js.map → tool-runner-DPD3YKe-.js.map} +1 -1
- package/dist/ui/assets/{tools-page-wjxEfdKF.js → tools-page-DXe7uWe2.js} +2 -2
- package/dist/ui/assets/{tools-page-wjxEfdKF.js.map → tools-page-DXe7uWe2.js.map} +1 -1
- package/dist/ui/assets/{trace-browser-B7e1JE0G.js → trace-browser-DLq-cgJu.js} +2 -2
- package/dist/ui/assets/{trace-browser-B7e1JE0G.js.map → trace-browser-DLq-cgJu.js.map} +1 -1
- package/dist/ui/assets/{transcript-item-BWi5umW2.js → transcript-item-CNTeNfE-.js} +2 -2
- package/dist/ui/assets/{transcript-item-BWi5umW2.js.map → transcript-item-CNTeNfE-.js.map} +1 -1
- package/dist/ui/index.html +1 -1
- package/package.json +5 -5
- package/dist/ui/assets/evals-page-BENEdYNb.js +0 -2
- package/dist/ui/assets/evals-page-BENEdYNb.js.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{i as e,r as t,s as n,t as r}from"./utils-C9GMruoG.js";import{n as i}from"./format-D43vTqrO.js";import{G as a,I as o,J as s,L as c,Y as l,n as u,nt as d,st as f,t as p}from"./index-
|
|
1
|
+
import{i as e,r as t,s as n,t as r}from"./utils-C9GMruoG.js";import{n as i}from"./format-D43vTqrO.js";import{G as a,I as o,J as s,L as c,Y as l,n as u,nt as d,st as f,t as p}from"./index-DY62pnOs.js";import{t as m}from"./badge-D7D2A73-.js";import{i as h,r as g}from"./renderers-BYO0FrBn.js";var _=n(e(),1),v=t(),y=(0,_.memo)(function(e){let t=e.displayText??(`text`in e.entry?e.entry.text:``);if(e.entry.kind===`reasoning`)return(0,v.jsxs)(`article`,{className:`max-w-205 justify-self-start text-muted-foreground`,"data-entry-id":String(e.entry.entryId),children:[(0,v.jsx)(`div`,{className:`mb-1 text-xs font-semibold uppercase text-muted-foreground`,children:`Reasoning`}),(0,v.jsx)(g,{live:e.live,size:`base`,text:t})]});if(e.entry.kind===`tool`)return(0,v.jsx)(j,{entry:e.entry,decidingApprovals:e.decidingApprovals,answeringQuestions:e.answeringQuestions,onApprovalDecision:e.onApprovalDecision,onQuestionAnswer:e.onQuestionAnswer});let n=e.entry.role===`assistant`?e.entry.traceId:void 0,i=e.entry.role===`assistant`&&A(t),a=e.entry.role===`assistant`&&`tone`in e.entry&&e.entry.tone===`error`,o=e.entry.role===`assistant`&&`tone`in e.entry&&e.entry.tone===`pending`,s=e.entry.role===`assistant`&&!o&&e.entry.text.trim().length>0,c=e.entry.durationMs??e.metrics?.durationMs,l=s||e.workingStartedAt!==void 0||c!==void 0;return e.entry.role===`user`?(0,v.jsxs)(`article`,{className:`grid w-fit max-w-[min(64ch,82%)] justify-items-end justify-self-end self-start text-foreground`,"data-entry-id":String(e.entry.entryId),children:[e.entry.text.trim().length===0?null:(0,v.jsx)(`div`,{className:`rounded-2xl bg-muted/55 px-4 py-2.5 shadow-sm shadow-black/[0.04] dark:bg-white/[0.08] dark:shadow-black/20`,children:(0,v.jsx)(g,{size:`base`,text:e.entry.text})}),e.entry.attachments===void 0?null:(0,v.jsx)(k,{attachments:e.entry.attachments})]}):(0,v.jsxs)(`article`,{className:r(`self-start`,i?`w-full max-w-full`:`max-w-[min(82ch,100%)]`,e.entry.role===`assistant`&&r(`justify-self-start text-foreground`,a&&`text-destructive`)),"data-entry-id":String(e.entry.entryId),children:[o?(0,v.jsx)(O,{}):null,t.trim().length===0?null:(0,v.jsx)(g,{live:e.live,size:`base`,text:t}),l?(0,v.jsx)(b,{metrics:e.metrics,showActions:s,text:e.entry.text,traceId:n,durationMs:e.workingStartedAt===void 0?c:void 0,startedAt:e.workingStartedAt,onOpenTrace:e.onOpenTrace}):null]})});function b(e){let[t,n]=(0,_.useState)(!1),r=e.traceId;async function i(){if(!(typeof navigator>`u`||navigator.clipboard===void 0))try{await navigator.clipboard.writeText(e.text),n(!0),window.setTimeout(()=>n(!1),1200)}catch{n(!1)}}return(0,v.jsxs)(`div`,{className:`mt-3 flex min-w-0 items-center gap-1.5`,children:[e.showActions?(0,v.jsx)(c,{"aria-label":t?`Response copied`:`Copy response`,className:`h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground`,title:t?`Copied`:`Copy response`,type:`button`,variant:`ghost`,onClick:()=>void i(),children:(0,v.jsx)(o,{icon:t?l:s,"aria-hidden":`true`})}):null,e.showActions?(0,v.jsxs)(`div`,{className:`group relative`,children:[(0,v.jsx)(c,{"aria-label":`Response metrics`,className:`h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground`,title:T(e.metrics),type:`button`,variant:`ghost`,children:(0,v.jsx)(o,{icon:a,"aria-hidden":`true`})}),(0,v.jsx)(`div`,{className:`pointer-events-none absolute left-0 top-full z-30 mt-2 hidden w-64 rounded-lg border border-border/90 bg-popover p-3 text-popover-foreground shadow-xl shadow-black/25 group-focus-within:grid group-hover:grid`,role:`tooltip`,children:(0,v.jsx)(x,{metrics:e.metrics})})]}):null,!e.showActions||r===void 0?null:(0,v.jsx)(c,{"aria-label":`Open trace ${r}`,className:`h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground`,title:`Open trace ${r}`,type:`button`,variant:`ghost`,onClick:()=>e.onOpenTrace(r),children:(0,v.jsx)(o,{icon:d,"aria-hidden":`true`})}),(0,v.jsx)(p,{className:e.showActions?`ml-1.5`:void 0,durationMs:e.durationMs,startedAt:e.startedAt})]})}function x(e){let t=C(e.metrics);return(0,v.jsxs)(`div`,{className:`grid min-w-0 gap-2 text-xs leading-5`,children:[(0,v.jsx)(`div`,{className:`font-semibold text-foreground`,children:`Response metrics`}),(0,v.jsxs)(`div`,{className:`grid min-w-0 gap-1`,children:[(0,v.jsx)(S,{label:`Cost`,value:`Unavailable`}),t.length===0?(0,v.jsx)(`div`,{className:`text-muted-foreground`,children:`No usage metrics yet`}):t.map(e=>(0,v.jsx)(S,{label:e.label,value:e.value},e.label))]})]})}function S(e){return(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3`,children:[(0,v.jsx)(`span`,{className:`text-muted-foreground`,children:e.label}),(0,v.jsx)(`span`,{className:`shrink-0 font-medium tabular-nums text-foreground`,children:e.value})]})}function C(e){let t=[],n=e?.usage;return n?.totalTokens!==void 0&&t.push({label:`Total`,value:`${E(n.totalTokens)} tokens`}),n?.inputTokens!==void 0&&t.push({label:`Input`,value:E(n.inputTokens)}),n?.outputTokens!==void 0&&t.push({label:`Output`,value:E(n.outputTokens)}),w(t,`Cached`,n,`cachedInputTokens`),w(t,`Cache create`,n,`cacheCreationInputTokens`),e?.durationMs!==void 0&&t.push({label:`Duration`,value:D(e.durationMs)}),t}function w(e,t,n,r){let i=n?.[r];i!==void 0&&i>0&&e.push({label:t,value:E(i)})}function T(e){let t=C(e);return t.length===0?`Cost unavailable. No usage metrics yet.`:[`Cost unavailable`,...t.map(e=>`${e.label}: ${e.value}`)].join(`. `)}function E(e){return e.toLocaleString()}function D(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}function O(){return(0,v.jsxs)(`div`,{"aria-label":`Assistant is responding`,className:`inline-flex h-9 min-h-9 items-center gap-2 rounded-xl border border-border/70 bg-muted/35 px-3 text-muted-foreground shadow-sm`,role:`status`,children:[(0,v.jsxs)(`span`,{className:`flex items-center gap-1`,"aria-hidden":`true`,children:[(0,v.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-foreground`}),(0,v.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:150ms]`}),(0,v.jsx)(`span`,{className:`h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:300ms]`})]}),(0,v.jsx)(`span`,{className:` text-xs font-semibold uppercase text-muted-foreground`,children:`Thinking`})]})}function k(e){return(0,v.jsx)(`div`,{className:`mt-2 flex max-w-full flex-wrap gap-2`,children:e.attachments.map((e,t)=>{let n=`${e.kind}-${e.name??e.mediaType??t}-${t}`;if(e.kind===`image`){let t=e.url??(e.data===void 0?void 0:`data:${e.mediaType??`image/png`};base64,${e.data}`);return(0,v.jsx)(`div`,{className:`overflow-hidden rounded-lg border border-border/80 bg-card/80`,children:t===void 0?(0,v.jsx)(`div`,{className:`grid h-20 w-24 place-items-center px-2 text-center text-xs text-muted-foreground`,children:`Image`}):(0,v.jsx)(`img`,{alt:e.name??`Attached image`,className:`h-20 w-24 object-cover`,src:t})},n)}return(0,v.jsx)(`span`,{className:`inline-flex max-w-full items-center gap-1.5 rounded-lg border border-border/80 bg-card/80 px-2 py-1 text-xs font-medium text-muted-foreground`,children:(0,v.jsx)(`span`,{className:`min-w-0 truncate`,children:e.name??e.mediaType??`Document`})},n)})})}function A(e){let t=e.split(`
|
|
2
2
|
`);return t.some((e,n)=>{let r=t[n+1];return e.includes(`|`)&&r!==void 0&&/^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)+\|?\s*$/.test(r)})}function j(e){let[t,n]=(0,_.useState)(e.entry.approval?.status!==`pending`&&e.entry.question?.status!==`pending`),i=e.entry.approval,a=e.entry.question,s=e.entry.childEvents??[],l=e.entry.args!==void 0||e.entry.result!==void 0||s.length>0||i!==void 0||a!==void 0,u=i?.status===`pending`,d=a?.status===`pending`,p=i?.status===`cancelled`||a?.status===`cancelled`,g=i!==void 0&&e.decidingApprovals.has(i.id),y=a!==void 0&&e.answeringQuestions.has(a.id);return(0,v.jsxs)(`article`,{className:`w-full justify-self-start overflow-hidden rounded-xl border border-border/80 bg-card/90 text-foreground shadow-sm shadow-black/20`,"data-entry-id":String(e.entry.entryId),children:[(0,v.jsxs)(`div`,{className:r(`flex min-w-0 items-center gap-2 px-3 py-2.5`,!t&&l&&`bg-muted/20`),children:[(0,v.jsxs)(c,{"aria-expanded":!t,className:`h-auto min-h-0 min-w-0 flex-1 justify-between border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit`,type:`button`,variant:`ghost`,onClick:()=>n(e=>!e),children:[(0,v.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(`span`,{className:`grid h-6 w-4 shrink-0 place-items-center text-foreground`,children:(0,v.jsx)(o,{icon:f,className:`h-3.5 w-3.5`,"aria-hidden":`true`})}),(0,v.jsx)(`strong`,{className:`min-w-0 truncate text-sm font-semibold text-foreground`,children:e.entry.toolName})]}),u?null:(0,v.jsx)(`span`,{className:`ml-auto shrink-0 text-xs font-medium text-muted-foreground`,children:t?`Show`:`Hide`})]}),u&&i!==void 0?(0,v.jsx)(L,{disabled:g,onDecision:t=>e.onApprovalDecision(i.id,t)}):null,d?(0,v.jsx)(m,{className:`border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground`,children:`Waiting for input`}):null,p?(0,v.jsx)(m,{className:`border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-muted-foreground`,children:`Cancelled`}):null,u||d?(0,v.jsx)(c,{"aria-expanded":!t,className:`h-7 min-h-7 px-2 text-xs font-medium`,size:`sm`,type:`button`,variant:`ghost`,onClick:()=>n(e=>!e),children:t?`Show`:`Hide`}):null]}),t||!l?null:(0,v.jsxs)(`div`,{className:`grid gap-3 p-3`,children:[i===void 0?null:(0,v.jsx)(I,{approval:i}),a===void 0?null:(0,v.jsx)(N,{disabled:y,question:a,onAnswer:t=>e.onQuestionAnswer(a.id,t)}),a!==void 0||e.entry.args===void 0?null:(0,v.jsx)(h,{title:`Input`,value:e.entry.args}),s.length===0?null:(0,v.jsx)(M,{events:s}),a!==void 0||e.entry.result===void 0?null:(0,v.jsx)(h,{title:`Output`,value:e.entry.result})]})]})}function M(e){return(0,v.jsxs)(`div`,{className:`overflow-hidden rounded-xl border border-border/80 bg-background/65`,children:[(0,v.jsx)(`div`,{className:`bg-muted/20 px-3 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground`,children:`Subagent activity`}),(0,v.jsx)(`div`,{className:`grid gap-3 p-3`,children:e.events.map(e=>{let t=e.agentName??e.agentId;return e.kind===`message`||e.kind===`reasoning`?(0,v.jsxs)(`div`,{className:`grid gap-1 rounded-xl border border-border/80 bg-card/90 p-3`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(m,{className:`border-border bg-muted px-1.5 py-0.5 text-xs uppercase text-muted-foreground`,children:e.kind===`reasoning`?`Reasoning`:`Response`}),(0,v.jsx)(`span`,{className:`min-w-0 truncate text-xs font-semibold text-muted-foreground`,children:t})]}),(0,v.jsx)(g,{size:`base`,text:e.text})]},`${e.kind}-${e.agentId}-${e.text}`):(0,v.jsxs)(`div`,{className:`grid gap-2 rounded-xl border border-border/80 bg-card/90 p-3`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(m,{className:`border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground`,children:`Tool`}),(0,v.jsxs)(`span`,{className:`min-w-0 truncate text-xs font-semibold text-muted-foreground`,children:[t,` / `,e.toolName]})]}),e.args===void 0?null:(0,v.jsx)(h,{title:`Input`,value:e.args}),e.result===void 0?null:(0,v.jsx)(h,{title:`Output`,value:e.result})]},`${e.kind}-${e.agentId}-${e.toolName}-${e.callId??e.args??e.result??``}`)})})]})}function N(e){let[t,n]=(0,_.useState)({}),[r,i]=(0,_.useState)(0),a=e.question.status===`pending`,o=e.question.questions.length,s=e.question.questions.map(e=>{let n=t[e.id],r=n?.customValue?.trim()??``,i=r.length>0?r:n?.answer,a={questionId:e.id,answer:i?.trim()??``};return n?.choice!==void 0&&(a.choice=n.choice),r.length>0&&(a.custom=!0),a}),l=o===0?0:Math.min(r,o-1),u=e.question.questions[l],d=s[l]?.answer??``,f=s.filter(e=>e.answer.length>0).length,p=d.length>0,m=a&&s.every(e=>e.answer.length>0),h=l===0,g=l>=o-1;if(u===void 0)return(0,v.jsx)(`div`,{className:`rounded-xl border border-border bg-background p-4 text-sm font-medium text-muted-foreground`,children:`No questions`});let y=()=>i(e=>Math.max(0,e-1)),b=()=>i(t=>Math.min(e.question.questions.length-1,t+1)),x=(e,t)=>n(n=>({...n,[e]:t}));return(0,v.jsxs)(`div`,{className:`grid gap-3`,children:[e.question.status===`cancelled`?(0,v.jsx)(`div`,{className:`rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5 text-sm font-medium text-muted-foreground`,children:`Question cancelled`}):null,(0,v.jsx)(P,{disabled:e.disabled||!a,index:l,total:o,question:u,value:t[u.id],answer:e.question.answers?.find(e=>e.questionId===u.id),onChange:e=>x(u.id,e),onAdvance:g?void 0:b},u.id),a?(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2`,children:[(0,v.jsxs)(`div`,{className:`min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground`,children:[f,`/`,o,` answered`]}),(0,v.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[h?null:(0,v.jsx)(c,{type:`button`,variant:`secondary`,onClick:y,children:`Back`}),g?(0,v.jsx)(c,{className:`h-9 min-h-9 px-4`,disabled:e.disabled||!m,type:`button`,onClick:()=>e.onAnswer(s),children:`Submit answers`}):(0,v.jsx)(c,{className:`h-9 min-h-9 px-4`,disabled:e.disabled||!p,type:`button`,onClick:b,children:`Next question`})]})]}):o>1?(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2`,children:[(0,v.jsx)(`div`,{className:`min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-foreground`,children:`Answered`}),(0,v.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[(0,v.jsx)(c,{disabled:h,type:`button`,variant:`secondary`,onClick:y,children:`Back`}),(0,v.jsx)(c,{disabled:g,type:`button`,variant:`secondary`,onClick:b,children:`Next`})]})]}):null]})}function P(e){let t=e.answer?.answer,n=F(e.value),i=t===void 0?n.length>0?`Ready`:`Waiting`:`Answered`;return(0,v.jsxs)(`section`,{className:`grid gap-4 rounded-xl border border-border/80 bg-background/70 p-4`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-4`,children:[(0,v.jsxs)(`div`,{className:`grid min-w-0 gap-2`,children:[(0,v.jsxs)(`div`,{className:` text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground`,children:[`Question `,e.index+1,` of `,e.total]}),(0,v.jsx)(`h3`,{className:`m-0 text-base font-semibold leading-7 text-foreground [overflow-wrap:anywhere]`,children:e.question.question})]}),(0,v.jsx)(`span`,{className:r(`shrink-0 text-xs font-semibold uppercase tracking-[0.18em]`,i===`Answered`&&`text-foreground`,i===`Ready`&&`text-foreground`,i===`Waiting`&&`text-muted-foreground`),children:i})]}),t===void 0?null:(0,v.jsx)(`div`,{className:`rounded-lg border border-border/70 bg-muted/45 px-3 py-2 text-sm font-medium text-foreground`,children:t}),t===void 0&&e.question.choices.length>0?(0,v.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.question.choices.map(t=>{let n=e.value?.choice===t.value;return(0,v.jsx)(c,{className:r(`h-8 min-h-8 px-3 text-xs`,n&&`border-foreground/45`),disabled:e.disabled,size:`sm`,type:`button`,variant:n?`default`:`secondary`,onClick:()=>{e.onChange({answer:t.value,choice:t.value,customValue:e.value?.customValue??``}),e.onAdvance?.()},children:t.label},t.value)})}):null,t===void 0?(0,v.jsx)(u,{className:`min-h-24 text-sm`,disabled:e.disabled,placeholder:`Type a custom answer`,rows:3,value:e.value?.customValue??``,onChange:t=>e.onChange({...e.value,customValue:t.currentTarget.value})}):null]})}function F(e){let t=e?.customValue?.trim()??``;return t.length>0?t:e?.answer?.trim()??``}function I(e){return(0,v.jsxs)(`div`,{className:`grid gap-2 rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5`,children:[(0,v.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(m,{className:r(`border-border/70 bg-background/60 px-1.5 py-0.5 text-xs uppercase text-muted-foreground`,e.approval.status===`approved`&&`text-foreground`,e.approval.status===`rejected`&&`text-destructive`),children:`Approval`}),(0,v.jsx)(`div`,{className:`min-w-0`,children:(0,v.jsx)(`div`,{className:`text-sm font-medium text-foreground`,children:i(e.approval)})})]}),e.approval.reason===void 0?null:(0,v.jsx)(`div`,{className:`text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]`,children:e.approval.reason})]})}function L(e){return(0,v.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 rounded-lg border border-border/80 bg-background/55 p-0.5`,children:[(0,v.jsx)(c,{className:`h-7 min-h-7 rounded-md border-0 bg-transparent px-2.5 text-xs text-muted-foreground shadow-none hover:bg-destructive/10 hover:text-destructive`,disabled:e.disabled,size:`sm`,type:`button`,variant:`ghost`,onClick:()=>e.onDecision(!1),children:`Reject`}),(0,v.jsx)(c,{className:`h-7 min-h-7 rounded-md px-2.5 text-xs`,disabled:e.disabled,size:`sm`,type:`button`,onClick:()=>e.onDecision(!0),children:`Approve`})]})}export{y as TranscriptItem};
|
|
3
|
-
//# sourceMappingURL=transcript-item-
|
|
3
|
+
//# sourceMappingURL=transcript-item-CNTeNfE-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-item-BWi5umW2.js","names":[],"sources":["../../../src/ui/app/modules/playground/transcript-item.tsx"],"sourcesContent":["import {\n ChartBarLineIcon,\n Copy01Icon,\n CopyCheckIcon,\n PathIcon,\n Wrench01Icon,\n} from \"@hugeicons/core-free-icons\";\nimport { memo, useState } from \"react\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { cn } from \"../../lib/utils\";\nimport { approvalLabel } from \"../shared/format\";\nimport { MarkdownText, ToolPayload } from \"../shared/renderers\";\nimport type { ToolApproval, ToolMessage, ToolQuestion, TranscriptEntry } from \"../shared/types\";\nimport type { AssistantResponseMetrics, ResponseUsageMetrics } from \"./response-metrics\";\nimport { WorkingDuration } from \"./working-duration\";\n\nexport const TranscriptItem = memo(function TranscriptItem(props: {\n entry: TranscriptEntry;\n displayText?: string | undefined;\n live?: boolean | undefined;\n metrics?: AssistantResponseMetrics | undefined;\n workingStartedAt?: number | undefined;\n decidingApprovals: Set<string>;\n answeringQuestions: Set<string>;\n onApprovalDecision: (approvalId: string, approved: boolean) => void;\n onQuestionAnswer: (\n questionId: string,\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n onOpenTrace: (traceId: string) => void;\n}) {\n const displayText = props.displayText ?? (\"text\" in props.entry ? props.entry.text : \"\");\n if (props.entry.kind === \"reasoning\") {\n return (\n <article\n className=\"max-w-205 justify-self-start text-muted-foreground\"\n data-entry-id={String(props.entry.entryId)}\n >\n <div className=\"mb-1 text-xs font-semibold uppercase text-muted-foreground\">Reasoning</div>\n <MarkdownText live={props.live} size=\"base\" text={displayText} />\n </article>\n );\n }\n\n if (props.entry.kind === \"tool\") {\n return (\n <ToolEntry\n entry={props.entry}\n decidingApprovals={props.decidingApprovals}\n answeringQuestions={props.answeringQuestions}\n onApprovalDecision={props.onApprovalDecision}\n onQuestionAnswer={props.onQuestionAnswer}\n />\n );\n }\n\n const traceId = props.entry.role === \"assistant\" ? props.entry.traceId : undefined;\n const hasTable = props.entry.role === \"assistant\" && hasMarkdownTable(displayText);\n const isError =\n props.entry.role === \"assistant\" && \"tone\" in props.entry && props.entry.tone === \"error\";\n const isPending =\n props.entry.role === \"assistant\" && \"tone\" in props.entry && props.entry.tone === \"pending\";\n const showAssistantActions =\n props.entry.role === \"assistant\" && !isPending && props.entry.text.trim().length > 0;\n const persistedDurationMs = props.entry.durationMs ?? props.metrics?.durationMs;\n const showAssistantFooter =\n showAssistantActions ||\n props.workingStartedAt !== undefined ||\n persistedDurationMs !== undefined;\n\n if (props.entry.role === \"user\") {\n return (\n <article\n className=\"grid w-fit max-w-[min(64ch,82%)] justify-items-end justify-self-end self-start text-foreground\"\n data-entry-id={String(props.entry.entryId)}\n >\n {props.entry.text.trim().length === 0 ? null : (\n <div className=\"rounded-2xl bg-muted/55 px-4 py-2.5 shadow-sm shadow-black/[0.04] dark:bg-white/[0.08] dark:shadow-black/20\">\n <MarkdownText size=\"base\" text={props.entry.text} />\n </div>\n )}\n {props.entry.attachments !== undefined ? (\n <MessageAttachments attachments={props.entry.attachments} />\n ) : null}\n </article>\n );\n }\n\n return (\n <article\n className={cn(\n \"self-start\",\n hasTable ? \"w-full max-w-full\" : \"max-w-[min(82ch,100%)]\",\n props.entry.role === \"assistant\" &&\n cn(\"justify-self-start text-foreground\", isError && \"text-destructive\"),\n )}\n data-entry-id={String(props.entry.entryId)}\n >\n {isPending ? <AssistantLoadingIndicator /> : null}\n {displayText.trim().length === 0 ? null : (\n <MarkdownText live={props.live} size=\"base\" text={displayText} />\n )}\n {showAssistantFooter ? (\n <AssistantResponseFooter\n metrics={props.metrics}\n showActions={showAssistantActions}\n text={props.entry.text}\n traceId={traceId}\n durationMs={props.workingStartedAt === undefined ? persistedDurationMs : undefined}\n startedAt={props.workingStartedAt}\n onOpenTrace={props.onOpenTrace}\n />\n ) : null}\n </article>\n );\n});\n\nfunction AssistantResponseFooter(props: {\n durationMs?: number | undefined;\n metrics?: AssistantResponseMetrics | undefined;\n showActions: boolean;\n startedAt?: number | undefined;\n text: string;\n traceId?: string | undefined;\n onOpenTrace: (traceId: string) => void;\n}) {\n const [copied, setCopied] = useState(false);\n const traceId = props.traceId;\n\n async function copyResponse() {\n if (typeof navigator === \"undefined\" || navigator.clipboard === undefined) {\n return;\n }\n try {\n await navigator.clipboard.writeText(props.text);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n setCopied(false);\n }\n }\n\n return (\n <div className=\"mt-3 flex min-w-0 items-center gap-1.5\">\n {props.showActions ? (\n <Button\n aria-label={copied ? \"Response copied\" : \"Copy response\"}\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={copied ? \"Copied\" : \"Copy response\"}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => void copyResponse()}\n >\n <StudioIcon icon={copied ? CopyCheckIcon : Copy01Icon} aria-hidden=\"true\" />\n </Button>\n ) : null}\n {props.showActions ? (\n <div className=\"group relative\">\n <Button\n aria-label=\"Response metrics\"\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={metricsTitle(props.metrics)}\n type=\"button\"\n variant=\"ghost\"\n >\n <StudioIcon icon={ChartBarLineIcon} aria-hidden=\"true\" />\n </Button>\n <div\n className=\"pointer-events-none absolute left-0 top-full z-30 mt-2 hidden w-64 rounded-lg border border-border/90 bg-popover p-3 text-popover-foreground shadow-xl shadow-black/25 group-focus-within:grid group-hover:grid\"\n role=\"tooltip\"\n >\n <ResponseMetricsTooltip metrics={props.metrics} />\n </div>\n </div>\n ) : null}\n {!props.showActions || traceId === undefined ? null : (\n <Button\n aria-label={`Open trace ${traceId}`}\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={`Open trace ${traceId}`}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenTrace(traceId)}\n >\n <StudioIcon icon={PathIcon} aria-hidden=\"true\" />\n </Button>\n )}\n <WorkingDuration\n className={props.showActions ? \"ml-1.5\" : undefined}\n durationMs={props.durationMs}\n startedAt={props.startedAt}\n />\n </div>\n );\n}\n\nfunction ResponseMetricsTooltip(props: { metrics?: AssistantResponseMetrics | undefined }) {\n const rows = responseMetricRows(props.metrics);\n return (\n <div className=\"grid min-w-0 gap-2 text-xs leading-5\">\n <div className=\"font-semibold text-foreground\">Response metrics</div>\n <div className=\"grid min-w-0 gap-1\">\n <MetricRow label=\"Cost\" value=\"Unavailable\" />\n {rows.length === 0 ? (\n <div className=\"text-muted-foreground\">No usage metrics yet</div>\n ) : (\n rows.map((row) => <MetricRow label={row.label} value={row.value} key={row.label} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction MetricRow(props: { label: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">{props.label}</span>\n <span className=\"shrink-0 font-medium tabular-nums text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction responseMetricRows(metrics: AssistantResponseMetrics | undefined): Array<{\n label: string;\n value: string;\n}> {\n const rows: Array<{ label: string; value: string }> = [];\n const usage = metrics?.usage;\n if (usage?.totalTokens !== undefined) {\n rows.push({ label: \"Total\", value: `${formatMetricNumber(usage.totalTokens)} tokens` });\n }\n if (usage?.inputTokens !== undefined) {\n rows.push({ label: \"Input\", value: formatMetricNumber(usage.inputTokens) });\n }\n if (usage?.outputTokens !== undefined) {\n rows.push({ label: \"Output\", value: formatMetricNumber(usage.outputTokens) });\n }\n pushOptionalUsageRow(rows, \"Cached\", usage, \"cachedInputTokens\");\n pushOptionalUsageRow(rows, \"Cache create\", usage, \"cacheCreationInputTokens\");\n if (metrics?.durationMs !== undefined) {\n rows.push({ label: \"Duration\", value: formatResponseDuration(metrics.durationMs) });\n }\n return rows;\n}\n\nfunction pushOptionalUsageRow(\n rows: Array<{ label: string; value: string }>,\n label: string,\n usage: ResponseUsageMetrics | undefined,\n key: keyof ResponseUsageMetrics,\n) {\n const value = usage?.[key];\n if (value !== undefined && value > 0) {\n rows.push({ label, value: formatMetricNumber(value) });\n }\n}\n\nfunction metricsTitle(metrics: AssistantResponseMetrics | undefined): string {\n const rows = responseMetricRows(metrics);\n if (rows.length === 0) {\n return \"Cost unavailable. No usage metrics yet.\";\n }\n return [\"Cost unavailable\", ...rows.map((row) => `${row.label}: ${row.value}`)].join(\". \");\n}\n\nfunction formatMetricNumber(value: number): string {\n return value.toLocaleString();\n}\n\nfunction formatResponseDuration(value: number): string {\n if (value < 1000) {\n return `${value}ms`;\n }\n return `${(value / 1000).toFixed(1)}s`;\n}\n\nfunction AssistantLoadingIndicator() {\n return (\n <div\n aria-label=\"Assistant is responding\"\n className=\"inline-flex h-9 min-h-9 items-center gap-2 rounded-xl border border-border/70 bg-muted/35 px-3 text-muted-foreground shadow-sm\"\n role=\"status\"\n >\n <span className=\"flex items-center gap-1\" aria-hidden=\"true\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground\" />\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:150ms]\" />\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:300ms]\" />\n </span>\n <span className=\" text-xs font-semibold uppercase text-muted-foreground\">Thinking</span>\n </div>\n );\n}\n\nfunction MessageAttachments(props: {\n attachments: NonNullable<Extract<TranscriptEntry, { kind: \"message\" }>[\"attachments\"]>;\n}) {\n return (\n <div className=\"mt-2 flex max-w-full flex-wrap gap-2\">\n {props.attachments.map((attachment, index) => {\n const key = `${attachment.kind}-${attachment.name ?? attachment.mediaType ?? index}-${index}`;\n if (attachment.kind === \"image\") {\n const src =\n attachment.url ??\n (attachment.data === undefined\n ? undefined\n : `data:${attachment.mediaType ?? \"image/png\"};base64,${attachment.data}`);\n return (\n <div\n className=\"overflow-hidden rounded-lg border border-border/80 bg-card/80\"\n key={key}\n >\n {src === undefined ? (\n <div className=\"grid h-20 w-24 place-items-center px-2 text-center text-xs text-muted-foreground\">\n Image\n </div>\n ) : (\n <img\n alt={attachment.name ?? \"Attached image\"}\n className=\"h-20 w-24 object-cover\"\n src={src}\n />\n )}\n </div>\n );\n }\n return (\n <span\n className=\"inline-flex max-w-full items-center gap-1.5 rounded-lg border border-border/80 bg-card/80 px-2 py-1 text-xs font-medium text-muted-foreground\"\n key={key}\n >\n <span className=\"min-w-0 truncate\">\n {attachment.name ?? attachment.mediaType ?? \"Document\"}\n </span>\n </span>\n );\n })}\n </div>\n );\n}\n\nfunction hasMarkdownTable(text: string): boolean {\n const lines = text.split(\"\\n\");\n return lines.some((line, index) => {\n const next = lines[index + 1];\n return (\n line.includes(\"|\") &&\n next !== undefined &&\n /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)+\\|?\\s*$/.test(next)\n );\n });\n}\n\nfunction ToolEntry(props: {\n entry: ToolMessage;\n decidingApprovals: Set<string>;\n answeringQuestions: Set<string>;\n onApprovalDecision: (approvalId: string, approved: boolean) => void;\n onQuestionAnswer: (\n questionId: string,\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n}) {\n const [collapsed, setCollapsed] = useState(\n props.entry.approval?.status !== \"pending\" && props.entry.question?.status !== \"pending\",\n );\n const approval = props.entry.approval;\n const question = props.entry.question;\n const childEvents = props.entry.childEvents ?? [];\n const hasPayload =\n props.entry.args !== undefined ||\n props.entry.result !== undefined ||\n childEvents.length > 0 ||\n approval !== undefined ||\n question !== undefined;\n const pendingApproval = approval?.status === \"pending\";\n const pendingQuestion = question?.status === \"pending\";\n const cancelledInteraction = approval?.status === \"cancelled\" || question?.status === \"cancelled\";\n const deciding = approval !== undefined && props.decidingApprovals.has(approval.id);\n const answering = question !== undefined && props.answeringQuestions.has(question.id);\n\n return (\n <article\n className=\"w-full justify-self-start overflow-hidden rounded-xl border border-border/80 bg-card/90 text-foreground shadow-sm shadow-black/20\"\n data-entry-id={String(props.entry.entryId)}\n >\n <div\n className={cn(\n \"flex min-w-0 items-center gap-2 px-3 py-2.5\",\n !collapsed && hasPayload && \"bg-muted/20\",\n )}\n >\n <Button\n aria-expanded={!collapsed}\n className=\"h-auto min-h-0 min-w-0 flex-1 justify-between border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setCollapsed((current) => !current)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"grid h-6 w-4 shrink-0 place-items-center text-foreground\">\n <StudioIcon icon={Wrench01Icon} className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </span>\n <strong className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.entry.toolName}\n </strong>\n </span>\n {pendingApproval ? null : (\n <span className=\"ml-auto shrink-0 text-xs font-medium text-muted-foreground\">\n {collapsed ? \"Show\" : \"Hide\"}\n </span>\n )}\n </Button>\n {pendingApproval && approval !== undefined ? (\n <ToolApprovalActions\n disabled={deciding}\n onDecision={(approved) => props.onApprovalDecision(approval.id, approved)}\n />\n ) : null}\n {pendingQuestion ? (\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground\">\n Waiting for input\n </Badge>\n ) : null}\n {cancelledInteraction ? (\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-muted-foreground\">\n Cancelled\n </Badge>\n ) : null}\n {pendingApproval || pendingQuestion ? (\n <Button\n aria-expanded={!collapsed}\n className=\"h-7 min-h-7 px-2 text-xs font-medium\"\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setCollapsed((current) => !current)}\n >\n {collapsed ? \"Show\" : \"Hide\"}\n </Button>\n ) : null}\n </div>\n {collapsed || !hasPayload ? null : (\n <div className=\"grid gap-3 p-3\">\n {approval === undefined ? null : <ToolApprovalPanel approval={approval} />}\n {question === undefined ? null : (\n <ToolQuestionPanel\n disabled={answering}\n question={question}\n onAnswer={(answers) => props.onQuestionAnswer(question.id, answers)}\n />\n )}\n {question !== undefined || props.entry.args === undefined ? null : (\n <ToolPayload title=\"Input\" value={props.entry.args} />\n )}\n {childEvents.length === 0 ? null : <ChildAgentActivity events={childEvents} />}\n {question !== undefined || props.entry.result === undefined ? null : (\n <ToolPayload title=\"Output\" value={props.entry.result} />\n )}\n </div>\n )}\n </article>\n );\n}\n\nfunction ChildAgentActivity(props: { events: NonNullable<ToolMessage[\"childEvents\"]> }) {\n return (\n <div className=\"overflow-hidden rounded-xl border border-border/80 bg-background/65\">\n <div className=\"bg-muted/20 px-3 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n Subagent activity\n </div>\n <div className=\"grid gap-3 p-3\">\n {props.events.map((event) => {\n const agentLabel = event.agentName ?? event.agentId;\n if (event.kind === \"message\" || event.kind === \"reasoning\") {\n return (\n <div\n className=\"grid gap-1 rounded-xl border border-border/80 bg-card/90 p-3\"\n key={`${event.kind}-${event.agentId}-${event.text}`}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge className=\"border-border bg-muted px-1.5 py-0.5 text-xs uppercase text-muted-foreground\">\n {event.kind === \"reasoning\" ? \"Reasoning\" : \"Response\"}\n </Badge>\n <span className=\"min-w-0 truncate text-xs font-semibold text-muted-foreground\">\n {agentLabel}\n </span>\n </div>\n <MarkdownText size=\"base\" text={event.text} />\n </div>\n );\n }\n return (\n <div\n className=\"grid gap-2 rounded-xl border border-border/80 bg-card/90 p-3\"\n key={`${event.kind}-${event.agentId}-${event.toolName}-${event.callId ?? event.args ?? event.result ?? \"\"}`}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground\">\n Tool\n </Badge>\n <span className=\"min-w-0 truncate text-xs font-semibold text-muted-foreground\">\n {agentLabel} / {event.toolName}\n </span>\n </div>\n {event.args === undefined ? null : <ToolPayload title=\"Input\" value={event.args} />}\n {event.result === undefined ? null : (\n <ToolPayload title=\"Output\" value={event.result} />\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ToolQuestionPanel(props: {\n question: ToolQuestion;\n disabled: boolean;\n onAnswer: (\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n}) {\n const [values, setValues] = useState<Record<string, QuestionDraft>>({});\n const [activeQuestionIndex, setActiveQuestionIndex] = useState(0);\n const pending = props.question.status === \"pending\";\n const total = props.question.questions.length;\n\n const answers = props.question.questions.map((question) => {\n const draft = values[question.id];\n const customAnswer = draft?.customValue?.trim() ?? \"\";\n const answer = customAnswer.length > 0 ? customAnswer : draft?.answer;\n const normalized: { questionId: string; answer: string; choice?: string; custom?: boolean } = {\n questionId: question.id,\n answer: answer?.trim() ?? \"\",\n };\n if (draft?.choice !== undefined) normalized.choice = draft.choice;\n if (customAnswer.length > 0) normalized.custom = true;\n return normalized;\n });\n const activeIndex = total === 0 ? 0 : Math.min(activeQuestionIndex, total - 1);\n const activeQuestion = props.question.questions[activeIndex];\n const activeAnswer = answers[activeIndex]?.answer ?? \"\";\n const answeredCount = answers.filter((answer) => answer.answer.length > 0).length;\n const canAdvance = activeAnswer.length > 0;\n const canSubmit = pending && answers.every((answer) => answer.answer.length > 0);\n const firstQuestion = activeIndex === 0;\n const lastQuestion = activeIndex >= total - 1;\n\n if (activeQuestion === undefined) {\n return (\n <div className=\"rounded-xl border border-border bg-background p-4 text-sm font-medium text-muted-foreground\">\n No questions\n </div>\n );\n }\n\n const goPrevious = () => setActiveQuestionIndex((current) => Math.max(0, current - 1));\n const goNext = () =>\n setActiveQuestionIndex((current) => Math.min(props.question.questions.length - 1, current + 1));\n const updateDraft = (questionId: string, value: QuestionDraft) =>\n setValues((current) => ({\n ...current,\n [questionId]: value,\n }));\n\n return (\n <div className=\"grid gap-3\">\n {props.question.status === \"cancelled\" ? (\n <div className=\"rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5 text-sm font-medium text-muted-foreground\">\n Question cancelled\n </div>\n ) : null}\n <QuestionPromptControl\n key={activeQuestion.id}\n disabled={props.disabled || !pending}\n index={activeIndex}\n total={total}\n question={activeQuestion}\n value={values[activeQuestion.id]}\n answer={props.question.answers?.find((answer) => answer.questionId === activeQuestion.id)}\n onChange={(value) => updateDraft(activeQuestion.id, value)}\n onAdvance={lastQuestion ? undefined : goNext}\n />\n {pending ? (\n <div className=\"flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2\">\n <div className=\"min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n {answeredCount}/{total} answered\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {firstQuestion ? null : (\n <Button type=\"button\" variant=\"secondary\" onClick={goPrevious}>\n Back\n </Button>\n )}\n {lastQuestion ? (\n <Button\n className=\"h-9 min-h-9 px-4\"\n disabled={props.disabled || !canSubmit}\n type=\"button\"\n onClick={() => props.onAnswer(answers)}\n >\n Submit answers\n </Button>\n ) : (\n <Button\n className=\"h-9 min-h-9 px-4\"\n disabled={props.disabled || !canAdvance}\n type=\"button\"\n onClick={goNext}\n >\n Next question\n </Button>\n )}\n </div>\n </div>\n ) : total > 1 ? (\n <div className=\"flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2\">\n <div className=\"min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-foreground\">\n Answered\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button disabled={firstQuestion} type=\"button\" variant=\"secondary\" onClick={goPrevious}>\n Back\n </Button>\n <Button disabled={lastQuestion} type=\"button\" variant=\"secondary\" onClick={goNext}>\n Next\n </Button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype QuestionDraft = {\n answer?: string;\n choice?: string;\n customValue?: string;\n};\n\nfunction QuestionPromptControl(props: {\n question: ToolQuestion[\"questions\"][number];\n value: QuestionDraft | undefined;\n answer: NonNullable<ToolQuestion[\"answers\"]>[number] | undefined;\n disabled: boolean;\n index: number;\n total: number;\n onChange: (value: QuestionDraft) => void;\n onAdvance: (() => void) | undefined;\n}) {\n const submittedAnswer = props.answer?.answer;\n const draftAnswer = questionDraftAnswer(props.value);\n const state =\n submittedAnswer !== undefined ? \"Answered\" : draftAnswer.length > 0 ? \"Ready\" : \"Waiting\";\n\n return (\n <section className=\"grid gap-4 rounded-xl border border-border/80 bg-background/70 p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n Question {props.index + 1} of {props.total}\n </div>\n <h3 className=\"m-0 text-base font-semibold leading-7 text-foreground [overflow-wrap:anywhere]\">\n {props.question.question}\n </h3>\n </div>\n <span\n className={cn(\n \"shrink-0 text-xs font-semibold uppercase tracking-[0.18em]\",\n state === \"Answered\" && \"text-foreground\",\n state === \"Ready\" && \"text-foreground\",\n state === \"Waiting\" && \"text-muted-foreground\",\n )}\n >\n {state}\n </span>\n </div>\n {submittedAnswer === undefined ? null : (\n <div className=\"rounded-lg border border-border/70 bg-muted/45 px-3 py-2 text-sm font-medium text-foreground\">\n {submittedAnswer}\n </div>\n )}\n {submittedAnswer !== undefined ? null : props.question.choices.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {props.question.choices.map((choice) => {\n const active = props.value?.choice === choice.value;\n return (\n <Button\n key={choice.value}\n className={cn(\"h-8 min-h-8 px-3 text-xs\", active && \"border-foreground/45\")}\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n variant={active ? \"default\" : \"secondary\"}\n onClick={() => {\n props.onChange({\n answer: choice.value,\n choice: choice.value,\n customValue: props.value?.customValue ?? \"\",\n });\n props.onAdvance?.();\n }}\n >\n {choice.label}\n </Button>\n );\n })}\n </div>\n ) : null}\n {submittedAnswer !== undefined ? null : (\n <Textarea\n className=\"min-h-24 text-sm\"\n disabled={props.disabled}\n placeholder=\"Type a custom answer\"\n rows={3}\n value={props.value?.customValue ?? \"\"}\n onChange={(event) =>\n props.onChange({\n ...props.value,\n customValue: event.currentTarget.value,\n })\n }\n />\n )}\n </section>\n );\n}\n\nfunction questionDraftAnswer(value: QuestionDraft | undefined): string {\n const customAnswer = value?.customValue?.trim() ?? \"\";\n return customAnswer.length > 0 ? customAnswer : (value?.answer?.trim() ?? \"\");\n}\n\nfunction ToolApprovalPanel(props: { approval: ToolApproval }) {\n return (\n <div className=\"grid gap-2 rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge\n className={cn(\n \"border-border/70 bg-background/60 px-1.5 py-0.5 text-xs uppercase text-muted-foreground\",\n props.approval.status === \"approved\" && \"text-foreground\",\n props.approval.status === \"rejected\" && \"text-destructive\",\n )}\n >\n Approval\n </Badge>\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{approvalLabel(props.approval)}</div>\n </div>\n </div>\n {props.approval.reason === undefined ? null : (\n <div className=\"text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]\">\n {props.approval.reason}\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolApprovalActions(props: {\n disabled: boolean;\n onDecision: (approved: boolean) => void;\n}) {\n return (\n <div className=\"flex shrink-0 items-center gap-1 rounded-lg border border-border/80 bg-background/55 p-0.5\">\n <Button\n className=\"h-7 min-h-7 rounded-md border-0 bg-transparent px-2.5 text-xs text-muted-foreground shadow-none hover:bg-destructive/10 hover:text-destructive\"\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onDecision(false)}\n >\n Reject\n </Button>\n <Button\n className=\"h-7 min-h-7 rounded-md px-2.5 text-xs\"\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n onClick={() => props.onDecision(true)}\n >\n Approve\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transcript-item-CNTeNfE-.js","names":[],"sources":["../../../src/ui/app/modules/playground/transcript-item.tsx"],"sourcesContent":["import {\n ChartBarLineIcon,\n Copy01Icon,\n CopyCheckIcon,\n PathIcon,\n Wrench01Icon,\n} from \"@hugeicons/core-free-icons\";\nimport { memo, useState } from \"react\";\nimport { Badge } from \"../../components/ui/badge\";\nimport { Button } from \"../../components/ui/button\";\nimport { StudioIcon } from \"../../components/ui/icon\";\nimport { Textarea } from \"../../components/ui/textarea\";\nimport { cn } from \"../../lib/utils\";\nimport { approvalLabel } from \"../shared/format\";\nimport { MarkdownText, ToolPayload } from \"../shared/renderers\";\nimport type { ToolApproval, ToolMessage, ToolQuestion, TranscriptEntry } from \"../shared/types\";\nimport type { AssistantResponseMetrics, ResponseUsageMetrics } from \"./response-metrics\";\nimport { WorkingDuration } from \"./working-duration\";\n\nexport const TranscriptItem = memo(function TranscriptItem(props: {\n entry: TranscriptEntry;\n displayText?: string | undefined;\n live?: boolean | undefined;\n metrics?: AssistantResponseMetrics | undefined;\n workingStartedAt?: number | undefined;\n decidingApprovals: Set<string>;\n answeringQuestions: Set<string>;\n onApprovalDecision: (approvalId: string, approved: boolean) => void;\n onQuestionAnswer: (\n questionId: string,\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n onOpenTrace: (traceId: string) => void;\n}) {\n const displayText = props.displayText ?? (\"text\" in props.entry ? props.entry.text : \"\");\n if (props.entry.kind === \"reasoning\") {\n return (\n <article\n className=\"max-w-205 justify-self-start text-muted-foreground\"\n data-entry-id={String(props.entry.entryId)}\n >\n <div className=\"mb-1 text-xs font-semibold uppercase text-muted-foreground\">Reasoning</div>\n <MarkdownText live={props.live} size=\"base\" text={displayText} />\n </article>\n );\n }\n\n if (props.entry.kind === \"tool\") {\n return (\n <ToolEntry\n entry={props.entry}\n decidingApprovals={props.decidingApprovals}\n answeringQuestions={props.answeringQuestions}\n onApprovalDecision={props.onApprovalDecision}\n onQuestionAnswer={props.onQuestionAnswer}\n />\n );\n }\n\n const traceId = props.entry.role === \"assistant\" ? props.entry.traceId : undefined;\n const hasTable = props.entry.role === \"assistant\" && hasMarkdownTable(displayText);\n const isError =\n props.entry.role === \"assistant\" && \"tone\" in props.entry && props.entry.tone === \"error\";\n const isPending =\n props.entry.role === \"assistant\" && \"tone\" in props.entry && props.entry.tone === \"pending\";\n const showAssistantActions =\n props.entry.role === \"assistant\" && !isPending && props.entry.text.trim().length > 0;\n const persistedDurationMs = props.entry.durationMs ?? props.metrics?.durationMs;\n const showAssistantFooter =\n showAssistantActions ||\n props.workingStartedAt !== undefined ||\n persistedDurationMs !== undefined;\n\n if (props.entry.role === \"user\") {\n return (\n <article\n className=\"grid w-fit max-w-[min(64ch,82%)] justify-items-end justify-self-end self-start text-foreground\"\n data-entry-id={String(props.entry.entryId)}\n >\n {props.entry.text.trim().length === 0 ? null : (\n <div className=\"rounded-2xl bg-muted/55 px-4 py-2.5 shadow-sm shadow-black/[0.04] dark:bg-white/[0.08] dark:shadow-black/20\">\n <MarkdownText size=\"base\" text={props.entry.text} />\n </div>\n )}\n {props.entry.attachments !== undefined ? (\n <MessageAttachments attachments={props.entry.attachments} />\n ) : null}\n </article>\n );\n }\n\n return (\n <article\n className={cn(\n \"self-start\",\n hasTable ? \"w-full max-w-full\" : \"max-w-[min(82ch,100%)]\",\n props.entry.role === \"assistant\" &&\n cn(\"justify-self-start text-foreground\", isError && \"text-destructive\"),\n )}\n data-entry-id={String(props.entry.entryId)}\n >\n {isPending ? <AssistantLoadingIndicator /> : null}\n {displayText.trim().length === 0 ? null : (\n <MarkdownText live={props.live} size=\"base\" text={displayText} />\n )}\n {showAssistantFooter ? (\n <AssistantResponseFooter\n metrics={props.metrics}\n showActions={showAssistantActions}\n text={props.entry.text}\n traceId={traceId}\n durationMs={props.workingStartedAt === undefined ? persistedDurationMs : undefined}\n startedAt={props.workingStartedAt}\n onOpenTrace={props.onOpenTrace}\n />\n ) : null}\n </article>\n );\n});\n\nfunction AssistantResponseFooter(props: {\n durationMs?: number | undefined;\n metrics?: AssistantResponseMetrics | undefined;\n showActions: boolean;\n startedAt?: number | undefined;\n text: string;\n traceId?: string | undefined;\n onOpenTrace: (traceId: string) => void;\n}) {\n const [copied, setCopied] = useState(false);\n const traceId = props.traceId;\n\n async function copyResponse() {\n if (typeof navigator === \"undefined\" || navigator.clipboard === undefined) {\n return;\n }\n try {\n await navigator.clipboard.writeText(props.text);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n } catch {\n setCopied(false);\n }\n }\n\n return (\n <div className=\"mt-3 flex min-w-0 items-center gap-1.5\">\n {props.showActions ? (\n <Button\n aria-label={copied ? \"Response copied\" : \"Copy response\"}\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={copied ? \"Copied\" : \"Copy response\"}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => void copyResponse()}\n >\n <StudioIcon icon={copied ? CopyCheckIcon : Copy01Icon} aria-hidden=\"true\" />\n </Button>\n ) : null}\n {props.showActions ? (\n <div className=\"group relative\">\n <Button\n aria-label=\"Response metrics\"\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={metricsTitle(props.metrics)}\n type=\"button\"\n variant=\"ghost\"\n >\n <StudioIcon icon={ChartBarLineIcon} aria-hidden=\"true\" />\n </Button>\n <div\n className=\"pointer-events-none absolute left-0 top-full z-30 mt-2 hidden w-64 rounded-lg border border-border/90 bg-popover p-3 text-popover-foreground shadow-xl shadow-black/25 group-focus-within:grid group-hover:grid\"\n role=\"tooltip\"\n >\n <ResponseMetricsTooltip metrics={props.metrics} />\n </div>\n </div>\n ) : null}\n {!props.showActions || traceId === undefined ? null : (\n <Button\n aria-label={`Open trace ${traceId}`}\n className=\"h-8 min-h-8 w-8 rounded-lg border border-border/70 bg-muted/30 p-0 text-muted-foreground shadow-none hover:border-border hover:bg-muted/55 hover:text-foreground\"\n title={`Open trace ${traceId}`}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onOpenTrace(traceId)}\n >\n <StudioIcon icon={PathIcon} aria-hidden=\"true\" />\n </Button>\n )}\n <WorkingDuration\n className={props.showActions ? \"ml-1.5\" : undefined}\n durationMs={props.durationMs}\n startedAt={props.startedAt}\n />\n </div>\n );\n}\n\nfunction ResponseMetricsTooltip(props: { metrics?: AssistantResponseMetrics | undefined }) {\n const rows = responseMetricRows(props.metrics);\n return (\n <div className=\"grid min-w-0 gap-2 text-xs leading-5\">\n <div className=\"font-semibold text-foreground\">Response metrics</div>\n <div className=\"grid min-w-0 gap-1\">\n <MetricRow label=\"Cost\" value=\"Unavailable\" />\n {rows.length === 0 ? (\n <div className=\"text-muted-foreground\">No usage metrics yet</div>\n ) : (\n rows.map((row) => <MetricRow label={row.label} value={row.value} key={row.label} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction MetricRow(props: { label: string; value: string }) {\n return (\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">{props.label}</span>\n <span className=\"shrink-0 font-medium tabular-nums text-foreground\">{props.value}</span>\n </div>\n );\n}\n\nfunction responseMetricRows(metrics: AssistantResponseMetrics | undefined): Array<{\n label: string;\n value: string;\n}> {\n const rows: Array<{ label: string; value: string }> = [];\n const usage = metrics?.usage;\n if (usage?.totalTokens !== undefined) {\n rows.push({ label: \"Total\", value: `${formatMetricNumber(usage.totalTokens)} tokens` });\n }\n if (usage?.inputTokens !== undefined) {\n rows.push({ label: \"Input\", value: formatMetricNumber(usage.inputTokens) });\n }\n if (usage?.outputTokens !== undefined) {\n rows.push({ label: \"Output\", value: formatMetricNumber(usage.outputTokens) });\n }\n pushOptionalUsageRow(rows, \"Cached\", usage, \"cachedInputTokens\");\n pushOptionalUsageRow(rows, \"Cache create\", usage, \"cacheCreationInputTokens\");\n if (metrics?.durationMs !== undefined) {\n rows.push({ label: \"Duration\", value: formatResponseDuration(metrics.durationMs) });\n }\n return rows;\n}\n\nfunction pushOptionalUsageRow(\n rows: Array<{ label: string; value: string }>,\n label: string,\n usage: ResponseUsageMetrics | undefined,\n key: keyof ResponseUsageMetrics,\n) {\n const value = usage?.[key];\n if (value !== undefined && value > 0) {\n rows.push({ label, value: formatMetricNumber(value) });\n }\n}\n\nfunction metricsTitle(metrics: AssistantResponseMetrics | undefined): string {\n const rows = responseMetricRows(metrics);\n if (rows.length === 0) {\n return \"Cost unavailable. No usage metrics yet.\";\n }\n return [\"Cost unavailable\", ...rows.map((row) => `${row.label}: ${row.value}`)].join(\". \");\n}\n\nfunction formatMetricNumber(value: number): string {\n return value.toLocaleString();\n}\n\nfunction formatResponseDuration(value: number): string {\n if (value < 1000) {\n return `${value}ms`;\n }\n return `${(value / 1000).toFixed(1)}s`;\n}\n\nfunction AssistantLoadingIndicator() {\n return (\n <div\n aria-label=\"Assistant is responding\"\n className=\"inline-flex h-9 min-h-9 items-center gap-2 rounded-xl border border-border/70 bg-muted/35 px-3 text-muted-foreground shadow-sm\"\n role=\"status\"\n >\n <span className=\"flex items-center gap-1\" aria-hidden=\"true\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground\" />\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:150ms]\" />\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-foreground [animation-delay:300ms]\" />\n </span>\n <span className=\" text-xs font-semibold uppercase text-muted-foreground\">Thinking</span>\n </div>\n );\n}\n\nfunction MessageAttachments(props: {\n attachments: NonNullable<Extract<TranscriptEntry, { kind: \"message\" }>[\"attachments\"]>;\n}) {\n return (\n <div className=\"mt-2 flex max-w-full flex-wrap gap-2\">\n {props.attachments.map((attachment, index) => {\n const key = `${attachment.kind}-${attachment.name ?? attachment.mediaType ?? index}-${index}`;\n if (attachment.kind === \"image\") {\n const src =\n attachment.url ??\n (attachment.data === undefined\n ? undefined\n : `data:${attachment.mediaType ?? \"image/png\"};base64,${attachment.data}`);\n return (\n <div\n className=\"overflow-hidden rounded-lg border border-border/80 bg-card/80\"\n key={key}\n >\n {src === undefined ? (\n <div className=\"grid h-20 w-24 place-items-center px-2 text-center text-xs text-muted-foreground\">\n Image\n </div>\n ) : (\n <img\n alt={attachment.name ?? \"Attached image\"}\n className=\"h-20 w-24 object-cover\"\n src={src}\n />\n )}\n </div>\n );\n }\n return (\n <span\n className=\"inline-flex max-w-full items-center gap-1.5 rounded-lg border border-border/80 bg-card/80 px-2 py-1 text-xs font-medium text-muted-foreground\"\n key={key}\n >\n <span className=\"min-w-0 truncate\">\n {attachment.name ?? attachment.mediaType ?? \"Document\"}\n </span>\n </span>\n );\n })}\n </div>\n );\n}\n\nfunction hasMarkdownTable(text: string): boolean {\n const lines = text.split(\"\\n\");\n return lines.some((line, index) => {\n const next = lines[index + 1];\n return (\n line.includes(\"|\") &&\n next !== undefined &&\n /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)+\\|?\\s*$/.test(next)\n );\n });\n}\n\nfunction ToolEntry(props: {\n entry: ToolMessage;\n decidingApprovals: Set<string>;\n answeringQuestions: Set<string>;\n onApprovalDecision: (approvalId: string, approved: boolean) => void;\n onQuestionAnswer: (\n questionId: string,\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n}) {\n const [collapsed, setCollapsed] = useState(\n props.entry.approval?.status !== \"pending\" && props.entry.question?.status !== \"pending\",\n );\n const approval = props.entry.approval;\n const question = props.entry.question;\n const childEvents = props.entry.childEvents ?? [];\n const hasPayload =\n props.entry.args !== undefined ||\n props.entry.result !== undefined ||\n childEvents.length > 0 ||\n approval !== undefined ||\n question !== undefined;\n const pendingApproval = approval?.status === \"pending\";\n const pendingQuestion = question?.status === \"pending\";\n const cancelledInteraction = approval?.status === \"cancelled\" || question?.status === \"cancelled\";\n const deciding = approval !== undefined && props.decidingApprovals.has(approval.id);\n const answering = question !== undefined && props.answeringQuestions.has(question.id);\n\n return (\n <article\n className=\"w-full justify-self-start overflow-hidden rounded-xl border border-border/80 bg-card/90 text-foreground shadow-sm shadow-black/20\"\n data-entry-id={String(props.entry.entryId)}\n >\n <div\n className={cn(\n \"flex min-w-0 items-center gap-2 px-3 py-2.5\",\n !collapsed && hasPayload && \"bg-muted/20\",\n )}\n >\n <Button\n aria-expanded={!collapsed}\n className=\"h-auto min-h-0 min-w-0 flex-1 justify-between border-0 bg-transparent p-0 text-left text-inherit shadow-none hover:bg-transparent hover:text-inherit\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setCollapsed((current) => !current)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"grid h-6 w-4 shrink-0 place-items-center text-foreground\">\n <StudioIcon icon={Wrench01Icon} className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </span>\n <strong className=\"min-w-0 truncate text-sm font-semibold text-foreground\">\n {props.entry.toolName}\n </strong>\n </span>\n {pendingApproval ? null : (\n <span className=\"ml-auto shrink-0 text-xs font-medium text-muted-foreground\">\n {collapsed ? \"Show\" : \"Hide\"}\n </span>\n )}\n </Button>\n {pendingApproval && approval !== undefined ? (\n <ToolApprovalActions\n disabled={deciding}\n onDecision={(approved) => props.onApprovalDecision(approval.id, approved)}\n />\n ) : null}\n {pendingQuestion ? (\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground\">\n Waiting for input\n </Badge>\n ) : null}\n {cancelledInteraction ? (\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-muted-foreground\">\n Cancelled\n </Badge>\n ) : null}\n {pendingApproval || pendingQuestion ? (\n <Button\n aria-expanded={!collapsed}\n className=\"h-7 min-h-7 px-2 text-xs font-medium\"\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setCollapsed((current) => !current)}\n >\n {collapsed ? \"Show\" : \"Hide\"}\n </Button>\n ) : null}\n </div>\n {collapsed || !hasPayload ? null : (\n <div className=\"grid gap-3 p-3\">\n {approval === undefined ? null : <ToolApprovalPanel approval={approval} />}\n {question === undefined ? null : (\n <ToolQuestionPanel\n disabled={answering}\n question={question}\n onAnswer={(answers) => props.onQuestionAnswer(question.id, answers)}\n />\n )}\n {question !== undefined || props.entry.args === undefined ? null : (\n <ToolPayload title=\"Input\" value={props.entry.args} />\n )}\n {childEvents.length === 0 ? null : <ChildAgentActivity events={childEvents} />}\n {question !== undefined || props.entry.result === undefined ? null : (\n <ToolPayload title=\"Output\" value={props.entry.result} />\n )}\n </div>\n )}\n </article>\n );\n}\n\nfunction ChildAgentActivity(props: { events: NonNullable<ToolMessage[\"childEvents\"]> }) {\n return (\n <div className=\"overflow-hidden rounded-xl border border-border/80 bg-background/65\">\n <div className=\"bg-muted/20 px-3 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground\">\n Subagent activity\n </div>\n <div className=\"grid gap-3 p-3\">\n {props.events.map((event) => {\n const agentLabel = event.agentName ?? event.agentId;\n if (event.kind === \"message\" || event.kind === \"reasoning\") {\n return (\n <div\n className=\"grid gap-1 rounded-xl border border-border/80 bg-card/90 p-3\"\n key={`${event.kind}-${event.agentId}-${event.text}`}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge className=\"border-border bg-muted px-1.5 py-0.5 text-xs uppercase text-muted-foreground\">\n {event.kind === \"reasoning\" ? \"Reasoning\" : \"Response\"}\n </Badge>\n <span className=\"min-w-0 truncate text-xs font-semibold text-muted-foreground\">\n {agentLabel}\n </span>\n </div>\n <MarkdownText size=\"base\" text={event.text} />\n </div>\n );\n }\n return (\n <div\n className=\"grid gap-2 rounded-xl border border-border/80 bg-card/90 p-3\"\n key={`${event.kind}-${event.agentId}-${event.toolName}-${event.callId ?? event.args ?? event.result ?? \"\"}`}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge className=\"border-border/70 bg-muted/45 px-1.5 py-0.5 text-xs uppercase text-foreground\">\n Tool\n </Badge>\n <span className=\"min-w-0 truncate text-xs font-semibold text-muted-foreground\">\n {agentLabel} / {event.toolName}\n </span>\n </div>\n {event.args === undefined ? null : <ToolPayload title=\"Input\" value={event.args} />}\n {event.result === undefined ? null : (\n <ToolPayload title=\"Output\" value={event.result} />\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ToolQuestionPanel(props: {\n question: ToolQuestion;\n disabled: boolean;\n onAnswer: (\n answers: Array<{ questionId: string; answer: string; choice?: string; custom?: boolean }>,\n ) => void;\n}) {\n const [values, setValues] = useState<Record<string, QuestionDraft>>({});\n const [activeQuestionIndex, setActiveQuestionIndex] = useState(0);\n const pending = props.question.status === \"pending\";\n const total = props.question.questions.length;\n\n const answers = props.question.questions.map((question) => {\n const draft = values[question.id];\n const customAnswer = draft?.customValue?.trim() ?? \"\";\n const answer = customAnswer.length > 0 ? customAnswer : draft?.answer;\n const normalized: { questionId: string; answer: string; choice?: string; custom?: boolean } = {\n questionId: question.id,\n answer: answer?.trim() ?? \"\",\n };\n if (draft?.choice !== undefined) normalized.choice = draft.choice;\n if (customAnswer.length > 0) normalized.custom = true;\n return normalized;\n });\n const activeIndex = total === 0 ? 0 : Math.min(activeQuestionIndex, total - 1);\n const activeQuestion = props.question.questions[activeIndex];\n const activeAnswer = answers[activeIndex]?.answer ?? \"\";\n const answeredCount = answers.filter((answer) => answer.answer.length > 0).length;\n const canAdvance = activeAnswer.length > 0;\n const canSubmit = pending && answers.every((answer) => answer.answer.length > 0);\n const firstQuestion = activeIndex === 0;\n const lastQuestion = activeIndex >= total - 1;\n\n if (activeQuestion === undefined) {\n return (\n <div className=\"rounded-xl border border-border bg-background p-4 text-sm font-medium text-muted-foreground\">\n No questions\n </div>\n );\n }\n\n const goPrevious = () => setActiveQuestionIndex((current) => Math.max(0, current - 1));\n const goNext = () =>\n setActiveQuestionIndex((current) => Math.min(props.question.questions.length - 1, current + 1));\n const updateDraft = (questionId: string, value: QuestionDraft) =>\n setValues((current) => ({\n ...current,\n [questionId]: value,\n }));\n\n return (\n <div className=\"grid gap-3\">\n {props.question.status === \"cancelled\" ? (\n <div className=\"rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5 text-sm font-medium text-muted-foreground\">\n Question cancelled\n </div>\n ) : null}\n <QuestionPromptControl\n key={activeQuestion.id}\n disabled={props.disabled || !pending}\n index={activeIndex}\n total={total}\n question={activeQuestion}\n value={values[activeQuestion.id]}\n answer={props.question.answers?.find((answer) => answer.questionId === activeQuestion.id)}\n onChange={(value) => updateDraft(activeQuestion.id, value)}\n onAdvance={lastQuestion ? undefined : goNext}\n />\n {pending ? (\n <div className=\"flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2\">\n <div className=\"min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n {answeredCount}/{total} answered\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {firstQuestion ? null : (\n <Button type=\"button\" variant=\"secondary\" onClick={goPrevious}>\n Back\n </Button>\n )}\n {lastQuestion ? (\n <Button\n className=\"h-9 min-h-9 px-4\"\n disabled={props.disabled || !canSubmit}\n type=\"button\"\n onClick={() => props.onAnswer(answers)}\n >\n Submit answers\n </Button>\n ) : (\n <Button\n className=\"h-9 min-h-9 px-4\"\n disabled={props.disabled || !canAdvance}\n type=\"button\"\n onClick={goNext}\n >\n Next question\n </Button>\n )}\n </div>\n </div>\n ) : total > 1 ? (\n <div className=\"flex min-w-0 items-center justify-between gap-3 rounded-xl bg-muted/20 px-3 py-2\">\n <div className=\"min-w-0 text-xs font-semibold uppercase tracking-[0.2em] text-foreground\">\n Answered\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button disabled={firstQuestion} type=\"button\" variant=\"secondary\" onClick={goPrevious}>\n Back\n </Button>\n <Button disabled={lastQuestion} type=\"button\" variant=\"secondary\" onClick={goNext}>\n Next\n </Button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype QuestionDraft = {\n answer?: string;\n choice?: string;\n customValue?: string;\n};\n\nfunction QuestionPromptControl(props: {\n question: ToolQuestion[\"questions\"][number];\n value: QuestionDraft | undefined;\n answer: NonNullable<ToolQuestion[\"answers\"]>[number] | undefined;\n disabled: boolean;\n index: number;\n total: number;\n onChange: (value: QuestionDraft) => void;\n onAdvance: (() => void) | undefined;\n}) {\n const submittedAnswer = props.answer?.answer;\n const draftAnswer = questionDraftAnswer(props.value);\n const state =\n submittedAnswer !== undefined ? \"Answered\" : draftAnswer.length > 0 ? \"Ready\" : \"Waiting\";\n\n return (\n <section className=\"grid gap-4 rounded-xl border border-border/80 bg-background/70 p-4\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"grid min-w-0 gap-2\">\n <div className=\" text-xs font-semibold uppercase tracking-[0.2em] text-muted-foreground\">\n Question {props.index + 1} of {props.total}\n </div>\n <h3 className=\"m-0 text-base font-semibold leading-7 text-foreground [overflow-wrap:anywhere]\">\n {props.question.question}\n </h3>\n </div>\n <span\n className={cn(\n \"shrink-0 text-xs font-semibold uppercase tracking-[0.18em]\",\n state === \"Answered\" && \"text-foreground\",\n state === \"Ready\" && \"text-foreground\",\n state === \"Waiting\" && \"text-muted-foreground\",\n )}\n >\n {state}\n </span>\n </div>\n {submittedAnswer === undefined ? null : (\n <div className=\"rounded-lg border border-border/70 bg-muted/45 px-3 py-2 text-sm font-medium text-foreground\">\n {submittedAnswer}\n </div>\n )}\n {submittedAnswer !== undefined ? null : props.question.choices.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {props.question.choices.map((choice) => {\n const active = props.value?.choice === choice.value;\n return (\n <Button\n key={choice.value}\n className={cn(\"h-8 min-h-8 px-3 text-xs\", active && \"border-foreground/45\")}\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n variant={active ? \"default\" : \"secondary\"}\n onClick={() => {\n props.onChange({\n answer: choice.value,\n choice: choice.value,\n customValue: props.value?.customValue ?? \"\",\n });\n props.onAdvance?.();\n }}\n >\n {choice.label}\n </Button>\n );\n })}\n </div>\n ) : null}\n {submittedAnswer !== undefined ? null : (\n <Textarea\n className=\"min-h-24 text-sm\"\n disabled={props.disabled}\n placeholder=\"Type a custom answer\"\n rows={3}\n value={props.value?.customValue ?? \"\"}\n onChange={(event) =>\n props.onChange({\n ...props.value,\n customValue: event.currentTarget.value,\n })\n }\n />\n )}\n </section>\n );\n}\n\nfunction questionDraftAnswer(value: QuestionDraft | undefined): string {\n const customAnswer = value?.customValue?.trim() ?? \"\";\n return customAnswer.length > 0 ? customAnswer : (value?.answer?.trim() ?? \"\");\n}\n\nfunction ToolApprovalPanel(props: { approval: ToolApproval }) {\n return (\n <div className=\"grid gap-2 rounded-xl border border-border/70 bg-muted/25 px-3 py-2.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge\n className={cn(\n \"border-border/70 bg-background/60 px-1.5 py-0.5 text-xs uppercase text-muted-foreground\",\n props.approval.status === \"approved\" && \"text-foreground\",\n props.approval.status === \"rejected\" && \"text-destructive\",\n )}\n >\n Approval\n </Badge>\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">{approvalLabel(props.approval)}</div>\n </div>\n </div>\n {props.approval.reason === undefined ? null : (\n <div className=\"text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]\">\n {props.approval.reason}\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolApprovalActions(props: {\n disabled: boolean;\n onDecision: (approved: boolean) => void;\n}) {\n return (\n <div className=\"flex shrink-0 items-center gap-1 rounded-lg border border-border/80 bg-background/55 p-0.5\">\n <Button\n className=\"h-7 min-h-7 rounded-md border-0 bg-transparent px-2.5 text-xs text-muted-foreground shadow-none hover:bg-destructive/10 hover:text-destructive\"\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => props.onDecision(false)}\n >\n Reject\n </Button>\n <Button\n className=\"h-7 min-h-7 rounded-md px-2.5 text-xs\"\n disabled={props.disabled}\n size=\"sm\"\n type=\"button\"\n onClick={() => props.onDecision(true)}\n >\n Approve\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
|
package/dist/ui/index.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
content="Professional Studio interface for Anvia agents, sessions, tools, knowledge, and traces."
|
|
10
10
|
/>
|
|
11
11
|
<link rel="icon" type="image/png" href="/ui/assets/anvia.png" />
|
|
12
|
-
<script type="module" crossorigin src="/ui/assets/index-
|
|
12
|
+
<script type="module" crossorigin src="/ui/assets/index-DY62pnOs.js"></script>
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/ui/assets/utils-C9GMruoG.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/ui/assets/chunk-ADH7NNCS-B-yOk_VP.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/ui/assets/format-D43vTqrO.js">
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvia/studio",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.52",
|
|
4
4
|
"description": "Studio UI and HTTP runtime for Anvia agents.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"react": "^19.2.8",
|
|
44
44
|
"react-dom": "^19.2.8",
|
|
45
45
|
"tailwind-merge": "^3.6.0",
|
|
46
|
-
"@anvia/react": "0.11.
|
|
46
|
+
"@anvia/react": "0.11.3",
|
|
47
47
|
"@anvia/react-ui": "0.7.0",
|
|
48
|
-
"@anvia/server": "0.7.
|
|
48
|
+
"@anvia/server": "0.7.3"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@tailwindcss/typography": "^0.5.19",
|
|
@@ -60,10 +60,10 @@
|
|
|
60
60
|
"vite": "^8.0.10",
|
|
61
61
|
"vitest": "^4.0.8",
|
|
62
62
|
"zod": "^4.4.3",
|
|
63
|
-
"@anvia/core": "0.
|
|
63
|
+
"@anvia/core": "0.25.0"
|
|
64
64
|
},
|
|
65
65
|
"peerDependencies": {
|
|
66
|
-
"@anvia/core": ">=0.
|
|
66
|
+
"@anvia/core": ">=0.25.0 <1.0.0"
|
|
67
67
|
},
|
|
68
68
|
"scripts": {
|
|
69
69
|
"build": "pnpm run build:deps && tsup && vite build --config vite.config.ts",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./utils-C9GMruoG.js";import{I as t,L as n,a as r,d as i,f as a,i as o,l as s,o as c,p as l,r as u,rt as d,s as f,u as p}from"./index-BA0rdlcA.js";var m=e();function h(e){let t=e.evals.find(t=>t.id===e.selectedEvalId)??e.evals[0];return(0,m.jsx)(r,{children:(0,m.jsx)(`div`,{className:`grid min-h-0 min-w-0 pb-6 pr-6`,children:(0,m.jsxs)(f,{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)(s,{value:t?.id??``,onValueChange:e.onSelectEval,children:[(0,m.jsx)(a,{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)(l,{placeholder:`Select eval`})}),(0,m.jsx)(p,{children:e.evals.map(e=>(0,m.jsx)(i,{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)(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`,disabled:e.disabled,onClick:e.onRun,variant:`ghost`,children:[(0,m.jsx)(t,{icon:d,"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)(o,{label:`Cases`,value:String(e.suite.caseCount)}),(0,m.jsx)(o,{label:`Metrics`,value:String(e.suite.metricNames.length)}),(0,m.jsx)(o,{label:`Concurrency`,value:String(e.suite.concurrency??1)}),(0,m.jsx)(o,{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)(o,{label:`Passed`,value:String(t.passed??0)}),(0,m.jsx)(o,{label:`Failed`,value:String(t.failed??0)}),(0,m.jsx)(o,{label:`Invalid`,value:String(t.invalid??0)}),(0,m.jsx)(o,{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)(c,{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-BENEdYNb.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evals-page-BENEdYNb.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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"}
|