evals-lab 0.14.0 → 0.16.0

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.
@@ -1,16 +0,0 @@
1
- import{$ as e,$n as t,$t as n,A as r,An as i,At as a,B as o,Bn as s,Bt as c,C as l,Cn as u,Ct as d,D as f,Dn as p,Dt as m,E as h,En as g,Et as _,F as v,Fn as y,Ft as b,G as x,Gn as S,Gt as C,H as w,Hn as T,Ht as E,I as D,In as O,It as k,J as A,Jn as j,Jt as M,K as N,Kn as P,Kt as F,L as I,Ln as L,Lt as R,M as z,Mn as B,Mt as V,N as ee,Nn as te,Nt as ne,O as H,On as U,Ot as re,P as W,Pn as ie,Q as ae,Qn as oe,Qt as G,R as K,Rn as se,Rt as ce,S as q,Sn as le,St as ue,T as de,Tn as fe,Tt as pe,U as me,Un as he,Ut as ge,V as _e,Vn as ve,W as ye,Wt as J,X as be,Xn as xe,Xt as Y,Y as Se,Yn as Ce,Yt as we,Z as Te,Zn as Ee,Zt as De,_ as Oe,_n as ke,_t as Ae,a as je,an as Me,at as Ne,b as Pe,bn as Fe,bt as Ie,c as Le,cn as Re,ct as ze,d as Be,dn as Ve,dt as He,en as Ue,er as We,et as Ge,f as Ke,fn as qe,ft as Je,g as Ye,gn as Xe,gt as Ze,h as Qe,hn as $e,ht as et,i as tt,in as nt,ir as rt,it,j as at,jn as ot,jt as st,k as ct,kn as lt,kt as ut,ln as dt,lt as ft,m as pt,mn as mt,mt as ht,n as gt,nn as _t,nr as vt,nt as yt,o as bt,on as xt,ot as St,p as Ct,pn as wt,pt as Tt,q as Et,qn as Dt,qt as Ot,r as kt,rn as At,rr as jt,rt as Mt,s as Nt,sn as Pt,st as Ft,t as It,tn as Lt,tr as Rt,tt as zt,un as Bt,ut as Vt,v as Ht,vn as Ut,vt as Wt,w as Gt,wn as Kt,wt as qt,x as Jt,xn as Yt,xt as Xt,y as Zt,yn as Qt,z as $t,zn as en,zt as tn}from"./tokens-C8dqXDHN.js";var nn=jt(),X=rt(),rn=(0,X.createContext)(null);function Z(){let e=(0,X.useContext)(rn);if(!e)throw Error(`useApi outside an ApiContext: main.tsx mounts one at the root`);return e}var an=`modulepreload`,on=function(e){return`/`+e},sn={},cn=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=on(t,n),t=s(t),t in sn)return;sn[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:an,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},ln={},un=new Set,dn=e=>`/plugins/${encodeURIComponent(e.id)}/${encodeURIComponent(e.version)}/${e.entry.split(`/`).map(encodeURIComponent).join(`/`)}`;async function fn(e){if(!un.has(e.id))try{let t=await cn(()=>import(dn(e)),[]);if(typeof t.default!=`function`)throw Error(`its entry exports no register function`);await t.default(L().pluginHost(e.id)),un.add(e.id),delete ln[e.id]}catch(t){ln[e.id]=t instanceof Error?t.message:String(t)}}async function pn(e){let t=[];try{t=(await e.plugins()).plugins}catch{return}for(let e of t)await fn(e)}var mn=class extends Error{status;body;constructor(e,t,n=null){super(t),this.name=`ApiError`,this.status=e,this.body=n}},hn=(e,t)=>`${e}:${t}`,gn=(e,t,n,r)=>{let i=e[hn(t,n)]??[];return i.length===0||i.includes(`*all`)||i.includes(r)},_n=new EventTarget,vn=e=>/^\/api\/(sources|queue)(\/|\?|$)/.test(e);function yn(e=(...e)=>fetch(...e),t=``){let n=e=>t+e;async function r(e){let t=await e.text(),n=t;try{n=t?JSON.parse(t):null}catch{}if(!e.ok){let t=n&&typeof n==`object`&&`error`in n?n.error:null,r=typeof t==`string`?t:t&&typeof t==`object`&&typeof t.message==`string`?`${t.type?`${t.type}: `:``}${t.message}`:t==null?``:JSON.stringify(t);throw new mn(e.status,r||`HTTP ${e.status}`,n)}return n}async function i(t,i){let a=await r(await e(n(t),i?.body===void 0?{method:i?.method??`GET`}:{method:i.method??`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i.body),...i.keepalive?{keepalive:!0}:{}}));return(i?.method??(i?.body===void 0?`GET`:`POST`))!==`GET`&&vn(t)&&_n.dispatchEvent(new Event(`write`)),a}let a=e=>({...e,snapshot:L().upgradePipeline(e.snapshot),results:L().upgradeResults(e.results)}),o=e=>{let t=new URLSearchParams;return e.limit&&t.set(`limit`,String(e.limit)),e.before&&t.set(`before`,e.before),e.beforeId&&t.set(`beforeId`,e.beforeId),e.full&&t.set(`full`,`1`),`/api/queue${t.size?`?${t}`:``}`},s=new Map,c=async e=>({...e,runs:await Promise.all(e.runs.map(e=>f(a(e))))}),l=async e=>{let t=await e;return{...t,run:a(t.run)}},u=new Map,d=e=>L().evalsOf(e.snapshot).some(e=>L().isWholeRun(L().EVAL_TYPES[e.type],e)),f=e=>{if(!e.brief||!d(e))return Promise.resolve(e);let t=`${e.status} ${e.progress?.n??0} ${e.finishedAt??``}`,n=u.get(e.id);if(n?.at===t)return n.row;let r=i(`/api/queue/${encodeURIComponent(e.id)}`).then(a,()=>(u.delete(e.id),e));return u.set(e.id,{at:t,row:r}),r};return{config:()=>i(`/api/config`),google:()=>i(`/api/google`),setGoogle:e=>i(`/api/google`,{method:`PUT`,body:e}),setMicrosoft:(e,t)=>i(`/api/microsoft`,{method:`PUT`,body:{clientId:e,tenant:t}}),state:()=>i(`/api/state`),writeState:(e,t=!1)=>i(`/api/state`,{body:{docs:e},keepalive:t}),queue:(e={})=>{let t=o(e),n=s.get(t);return s.delete(t),n??i(t).then(c)},askQueue:(e,t)=>{let n=o(e),r=i(n),a=t.then(()=>r).then(c);a.catch(()=>{}),s.set(n,a)},run:e=>i(`/api/queue/${encodeURIComponent(e)}`).then(a),setComment:(e,t)=>i(`/api/queue/${encodeURIComponent(e)}`,{method:`PATCH`,body:{comment:t}}).then(a),submit:e=>l(i(`/api/queue`,{body:e})),cancel:e=>l(i(`/api/queue/${encodeURIComponent(e)}/cancel`,{body:{}})),resume:e=>l(i(`/api/queue/${encodeURIComponent(e)}/resume`,{body:{}})),rerunRun:e=>l(i(`/api/queue/${encodeURIComponent(e)}/rerun`,{body:{}})),rerun:(e,t)=>l(i(`/api/queue/${encodeURIComponent(e)}/items/${t}`,{body:{}})),rescore:(e,t)=>l(i(`/api/queue/${encodeURIComponent(e)}/rescore/${t}`,{body:{}})),clear:()=>i(`/api/queue`,{method:`DELETE`}),sources:()=>i(`/api/sources`),source:e=>i(`/api/sources/${encodeURIComponent(e)}`),datasets:()=>i(`/api/datasets`),dataset:e=>i(`/api/datasets/${encodeURIComponent(e)}`),archivedRules:()=>i(`/api/datasets/archived-rules`),createDataset:e=>i(`/api/datasets`,{body:e}),renameDataset:(e,t)=>i(`/api/datasets/${encodeURIComponent(e)}`,{method:`PATCH`,body:{name:t}}),setDatasetPreview:(e,t)=>i(`/api/datasets/${encodeURIComponent(e)}`,{method:`PATCH`,body:{preview:t}}),saveDataset:(e,t,n)=>i(`/api/datasets/${encodeURIComponent(e)}`,{method:`PUT`,body:{version:t,body:n}}),deleteDataset:e=>i(`/api/datasets/${encodeURIComponent(e)}`,{method:`DELETE`}),restoreDataset:e=>i(`/api/datasets/trash/${encodeURIComponent(e)}/restore`,{body:{}}),exportDatasetUrl:e=>n(`/api/datasets/${encodeURIComponent(e)}/export`),exportAllDatasetsUrl:()=>n(`/api/datasets/export`),importDatasets:e=>i(`/api/datasets/import`,{body:e}),runDataset:e=>i(`/api/queue/${encodeURIComponent(e)}/dataset`),runGroups:e=>i(`/api/queue/${encodeURIComponent(e)}/groups`),filterSets:()=>i(`/api/filter-sets`),filterSet:e=>i(`/api/filter-sets/${encodeURIComponent(e)}`),createFilterSet:e=>i(`/api/filter-sets`,{body:e}),renameFilterSet:(e,t)=>i(`/api/filter-sets/${encodeURIComponent(e)}`,{method:`PATCH`,body:{name:t}}),saveFilterSet:(e,t,n)=>i(`/api/filter-sets/${encodeURIComponent(e)}`,{method:`PUT`,body:{version:t,body:n}}),deleteFilterSet:e=>i(`/api/filter-sets/${encodeURIComponent(e)}`,{method:`DELETE`}),restoreFilterSet:e=>i(`/api/filter-sets/trash/${encodeURIComponent(e)}/restore`,{body:{}}),prompts:()=>i(`/api/prompts`),prompt:e=>i(`/api/prompts/${encodeURIComponent(e)}`),createPrompt:e=>i(`/api/prompts`,{body:e}),editPrompt:(e,t,n)=>i(`/api/prompts/${encodeURIComponent(e)}`,{method:`PUT`,body:{base:t,...n}}),setDefaultPrompt:e=>i(`/api/prompts/${encodeURIComponent(e)}/default`,{body:{}}),restorePromptVersion:(e,t)=>i(`/api/prompts/${encodeURIComponent(e)}/versions/${t}/restore`,{body:{}}),deletePrompt:e=>i(`/api/prompts/${encodeURIComponent(e)}`,{method:`DELETE`}),restorePrompt:e=>i(`/api/prompts/trash/${encodeURIComponent(e)}/restore`,{body:{}}),createSource:(e,t,n)=>i(`/api/sources`,{body:{name:e,type:t,...n?{config:n}:{}}}),definition:e=>i(`/api/sources/${encodeURIComponent(e)}/definition`),saveDefinition:(e,t,n)=>i(`/api/sources/${encodeURIComponent(e)}/definition`,{method:`PUT`,body:{version:t,body:n}}),updateSource:(e,t)=>i(`/api/sources/${encodeURIComponent(e)}`,{method:`PATCH`,body:t}),sourceCalls:e=>i(`/api/sources/${encodeURIComponent(e)}/calls`),snapshotSource:e=>i(`/api/sources/${encodeURIComponent(e)}/snapshot`,{body:{}}),sourceResponses:e=>i(`/api/sources/${encodeURIComponent(e)}/responses`),restoreResponse:(e,t,n,r)=>i(`/api/sources/${encodeURIComponent(e)}/responses/restore`,{body:{name:t,n,...r==null?{}:{drop:r}}}),removeCalls:(e,t)=>i(`/api/sources/${encodeURIComponent(e)}/calls/remove`,{body:{names:t}}),editCall:(e,t,n)=>i(`/api/sources/${encodeURIComponent(e)}/calls/edit`,{body:{name:t,...n}}),cloneCall:(e,t)=>i(`/api/sources/${encodeURIComponent(e)}/calls/clone`,{body:{name:t}}),removeSource:e=>i(`/api/sources/${encodeURIComponent(e)}`,{method:`DELETE`}),removeFiles:(e,t)=>i(`/api/sources/${encodeURIComponent(e)}/remove`,{body:{names:t}}),restoreTrash:e=>i(`/api/sources/trash/${encodeURIComponent(e)}/restore`,{body:{}}),copyFiles:(e,t,n,r=!1)=>i(`/api/sources/${encodeURIComponent(e)}/copy`,{body:{from:t,names:n,move:r}}),upload:async(t,i,a)=>r(await e(n(`/api/sources/${encodeURIComponent(t)}`),{method:`POST`,headers:{"X-File-Name":i},body:a})),zip:async(t,i)=>{let a=await e(n(`/api/sources/${encodeURIComponent(t)}/zip`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({names:i})});return a.ok||await r(a),a.blob()},bundle:async t=>{let i=await e(n(`/api/bundle`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});return i.ok||await r(i),i.blob()},file:async(t,i)=>{let a=await e(n(`/api/sources/${encodeURIComponent(t)}/files/${encodeURIComponent(i)}`),{cache:`no-store`});return a.ok||await r(a),a.blob()},samples:()=>i(`/api/samples`),presets:()=>i(`/api/presets`),plugins:()=>i(`/api/plugins`),installPlugin:async t=>r(await e(n(`/api/plugins`),{method:`POST`,headers:{"Content-Type":`application/zip`},body:t})),removePlugin:e=>i(`/api/plugins/${encodeURIComponent(e)}`,{method:`DELETE`}),restorePlugin:e=>i(`/api/plugins/trash/${encodeURIComponent(e)}/restore`,{body:{}}),connections:()=>i(`/api/connections`),signIn:e=>i(`/api/connections/${encodeURIComponent(e)}/start`,{body:{}}),signOut:e=>i(`/api/connections/${encodeURIComponent(e)}`,{method:`DELETE`}),connectionShares:()=>i(`/api/connections/shares`),setConnectionShares:(e,t,n)=>i(`/api/connections/shares`,{method:`PUT`,body:{kind:e,id:t,workspaces:n}}),shareConnection:(e,t,n=!1)=>i(`/api/connections/share`,{body:{kind:e,id:t,...n?{undo:!0}:{}}}),packs:()=>i(`/api/packs`),installPack:async t=>r(await e(n(`/api/packs`),{method:`POST`,headers:{"Content-Type":`application/zip`},body:t})),removePack:e=>i(`/api/packs/${encodeURIComponent(e)}`,{method:`DELETE`}),restorePack:e=>i(`/api/packs/trash/${encodeURIComponent(e)}/restore`,{body:{}}),workspaces:()=>i(`/api/workspaces`),createWorkspace:e=>i(`/api/workspaces`,{body:e}),renameWorkspace:(e,t)=>i(`/api/workspaces/${encodeURIComponent(e)}`,{method:`PATCH`,body:{name:t}}),regenerateWorkspace:e=>i(`/api/workspaces/${encodeURIComponent(e)}/regenerate`,{body:{}}),archiveWorkspace:e=>i(`/api/workspaces/${encodeURIComponent(e)}/archive`,{body:{}}),unarchiveWorkspace:e=>i(`/api/workspaces/${encodeURIComponent(e)}/unarchive`,{body:{}}),setDefaultWorkspace:e=>i(`/api/workspaces/${encodeURIComponent(e)}/default`,{body:{}}),deleteWorkspace:e=>i(`/api/workspaces/${encodeURIComponent(e)}`,{method:`DELETE`}),restoreWorkspace:e=>i(`/api/workspaces/trash/${encodeURIComponent(e)}/restore`,{body:{}}),copyMovePreflight:e=>i(`/api/copy-move/preflight`,{body:e}),copyAsset:e=>i(`/api/copy-move/copy`,{body:e}),moveAsset:e=>i(`/api/copy-move/move`,{body:e}),forWorkspace:t=>yn(e,`/w/${encodeURIComponent(t)}`),models:e=>i(`/api/models`,{body:e}),modelsAsk:e=>i(`/api/models/ask`,{body:e})}}var bn=O(`archive-restore`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]),xn=O(`archive`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]),Sn=O(`arrow-left-right`,[[`path`,{d:`M8 3 4 7l4 4`,key:`9rb6wj`}],[`path`,{d:`M4 7h16`,key:`6tx8e3`}],[`path`,{d:`m16 21 4-4-4-4`,key:`siv7j2`}],[`path`,{d:`M20 17H4`,key:`h6l3hr`}]]),Cn=O(`ban`,[[`path`,{d:`M4.929 4.929 19.07 19.071`,key:`196cmz`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),wn=O(`boxes`,[[`path`,{d:`M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z`,key:`lc1i9w`}],[`path`,{d:`m7 16.5-4.74-2.85`,key:`1o9zyk`}],[`path`,{d:`m7 16.5 5-3`,key:`va8pkn`}],[`path`,{d:`M7 16.5v5.17`,key:`jnp8gn`}],[`path`,{d:`M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z`,key:`8zsnat`}],[`path`,{d:`m17 16.5-5-3`,key:`8arw3v`}],[`path`,{d:`m17 16.5 4.74-2.85`,key:`8rfmw`}],[`path`,{d:`M17 16.5v5.17`,key:`k6z78m`}],[`path`,{d:`M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z`,key:`1xygjf`}],[`path`,{d:`M12 8 7.26 5.15`,key:`1vbdud`}],[`path`,{d:`m12 8 4.74-2.85`,key:`3rx089`}],[`path`,{d:`M12 13.5V8`,key:`1io7kd`}]]),Tn=O(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),En=O(`columns-3`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]]),Dn=O(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]),On=O(`file-code-corner`,[[`path`,{d:`M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35`,key:`1wthlu`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`m5 16-3 3 3 3`,key:`331omg`}],[`path`,{d:`m9 22 3-3-3-3`,key:`lsp7cz`}]]),kn=O(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),An=O(`file-up`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]),jn=O(`flag`,[[`path`,{d:`M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528`,key:`1jaruq`}]]),Mn=O(`folder-down`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}],[`path`,{d:`M12 10v6`,key:`1bos4e`}],[`path`,{d:`m15 13-3 3-3-3`,key:`6j2sf0`}]]),Nn=O(`folder-input`,[[`path`,{d:`M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1`,key:`fm4g5t`}],[`path`,{d:`M2 13h10`,key:`pgb2dq`}],[`path`,{d:`m9 16 3-3-3-3`,key:`6m91ic`}]]),Pn=O(`folder-plus`,[[`path`,{d:`M12 10v6`,key:`1bos4e`}],[`path`,{d:`M9 13h6`,key:`1uhe8q`}],[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]),Fn=O(`folder-up`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}],[`path`,{d:`M12 10v6`,key:`1bos4e`}],[`path`,{d:`m9 13 3-3 3 3`,key:`1pxg3c`}]]),In=O(`gavel`,[[`path`,{d:`m14 13-8.381 8.38a1 1 0 0 1-3.001-3l8.384-8.381`,key:`pgg06f`}],[`path`,{d:`m16 16 6-6`,key:`vzrcl6`}],[`path`,{d:`m21.5 10.5-8-8`,key:`a17d9x`}],[`path`,{d:`m8 8 6-6`,key:`18bi4p`}],[`path`,{d:`m8.5 7.5 8 8`,key:`1oyaui`}]]),Ln=O(`link-2`,[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7h2`,key:`8i5ue5`}],[`path`,{d:`M15 7h2a5 5 0 1 1 0 10h-2`,key:`1b9ql8`}],[`line`,{x1:`8`,x2:`16`,y1:`12`,y2:`12`,key:`1jonct`}]]),Rn=O(`log-in`,[[`path`,{d:`m10 17 5-5-5-5`,key:`1bsop3`}],[`path`,{d:`M15 12H3`,key:`6jk70r`}],[`path`,{d:`M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4`,key:`u53s6r`}]]),zn=O(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),Bn=O(`minus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}]]),Vn=O(`pin-off`,[[`path`,{d:`M12 17v5`,key:`bb1du9`}],[`path`,{d:`M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89`,key:`znwnzq`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11`,key:`c9qhm2`}]]),Hn=O(`pin`,[[`path`,{d:`M12 17v5`,key:`bb1du9`}],[`path`,{d:`M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z`,key:`1nkz8b`}]]),Un=O(`printer`,[[`path`,{d:`M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2`,key:`143wyd`}],[`path`,{d:`M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6`,key:`1itne7`}],[`rect`,{x:`6`,y:`14`,width:`12`,height:`8`,rx:`1`,key:`1ue0tg`}]]),Wn=O(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),Gn=O(`replace`,[[`path`,{d:`M14 4a1 1 0 0 1 1-1`,key:`dhj8ez`}],[`path`,{d:`M15 10a1 1 0 0 1-1-1`,key:`1mnyi5`}],[`path`,{d:`M21 4a1 1 0 0 0-1-1`,key:`sfs9ap`}],[`path`,{d:`M21 9a1 1 0 0 1-1 1`,key:`mp6qeo`}],[`path`,{d:`m3 7 3 3 3-3`,key:`x25e72`}],[`path`,{d:`M6 10V5a2 2 0 0 1 2-2h2`,key:`15xut4`}],[`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`,key:`1bkyp8`}]]),Kn=O(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),qn=O(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),Jn=O(`shapes`,[[`path`,{d:`M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z`,key:`1bo67w`}],[`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`,key:`1bkyp8`}],[`circle`,{cx:`17.5`,cy:`17.5`,r:`3.5`,key:`w3z12y`}]]),Yn=O(`square-code`,[[`path`,{d:`m10 9-3 3 3 3`,key:`1oro0q`}],[`path`,{d:`m14 15 3-3-3-3`,key:`bz13h7`}],[`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`,key:`h1oib`}]]),Xn=O(`square-terminal`,[[`path`,{d:`m7 11 2-2-2-2`,key:`1lz0vl`}],[`path`,{d:`M11 13h4`,key:`1p7l4v`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,ry:`2`,key:`1m3agn`}]]),Zn=O(`star`,[[`path`,{d:`M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z`,key:`r04s7s`}]]),Qn=O(`unlink`,[[`path`,{d:`m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71`,key:`yqzxt4`}],[`path`,{d:`m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71`,key:`4qinb0`}],[`line`,{x1:`8`,x2:`8`,y1:`2`,y2:`5`,key:`1041cp`}],[`line`,{x1:`2`,x2:`5`,y1:`8`,y2:`8`,key:`14m1p5`}],[`line`,{x1:`16`,x2:`16`,y1:`19`,y2:`22`,key:`rzdirn`}],[`line`,{x1:`19`,x2:`22`,y1:`16`,y2:`16`,key:`ox905f`}]]),$n=(0,X.createContext)(null);function er(){let e=(0,X.useContext)($n);if(!e)throw Error(`useStore outside a StoreContext: the app mounts one at its root`);return e}function Q(e){let t=er();return[(0,X.useSyncExternalStore)(t.subscribe,()=>t.get(e)),(0,X.useCallback)(n=>t.set(e,n),[t,e])]}function tr(){let e=er();return{sync:(0,X.useSyncExternalStore)(e.subscribe,e.sync),resolve:e.resolve}}var nr=e=>e,rr=()=>({version:9,scoring:{mode:`all`,threshold:null},grader:null,every:[],run:[],cases:[]}),ir=e=>e?.state===`conflict`?`Not saved: changed in another browser.`:e?.state===`offline`?`Not saved: ${e.message}`:null,ar=(e,t)=>JSON.stringify(e)===JSON.stringify(t),or=e=>e instanceof Error?e.message:String(e),sr=({body:e,...t})=>t;function cr({api:e,pause:t=800,idle:n}){let r=nr(e),i={list:null,error:null},a=new Map,o=new Set,s=new Map,c=new Map,l=new Map,u=new Set,d=null,f=()=>{d=null,u.forEach(e=>e())},p=(e,t)=>{let n=a.get(e)??{id:e,doc:null,sync:{state:`loading`}};a.set(e,{...n,...t,id:e}),f()},m=e=>{i={list:e,error:null},f()},h=e=>{if(!i.list)return;let t=i.list.findIndex(t=>t.id===e.id);m(t<0?[...i.list,e]:i.list.map((n,r)=>r===t?e:n))},g=e=>{for(let t of[s,c]){let n=t.get(e);n&&clearTimeout(n),t.delete(e)}o.delete(e),a.delete(e),i.list?m(i.list.filter(t=>t.id!==e)):f()},_=e=>{p(e.id,{doc:e,sync:{state:`saved`}}),h(sr(e))};async function v(e){let t=a.get(e);if(!t?.doc||!o.has(e)||t.sync.state===`conflict`)return;let{body:n,version:i}=t.doc;p(e,{sync:{state:`saving`}});try{let t=await r.saveDataset(e,i,n),s=a.get(e);if(!s?.doc)return;s.doc.body===n&&o.delete(e);let c={...s.doc,version:t.version,versions:t.versions,cases:n.cases.length};if(p(e,{doc:c,sync:{state:`saved`}}),h(sr(c)),o.has(e))return v(e)}catch(t){let n=a.get(e);if(!n?.doc)return;let r=t instanceof mn&&t.status===409?t.body?.current??null:null;if(r){if(ar(r.body,n.doc.body)){o.delete(e),p(e,{doc:{...n.doc,version:r.version},sync:{state:`saved`}});return}p(e,{sync:{state:`conflict`,theirs:r}});return}p(e,{sync:{state:`offline`,message:or(t)}})}}function y(e){let t=s.get(e);t&&(clearTimeout(t),s.delete(e));let n=l.get(e);return n||(n=v(e).finally(()=>l.delete(e)),l.set(e,n)),n}return{list:()=>i,entry:e=>a.get(e),held:()=>d??=[...a.values()],async refresh(){i.error&&(i={list:i.list,error:null},f());try{let e=(await r.datasets()).datasets;m(e);for(let t of e){let e=a.get(t.id);e?.doc&&!o.has(t.id)&&t.version>e.doc.version&&r.dataset(t.id).then(e=>{a.has(t.id)&&!o.has(t.id)&&_(e)},()=>{})}}catch(e){i={list:i.list,error:or(e)},f()}},load(e){a.has(e)&&a.get(e).sync.state!==`missing`||(p(e,{sync:{state:`loading`}}),r.dataset(e).then(t=>{a.has(e)&&p(e,{doc:t,sync:{state:`saved`}})},t=>{a.has(e)&&p(e,{sync:{state:`missing`,message:or(t)}})}))},edit(e,r){let i=a.get(e);if(!i?.doc)return;let l=r(i.doc.body);if(l===i.doc.body)return;p(e,{doc:{...i.doc,body:l,cases:l.cases.length}}),o.add(e);let u=s.get(e);if(u&&clearTimeout(u),s.set(e,setTimeout(()=>{s.delete(e),y(e)},t)),n){let t=c.get(e);t&&clearTimeout(t),c.set(e,setTimeout(()=>{c.delete(e);let t=a.get(e)?.doc;t&&n.cut(e,t.body)},n.ms))}},async flush(e){await Promise.all((e?[e]:[...o]).map(y))},async resolve(e,t){let n=a.get(e);if(!n?.doc||n.sync.state!==`conflict`)return;let r=n.sync.theirs;if(t===`theirs`){o.delete(e),_(r);return}p(e,{doc:{...n.doc,version:r.version},sync:{state:`saved`}}),o.add(e),await y(e)},async create(e,t,n){let i=await r.createDataset({name:e,...t?{body:t}:{},...n?{preview:n}:{}});return _(i),i},async rename(e,t){let n=await r.renameDataset(e,t),i=a.get(e)?.doc;i&&p(e,{doc:{...i,name:n.name,version:n.version,updated:n.updated}}),h({...sr(n),cases:i?.body.cases.length??n.cases})},async setPreview(e,t){let n=await r.setDatasetPreview(e,t),i=a.get(e)?.doc;i&&p(e,{doc:{...i,preview:n.preview??null}}),h({...sr(n),cases:i?.body.cases.length??n.cases})},async remove(e){let{trash:t}=await r.deleteDataset(e);return g(e),t},async restore(e){let t=await r.restoreDataset(e);return _(t),t},async importFile(e){let{created:t}=await r.importDatasets(e);for(let e of t)h(e);return t},exportUrl:e=>r.exportDatasetUrl(e),exportAllUrl:()=>r.exportAllDatasetsUrl(),subscribe(e){return u.add(e),()=>{u.delete(e)}}}}var lr=3e4,ur=(e,t)=>e.get(`promptlab.versions`)[t]??{};function dr(e,t){return(e.get(`promptlab.versions`).dataset?.[t]??[]).map(e=>({...e,doc:L().upgradeDatasetBody(e?.doc)})).filter(e=>fr(e.doc))}var fr=e=>!!e&&typeof e==`object`&&Array.isArray(e.cases);function pr(e,t,n,r,i){let a=e.get(`promptlab.versions`),o=ur(e,t),s=(o[n]??[]).slice(),c=structuredClone(r);s[0]&&hr(s[0].doc,c)||(s.unshift({at:new Date().toISOString(),doc:c,reason:i}),s.length>10&&(s.length=10),e.set(`promptlab.versions`,{...a,[t]:{...o,[n]:s}}))}function mr(e,t,n,r){let i=e.get(`promptlab.versions`),a=(i.dataset?.[t]??[]).slice(),o=structuredClone(n);a[0]&&hr(a[0].doc,o)||(a.unshift({at:new Date().toISOString(),doc:o,reason:r}),a.length>10&&(a.length=10),e.set(`promptlab.versions`,{...i,dataset:{...i.dataset??{},[t]:a}}))}var hr=(e,t)=>JSON.stringify(e)===JSON.stringify(t),$=De(),gr=(0,X.createContext)(null);function _r({children:e,pause:t}){let n=Z(),r=er(),i=(0,X.useMemo)(()=>cr({api:n,...t==null?{}:{pause:t},idle:{ms:lr,cut:(e,t)=>mr(r,e,t,`idle`)}}),[n,r,t]);return(0,X.useEffect)(()=>{let e=()=>{i.flush()};return addEventListener(`pagehide`,e),()=>removeEventListener(`pagehide`,e)},[i]),(0,$.jsx)(gr.Provider,{value:i,children:e})}function vr(){let e=(0,X.useContext)(gr);if(!e)throw Error(`useDatasets outside a DatasetsProvider: the app mounts one at its root`);return e}function yr(){let e=vr(),t=(0,X.useSyncExternalStore)(e.subscribe,e.list);return(0,X.useEffect)(()=>{e.list().list===null&&e.refresh()},[e]),t}function br(e){let t=vr(),n=(0,X.useSyncExternalStore)(t.subscribe,()=>e?t.entry(e):void 0);return(0,X.useEffect)(()=>{e&&t.load(e)},[t,e]),n}var xr=e=>e.name.trim()||e.text.trim().split(`
2
- `)[0].trim()||`Untitled prompt`,Sr=e=>e?.state===`conflict`?`Not saved: changed in another browser.`:e?.state===`offline`?`Not saved: ${e.message}`:null,Cr=e=>e instanceof Error?e.message:String(e),wr=({versions:e,uses:t,...n})=>n;function Tr({api:e,pause:t=800}){let n={list:null,error:null},r=new Map,i=new Set,a=new Map,o=new Map,s=new Set,c=()=>s.forEach(e=>e()),l=(e,t)=>{let n=r.get(e)??{id:e,doc:null,sync:{state:`loading`}};r.set(e,{...n,...t,id:e}),c()},u=e=>{n={list:e,error:null},c()},d=e=>{if(!n.list)return;let t=n.list.findIndex(t=>t.id===e.id),r=e.default?n.list.map(t=>t.default&&t.id!==e.id?{...t,default:!1}:t):n.list;u(t<0?[e,...r]:r.map((n,r)=>r===t?e:n))},f=e=>{l(e.id,{doc:e,sync:{state:`saved`}}),d(wr(e))};async function p(t){let n=r.get(t);if(!n?.doc||!i.has(t)||n.sync.state===`conflict`)return;let{name:a,text:o,version:s}=n.doc;l(t,{sync:{state:`saving`}});try{let n=await e.editPrompt(t,s,{name:a,text:o}),c=r.get(t);if(!c?.doc)return;let u=c.doc.name!==a||c.doc.text!==o;u||i.delete(t);let f=u?{...n,name:c.doc.name,text:c.doc.text}:n;if(l(t,{doc:f,sync:{state:u?`saving`:`saved`}}),d(wr(f)),u)return p(t)}catch(e){let n=r.get(t);if(!n?.doc)return;let a=e instanceof mn&&e.status===409?e.body?.current??null:null;if(a){if(a.text===n.doc.text&&a.name===n.doc.name){i.delete(t),f(a);return}l(t,{sync:{state:`conflict`,theirs:a}});return}l(t,{sync:{state:`offline`,message:Cr(e)}})}}function m(e){let t=a.get(e);t&&(clearTimeout(t),a.delete(e));let n=o.get(e);return n||(n=p(e).finally(()=>o.delete(e)),o.set(e,n)),n}return{list:()=>n,entry:e=>r.get(e),async refresh(){n.error&&(n={list:n.list,error:null},c());try{u((await e.prompts()).prompts)}catch(e){n={list:n.list,error:Cr(e)},c()}},load(t){i.has(t)||(r.has(t)||l(t,{sync:{state:`loading`}}),e.prompt(t).then(e=>{r.has(t)&&!i.has(t)&&f(e)},e=>{r.has(t)&&l(t,{sync:{state:`missing`,message:Cr(e)}})}))},edit(e,n){let o=r.get(e);if(!o?.doc)return;let s={...o.doc,...n};if(s.name===o.doc.name&&s.text===o.doc.text)return;l(e,{doc:s}),d(wr(s)),i.add(e);let c=a.get(e);c&&clearTimeout(c),a.set(e,setTimeout(()=>{a.delete(e),m(e)},t))},async flush(e){await Promise.all((e?[e]:[...i]).map(m))},async resolve(e,t){let n=r.get(e);if(!n?.doc||n.sync.state!==`conflict`)return;let a=n.sync.theirs;if(t===`theirs`){i.delete(e),f(a);return}l(e,{doc:{...n.doc,version:a.version},sync:{state:`saved`}}),i.add(e),await m(e)},async create(t={}){let n=await e.createPrompt(t);return f(n),n},async setDefault(t){await m(t),f(await e.setDefaultPrompt(t))},async restoreVersion(t,n){await m(t),f(await e.restorePromptVersion(t,n))},async remove(t){await m(t);let{trash:o}=await e.deletePrompt(t),s=a.get(t);return s&&clearTimeout(s),a.delete(t),i.delete(t),r.delete(t),n.list?u(n.list.filter(e=>e.id!==t)):c(),o},async restore(t){let n=await e.restorePrompt(t);return f(n),n},subscribe(e){return s.add(e),()=>{s.delete(e)}}}}var Er=(0,X.createContext)(null);function Dr({children:e,pause:t}){let n=Z(),r=(0,X.useMemo)(()=>Tr({api:n,...t==null?{}:{pause:t}}),[n,t]);return(0,X.useEffect)(()=>{let e=()=>{r.flush()};return addEventListener(`pagehide`,e),()=>removeEventListener(`pagehide`,e)},[r]),(0,$.jsx)(Er.Provider,{value:r,children:e})}function Or(){let e=(0,X.useContext)(Er);if(!e)throw Error(`usePrompts outside a PromptsProvider: the app mounts one at its root`);return e}function kr(){let e=Or(),t=(0,X.useSyncExternalStore)(e.subscribe,e.list);return(0,X.useEffect)(()=>{e.refresh()},[e]),t}function Ar(e){let t=Or(),n=(0,X.useSyncExternalStore)(t.subscribe,()=>e?t.entry(e):void 0);return(0,X.useEffect)(()=>{e&&t.load(e)},[t,e]),n}var jr=[`datasets`,`filters`,`prompts`,`sources`],Mr=[`connections`,`wizards`,`workspaces`],Nr=[`connections`,`wizards`],Pr={tab:`home`};function Fr(e){let t=e.indexOf(`?`),n=new URLSearchParams(t<0?``:e.slice(t+1)),r=(t<0?e:e.slice(0,t)).replace(/^#\/?/,``).split(`/`).map(Vr),i=null;(r[0]===`evals`||r[0]===`datasets`||r[0]===`sources`)&&(r=[`library`,r[0]===`sources`?`sources`:`datasets`,...r.slice(1)],i=`#/${r.map(encodeURIComponent).join(`/`)}`);let a=Ir(r);if(a.tab===`history`){let e=n.get(`pipeline`),t=n.get(`content`);e&&(a.pipeline=e),t&&(a.content=t)}return{route:a,rewrite:i}}function Ir([e=``,...t]){let n=t.join(`/`)||null;switch(e){case``:case`home`:return Pr;case`history`:return t.length?Pr:{tab:`history`};case`runs`:return{tab:`runs`,id:n};case`results`:return n?{tab:`results`,id:n}:{tab:`history`};case`library`:{let[e=``,...r]=t,i=jr.find(t=>t===e);return i?{tab:`library`,section:i,id:r.join(`/`)||null}:{tab:`library`,section:`datasets`,id:n}}case`setup`:{let[e=``,...n]=t;if(!e)return{tab:`setup`,section:`connections`,id:null};if(e===`profiles`){let e=n.join(`/`)||null;return e?{tab:`setup`,section:`connections`,id:e,kind:`profile`}:{tab:`setup`,section:`connections`,id:null}}let r=Mr.find(t=>t===e),i=n.join(`/`)||null;return!r||i&&!Nr.includes(r)?Pr:{tab:`setup`,section:r,id:i}}default:return Pr}}function Lr(e){switch(e.tab){case`home`:return`#/home`;case`history`:{let t=new URLSearchParams;return e.pipeline&&t.set(`pipeline`,e.pipeline),e.content&&t.set(`content`,e.content),t.size?`#/history?${t}`:`#/history`}case`runs`:return e.id?`#/runs/${encodeURIComponent(e.id)}`:`#/runs`;case`results`:return`#/results/${encodeURIComponent(e.id)}`;case`library`:return`#/library/${e.section}${e.id?`/${encodeURIComponent(e.id)}`:``}`;case`setup`:return e.kind===`profile`&&e.id?`#/setup/profiles/${encodeURIComponent(e.id)}`:`#/setup/${e.section}${e.id?`/${encodeURIComponent(e.id)}`:``}`}}function Rr(e){location.hash=Lr(e)}function zr(e){history.replaceState(history.state,``,Lr(e)),window.dispatchEvent(new HashChangeEvent(`hashchange`))}function Br(){return Fr(location.hash).route}function Vr(e){try{return decodeURIComponent(e)}catch{return e}}var Hr=e=>(typeof e.id==`string`?e.id.trim():``)||`item:${L().caseItem(e)}`,Ur=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase(),Wr=e=>Array.isArray(e.metrics)?e.metrics:[],Gr=e=>!e.not&&e.weight!==0,Kr=e=>e.type===`contains`&&e.not===!0&&e.weight!==0,qr=e=>L().metricLines(e);function Jr(e,t){let n=Wr(e);switch(t.type){case`bounds`:{let r=n.findIndex(e=>e.type===`item-count`&&Gr(e)),i=r>=0?n[r]:null,a=e=>e==null||e===``?null:Number(e),o=(e,t)=>e.kind===`keep`?t:e.kind===`clear`?null:e.n,s=o(t.min,a(i?.min)),c=o(t.max,a(i?.max));if(s===a(i?.min)&&c===a(i?.max))return e;let l=s==null&&c==null?null:{...i??{type:`item-count`},min:s,max:c};return{...e,metrics:r>=0?n.flatMap((e,t)=>t===r?l?[l]:[]:[e]):[...n,...l?[l]:[]]}}case`addTerm`:{let r=t.term.trim();if(!r)return e;if(t.list===`forbid`)return n.some(e=>Kr(e)&&Ur(String(e.value??``),r))?e:{...e,metrics:[...n,{type:`contains`,value:r,not:!0,ignoreCase:!0}]};let i=n.findIndex(e=>e.type===`contains-all`&&Gr(e));return i>=0&&qr(n[i].values).some(e=>Ur(e,r))?e:{...e,metrics:i>=0?n.map((e,t)=>t===i?{...e,values:[...qr(e.values),r].join(`
3
- `)}:e):[...n,{type:`contains-all`,values:r,ignoreCase:!0}]}}case`removeTerm`:{let r=t.term.trim();if(!r)return e;let i=!1,a=n.flatMap(e=>{if(Kr(e)&&Ur(String(e.value??``),r))return i=!0,[];if((e.type===`contains-all`||e.type===`contains-any`)&&Gr(e)&&qr(e.values).some(e=>Ur(e,r))){i=!0;let t=qr(e.values).filter(e=>!Ur(e,r));return t.length?[{...e,values:t.join(`
4
- `)}]:[]}return[e]});return i?{...e,metrics:a}:e}case`status`:return!!e.todo===t.todo?e:{...e,todo:t.todo}}}function Yr(e,t,n){let r=[];return n.type===`delete`?{next:e.filter(e=>{let n=t.has(Hr(e));return n&&r.push(Hr(e)),!n}),changed:r}:{next:e.map(e=>{if(!t.has(Hr(e)))return e;let i=Jr(e,n);return i!==e&&r.push(Hr(e)),i}),changed:r}}function Xr(e,t,n){let r=new Map(e.map(e=>[Hr(e),e])),i=new Map(t.map(e=>[Hr(e),e])),a=[];for(let e of n){let t=r.get(e),n=i.get(e);if(!t||!n)continue;let o=new Set(L().validateEvals({cases:[t]})),s=`${n.id}: `,c=L().validateEvals({cases:[n]}).filter(e=>!o.has(e)).map(e=>e.startsWith(s)?e.slice(s.length):e);c.length&&a.push({key:e,file:L().caseItem(n),reasons:c})}return{cases:a}}var Zr={expect:`Expect`,forbid:`Forbid`},Qr=e=>Zr[e],$r=e=>`${e} ${e===1?`case`:`cases`}`;function ei(e,t){let n=$r(t);switch(e.type){case`bounds`:{let t=[];return e.min.kind!==`keep`&&t.push({verb:e.min.kind===`set`?`Set`:`Cleared`,what:`Min`}),e.max.kind!==`keep`&&t.push({verb:e.max.kind===`set`?`Set`:`Cleared`,what:`Max`}),t.length===2&&t[0].verb===t[1].verb?`${t[0].verb} Min and Max items on ${n}`:t.length===2?`${t[0].verb} Min items and ${t[1].verb.toLowerCase()} Max items on ${n}`:t[0]?`${t[0].verb} ${t[0].what} items on ${n}`:`Changed ${n}`}case`addTerm`:return`Added ${e.term.trim()} to ${Zr[e.list]} on ${n}`;case`removeTerm`:return`Removed ${e.term.trim()} from ${n}`;case`status`:return`Marked ${n} ${e.todo?`To do`:`graded`}`;case`delete`:return`Deleted ${n}`}}var ti={graded:`Graded`,todo:`To do`,missing:`Missing`};function ni(e,t){return t&&!t.includes(L().caseItem(e))?`missing`:e.todo?`todo`:`graded`}function ri(e,t){let n=new Set(e.map(e=>L().caseItem(e)));return t.filter(e=>!n.has(e))}var ii={file:``,status:`all`,show:`all`};function ai(e,t,n,r=null){let i=t.file.trim().toLowerCase();return e.filter(e=>(!i||L().caseItem(e).toLowerCase().includes(i))&&(t.status===`all`||ni(e,r)===t.status)&&(t.show===`all`||n.has(Hr(e))))}var oi=(0,X.createContext)(null);function si({children:e}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(new Set),[a,o]=(0,X.useState)(ii),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(null),d=br(l?.dataset??null),f=(0,X.useRef)(null),p=(0,X.useCallback)(e=>{e!==f.current&&(f.current=e,n(e),i(new Set),o(ii),c(null))},[]),m=(0,X.useCallback)(e=>{i(e)},[]),h=(0,X.useCallback)(e=>{o(t=>({...t,...e}))},[]),g=(0,X.useCallback)((e,t,r)=>{f.current=e,n(e),i(new Set),o({...ii,show:`selected`}),c(null),u({dataset:e,files:t,from:r});let a=Lr({tab:`library`,section:`datasets`,id:e});location.hash===a?window.dispatchEvent(new HashChangeEvent(`hashchange`)):location.hash=a},[]),_=d?.doc?.body??null,v=d?.sync.state===`missing`;(0,X.useEffect)(()=>{if(!l||!_&&!v)return;let e=new Set(l.files),t=(_?.cases??[]).filter(t=>e.has(L().caseItem(t))).map(Hr);i(new Set(t)),c({from:l.from,wanted:e.size,found:t.length}),u(null)},[l,_,v]);let y=(0,X.useMemo)(()=>({datasetId:t,pickDataset:p,selected:r,setSelected:m,filters:a,setFilters:h,handedOver:s,showCases:g}),[t,p,r,m,a,h,s,g]);return(0,$.jsx)(oi.Provider,{value:y,children:e})}function ci(){let e=(0,X.useContext)(oi);if(!e)throw Error(`useCases outside an CasesProvider: the app mounts one at its root`);return e}var li=(0,X.createContext)(null);function ui({children:e}){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(null),a=(0,X.useRef)(t);a.current=t;let o=(0,X.useRef)(r);o.current=r;let s=(0,X.useRef)(0),c=(0,X.useCallback)((e,t)=>{a.current=e,n(e),o.current=t,i(t)},[]),l=(0,X.useCallback)((e,t={})=>{let n=++s.current,r=a.current,i=r.find(t=>t.id===e),o;if(i)o=r.map(r=>r.id===e?{...r,from:t.from??r.from,last:n}:r);else if(o=[...r,{id:e,at:t.at??``,from:t.from??`runs`,show:`all`,last:n}],o.length>4){let e=o.reduce((e,t)=>e.last<t.last?e:t);o=o.filter(t=>t.id!==e.id)}c(o,e)},[c]),u=(0,X.useCallback)(e=>{let t=a.current,n=t.findIndex(t=>t.id===e);if(n<0)return;let r=t[n].from,i=t.filter(t=>t.id!==e);if(i.length===0){c(i,null),window.location.hash=`#/${r}`;return}c(i,o.current===e?i[Math.min(n,i.length-1)].id:o.current)},[c]),d=(0,X.useCallback)((e,t)=>{let n=++s.current;c(a.current.map(r=>r.id===e?{...r,from:t??r.from,last:n}:r),e)},[c]),f=(0,X.useCallback)((e,t)=>{c(a.current.map(n=>n.id===e?{...n,show:t}:n),o.current)},[c]),p=(0,X.useCallback)(()=>{c(a.current,null)},[c]),m=(0,X.useCallback)(()=>{let e=a.current.find(e=>e.id===o.current);window.location.hash=`#/${e?.from??`runs`}`,p()},[p]),h=(0,X.useMemo)(()=>({tabs:t,focusedId:r,openRun:l,closeRun:u,focusRun:d,setShow:f,goBack:m,hide:p}),[t,r,l,u,d,f,m,p]);return(0,$.jsx)(li.Provider,{value:h,children:e})}function di(){let e=(0,X.useContext)(li);if(!e)throw Error(`useResults outside a ResultsProvider: the app mounts one at its root`);return e}function fi({n:e,of:t}){return(0,$.jsxs)(`span`,{className:`fig-part`,children:[e,(0,$.jsxs)(`span`,{className:`fig-of`,children:[`/`,t]})]})}var pi=e=>e===`good`?` fig-good`:e===`bad`?` fig-bad`:``;function mi({fig:e}){return(0,$.jsx)(`span`,{className:`fig-value${pi(e.tone)}`,children:e.value??(e.of?(0,$.jsx)(fi,{n:e.of[0],of:e.of[1]}):`—`)})}function hi({fig:e}){return(0,$.jsxs)(`div`,{className:`fig`,children:[(0,$.jsx)(`span`,{className:`fig-label`,children:e.label}),(0,$.jsx)(mi,{fig:e})]},e.key)}function gi({label:e,lead:t,rest:n,dense:r}){return(0,$.jsxs)(`div`,{className:`figures${r?` dense`:``}`,role:`group`,"aria-label":e,children:[(0,$.jsxs)(`div`,{className:`fig fig-lead`,children:[(0,$.jsx)(`span`,{className:`fig-label`,children:t.label}),(0,$.jsxs)(`div`,{className:`fig-headline`,children:[(0,$.jsx)(mi,{fig:t}),t.under&&(0,$.jsx)(`span`,{className:`fig-under`,children:(0,$.jsx)(fi,{n:t.under[0],of:t.under[1]})})]})]}),!!n.length&&(0,$.jsx)(`div`,{className:`fig-rest`,children:n.map(e=>(0,$.jsx)(hi,{fig:e},e.key))})]})}var _i={type:`Connection type`,profile:`Request profile`,px:`Resolution`,format:`Image format`,quality:`Image quality`,seed:`Seed`,nPredict:`Reply tokens`,repeatPenalty:`Repeat penalty`,frequencyPenalty:`Frequency penalty`,presencePenalty:`Presence penalty`,dryMultiplier:`DRY multiplier`,dryBase:`DRY base`,dryAllowedLength:`DRY allowed length`,grammar:`Grammar`,url:`Address`,model:`Model`,temperature:`Temperature`,imagePosition:`Image position`,cachePrompt:`Cache prompt`,thinking:`Thinking`,rejectLoops:`Reject looping replies`,maxTokens:`Reply tokens`},vi={format:`image/jpeg`,quality:`0.92`,seed:``,nPredict:``,repeatPenalty:``,frequencyPenalty:``,presencePenalty:``,dryMultiplier:``,dryBase:``,dryAllowedLength:``,grammar:``,px:`921600`},yi=[`type`,`profile`,`px`,`format`,`quality`,`seed`,`nPredict`,`maxTokens`,`repeatPenalty`,`frequencyPenalty`,`presencePenalty`,`dryMultiplier`,`dryBase`,`dryAllowedLength`,`grammar`,`imagePosition`,`cachePrompt`,`thinking`,`rejectLoops`,`url`,`model`,`temperature`],bi=[`type`,`profile`,`url`,`model`,`temperature`],xi=[`px`,`format`,`quality`,`imagePosition`];function Si(e){let t=(t,n)=>String(e[t]??``).trim()?[`${n} ${e[t]}`]:[];return[...t(`frequencyPenalty`,`frequency`),...t(`presencePenalty`,`presence`),...String(e.dryMultiplier??``).trim()?[`DRY ${e.dryMultiplier} / ${e.dryBase||`–`} / ${e.dryAllowedLength||`–`}`]:[],...String(e.grammar??``).trim()?[`grammar`]:[]].join(`, `)}var Ci=(e,t)=>({...vi,...t?.setupProfile?.settings||{}});function wi(e){return _i[e]??e}function Ti(e,t){return e===`type`?Ei(String(t)):e===`profile`?t===`speed`?`Speed`:`Quality`:e===`px`?L().budgetLabel(t):e===`format`?String(t).replace(`image/`,``).toUpperCase():String(t)}function Ei(e){return L().CONNECTION_TYPES[e]?.label??e}var Di=e=>e.content?e.content!==`text`:null,Oi=e=>Number(new Date(e)).toString(36).slice(-6).toUpperCase(),ki=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,Ai=e=>{let t=e?e.timed??e.ran:0;return t?e.ms/t:null};function ji(e,t){let n=e.scenarios.map(()=>0);for(let e of t.results||[])e&&!e.unrun&&(e.scenarios||[]).forEach((e,t)=>{t<n.length&&typeof e?.res?.ms==`number`&&n[t]++});return{...e,scenarios:e.scenarios.map((e,t)=>({...e,timed:n[t]??0}))}}var Mi={queued:`Queued`,running:`Running`,done:`Done`,incomplete:`Incomplete`,cancelled:`Cancelled`,failed:`Failed`,interrupted:`Interrupted`},Ni=e=>Mi[e]??e;function Pi(e){return Mi[e]?(0,$.jsx)(`span`,{className:`rchip ${e}`,children:Mi[e]}):null}var Fi=e=>e.length?e.reduce((e,t)=>e+t,0)/e.length:null;function Ii(e){if(Math.round(e)<1e3)return`${Math.max(0,Math.round(e))} ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let n=Math.round(e/1e3),r=Math.floor(n/60),i=n%60;if(r<60)return i?`${r}m ${i}s`:`${r}m`;let a=Math.floor(r/60),o=r%60;return o?`${a}hr ${o}`:`${a}hr`}function Li(e,t){if(!e)return null;let n=new Date(e).getTime();if(Number.isNaN(n))return null;let r=t?new Date(t).getTime():Date.now();return Number.isNaN(r)?null:Math.max(0,r-n)}var Ri=e=>{let t=(e.scenarios||[]).filter(Boolean),n=t.reduce((e,t)=>e+(t.passed||0),0),r=t.reduce((e,t)=>e+(t.cases||0),0),i=t.map(e=>e.percent).filter(e=>e!=null),a=t.map(Ai).filter(e=>e!=null);return{pct:r?Math.round(100*n/r):null,avgScore:i.length?Math.round(Fi(i)):null,avgTime:a.length?Fi(a):null}},zi=e=>{let t=Ri(e);return{pct:t.pct==null?`—`:`${t.pct}%`,avgScore:t.avgScore==null?`—`:`${t.avgScore}%`,avgTime:t.avgTime==null?`—`:Ii(t.avgTime)}},Bi=e=>e.profile??`(Default)`,Vi=`(No pipeline)`,Hi=`(No content)`,Ui=(e,t)=>t?(0,$.jsx)(`a`,{className:`linkish hlink`,href:t,children:e}):e,Wi=e=>!!e.run&&(e.status===`cancelled`||e.status===`interrupted`),Gi=e=>e.rerunOf?(0,$.jsxs)(`span`,{className:`hrerun note`,children:[`Re-run of `,e.rerunOfAt?Oi(e.rerunOfAt):`a cleared run`]}):null,Ki=[{key:`runid`,label:`Run ID`,on:!0,sort:e=>e.at,get:e=>(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`code`,{className:`runlink`,"data-openrun":e.run??void 0,children:Oi(e.at)}),Gi(e)]})},{key:`date`,label:`Date`,on:!0,sort:e=>e.at,get:e=>(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`time`,{dateTime:e.at,title:new Date(e.at).toLocaleString(),children:Ft(e.at)}),e.cancelled&&(0,$.jsx)(`span`,{className:`err`,children:` cancelled`})]})},{key:`setup`,label:`Pipeline`,on:!0,sort:e=>e.setup||null,get:e=>e.setup?Ui(e.setup,e.pipelineHref):(0,$.jsx)(`span`,{className:`note`,children:Vi})},{key:`state`,label:`State`,on:!0,sort:e=>Ni(e.status),get:e=>Pi(e.status)},{key:`content`,label:`Content`,on:!0,sort:e=>e.content||null,get:e=>e.content?Ui(e.content,e.contentHref):(0,$.jsx)(`span`,{className:`note`,children:Hi})},{key:`pct`,label:`% Passed Items`,on:!0,numeric:!0,sort:e=>Ri(e).pct,get:e=>zi(e).pct},{key:`avgscore`,label:`Avg Score`,on:!0,numeric:!0,sort:e=>Ri(e).avgScore,get:e=>zi(e).avgScore},{key:`avgtime`,label:`Avg Time`,on:!0,numeric:!0,sort:e=>Ri(e).avgTime,get:e=>zi(e).avgTime},{key:`duration`,label:`Duration`,on:!1,numeric:!0,sort:e=>Li(e.startedAt,e.finishedAt),get:e=>{let t=Li(e.startedAt,e.finishedAt);return t==null?`—`:Ii(t)}},{key:`ran`,label:`Ran`,on:!1,numeric:!0,sort:e=>e.done,get:e=>(0,$.jsx)(fi,{n:e.done,of:e.total})},{key:`plugins`,label:`Plugins`,on:!1,get:e=>e.plugins||`—`},{key:`comment`,label:`Comment`,on:!1,sort:e=>e.comment,get:e=>(0,$.jsx)(`button`,{type:`button`,className:`ghost linkish hcomment-btn`,"data-editcomment":e.run??void 0,"aria-label":e.comment?void 0:`Add a comment`,children:e.comment?(0,$.jsx)(`span`,{className:`hcomment`,title:e.comment,children:e.comment}):(0,$.jsx)(`span`,{className:`hcomment empty`,children:`——`})})}],qi=[{key:`name`,label:`Name`,on:!0,sort:(e,t)=>e?.name||`Target ${L().targetLetter(t)}`,get:(e,t,n)=>(0,$.jsx)(`button`,{type:`button`,className:`ghost linkish`,"data-scenario":n,children:t?.name||`Target ${L().targetLetter(n)}`})},{key:`outcome`,label:`Outcome`,on:!0,sort:e=>e.pass,get:(e,t)=>t.pass==null?(0,$.jsx)(`span`,{className:`note`,children:`—`}):(0,$.jsx)(`b`,{className:t.pass?`hit`:`fault`,children:t.pass?`Pass`:`Fail`})},{key:`evals`,label:`Evals`,on:!0,sort:e=>e.evals||null,get:(e,t)=>t.evalParts?.length?t.evalParts.map((e,t)=>(0,$.jsxs)(`span`,{children:[t>0&&`, `,e.label,` `,e.mark==null?e.value:(0,$.jsx)(ge,{pass:e.mark})]},t)):t.evals||`—`},{key:`connection`,label:`Connection`,on:!0,sort:e=>e?.connection,get:(e,t)=>t?.connection||`—`},{key:`profile`,label:`Profile`,on:!0,sort:e=>e?.setupProfile?Bi(e):null,get:(e,t,n)=>t?.setupProfile?(0,$.jsx)(`button`,{type:`button`,className:`ghost linkish`,"data-prof":n,children:Bi(t)}):`—`},{key:`passed`,label:`Passed Items`,on:!0,numeric:!0,sort:e=>e.cases?e.passed/e.cases:null,get:(e,t)=>t.cases?(0,$.jsx)(fi,{n:t.passed,of:t.cases}):`—`},{key:`score`,label:`Score`,on:!0,numeric:!0,sort:e=>e.percent,get:(e,t)=>t.percent==null?`—`:`${t.percent}%`},{key:`avgtime`,label:`Avg Time`,on:!0,numeric:!0,sort:e=>Ai(e),get:(e,t)=>{let n=Ai(t);return n==null?`—`:Ii(n)}},{key:`total`,label:`Total`,on:!1,numeric:!0,sort:e=>e.ms||null,get:(e,t)=>t.ms?Ii(t.ms):`—`},{key:`model`,label:`Model`,on:!1,get:(e,t)=>t.model||`—`},{key:`res`,label:`Resolution`,on:!1,image:!0,get:(e,t)=>String(L().budgetLabel(Ci(e,t).px))},{key:`format`,label:`Format`,on:!1,image:!0,get:(e,t)=>String(Ci(e,t).format).replace(`image/`,``).toUpperCase()},{key:`quality`,label:`Quality`,on:!1,image:!0,get:(e,t)=>Ci(e,t).format===`image/png`?`—`:String(Ci(e,t).quality)},{key:`seed`,label:`Seed`,on:!1,get:(e,t)=>String(Ci(e,t).seed||`1234`)},{key:`predict`,label:`Reply tokens`,on:!1,get:(e,t)=>String(Ci(e,t).nPredict||Ci(e,t).maxTokens||`—`)},{key:`penalty`,label:`Repeat penalty`,on:!1,get:(e,t)=>String(Ci(e,t).repeatPenalty||`—`)},{key:`decoding`,label:`Decoding`,on:!1,get:(e,t)=>Si(Ci(e,t))||`—`},...[[`case`,`Case`],[`tidy`,`Tidy items`],[`dedupe`,`Remove duplicates`],[`keep-first`,`Keep first`],[`drop-echoes`,`Drop prompt echoes`]].map(([e,t])=>({key:`modifier-${e}`,label:t,on:!1,get:(t,n)=>n.modifiers?.[e]||`—`}))],Ji={"Run Scenarios":`Run Targets`},Yi={tests:`evals`},Xi={connection:`profile`},Zi=[[`Runs`,Ki],[`Run Scenarios`,qi]],Qi=e=>![`queued`,`running`].includes(e),$i=e=>e.cancel&&!Qi(e.status),ea=()=>({ran:0,passed:0,found:0,of:0,ms:0,timed:0,share:0,shared:0});function ta(e){return e.of?Math.round(100*e.found/e.of):e.shared?Math.round(100*e.share/e.shared):null}var na=(e,t)=>e.filter(e=>!e.whole).map(e=>e.items[t]).filter(e=>!!e&&!L().isSkipped(e)),ra=e=>Array.isArray(e)?e.length:typeof e==`number`?e:0;function ia(e,t){let n=t.map(ea);return(e||[]).forEach((e,r)=>{e&&!e.unrun&&(e.scenarios||[]).forEach((e,i)=>{let a=n[i];if(!a||!e)return;let o=na(t[i],r);if(o.length){a.ran++,o.every(e=>e.pass)&&a.passed++;for(let e of o)a.found+=ra(e.found),a.of+=ra(e.found)+ra(e.missed)+ra(e.invented),e.found==null&&e.missed==null&&typeof e.score==`number`&&!e.points&&(a.share+=e.score,a.shared++)}e.res&&(a.timed++,a.ms+=e.res.ms||0)})}),n}var aa=(e,t,n)=>L().targetsOf(e).map((r,i)=>L().scenarioEvals(e,i,t,Qi(n))),oa=(e,t,n)=>(e.outcomes[n]??[]).some(e=>!e.whole&&L().failedScore(e.items[t]));function sa(e){return e.skipped?`Skipped`:e.whole?e.verdict?.ran?e.verdict.pass?`Passed`:`Failed`:`—`:e.ran?`${e.passed}/${e.ran}`:e.skippedItems?`Skipped`:`—`}var ca=e=>!e.skipped&&e.whole&&e.verdict?.ran?!!e.verdict.pass:null,la=e=>e.map(e=>`${e.label} ${sa(e)}`).join(`, `),ua=e=>e.map(e=>({label:e.label,value:sa(e),mark:ca(e)})),da=e=>{if(!e.group)return null;let t=L().casesRef(e)?.n??e.pin;return t==null?null:`v${t}`},fa=(e,t,n)=>e.group?.name||e.group?.id||(e.name||``).trim()||L().evalLabel({evals:n},t);function pa(e){let t=e.evals,n=t.map((n,r)=>({key:n.id,name:fa(n,r,t),version:da(n),cells:e.scenarios.map((t,n)=>{let i=e.outcomes[n]?.[r];return{pct:i&&!i.whole&&i.ran?Math.round(100*i.passed/i.ran):null,pass:i?L().groupPass(i):null,skipped:!!i?.skipped}})})),r=e.snapshot.pass;return{rows:n,overall:t.length?{label:r?.mode===`atLeast`?`At least ${r.count}`:`All groups pass`,pass:e.scenarios.map((t,n)=>L().overallVerdict(e.outcomes[n]??[],r)),pct:e.tallies.map(e=>e.ran?Math.round(100*e.passed/e.ran):null)}:null}}var ma=e=>e.scenarios.map((t,n)=>L().recordedTargetOf(e.snapshot,n)),ha=e=>e.findIndex(e=>!e);function ga(e){return!e||e.error?null:e.transcript?.at(-1)?.got!=null||e.raw!=null?L().gradedText(e):null}function _a(e,t,n,r){let i=e.results[t]?.scenarios?.[n]?.scores?.[r];return i&&!L().isSkipped(i)?i.metrics??[]:[]}var va=e=>`${e.type}::${e.label}`;function ya(e,t){let n=e.scenarios.length,r=(n,r)=>_a(e,n,r,t),i=[],a=new Set,o=[];e.results.forEach((e,t)=>{for(let e=0;e<n;e++){let n=r(t,e);n.length>o.length&&(o=n)}});let s=e=>{let t=va(e);a.has(t)||(a.add(t),i.push({key:t,label:e.label}))};return o.forEach(s),e.results.forEach((e,t)=>{for(let e=0;e<n;e++)r(t,e).forEach(s)}),i.map(({key:t,label:i})=>({key:t,label:i,cells:Array.from({length:n},(n,i)=>{let a=0,o=0;return e.results.forEach((e,n)=>{let s=r(n,i).find(e=>va(e)===t);s&&s.weight!==0&&(o++,s.pass&&a++)}),o?{passed:a,ran:o}:null})}))}var ba=e=>typeof e.n==`number`&&Number.isInteger(e.n)?`${e.id}@${e.n}`:e.id;function xa(e,t,n,r=[],i=null){let a=e.own??(e.group?n[ba(e.group)]:void 0),o=L().casesRef(e),s=o?n[ba(o)]?.cases??(o.id===i?r:[]):[],c=t?s.find(e=>!e.todo&&L().caseItem(e)===t):void 0;return[...a?.every??[],...c?.metrics??[]]}function Sa(e,t){let n=e=>[typeof e.metric==`string`&&e.metric.trim()||``,L().METRICS[e.type]?.label??e.type],r=0;return e.map(e=>{let i=t.findIndex((t,i)=>i>=r&&t.type===e.type&&n(t).includes(e.label));if(i<0)return null;r=i+1;let a=t[i];return[a.not?`not`:``,L().metricCheck(a)].filter(Boolean).join(` `)||null})}function Ca(e){let t=e.snapshot||{},n=L().contentOf(t),r=!!(n&&L().CONTENT_TYPES[n.type]?.inline),i=L().lastKind(t),a=e.results||[],o=aa(t,a,e.status);return{id:e.id,status:e.status,at:e.submittedAt,behind:e.behind,name:t.name||`Run`,error:e.error,progress:e.progress||{current:null,n:0,total:0},scenarios:L().targetsOf(t).map((e,n)=>({id:e?.id||`scenario-${n}`,name:L().targetLabel(t,n),kind:i,plain:!(i&&L().OUTPUT_KINDS[i]?.terms),asked:Da(t,n)})),items:r?[null]:n?.type===`source`&&n.files||[],content:r?{type:`text`,text:n.text??``}:{type:`source`,source:n?.ref?.id??``,sourceName:n?.ref?.name??``},evals:L().evalsOf(t),snapshot:t,results:a,outcomes:o,tallies:ia(a,o),startedAt:e.startedAt,finishedAt:e.finishedAt}}var wa={LOWER:`lower case`,SENTENCE:`Sentence case`,TITLE:`Title Case`,UPPER:`UPPER CASE`,NONE:`No change`};function Ta(e){if(!e)return{};let t={};for(let n of L().outOf(e)?.modifiers||[])t[n.type]=n.type===`case`?wa[n.mode]??String(n.mode):L().modifierSummary(n);for(let n of L().filterSetsOf(e,`items`))for(let e of n.own?.filters||[]){let n=e.op,r=e.match;e.type===`rewrite-item`&&n?.kind===`case`?t.case=wa[n.mode??``]??String(n.mode):e.type===`rewrite-item`&&n?.kind===`tidy`?t.tidy=`on`:e.type===`keep-first`?t[`keep-first`]=String(n?.n??``):e.type===`drop-item`&&r?.duplicate?t.dedupe=`on`:e.type===`drop-item`&&r?.echoes&&(t[`drop-echoes`]=`on`)}return t}function Ea(e,t){let n=L().scenarioProfile(e,t),r=L().targetsOf(e)[t],i=e.profiles,a=!r?.connection||!!i&&Object.hasOwn(i,L().answerKey(r.connection.id,r.profile?.id??null));return n?a?{connection:n.name,profile:r?.profile?.name??null}:{connection:null,profile:n.name}:{connection:null,profile:null}}var Da=(e,t)=>{if(L().recordedTargetOf(e,t))return null;let{connection:n,profile:r}=Ea(e,t);return[n,r].filter(Boolean).join(`, `)||null};function Oa(e){let t=e.snapshot||{},n=L().contentOf(t),r=e.results||[],i=L().targetsOf(t),a=t.jobs||[],o=aa(t,r,e.status),s=ia(r,o),c=i.map((e,n)=>{let r=s[n]??ea(),i=(a.length?L().stagesFor(t,n).connections:[]).map(e=>String(e.model||``)),c=i[0]?new Set(i).size===1?i[0]:i.join(` → `):``,l=ta(r),u=L().overallVerdict(o[n]??[],t.pass);return{name:L().targetLabel(t,n),id:e?.id,model:c,setupProfile:L().scenarioProfile(t,n),...Ea(t,n),modifiers:Ta(t.jobs?.at(-1)),percent:l,passed:r.passed,cases:r.ran,pass:u,detail:u==null?`not graded`:la(o[n]??[]),evals:la(o[n]??[]),evalParts:ua(o[n]??[]),ms:r.ms,ran:r.ran}}),l=e.progress||{},u=l.n??l.total??0;return{at:e.submittedAt,run:e.id,status:e.status,cancelled:e.status===`cancelled`,startedAt:e.startedAt,finishedAt:e.finishedAt,setup:t.name||``,pipelineId:t.id||``,comment:t.comment||``,plugins:(t.plugins||[]).map(e=>`${e.id} ${e.version}`).join(`, `),done:u,total:l.total??u,content:n&&L().CONTENT_TYPES[n.type]?.inline?`text`:n?.type===`source`&&(n.ref?.name||n.ref?.id)||``,sourceId:n?.type===`source`&&n.ref?.id||``,scenarios:c,rerunOf:e.rerunOf??null,rerunOfAt:e.rerunOfAt??null}}var ka=(e,t)=>({key:`state`,label:`State`,value:t?`Stopping`:Ni(e),tone:e===`done`?`good`:[`failed`,`incomplete`,`cancelled`,`interrupted`].includes(e)?`bad`:null}),Aa=e=>e.length?e.reduce((e,t)=>e+t,0)/e.length:null;function ja(e){let t=0,n=0;for(let r of e||[])for(let e of r?.scenarios||[])for(let r of Object.values(e?.scores||{}))if(r&&!L().isSkipped(r))for(let e of r.metrics||[])typeof e.asked==`number`&&(t++,n+=e.asked);return{calls:t,ms:n}}function Ma(e,t=!1){let n=e.tallies,r=n.reduce((e,t)=>e+t.passed,0),i=n.reduce((e,t)=>e+t.ran,0),a=n.map(ta).filter(e=>e!=null),o=a.length?`${Math.round(Aa(a))}%`:`—`,s=Li(e.startedAt,e.finishedAt),c=ja(e.results),l={key:`ran`,label:`Run Items`,of:e.progress.total?[e.progress.n,e.progress.total]:null};return{lead:i?{key:`pct`,label:`% Passed Items`,value:`${Math.round(100*r/i)}%`}:{...l,key:`lead-ran`},rest:[{key:`run`,label:`Run ID`,value:e.at?(0,X.createElement)(`code`,null,Oi(e.at)):`—`},ka(e.status,t),{key:`score`,label:`Avg Score`,value:o},{key:`duration`,label:`Duration`,value:s==null?`—`:Ii(s)},...c.calls?[{key:`grader`,label:`Grader`,value:`${c.calls} ${c.calls===1?`call`:`calls`}, ${Ii(c.ms)}`}]:[],...i?[l]:[],{key:`start`,label:`Start Date`,value:e.at&&Ft(e.at)||`—`},...e.snapshot.comment?[{key:`comment`,label:`Comment`,value:(0,X.createElement)(`span`,{className:`fig-comment`,title:e.snapshot.comment},e.snapshot.comment)}]:[]]}}var Na=e=>e.evals.length&&Qi(e.status)?`(Not graded)`:`—`;function Pa(e,t){let n=e.tallies[t],r={key:`time`,label:`Avg Time`,value:Fa(n)??`—`};return n?.ran?{lead:{key:`pct`,label:`% Passed Items`,value:`${Math.round(100*n.passed/n.ran)}%`},rest:[{key:`score`,label:`Score`,value:ta(n)==null?`—`:`${ta(n)}%`},r]}:e.evals.length&&Qi(e.status)&&La(e,t)==null?{lead:{key:`pct`,label:`% Passed Items`,value:Na(e)},rest:[r]}:{lead:r,rest:[]}}function Fa(e){return e?.timed?Ii(e.ms/e.timed):null}function Ia(e,t=!1){let n=t?`Stopping`:Ni(e.status);return e.status===`queued`?{state:n,detail:e.behind?`behind ${e.behind}`:`next in line`}:e.status===`running`?{state:n,detail:e.progress.current||``}:null}function La(e,t){return L().overallVerdict(e.outcomes[t]??[],e.snapshot.pass)}function Ra(e,t){let n=e.content?.type===`source`?e.content.source:null;return n===`samples`?`/api/samples/thumbs/${encodeURIComponent(t)}`:n?`/api/sources/${encodeURIComponent(n)}/thumbs/${encodeURIComponent(t)}`:``}function za(e,t){let n=e.content?.type===`source`?e.content.source:null;return n===`samples`?`/api/samples/zoom/${encodeURIComponent(t)}`:n?`/api/sources/${encodeURIComponent(n)}/zoom/${encodeURIComponent(t)}`:`/api/samples/zoom/${encodeURIComponent(t)}`}var Ba=(e,t)=>t==null||t===``?null:`${e}: ${t}`,Va=e=>(e||[]).map(String).join(`, `),Ha=e=>e.length?e.every(t=>t===e[0])?String(e[0]):e.join(` → `):``,Ua=e=>{let t=L().OUTPUT_KINDS[L().lastKind(e)??L().defaultKind()];return t?!t.terms:!1},Wa=e=>{let t=e.metric&&String(e.metric)||L().METRICS[e.type]?.label||e.type,n=L().metricCheck(e);return[e.not?`not`:``,`${t}${n?` ${n}`:``}`,e.weight===0?`(watched, not scored)`:typeof e.weight==`number`&&e.weight!==1?`×${e.weight}`:``].filter(Boolean).join(` `)};function Ga(e,t,n,r){let i=L().readCase(t,n,Ua(e)),{stages:a,connections:o}=L().stagesFor(e,r),s=o.map(e=>L().connectionSettings(e)),c=e=>Ha(s.map(e)),l=L().evalsDataset(e);return[`An eval case is failing.`,``,`## The case`,Ba(`item`,L().caseItem(t)),Ba(`case id`,t.id),Ba(`note`,t.note),...(t.metrics||[]).map((e,t)=>Ba(`metric ${t+1}`,Wa(e))),``,`## What came back`,Ba(`verdict`,i.pass?`pass`:`fail`),Ba(`score`,i.score==null?`—`:`${Math.round(i.score*100)}%`),Ba(`items`,Va(n?.terms)||`(none)`),Ba(`missed`,Va((i.missed??[]).map(e=>Array.isArray(e)?e.join(` / `):e))),Ba(`invented`,Va(i.invented)),Ba(`dropped`,Va((n?.dropped||[]).map(e=>`${e.item} (${e.by})`))),Ba(`reasons`,Va(i.reasons)),Ba(`error`,n?.error),Ba(`took`,n?.ms==null?null:`${n.ms} ms`),``,`## How it was asked`,Ba(`scenario`,`${r+1} of ${L().targetsOf(e).length}`),Ba(`model`,c(e=>e.model)),Ba(`endpoint`,c(e=>e.url||`(the lab's own Ollama)`)),Ba(`connection type`,c(e=>Ei(String(e.type??``)))),Ba(`image`,a[0]?.withImage?Ka(s[0]):`no image`),Ba(`seed`,c(e=>e.seed||`1234`)),Ba(`reply tokens`,c(e=>e.nPredict||e.maxTokens||`not set`)),Ba(`repeat penalty`,c(e=>e.repeatPenalty||`(profile default)`)),Ba(`other decoding`,qa(s.at(-1))),Ba(`modifiers`,(L().outOf(e.jobs.at(-1))?.modifiers||[]).map(e=>`${L().MODIFIERS[e.type]?.label??e.type}: ${L().modifierSummary(e)}`).join(`; `)||`none`),``,`## The prompt`,...a.flatMap((e,t)=>[a.length>1?`job ${t+1}${e.withImage?` (with image)`:``}, answering as ${e.kind}, on ${String(o[t]?.name||`unnamed`)}:`:null,e.text]),``,`## Where things live`,l?`the graded set: ${l.name||l.id} (this case is id "${t.id}")`:null,`the parser and scorer, shared by the lab, the CLI and CI: evals-core.ts`,`what the grading means: the dataset's README`].filter(e=>e!==null).join(`
5
- `)}function Ka(e){let{px:t,format:n}=L().connectionImage(e);return`${t==null?`default budget`:L().budgetLabel(t)}, ${n.replace(`image/`,``).toUpperCase()}`}function qa(e){let t=(t,n)=>String(e?.[t]??``).trim()?[`${n} ${e?.[t]}`]:[];return[...t(`frequencyPenalty`,`frequency`),...t(`presencePenalty`,`presence`),...String(e?.dryMultiplier??``).trim()?[`DRY`]:[],...String(e?.grammar??``).trim()?[`grammar`]:[]].join(`, `)}function Ja(e,t){let n=[];return!Qi(e.status)||!L().evalsDataset(e.snapshot)||(e.results||[]).forEach((r,i)=>{r&&!r.unrun&&(r.scenarios||[]).forEach((a,o)=>{let s=t.find(e=>L().caseItem(e)===r.name);oa(e,i,o)&&s&&a.res&&n.push({kase:s,res:a.res,scenarioIndex:o,item:r.name??``})})}),n}var Ya=e=>{let t=Math.min(...e),n=Math.max(...e);return t===n?String(t):`${t}–${n}`};function Xa(e,t,n){let r=L().evalsDataset(e.snapshot);if(!Qi(e.status)||!r)return[];let i=e.outcomes[n]?.find(t=>e.evals.find(e=>e.id===t.id&&L().casesRef(e))),a=new Map(t.map(e=>[L().caseItem(e),e])),o=new Map,s=(e,t,n,r,i,a)=>{let s=o.get(e);s||(s={key:e,label:n,note:null,files:[],rank:t,counts:[],limits:[]},o.set(e,s)),s.files.includes(r)||s.files.push(r),i!=null&&s.counts.push(i),a!=null&&s.limits.push(a)};return e.results.forEach((e,t)=>{if(!e||e.unrun||!e.name)return;let r=a.get(e.name),o=e.scenarios?.[n]?.res,c=i?.items[t];if(!r||r.todo||!o||!c||L().isSkipped(c)||c.pass)return;let l=e.name;if(o.error){s(`error`,6,`Error`,l);return}let u=(o.terms||[]).length,d=(r.metrics||[]).filter(e=>e.type===`item-count`&&e.weight!==0),f=(c.metrics??[]).filter(e=>e.type===`item-count`&&e.weight!==0);d.forEach((e,t)=>{let n=f[t];if(e.not||!n||n.pass)return;let r=e.max==null||e.max===``?null:Number(e.max),i=e.min==null||e.min===``?null:Number(e.min);r!=null&&u>r?s(`over`,0,`Too many items`,l,u,r):i!=null&&s(`under`,1,`Too few items`,l,u,i)});for(let e of c.missed??[])Array.isArray(e)?s(`none:${e.join(`/`)}`,3,`None of ${e.join(` / `)}`,l):s(`missed:${e}`,2,`Missed ${e}`,l);for(let e of c.invented??[])s(`invented:${e}`,4,`Invented ${e}`,l)}),[...o.values()].sort((e,t)=>e.rank-t.rank||t.files.length-e.files.length||e.label.localeCompare(t.label)).map(({key:e,label:t,files:n,counts:r,limits:i})=>({key:e,label:t,files:n,note:r.length&&i.length?`${Ya(r)}, ${e===`over`?`max`:`min`} ${Ya(i)}`:null}))}var Za=[{id:`home`,label:`Home`,icon:Xe,built:!0},{id:`runs`,label:`Runs`,icon:le,built:!0},{id:`history`,label:`History`,icon:ke,built:!0},{id:`library`,label:`Library`,icon:$e,built:!0},{id:`setup`,label:`Setup`,icon:Pt,built:!0}],Qa=e=>e.replace(/[^A-Za-z0-9._-]+/g,`-`).replace(/^[-.]+|[-.]+$/g,``);function $a(e=new Date){let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}${t(e.getMonth()+1)}${t(e.getDate())}-${t(e.getHours())}${t(e.getMinutes())}`}function eo(e,t,n,r,i=new Date){return`${e}-${Qa(t)||e}-v${n}-${$a(i)}.${r}`}function to(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(n),0)}var no=()=>Rr({tab:`library`,section:`datasets`,id:null}),ro=e=>Rr({tab:`library`,section:`datasets`,id:e}),io=()=>zr({tab:`library`,section:`datasets`,id:null}),ao=(e,t=location.hash)=>`/w/${encodeURIComponent(e)}${t}`,oo=(e,t,n)=>n?`No ${e} ${t} in ${n.name}`:`No ${e} ${t}`,so=`promptlab.ws.undo`;function co(e){try{localStorage.setItem(so,JSON.stringify(e))}catch{}}function lo(){let e=null;try{e=localStorage.getItem(so),localStorage.removeItem(so)}catch{return null}if(!e)return null;try{let t=JSON.parse(e);return t&&t.id&&t.slug&&t.name?{id:t.id,slug:t.slug,name:t.name}:null}catch{return null}}function uo(e){let t=e.filter(e=>!e.archived);return t.length?[...t].sort((e,t)=>(t.lastUsed??``).localeCompare(e.lastUsed??``)||Number(t.isDefault)-Number(e.isDefault))[0]??null:null}var fo=(0,X.createContext)({current:{id:`default`,slug:`default`,name:`Default`,archived:!1,isDefault:!0},requestedSlug:null,list:[],switchTo:()=>{}}),po=()=>(0,X.useContext)(fo),mo=1600,ho=(0,X.createContext)(null);function go({children:e}){let t=po(),[n,r]=(0,X.useState)(null),i=(0,X.useRef)(null);(0,X.useEffect)(()=>()=>{i.current&&clearTimeout(i.current)},[]);let a=t.current?.slug??null,o=(0,X.useCallback)(e=>{a&&Ne(_o(a,e)).then(e=>{r(e?`Copied to clipboard.`:`Could not copy.`),i.current&&clearTimeout(i.current),i.current=setTimeout(()=>r(null),mo)})},[a]);return(0,$.jsxs)(ho.Provider,{value:o,children:[e,n&&(0,$.jsx)(`div`,{className:`undo-toast copy-link-said`,role:`status`,children:(0,$.jsx)(`span`,{className:`undo-label`,children:n})})]})}var _o=(e,t)=>`${location.origin}${ao(e,Lr(t))}`;function vo(){let e=(0,X.useContext)(ho),t=po();return(0,X.useCallback)(n=>({label:`Copy link`,icon:Y.link,onSelect:()=>{e?e(n):t.current&&Ne(_o(t.current.slug,n))}}),[e,t.current])}var yo={"eval-group":{noun:`eval group`,href:e=>Lr({tab:`library`,section:`datasets`,id:e})},"filter-set":{noun:`filter set`,href:e=>Lr({tab:`library`,section:`filters`,id:e})},prompt:{noun:`prompt`,href:e=>Lr({tab:`library`,section:`prompts`,id:e})},source:{noun:`Source`,href:e=>Lr({tab:`library`,section:`sources`,id:e})},pipeline:{noun:`pipeline`,href:e=>Lr({tab:`runs`,id:e})}};function bo(e){let t=new Set,n=new Set,r=new Set,i=new Set,a=(e,t)=>{typeof t==`string`&&t&&e.add(t)},o=Array.isArray(e?.evals)?e.evals:[];for(let e of o)a(t,e?.group?.id),a(t,e?.dataset?.id);for(let t of e?.targets??[])for(let e of t?.steps??[])a(n,e?.from?.id);for(let t of e?.jobs??[])for(let e of t?.steps??[])if(e?.content?.type===`source`&&a(i,e.content.ref?.id),Array.isArray(e?.filterSets))for(let t of e.filterSets)a(r,t?.set?.id);let s=L().profileIds(e)??[];return{groups:[...t],prompts:[...n],filterSets:[...r],sources:[...i],profiles:s}}var xo=(e,t)=>e?.find(e=>e.id===t)?.name||t;function So(e,t){if(e.kind===`pipeline`){let n=t.pipelines.find(t=>t.id===e.id);if(!n)return[];let r=bo(n.work),i=[],a=(e,t,n)=>{for(let r of t)i.push({kind:e,id:r,name:xo(n,r),href:yo[e].href(r)})};return a(`eval-group`,r.groups,t.groups),a(`prompt`,r.prompts,t.prompts),a(`filter-set`,r.filterSets,t.filterSets),a(`source`,r.sources,t.sources),i}let n={"eval-group":`groups`,"filter-set":`filterSets`,prompt:`prompts`,source:`sources`}[e.kind],r=t.pipelines.filter(t=>bo(t.work)[n].includes(e.id)).map(e=>({kind:`pipeline`,id:e.id,name:e.name,href:yo.pipeline.href(e.id)})),i=e.kind===`source`?(t.groups??[]).filter(t=>t.preview?.id===e.id).map(e=>({kind:`eval-group`,id:e.id,name:e.name||e.id,href:yo[`eval-group`].href(e.id)})):[];return[...r,...i]}function Co({subject:e,scan:t,undo:n,onClose:r,onChanged:i,accountShare:a}){let o=Z(),s=po();return s.current?(0,$.jsx)(ht,{api:o,subject:e,workspaces:s.list,current:s.current,dependents:So(e,t),undo:n,onClose:r,onChanged:i,accountShare:a}):null}function wo({undo:e}){let t=vo(),n=vr(),{list:r,error:i}=yr(),[o]=Q(`promptlab.workflows`),[s,c]=a(`eval-groups`,20),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(null),[p,h]=(0,X.useState)(null),[g,_]=(0,X.useState)(null),v=(0,X.useRef)(null),[,y]=(0,X.useState)(0);(0,X.useEffect)(()=>n.subscribe(()=>y(e=>e+1)),[n]),(0,X.useEffect)(()=>{for(let e of r??[])n.load(e.id)},[r,n]);let b=e=>f(e instanceof Error?e.message:String(e)),x=(0,X.useMemo)(()=>{let e=new Map;for(let t of o.list)for(let n of t.work.evals??[]){if(n.type!==`group`)continue;let r=n,i=r.group?.id??r.own?.casesFrom?.id;if(!i)continue;let a=e.get(i)??{names:[],pinned:!1};a.names.includes(t.name)||a.names.push(t.name),typeof r.pin==`number`&&(a.pinned=!0),e.set(i,a)}return e},[o.list]),S=(r??[]).map(e=>({...e,body:n.entry(e.id)?.doc?.body??null,links:x.get(e.id)??{names:[],pinned:!1}})),C=()=>new Set((n.list().list??[]).map(e=>e.name)),w=async()=>{f(null);try{ro((await n.create(Eo(`Untitled eval group`,C()))).id)}catch(e){b(e)}},T=async t=>{f(null);try{await n.flush(t.id);let r=await n.remove(t.id);e.offer({label:`Deleted ${t.name}`,restore:()=>{n.restore(r).catch(b)}})}catch(e){b(e)}},E=async e=>{f(null);let t;try{t=await To(e)}catch(e){b(e);return}let r;try{r=JSON.parse(t)}catch(e){f(`Not JSON: ${e instanceof Error?e.message:String(e)}`);return}h(`import`);try{let e=await n.importFile(r);e[0]&&ro(e[0].id)}catch(e){b(e)}finally{h(null)}},D=async()=>{h(`exportAll`);try{let e=await fetch(n.exportAllUrl());if(!e.ok)throw Error(`the export answered ${e.status}`);let t=await e.json();to(new Blob([JSON.stringify(t,null,2)+`
6
- `],{type:`application/json`}),eo(`eval-groups`,`all`,t.version,`json`))}catch(e){b(e)}finally{h(null)}},O=e=>[{label:`Open`,icon:Yt,onSelect:()=>ro(e.id)},t({tab:`library`,section:`datasets`,id:e.id}),{label:`Copy or move…`,icon:Y.transfer,onSelect:()=>_(e)},{label:`Delete`,icon:Y.remove,destructive:!0,onSelect:()=>void T(e)}],k=e=>e.scoring.mode===`weighted`?`Points`:`All`,A=[{key:`group`,header:`Eval group`,role:`title`,sort:e=>e.name.toLowerCase(),cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`eg-open`,onClick:()=>ro(e.id),children:e.name})},{key:`preview`,header:`Preview Source`,sort:e=>e.preview?.name??``,tdProps:e=>({"data-state":e.preview?void 0:`none`}),cell:e=>e.preview?.name??`None`},{key:`cases`,header:`Cases`,className:`num`,sort:e=>e.cases,cell:e=>e.cases},{key:`every`,header:`Every item`,className:`num`,sort:e=>e.body?.every.length??-1,cell:e=>e.body?e.body.every.length:`…`},{key:`scoring`,header:`Scoring`,sort:e=>e.body?k(e.body):``,cell:e=>e.body?k(e.body):`…`},{key:`linked`,header:`Linked by`,sort:e=>e.links.names.length,tdProps:e=>({"data-state":e.links.names.length?void 0:`none`}),cell:e=>e.links.names.length?(0,$.jsx)(`span`,{title:e.links.names.join(`, `),children:`${e.links.names.length} ${e.links.names.length===1?`pipeline`:`pipelines`}${e.links.pinned?`, pinned`:``}`}):`—`},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${e.name} actions`,actions:O(e)})}],j=[{label:`Import JSON…`,icon:Ue,busy:p===`import`,onSelect:()=>v.current?.click()},{label:`Export all`,icon:Mn,disabled:!r?.length,busy:p===`exportAll`,onSelect:()=>void D()},{label:`Page size…`,icon:Y.pageSize,onSelect:()=>u(!0)}];return(0,$.jsxs)(J,{id:`evals`,title:`Evals`,note:r?String(r.length):void 0,actions:j,about:`Checks of a reply, defined once and linked by the pipelines they grade.`,children:[(0,$.jsx)(`input`,{ref:v,type:`file`,accept:`.json,application/json`,hidden:!0,"aria-label":`Import JSON file`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&E(t)}}),r===null?(0,$.jsx)(Ot,{label:`Eval groups`,error:i,onRetry:()=>void n.refresh()}):r.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No eval groups yet.`}):(0,$.jsx)(m,{className:`eg-groups`,cards:!0,label:`Eval groups`,rows:S,rowKey:e=>e.id,pageSize:s,columns:A}),d&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:d}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost eg-add`,onClick:()=>void w(),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add eval group`]}),l&&(0,$.jsx)(re,{value:s,onChange:c,onClose:()=>u(!1)}),g&&(0,$.jsx)(Co,{subject:{kind:`eval-group`,id:g.id,name:g.name},scan:{pipelines:o.list},undo:e,onClose:()=>_(null),onChanged:()=>void n.refresh()})]})}function To(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result??``)),r.onerror=()=>n(r.error??Error(`The file could not be read.`)),r.readAsText(e)})}var Eo=(e,t)=>{if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`};function Do(e){return[e.every&&`Every reply`,e.not&&`Not`,e.of===`said`&&`Raw reply`,e.weight!=null&&`Weight ${e.weight}`].filter(Boolean).join(`, `)}var Oo=(e,t)=>({type:e,...L().METRICS[e].defaults(),...t?.weight==null?{}:{weight:t.weight},...t?.not?{not:!0}:{},...t?.metric?{metric:t.metric}:{}});function ko({label:e,metrics:t,set:n,undoable:r,over:i=`item`,rawReply:a}){let o=L(),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(null),d=(e,r)=>n(t.map((t,n)=>n===e?r:t)),f=e=>{s===`new`?n([...t,Oo(e)]):typeof s==`number`&&d(s,Oo(e,t[s])),c(null)};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(et,{noun:`metric`,items:[...t],empty:(0,$.jsx)(`p`,{className:`note`,children:`(No metrics)`}),onAdd:()=>c(`new`),onRemove:e=>r(t.filter((t,n)=>n!==e),`Removed a metric`),onRename:e=>u(e),extra:(e,t)=>[{label:`Change type…`,icon:Jn,onSelect:()=>c(t)}],renderItem:(t,n,r)=>{let s=o.METRICS[t.type],c=(t.metric||s?.label||t.type)+(t.not?` (not)`:``)+(t.weight===0?` (watch)`:``),l=`${e.replace(/\W+/g,`-`).toLowerCase()}-metric-${n}`,u=!!(t.every||t.not||t.of||t.weight!=null),f=!s?.parsedOnly&&(a!==!1||t.of===`said`),p=!s?.expects||!!t.not,m=(s?.options??[]).map(e=>it(e,t,e=>d(n,e)));return(0,$.jsx)(J,{id:l,title:c,level:3,actions:r,about:s?.description,children:(0,$.jsxs)(k,{children:[m.length>0&&(0,$.jsx)(V,{label:`${e}, metric ${n+1}`,rows:m}),(0,$.jsx)(J,{id:`${l}-counts`,title:`Options`,level:3,open:u,note:u?Do(t):`Defaults`,children:(0,$.jsx)(V,{label:`${e}, metric ${n+1}, options`,rows:[...i===`run`?[{key:`every`,label:`Every reply`,control:{type:`checkbox`,checked:!!t.every,onChange:e=>{let{every:r,...i}=t;d(n,e?{...i,every:!0}:i)}}}]:[],...p?[{key:`not`,label:`Not`,control:{type:`checkbox`,checked:!!t.not,onChange:e=>{let{not:r,...i}=t;d(n,e?{...i,not:!0}:i)}}}]:[],...f?[{key:`of`,label:`Reads`,...a==null?{hint:`The text before Read as`}:{},control:{type:`select`,value:t.of??`reply`,options:[{value:`reply`,label:`Parsed reply`},{value:`said`,label:`Raw reply`}],onChange:e=>{let{of:r,...i}=t;d(n,e===`said`?{...i,of:`said`}:i)}}}]:[],{key:`weight`,label:`Weight`,width:`quarter`,control:{type:`text`,value:t.weight==null?``:String(t.weight),placeholder:`1`,onChange:e=>{let{weight:r,...i}=t;d(n,e.trim()?{...i,weight:/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e}:i)}}}]})})]})},n)}}),l!==null&&t[l]&&(0,$.jsx)(Tt,{title:`Rename metric`,value:t[l].metric||o.METRICS[t[l].type]?.label||t[l].type,onCommit:e=>{let{metric:n,...r}=t[l];d(l,e&&e!==o.METRICS[r.type]?.label?{...r,metric:e}:r)},onClose:()=>u(null)}),s!==null&&(0,$.jsx)(Ao,{title:s===`new`?`Add metric`:`Change type`,current:typeof s==`number`?t[s]?.type??null:null,over:i,onPick:f,onClose:()=>c(null)})]})}function Ao({title:e,current:t,over:n,onPick:r,onClose:i}){let[a,o]=(0,X.useState)(``),s=(0,X.useMemo)(()=>{let e=new Map;for(let[t,r]of Object.entries(L().METRICS)){if(n===`run`&&(r.graded||r.perItem))continue;let i=`${r.label} ${r.description??``}`.toLowerCase();if(a.trim()&&!i.includes(a.trim().toLowerCase()))continue;let o=r.family??`Other`;e.set(o,[...e.get(o)??[],{id:t,label:r.label,description:r.description??``}])}return[...e]},[a,n]);return(0,$.jsxs)(R,{title:e,onClose:i,className:`metric-picker`,children:[(0,$.jsx)(`input`,{type:`search`,className:`mp-search`,"aria-label":`Find a metric`,placeholder:`Find a metric`,value:a,onChange:e=>o(e.target.value),autoComplete:`off`}),s.length===0&&(0,$.jsx)(`p`,{className:`note`,children:`No metric matches.`}),s.map(([e,n])=>(0,$.jsxs)(`fieldset`,{className:`mp-family`,children:[(0,$.jsx)(`legend`,{children:e}),(0,$.jsx)(`div`,{className:`mp-grid`,children:n.map(e=>(0,$.jsx)(`button`,{type:`button`,className:`mp-type${e.id===t?` on`:``}`,...e.id===t?{"aria-current":`true`}:{},title:e.description,onClick:()=>r(e.id),children:e.label},e.id))})]},e))]})}function jo(e,t,n=[]){return{options:[...n.map(e=>({...e,fixed:!0})),...e.map(e=>{let n=t(e.id);return{id:e.id,label:e.name||`Untitled`,used:n?{at:n,label:Ft(n)}:null,...e.missing?{missing:!0}:{}}})],recent:e.filter(e=>!e.missing&&t(e.id)).sort((e,n)=>t(n.id).localeCompare(t(e.id))).slice(0,5).map(e=>e.id)}}var Mo=50,No=null;_n.addEventListener(`write`,()=>{No=null});function Po(e){return No?.api!==e&&(No={api:e,at:Promise.resolve().then(()=>e.queue({limit:Mo})).then(({runs:e})=>{let t={};for(let n of e)for(let[e,r]of Object.entries(n.snapshot?.profiles??{})){let i=L().answerConnectionId(e,r);i&&(!t[i]||t[i]<n.submittedAt)&&(t[i]=n.submittedAt)}return t},()=>({}))}),No.at}function Fo(){let e=Z(),[t]=Q(`promptlab.connections`),[n,r]=(0,X.useState)({});(0,X.useEffect)(()=>{let t=!0,n=()=>{Po(e).then(e=>{t&&r(e)})};return n(),_n.addEventListener(`write`,n),()=>{t=!1,_n.removeEventListener(`write`,n)}},[e]);let i=e=>t.list.find(t=>t.id===e)?.model?.trim()||void 0;return(e,t=[])=>{let{options:r,recent:a}=jo(e,e=>n[e]??null,t);return{options:r.map(e=>e.fixed?e:{...e,detail:i(e.id)}),recent:a,usedLabel:`Last used`,detailLabel:`Model`}}}function Io({name:e,body:t,onSave:n,onClose:r}){let[i]=(0,X.useState)(()=>JSON.stringify(t,null,2)),[a,o]=(0,X.useState)(i),[s,c]=(0,X.useState)(()=>Ro(a));(0,X.useEffect)(()=>{let e=setTimeout(()=>c(Ro(a)),400);return()=>clearTimeout(e)},[a]);let l=s.problems;return(0,$.jsxs)(R,{title:`Edit raw… ${e}`,onClose:r,wide:!0,dirty:a!==i,children:[(0,$.jsx)(`textarea`,{className:`raw-content`,"aria-label":`Dataset JSON`,spellCheck:!1,value:a,onChange:e=>o(e.target.value)}),(0,$.jsxs)(`div`,{className:`raw-foot`,children:[(0,$.jsx)(`span`,{className:`note ${l.length?` bad`:``}`,role:l.length?`alert`:void 0,children:l.length?`${l.length} to fix — ${l.join(`, `)}`:`Validated before it is accepted.`}),a===i?(0,$.jsx)(`button`,{type:`button`,className:`run`,onClick:r,children:`Close`}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:r,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`run`,onClick:()=>{let e=Ro(a);e.body?n(e.body):c(e)},disabled:l.length>0,children:`Save & Close`})]})]})]})}var Lo=[`version`,`source`,`scoring`,`grader`,`every`,`run`,`cases`];function Ro(e){let t;try{t=JSON.parse(e)}catch(e){return{body:null,problems:[`Not JSON: ${e instanceof Error?e.message:String(e)}`]}}if(!t||typeof t!=`object`||Array.isArray(t))return{body:null,problems:[`a dataset has to be a JSON object`]};let n=t,r=[];for(let e of Object.keys(n))Lo.includes(e)||r.push(`${e} is not part of a dataset`);Array.isArray(n.cases)||r.push(`cases has to be a list`);let i=L().DATASET_BODY_VERSION;if(`version`in n&&n.version!==i&&r.push(`version has to be ${i}`),r.length)return{body:null,problems:r};let a=rr(),o={version:i,scoring:n.scoring??a.scoring,grader:n.grader??null,every:n.every??[],run:n.run??[],cases:n.cases};return r.push(...L().validateEvals(o)),r.length?{body:null,problems:r}:{body:o,problems:[]}}function zo(e,t){return`/api/sources/${encodeURIComponent(e)}/thumbs/${encodeURIComponent(t)}`}function Bo(e){return/\.(?:jpe?g|png|gif|webp|bmp|heic|heif|dng|tiff?)$/i.test(e)}function Vo(e){let t=Z(),[n,r]=(0,X.useState)(null);return(0,X.useEffect)(()=>{if(!e)return;let n=!0;return t.source(e).then(t=>{n&&r({id:e,files:t.files.map(e=>e.name)})}).catch(()=>{n&&r(null)}),()=>{n=!1}},[t,e]),e&&n?.id===e?n.files:null}function Ho({title:e,action:t,start:n,taken:r,initial:i=``,onPick:a,onClose:o}){let s=Z(),[c,l]=(0,X.useState)(null);(0,X.useEffect)(()=>{let e=!0;return s.sources().then(t=>{e&&l(t.sources)}).catch(()=>{e&&l([])}),()=>{e=!1}},[s]);let[u,d]=(0,X.useState)(n),f=Vo(u?.id),p=(0,X.useMemo)(()=>(f??[]).filter(e=>!r.has(e)),[f,r]),[m,h]=(0,X.useState)(i),[g,_]=(0,X.useState)(!!i);(0,X.useEffect)(()=>{!g&&p[0]&&h(p[0])},[g,p]);let[v,y]=(0,X.useState)(``),b=p.filter(e=>!v.trim()||e.toLowerCase().includes(v.trim().toLowerCase())),x=m.trim(),S=!!x&&r.has(x),C=[{key:`browse`,label:`Browse`,control:{type:`picker`,kind:`Source`,value:u?.id??``,usedLabel:`Last changed`,...jo(c??(n?[n]:[]),e=>c?.find(t=>t.id===e)?.changed??null,[{id:``,label:`None`}]),onChange:e=>{let t=c?.find(t=>t.id===e)??(n?.id===e?n:null);d(t?{id:t.id,name:t.name}:null),_(!0),y(``)}}},{key:`item`,label:`Item`,width:`full`,control:{type:`text`,value:m,onChange:e=>{_(!0),h(e)}}}];return(0,$.jsxs)(R,{title:e,onClose:o,className:`item-picker`,footer:(0,$.jsxs)(`div`,{className:`edit-actions`,children:[S&&(0,$.jsxs)(`span`,{className:`note bad`,role:`alert`,children:[x,` has a case`]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:o,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`edit-done`,disabled:!x||S,onClick:()=>a(x),children:t})]}),children:[(0,$.jsx)(V,{label:e,rows:C}),u&&f&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`input`,{type:`search`,className:`ip-search`,"aria-label":`Find an item`,placeholder:`Find an item`,value:v,onChange:e=>y(e.target.value),autoComplete:`off`}),(0,$.jsxs)(`fieldset`,{className:`ip-items`,children:[(0,$.jsxs)(`legend`,{className:`note`,children:[p.length,` `,p.length===1?`item`:`items`,` without a case`]}),p.length?b.length?b.map(e=>(0,$.jsxs)(`label`,{className:`ip-item${e===x?` on`:``}`,children:[(0,$.jsx)(`input`,{type:`radio`,name:`item`,checked:e===x,onChange:()=>h(e)}),Bo(e)?(0,$.jsx)(`img`,{src:zo(u.id,e),alt:``,loading:`lazy`}):(0,$.jsx)(`span`,{className:`ip-thumb`,"aria-hidden":`true`}),(0,$.jsx)(`span`,{className:`ip-name`,children:e})]},e)):(0,$.jsx)(`p`,{className:`note`,children:`No item matches.`}):(0,$.jsxs)(`p`,{className:`note`,children:[`Every item of `,u.name,` has a case.`]})]})]})]})}var Uo=2e3,Wo=e=>({id:``,item:e,todo:!0,note:``,metrics:[]}),Go=e=>{let t=e.map(e=>/^sample-(\d+)$/.exec(String(e?.id??``))?.[1]??0);return`sample-${String(Math.max(0,...t.map(Number))+1).padStart(3,`0`)}`};function Ko({item:e,cases:t,onWrite:n,problem:r,resultFor:a,scenarioCount:o,plain:s=!1,files:c,onFile:l,onClose:u,run:d,source:f=null,sourceFiles:p=null,onRemove:m}){let h=t.find(t=>L().caseItem(t)===e),g=!h,[_,v]=(0,X.useState)(()=>structuredClone(h??Wo(e))),[y,b]=(0,X.useState)(0),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(!1),[k,A]=(0,X.useState)(!1),j=(0,X.useRef)(_);j.current=_;let M=(0,X.useRef)(t);M.current=t;let N=(0,X.useRef)(null),P=t=>M.current.filter(n=>!(t.id&&n.id===t.id)&&!(!t.id&&L().caseItem(n)===e)).some(e=>L().caseItem(e)===L().caseItem(t))?`${L().caseItem(t)} has a case already`:L().validateEvals({cases:[{...t,id:t.id||`new`}]})[0]?.replace(/^[^:]*: /,``)??null,F=P(_),I=(0,X.useCallback)(()=>{let e=j.current;if(P(e))return!1;e.id||(e={...e,id:Go(M.current)},j.current=e,v(e));let t=e;return n(e=>qo({cases:e},t)),!0},[n,e]);(0,X.useEffect)(()=>()=>{N.current&&clearTimeout(N.current)},[]);let[R,z]=(0,X.useState)(!1),B=e=>{v(e),z(!0)},V=e=>{let t=j.current;B({...t,metrics:e,...t.todo&&!(t.metrics??[]).length&&e.length?{todo:!1}:{}})},ee=C&&C[y]?C[y]:a(y),te=!ee||_.todo||!(_.metrics??[]).length?null:L().readCase(_,ee,s),ne=async()=>{if(d&&!T){E(!0),S(null);try{let e=await d(L().caseItem(j.current));w(e),S(e.length?null:`No reply to grade.`)}catch(e){S(e instanceof Error?e.message:String(e))}finally{E(!1)}}},H=c.indexOf(e),U=e=>{let t=H<0?null:c[H+e];if(!t)return;let n=R||g;(!n||I())&&(n&&(O(!0),N.current&&clearTimeout(N.current),N.current=setTimeout(()=>O(!1),Uo)),l(t))};(0,X.useEffect)(()=>{let e=e=>{(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.target?.closest?.(`input, textarea, select, [contenteditable]`)||(e.preventDefault(),U(e.key===`ArrowRight`?1:-1)))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)});let re=()=>{(!R&&!g||I())&&u()},W=L().caseItem(_),ie=new Set(t.filter(t=>!(_.id&&t.id===_.id)&&L().caseItem(t)!==e).map(e=>L().caseItem(e))),ae=!!p&&!p.includes(W),oe=[{key:`item`,label:`Item`,control:f?{type:`static`,text:ae?`${W||`None`} (missing)`:W}:{type:`text`,value:W,onChange:e=>B({...j.current,item:e.trim()})}},{key:`todo`,label:`To do`,control:{type:`checkbox`,checked:!!_.todo,label:`Not graded yet`,onChange:e=>B({...j.current,todo:e})}},{key:`note`,label:`Note`,control:{type:`textarea`,value:_.note??``,onChange:e=>B({...j.current,note:e})}}],G=[];o>1&&G.push({key:`scenario`,label:`Show result of`,control:{type:`select`,value:String(y),options:Array.from({length:o},(e,t)=>({value:String(t),label:`Target ${L().targetLetter(t)}`})),onChange:e=>b(Number(e))}}),te&&(G.push({key:`verdict`,label:`Result`,control:{type:`static`,text:te.pass?`Pass`:`Fail`}}),te.watch.length&&G.push({key:`watch`,label:`Watch`,control:{type:`static`,text:`${te.watch.filter(e=>e.pass).length} of ${te.watch.length}`}}));let K=f&&W&&Bo(W)&&p?.includes(W)?{src:zo(f.id,W),file:W,source:f.name}:null,se=[...K?[{key:`preview`,title:`Preview`,children:(0,$.jsxs)(`div`,{className:`cf-preview`,children:[(0,$.jsx)(`img`,{src:K.src,alt:K.file,loading:`lazy`}),(0,$.jsxs)(`p`,{className:`note`,children:[K.file,` in `,K.source]})]})}]:[],{key:`case`,title:`Case`,rows:oe},{key:`metrics`,title:`Metrics`,children:(0,$.jsx)(ko,{label:`${W||`Case`} metrics`,metrics:_.metrics??[],set:V,undoable:V})},...G.length?[{key:`result`,title:`Result`,rows:G}]:[]],ce=[{label:`Previous`,icon:ot,disabled:H<=0,onSelect:()=>U(-1)},{label:`Next`,icon:i,disabled:H<0||H>=c.length-1,onSelect:()=>U(1)},...d?[{label:`Run`,icon:Wn,disabled:T,onSelect:()=>void ne()}]:[]],q=[{label:`Change item…`,icon:Gn,onSelect:()=>A(!0)},...m?[{label:`Remove`,icon:At,destructive:!0,onSelect:()=>{m(L().caseItem(j.current)),u()}}]:[]],le=x??r??(F?`Not saved: ${F}`:null);return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(st,{title:W||`Case`,status:le??(T?`Running…`:D?`Saved.`:void 0),...le?{statusBad:!0}:{},sections:se,...q.length?{menu:q}:{},actions:ce,dirty:R,adding:g,onSave:re,onClose:u}),k&&(0,$.jsx)(Ho,{title:`Change item`,action:`Change`,start:f,taken:ie,onPick:e=>{A(!1),B({...j.current,item:e})},onClose:()=>A(!1)})]})}function qo(e,t){let n=e.cases.findIndex(e=>e.id===t.id),r=structuredClone(e.cases);return n>=0?r[n]=structuredClone(t):r.push(structuredClone(t)),r}function Jo(e,t){return structuredClone(e.cases).filter(e=>L().caseItem(e)!==t)}var Yo=(0,X.createContext)(null);function Xo({children:e}){let t=vr(),[n,r]=(0,X.useState)(null),i=br(n?.dataset??null),a=(0,X.useCallback)((e,t)=>{r({item:e,...t})},[]),o=(0,X.useCallback)(e=>{r(t=>t&&{...t,item:e})},[]),s=i?.doc?.preview??null,c=Vo(s?.id),l=n?.dataset??``,u=(0,X.useCallback)(e=>{t.edit(l,t=>({...t,cases:e(t.cases)}))},[t,l]),d=(0,X.useMemo)(()=>({openCaseEditor:a}),[a]),f=i?.doc;return(0,$.jsxs)(Yo.Provider,{value:d,children:[e,n&&f&&(0,$.jsx)(Ko,{item:n.item,cases:f.body.cases,onWrite:u,problem:ir(i.sync),resultFor:n.resultFor??(()=>null),scenarioCount:n.scenarioCount??0,files:n.files??[],onFile:o,...n.run?{run:n.run}:{},...n.plain?{plain:!0}:{},source:s,sourceFiles:c,...n.onRemove?{onRemove:n.onRemove}:{},onClose:()=>r(null)},n.item)]})}function Zo(){let e=(0,X.useContext)(Yo);if(!e)throw Error(`useCaseEditor outside a CaseEditorProvider: the app mounts one at its root`);return e}function Qo({rows:e,shown:t,filters:n,onFilters:r,selected:i,onSelect:a,selectionActions:o,sourceFiles:s,noCase:c,pageSize:l,onEdit:u,onAdd:d,onRemove:f,loading:p,loadError:h,onRetry:g,children:v}){let y=t.map(Hr),b=y.filter(e=>i.has(e)).length,x=b>0&&b===y.length,S=t=>e.filter(e=>ni(e,s)===t).length,C={label:`Status`,value:n.status,onChange:e=>r({status:e}),options:[{value:`all`,label:`All`},{value:`graded`,label:`Graded ${S(`graded`)}`},{value:`todo`,label:`To do ${S(`todo`)}`},...s&&c?[{value:`missing`,label:`Missing ${S(`missing`)}`},{value:`nocase`,label:`No case ${c.length}`}]:[]]},w=n.status===`nocase`&&c?c.filter(e=>!n.file.trim()||e.toLowerCase().includes(n.file.trim().toLowerCase())):null,T=[{key:`show`,label:`Show`,value:n.show,onChange:e=>r({show:e}),options:[{value:`all`,label:`All`},{value:`selected`,label:`Selected`}]}];return p?(0,$.jsxs)(`div`,{className:`ds-casebody`,children:[v,(0,$.jsx)(Ot,{label:`Cases`,error:h,onRetry:g})]}):(0,$.jsxs)(`div`,{className:`ds-casebody`,children:[(e.length>0||!!c?.length)&&(0,$.jsx)(pe,{noun:`cases`,search:{label:`Item`,placeholder:`Search items`,value:n.file,onChange:e=>r({file:e})},filters:T,quick:C,...w?{}:{count:{shown:t.length,total:e.length}},lead:(0,$.jsx)(`label`,{className:`ev-check ev-all`,children:(0,$.jsx)($o,{all:x,some:b>0,disabled:!t.length,onChange:()=>a(e=>{let t=new Set(e);for(let e of y)x?t.delete(e):t.add(e);return t})})})}),v,w?w.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No items match.`}):(0,$.jsx)(`div`,{className:`ds-cases`,children:(0,$.jsx)(m,{className:`dstable`,cards:!0,label:`Items with no case`,rows:w,pageSize:l,defaultSort:null,rowKey:e=>e,columns:[{key:`item`,header:`Item`,role:`title`,sort:e=>e,cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`ds-file`,onClick:()=>d(e),children:e})},{key:`status`,header:`Status`,sort:()=>`No case`,cell:()=>(0,$.jsx)(`span`,{className:`ds-status ds-nocase`,children:`No case`})}]})}):e.length===0?(0,$.jsx)(`p`,{className:`ds-none`,children:`No cases.`}):(0,$.jsx)($.Fragment,{children:t.length===0?(0,$.jsxs)($.Fragment,{children:[i.size>0&&(0,$.jsx)(_,{count:i.size,noun:`case`,hidden:i.size,actions:o,onClear:()=>a(()=>new Set)}),(0,$.jsx)(`p`,{className:`note`,children:`No cases match these filters.`})]}):(0,$.jsx)(`div`,{className:`ds-cases`,children:(0,$.jsx)(m,{className:`dstable`,cards:!0,label:`Cases`,rows:t,pageSize:l,defaultSort:null,rowKey:e=>Hr(e),select:{noun:`case`,selected:i,onChange:e=>a(()=>e),actions:()=>o},columns:es(s,u,f)})})}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost ds-add`,onClick:()=>d(),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add case`]})]})}function $o({all:e,some:t,disabled:n,onChange:r}){let i=(0,X.useRef)(null);return(0,X.useEffect)(()=>{i.current&&(i.current.indeterminate=t&&!e)},[t,e]),(0,$.jsx)(`input`,{ref:i,type:`checkbox`,"aria-label":`Select all shown`,checked:e,disabled:n,onChange:r})}function es(e,t,n){let r=t=>ni(t,e);return[{key:`item`,header:`Item`,role:`title`,sort:e=>e.item,cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`ds-file`,onClick:()=>t(e.item),children:e.item})},{key:`status`,header:`Status`,sort:e=>ti[r(e)],tdProps:e=>({"data-state":r(e)}),cell:e=>(0,$.jsx)(`span`,{className:`ds-status ds-${r(e)}`,children:ti[r(e)]})},{key:`metrics`,header:`Metrics`,className:`num`,sort:e=>ts(e).length,cell:e=>ts(e).length},{key:`note`,header:`Note`,sort:e=>e.note??``,tdProps:e=>({"data-state":e.note?.trim()?void 0:`none`}),cell:e=>(0,$.jsx)(`span`,{className:`ds-note`,children:e.note})},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${e.item} actions`,actions:[{label:`Edit…`,icon:Y.edit,onSelect:()=>t(e.item)},{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>n(e.item)}]})}]}var ts=e=>(e.metrics??[]).filter(e=>e.weight!==0),ns={bounds:`Set count`,addTerm:`Add term`,removeTerm:`Remove term`,todo:`Mark To do`,graded:`Mark graded`},rs=[{value:`keep`,label:`Keep`},{value:`set`,label:`Set`},{value:`clear`,label:`Clear`}],is=e=>/^\s*\d+\s*$/.test(e)?Number(e):null;function as({kind:e,cases:t,keys:n,onApply:r,onClose:i}){let[a,o]=(0,X.useState)(`keep`),[s,c]=(0,X.useState)(`keep`),[l,u]=(0,X.useState)(``),[d,f]=(0,X.useState)(``),[p,m]=(0,X.useState)(`expect`),[h,g]=(0,X.useState)(``),[_,v]=(0,X.useState)(null),y=(0,X.useMemo)(()=>{switch(e){case`bounds`:{let e=a===`set`?is(l):null,t=s===`set`?is(d):null;return a===`set`&&e==null?`Min items needs a whole number.`:s===`set`&&t==null?`Max items needs a whole number.`:{type:`bounds`,min:a===`set`?{kind:`set`,n:e}:{kind:a},max:s===`set`?{kind:`set`,n:t}:{kind:s}}}case`addTerm`:return h.trim()?{type:`addTerm`,list:p,term:h}:`Name the term.`;case`removeTerm`:return h.trim()?{type:`removeTerm`,term:h}:`Name the term.`;case`todo`:return{type:`status`,todo:!0};case`graded`:return{type:`status`,todo:!1}}},[e,a,s,l,d,p,h]),b=(0,X.useMemo)(()=>{if(typeof y==`string`)return null;let{next:e,changed:r}=Yr(t,n,y);return{changed:r,problems:Xr(t,e,r)}},[y,t,n]),x=_??b?.problems??null,S=!!x&&x.cases.length>0,C=b?.changed.length??0,w=(0,X.useCallback)(()=>{if(typeof y==`string`)return;let e=r(y);e&&v(e)},[y,r]),T=e=>t=>{v(null),e(t)},E=[];return e===`bounds`&&(E.push({key:`min`,label:`Min items`,required:!0,control:{type:`select`,value:a,options:rs,onChange:T(e=>o(e))}}),a===`set`&&E.push({key:`minN`,label:`Min`,required:!0,width:`quarter`,control:{type:`text`,value:l,onChange:T(u)}}),E.push({key:`max`,label:`Max items`,required:!0,control:{type:`select`,value:s,options:rs,onChange:T(e=>c(e))}}),s===`set`&&E.push({key:`maxN`,label:`Max`,required:!0,width:`quarter`,control:{type:`text`,value:d,onChange:T(f)}})),e===`addTerm`&&E.push({key:`list`,label:`List`,required:!0,control:{type:`select`,value:p,onChange:T(e=>m(e)),options:[`expect`,`forbid`].map(e=>({value:e,label:Qr(e)}))}}),(e===`addTerm`||e===`removeTerm`)&&E.push({key:`term`,label:`Term`,required:!0,control:{type:`text`,value:h,onChange:T(g)}}),(0,$.jsxs)(R,{title:ns[e],onClose:i,dirty:a!==`keep`||s!==`keep`||!!l||!!d||!!h,className:`ev-bulk`,footer:(0,$.jsxs)(`div`,{className:`edit-actions`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:i,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`edit-done`,disabled:!C||S,onClick:w,children:`Apply`})]}),children:[E.length>0&&(0,$.jsx)(V,{label:ns[e],rows:E}),(0,$.jsx)(`p`,{className:`note ev-changes`,role:`status`,children:typeof y==`string`?y:`Changes ${C} of ${n.size}`}),S&&x&&(0,$.jsx)(`div`,{className:`ev-refusal`,role:`alert`,children:x.cases.length>0&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`p`,{className:`ev-refusal-head`,children:[x.cases.length,` of `,n.size,` would break`]}),(0,$.jsx)(`ul`,{children:x.cases.map(e=>(0,$.jsxs)(`li`,{children:[(0,$.jsx)(`b`,{children:e.file}),` `,e.reasons.join(`; `)]},e.key))})]})})]})}function os({pageSize:e=20}){let t=er(),n=vr(),r=Je(),{openCaseEditor:i}=Zo(),{list:a}=yr(),{datasetId:o,selected:s,setSelected:c,filters:l,setFilters:u,handedOver:d}=ci(),[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(null),g=(0,X.useCallback)(()=>p(null),[]),_=a?.find(e=>e.id===o)??a?.[0]??null,v=_?.id??``,y=br(v||null),b=y?.doc?.body??null,x=b?.cases,S=(0,X.useMemo)(()=>x?L().gradedSetFrom({cases:x}):[],[x]),C=y?.doc?.preview??_?.preview??null,w=Vo(C?.id),T=(0,X.useMemo)(()=>w?ri(S,w):null,[S,w]),E=(0,X.useMemo)(()=>new Set(S.map(Hr)),[S]),D=(0,X.useMemo)(()=>new Set([...s].filter(e=>E.has(e))),[s,E]),O=(0,X.useMemo)(()=>ai(S,l,D,w),[S,l,D,w]),k=!!y?.doc&&!C;(0,X.useEffect)(()=>{k&&(l.status===`missing`||l.status===`nocase`)&&u({status:`all`})},[k,l.status,u]);let A=(0,X.useCallback)(()=>n.entry(v)?.doc?.body??null,[n,v]),j=(0,X.useCallback)(e=>{v&&n.edit(v,t=>({...t,cases:e}))},[n,v]),M=e=>{i(e,{dataset:v,files:O.map(e=>e.item),onRemove:P})},N=e=>{h(null),i(e,{dataset:v,files:[...S.map(e=>e.item),e],onRemove:P})};function P(e){let t=A()?.cases??[];j(Jo({cases:t},e)),r.offer({label:`Removed ${e}`,restore:()=>j(t)})}let F=e=>{let i=A();if(!v||!i)return null;let{next:a,changed:o}=Yr(i.cases,D,e);if(!o.length)return p(null),null;if(e.type!==`delete`){let e=Xr(i.cases,a,o);if(e.cases.length)return e}mr(t,v,i,`bulk`);let s=i.cases;if(n.edit(v,e=>({...e,cases:a})),e.type===`delete`){let e=new Set(o);c(t=>new Set([...t].filter(t=>!e.has(t))))}return r.offer({label:ei(e,o.length),restore:()=>n.edit(v,e=>({...e,cases:s}))}),p(null),null},I=D.size===0,R=[{label:`Set count…`,icon:xt,disabled:I,onSelect:()=>p(`bounds`)},{label:`Add term…`,icon:Y.add,disabled:I,onSelect:()=>p(`addTerm`)},{label:`Remove term…`,icon:Bn,disabled:I,onSelect:()=>p(`removeTerm`)},{label:`Mark To do…`,icon:Cn,disabled:I,onSelect:()=>p(`todo`)},{label:`Mark graded…`,icon:Tn,disabled:I,onSelect:()=>p(`graded`)},{label:`Delete`,icon:Y.remove,destructive:!0,disabled:I,onSelect:()=>void F({type:`delete`})}];return(0,$.jsxs)(`div`,{className:`cases`,children:[a?.length?(0,$.jsx)(Qo,{rows:S,shown:O,filters:l,onFilters:u,selected:D,onSelect:c,selectionActions:R,sourceFiles:w,noCase:T,loading:!b,loadError:y?.sync.state===`missing`?y.sync.message:null,onRetry:()=>{v&&n.load(v)},pageSize:e,onEdit:M,onAdd:e=>h({item:e??``}),onRemove:P,children:d&&_&&(0,$.jsxs)(`p`,{className:`note ev-from`,role:`status`,children:[(0,$.jsxs)(`span`,{children:[`From `,d.from]}),d.found<d.wanted&&(0,$.jsxs)(`span`,{children:[d.found,` of `,d.wanted,` are in `,_.name,` now`]})]})}):null,m&&b&&(0,$.jsx)(Ho,{title:`Add case`,action:`Add case`,start:C,initial:m.item,taken:new Set(S.map(e=>e.item)),onPick:N,onClose:()=>h(null)}),f&&b&&(0,$.jsx)(as,{kind:f,cases:b.cases,keys:D,onApply:F,onClose:g}),(0,$.jsx)(Vt,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss})]})}function ss({groupId:e,undo:t}){let n=vo(),r=Z(),i=er(),o=vr(),{list:s,error:c}=yr(),{pickDataset:l}=ci(),[u,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),[h,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(!1),[b,x]=(0,X.useState)(!1),[S,C]=a(`dataset-cases`,20),[w,T]=(0,X.useState)(!1),[E,D]=(0,X.useState)(null),[O,k]=(0,X.useState)(!1),A=(0,X.useRef)(null),[j]=Q(`promptlab.versions`),[M]=Q(`promptlab.connections`),[N]=Q(`promptlab.workflows`),P=Fo(),[F,I]=(0,X.useState)(null);(0,X.useEffect)(()=>{let e=!0;return r.sources().then(t=>{e&&I(t.sources)}).catch(()=>{e&&I([])}),()=>{e=!1}},[r]);let z=br(e)?.doc??null,B=z?.body??null,ee=s?.find(t=>t.id===e)??null;(0,X.useEffect)(()=>{l(e)},[e,l]);let te=po(),ne=(0,X.useRef)(new Set);(0,X.useEffect)(()=>{if(ee){ne.current.add(e);return}s&&(io(),ne.current.has(e)||t.notify({label:oo(`eval group`,e,te.current)}))},[s,ee,e,t.notify,te.current]);let H=(0,X.useMemo)(()=>e?dr(i,e):[],[i,e,j]),U=e=>_({text:e instanceof Error?e.message:String(e),bad:!0}),W=(0,X.useCallback)(()=>o.entry(e)?.doc?.body??null,[o,e]),ie=(0,X.useCallback)(t=>o.edit(e,t),[o,e]),ae=()=>new Set((o.list().list??[]).map(e=>e.name)),oe=async()=>{_(null);try{ro((await o.create(ls(`Untitled eval group`,ae()))).id)}catch(e){U(e)}},G=t=>{let n=t.trim();z&&n&&n!==z.name&&(_(null),o.rename(e,n).catch(e=>{e instanceof mn&&e.status===409?_({text:`An eval group is already called ${n}.`,bad:!0}):U(e)}))},K=async()=>{if(z){_(null);try{await o.flush(e),ro((await o.create(ls(`${z.name} copy`,ae()),structuredClone(z.body),z.preview??null)).id)}catch(e){U(e)}}},se=async()=>{if(!z)return;_(null);let{name:n}=z;try{await o.flush(e);let r=await o.remove(e);no(),t.offer({label:`Deleted ${n}`,restore:()=>{o.restore(r).then(e=>{ro(e.id),e.name!==n&&_({text:`Restored as ${e.name}.`,bad:!1})}).catch(U)}})}catch(e){U(e)}},q=async e=>{_(null);let t;try{t=await cs(e)}catch(e){U(e);return}let n;try{n=JSON.parse(t)}catch(e){_({text:`Not JSON: ${e instanceof Error?e.message:String(e)}`,bad:!0});return}D(`import`);try{let e=await o.importFile(n);e[0]&&ro(e[0].id),_({text:`Imported ${e.map(e=>e.name).join(`, `)}.`,bad:!1})}catch(e){U(e)}finally{D(null)}},le=async()=>{e&&(D(`export`),await o.flush(e).catch(()=>{}),await ue(o.exportUrl(e),e=>eo(`eval-group`,e.group?.name??e.dataset?.name??``,e.version,`json`)),D(null))},ue=async(e,t)=>{try{let n=await fetch(e);if(!n.ok)throw Error(`the export answered ${n.status}`);let r=await n.json();to(new Blob([JSON.stringify(r,null,2)+`
7
- `],{type:`application/json`}),t(r))}catch(e){U(e)}},de=n=>{let r=W();r&&(mr(i,e,r,`restore`),ie(()=>structuredClone(n.doc)),x(!1),t.offer({label:`Restored the eval group`,restore:()=>ie(()=>r)}))},fe=(0,X.useMemo)(()=>{let e=M.list.find(e=>e.id===M.grader);return e?{id:e.id,name:e.name}:null},[M]),pe=(0,X.useMemo)(()=>M.list.filter(e=>L().listedConnection(e)&&(L().CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`)),[M.list]),me=e=>{let{mode:t,threshold:n}=e.scoring;return[{key:`mode`,label:`Scoring`,control:{type:`select`,value:t,options:[{value:`all`,label:`All must pass`},{value:`weighted`,label:`Weighted points`}],onChange:e=>ie(t=>({...t,scoring:{mode:e===`weighted`?`weighted`:`all`,threshold:e===`weighted`?t.scoring.threshold??1:t.scoring.threshold}}))}},...t===`weighted`?[{key:`threshold`,label:`Pass at`,width:`quarter`,control:{type:`text`,value:n==null?``:String(n),onChange:e=>ie(t=>({...t,scoring:{mode:`weighted`,threshold:e.trim()?/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e:null}}))}}]:[],{key:`grader`,label:`Grader`,control:{type:`picker`,kind:`Connection`,title:`Choose grader connection`,value:e.grader?.id??``,...P(pe,[{id:``,label:fe?`Lab (${fe.name})`:`None`}]),onChange:e=>{let t=pe.find(t=>t.id===e);ie(e=>({...e,grader:t?{id:t.id,name:t.name}:null}))}}}]},he=z?.preview??null,ge=[{key:`preview`,label:`Preview Source`,control:{type:`picker`,kind:`Source`,value:he?.id??``,usedLabel:`Last changed`,...jo([...he&&F&&!F.some(e=>e.id===he.id)?[{id:he.id,name:`${he.name} (missing)`,missing:!0}]:[],...F??[]],e=>F?.find(t=>t.id===e)?.changed??null,[{id:``,label:`None`}]),onChange:t=>{let n=F?.find(e=>e.id===t),r=n?{id:n.id,name:n.name}:he?.id===t?he:null;o.setPreview(e,r).catch(U)}}}],_e=e=>t=>ie(n=>({...n,[e]:t})),ve=e=>(n,r)=>{let i=W()?.[e]??[];_e(e)(n),t.offer({label:r,restore:()=>ie(t=>({...t,[e]:i}))})},ye=B?B.cases.filter(e=>!e.todo).length:0,be=[{label:`Rename…`,icon:qe,disabled:!z,onSelect:()=>f(!0)},{label:`Clone`,icon:Y.clone,disabled:!z,onSelect:()=>void K()},n({tab:`library`,section:`datasets`,id:e}),{label:`Copy or move…`,icon:Y.transfer,disabled:!z,onSelect:()=>k(!0)},{label:`Import JSON…`,icon:Ue,busy:E===`import`,onSelect:()=>A.current?.click()},{label:`Export JSON`,icon:g,disabled:!z,busy:E===`export`,onSelect:()=>void le()},{label:`Export all`,icon:Mn,disabled:!s?.length,busy:E===`exportAll`,onSelect:()=>{D(`exportAll`),ue(o.exportAllUrl(),e=>eo(`eval-groups`,`all`,e.version,`json`)).finally(()=>D(null))}},{label:`Restore…`,icon:ke,disabled:!H.length||!z,onSelect:()=>x(!0)},{label:`Edit raw…`,icon:On,disabled:!z,onSelect:()=>y(!0)},{label:`Delete`,icon:At,destructive:!0,disabled:!z,onSelect:()=>void se()}],xe=(0,$.jsx)(`input`,{ref:A,type:`file`,accept:`.json,application/json`,hidden:!0,"aria-label":`Import JSON file`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&q(t)}}),Se=B?`${B.cases.length} ${B.cases.length===1?`case`:`cases`}, ${ye} graded`:void 0;return(0,$.jsxs)(`div`,{className:`datasets`,children:[(0,$.jsx)(ce,{kind:`Eval group`,name:z?.name??ee?.name??(s===null?`Loading…`:`None`),onPick:s?.length?()=>m(!0):void 0,meta:Se,primary:{label:`New eval group`,icon:dt,onSelect:()=>void oe()},actions:be}),h&&(0,$.jsx)(`p`,{className:`note${h.bad?` bad`:``}`,role:h.bad?`alert`:`status`,children:h.text}),xe,B==null?(0,$.jsx)(Ot,{label:`Eval group`,error:c,onRetry:()=>void o.refresh()}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(J,{id:`grades`,title:`Grades`,level:2,children:(0,$.jsx)(V,{label:`Grades`,rows:me(B)})}),(0,$.jsx)(J,{id:`every`,title:`Every item`,level:2,note:B.every.length?String(B.every.length):void 0,children:(0,$.jsx)(ko,{label:`Every item`,metrics:B.every,over:`item`,set:_e(`every`),undoable:ve(`every`)})}),(0,$.jsx)(J,{id:`run`,title:`Whole run`,level:2,note:B.run.length?String(B.run.length):void 0,children:(0,$.jsx)(ko,{label:`Whole run`,metrics:B.run,over:`run`,set:_e(`run`),undoable:ve(`run`)})}),(0,$.jsxs)(J,{id:`cases`,title:`Cases`,level:2,note:String(B.cases.length),actions:[{label:`Page size…`,icon:Y.pageSize,onSelect:()=>T(!0)}],children:[(0,$.jsx)(V,{label:`Preview`,rows:ge}),(0,$.jsx)(os,{pageSize:S})]})]}),p&&s&&(0,$.jsx)(d,{kind:`Eval group`,value:e,onClose:()=>m(!1),options:s.map(e=>({id:e.id,label:e.name})),onPick:e=>{_(null),ro(e)}}),u&&z&&(0,$.jsx)(Tt,{title:`Rename eval group`,value:z.name,onCommit:G,onClose:()=>f(!1)}),w&&(0,$.jsx)(re,{value:S,onChange:C,onClose:()=>T(!1)}),O&&z&&(0,$.jsx)(Co,{subject:{kind:`eval-group`,id:e,name:z.name},scan:{pipelines:N.list},undo:t,onClose:()=>k(!1),onChanged:()=>void o.refresh()}),b&&z&&(0,$.jsx)(R,{title:`Restore eval group`,onClose:()=>x(!1),children:(0,$.jsxs)(`div`,{className:`version-list`,children:[H.length===0&&(0,$.jsx)(`p`,{className:`note`,children:`No versions of this eval group yet.`}),H.map((e,t)=>(0,$.jsxs)(`div`,{className:`version-row`,children:[(0,$.jsxs)(`span`,{className:`version-when`,children:[ds(e.at),`, `,us(e.reason)]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>de(e),children:`Restore`})]},`${e.at}-${t}`))]})}),v&&z&&(0,$.jsx)(Io,{name:z.name,body:z.body,onSave:e=>{ie(()=>e),y(!1)},onClose:()=>y(!1)})]})}function cs(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result??``)),r.onerror=()=>n(r.error??Error(`The file could not be read.`)),r.readAsText(e)})}var ls=(e,t)=>{if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`},us=e=>e===`idle`?`after editing`:e===`restore`?`before a restore`:e===`bulk`?`before a bulk edit`:e===`pack`?`before a pack update`:e,ds=e=>Ft(e)||e;function fs({groupId:e}){let t=Je();return(0,$.jsxs)($.Fragment,{children:[e?(0,$.jsx)(ss,{groupId:e,undo:t}):(0,$.jsx)(wo,{undo:t}),(0,$.jsx)(Vt,{undo:t.undo,notice:t.notice,onUndo:t.undoNow,onDismiss:t.dismiss})]})}var ps=e=>e,ms=e=>e?.state===`conflict`?`Not saved: changed in another browser.`:e?.state===`offline`?`Not saved: ${e.message}`:null,hs=(e,t)=>JSON.stringify(e)===JSON.stringify(t),gs=e=>e instanceof Error?e.message:String(e),_s=({body:e,...t})=>t;function vs({api:e,pause:t=800}){let n=ps(e),r={list:null,error:null},i=new Map,a=new Set,o=new Map,s=new Map,c=new Set,l=null,u=()=>{l=null,c.forEach(e=>e())},d=(e,t)=>{let n=i.get(e)??{id:e,doc:null,sync:{state:`loading`}};i.set(e,{...n,...t,id:e}),u()},f=e=>{r={list:e,error:null},u()},p=e=>{if(!r.list)return;let t=r.list.findIndex(t=>t.id===e.id);f(t<0?[...r.list,e]:r.list.map((n,r)=>r===t?e:n))},m=e=>{let t=o.get(e);t&&clearTimeout(t),o.delete(e),a.delete(e),i.delete(e),r.list?f(r.list.filter(t=>t.id!==e)):u()},h=e=>{d(e.id,{doc:e,sync:{state:`saved`}}),p(_s(e))};async function g(e){let t=i.get(e);if(!t?.doc||!a.has(e)||t.sync.state===`conflict`)return;let{body:r,version:o}=t.doc;d(e,{sync:{state:`saving`}});try{let t=await n.saveFilterSet(e,o,r),s=i.get(e);if(!s?.doc)return;s.doc.body===r&&a.delete(e);let c={...s.doc,version:t.version,versions:t.versions,filters:r.filters.length};if(d(e,{doc:c,sync:{state:`saved`}}),p(_s(c)),a.has(e))return g(e)}catch(t){let n=i.get(e);if(!n?.doc)return;let r=t instanceof mn&&t.status===409?t.body?.current??null:null;if(r){if(hs(r.body,n.doc.body)){a.delete(e),d(e,{doc:{...n.doc,version:r.version},sync:{state:`saved`}});return}d(e,{sync:{state:`conflict`,theirs:r}});return}d(e,{sync:{state:`offline`,message:gs(t)}})}}function _(e){let t=o.get(e);t&&(clearTimeout(t),o.delete(e));let n=s.get(e);return n||(n=g(e).finally(()=>s.delete(e)),s.set(e,n)),n}return{list:()=>r,entry:e=>i.get(e),held:()=>l??=[...i.values()],async refresh(){r.error&&(r={list:r.list,error:null},u());try{let e=(await n.filterSets()).filterSets;f(e);for(let t of e){let e=i.get(t.id);e?.doc&&!a.has(t.id)&&t.version>e.doc.version&&n.filterSet(t.id).then(e=>{i.has(t.id)&&!a.has(t.id)&&h(e)},()=>{})}}catch(e){r={list:r.list,error:gs(e)},u()}},load(e){i.has(e)&&i.get(e).sync.state!==`missing`||(d(e,{sync:{state:`loading`}}),n.filterSet(e).then(t=>{i.has(e)&&d(e,{doc:t,sync:{state:`saved`}})},t=>{i.has(e)&&d(e,{sync:{state:`missing`,message:gs(t)}})}))},edit(e,n){let r=i.get(e);if(!r?.doc)return;let s=n(r.doc.body);if(s===r.doc.body)return;d(e,{doc:{...r.doc,body:s,filters:s.filters.length}}),a.add(e);let c=o.get(e);c&&clearTimeout(c),o.set(e,setTimeout(()=>{o.delete(e),_(e)},t))},async flush(e){await Promise.all((e?[e]:[...a]).map(_))},async resolve(e,t){let n=i.get(e);if(!n?.doc||n.sync.state!==`conflict`)return;let r=n.sync.theirs;if(t===`theirs`){a.delete(e),h(r);return}d(e,{doc:{...n.doc,version:r.version},sync:{state:`saved`}}),a.add(e),await _(e)},async create(e,t){let r=await n.createFilterSet(t?{name:e,body:t}:{name:e});return h(r),r},async rename(e,t){let r=await n.renameFilterSet(e,t),a=i.get(e)?.doc;a&&d(e,{doc:{...a,name:r.name,version:r.version,updated:r.updated}}),p({..._s(r),filters:a?.body.filters.length??r.filters})},async remove(e){let{trash:t}=await n.deleteFilterSet(e);return m(e),t},async restore(e){let t=await n.restoreFilterSet(e);return h(t),t},subscribe(e){return c.add(e),()=>{c.delete(e)}}}}var ys=(0,X.createContext)(null);function bs({children:e,pause:t}){let n=Z(),r=(0,X.useMemo)(()=>vs({api:n,...t==null?{}:{pause:t}}),[n,t]);return(0,X.useEffect)(()=>{let e=()=>{r.flush()};return addEventListener(`pagehide`,e),()=>removeEventListener(`pagehide`,e)},[r]),(0,$.jsx)(ys.Provider,{value:r,children:e})}function xs(){let e=(0,X.useContext)(ys);if(!e)throw Error(`useFilterSets outside a FilterSetsProvider: the app mounts one at its root`);return e}function Ss(){let e=xs(),t=(0,X.useSyncExternalStore)(e.subscribe,e.list);return(0,X.useEffect)(()=>{e.list().list===null&&e.refresh()},[e]),t}function Cs(e){let t=xs(),n=(0,X.useSyncExternalStore)(t.subscribe,()=>e?t.entry(e):void 0);return(0,X.useEffect)(()=>{e&&t.load(e)},[t,e]),n}function ws(e){let t=[];for(let n of e.jobs??[])for(let e of n.steps??[]){let n=e.filterSets;if(Array.isArray(n))for(let e of n)e&&typeof e==`object`&&t.push(e)}return t}var Ts=()=>Rr({tab:`library`,section:`filters`,id:null}),Es=e=>Rr({tab:`library`,section:`filters`,id:e}),Ds=()=>zr({tab:`library`,section:`filters`,id:null});function Os({undo:e}){let t=vo(),n=xs(),{list:r,error:i}=Ss(),[o]=Q(`promptlab.workflows`),[s,c]=a(`filter-sets`,20),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(null),[p,h]=(0,X.useState)(null),[g,_]=(0,X.useState)(!1),v=e=>f(e instanceof Error?e.message:String(e)),y=(0,X.useMemo)(()=>{let e=new Map;for(let t of o.list)for(let n of ws(t.work)){let r=n.set?.id;if(!r)continue;let i=e.get(r)??{names:[],pinned:!1};i.names.includes(t.name)||i.names.push(t.name),typeof n.pin==`number`&&(i.pinned=!0),e.set(r,i)}return e},[o.list]),b=(r??[]).map(e=>({...e,links:y.get(e.id)??{names:[],pinned:!1}})),x=()=>new Set((n.list().list??[]).map(e=>e.name)),S=async e=>{f(null);try{Es((await n.create(e,L().blankFilterSetBody())).id)}catch(e){v(e)}},C=async t=>{f(null);try{await n.flush(t.id);let r=await n.remove(t.id);e.offer({label:`Deleted ${t.name}`,restore:()=>{n.restore(r).catch(v)}})}catch(e){v(e)}},w=e=>[{label:`Open`,icon:Yt,onSelect:()=>Es(e.id)},t({tab:`library`,section:`filters`,id:e.id}),{label:`Copy or move…`,icon:Y.transfer,onSelect:()=>h(e)},{label:`Delete`,icon:Y.remove,destructive:!0,onSelect:()=>void C(e)}],T=[{key:`set`,header:`Filter set`,role:`title`,sort:e=>e.name.toLowerCase(),cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`eg-open`,onClick:()=>Es(e.id),children:e.name})},{key:`filters`,header:`Filters`,className:`num`,sort:e=>e.filters,cell:e=>e.filters},{key:`linked`,header:`Linked by`,sort:e=>e.links.names.length,tdProps:e=>({"data-state":e.links.names.length?void 0:`none`}),cell:e=>e.links.names.length?(0,$.jsx)(`span`,{title:e.links.names.join(`, `),children:`${e.links.names.length} ${e.links.names.length===1?`pipeline`:`pipelines`}${e.links.pinned?`, pinned`:``}`}):`—`},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${e.name} actions`,actions:w(e)})}],E=[{label:`Page size…`,icon:Y.pageSize,onSelect:()=>u(!0)}];return(0,$.jsxs)(J,{id:`filter-sets`,title:`Filter sets`,note:r?String(r.length):void 0,actions:E,about:`Item filters defined once and linked by the pipelines whose list replies they clean.`,children:[r===null?(0,$.jsx)(Ot,{label:`Filter sets`,error:i,onRetry:()=>void n.refresh()}):r.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No filter sets yet.`}):(0,$.jsx)(m,{className:`eg-groups`,cards:!0,label:`Filter sets`,rows:b,rowKey:e=>e.id,pageSize:s,columns:T}),d&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:d}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost eg-add`,onClick:()=>_(!0),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add filter set`]}),g&&(0,$.jsx)(As,{taken:x(),onCreate:e=>void S(e),onClose:()=>_(!1)}),l&&(0,$.jsx)(re,{value:s,onChange:c,onClose:()=>u(!1)}),p&&(0,$.jsx)(Co,{subject:{kind:`filter-set`,id:p.id,name:p.name},scan:{pipelines:o.list},undo:e,onClose:()=>h(null),onChanged:()=>void n.refresh()})]})}var ks=(e,t)=>{if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`};function As({taken:e,onCreate:t,onClose:n}){let r=ks(`Untitled filter set`,e);return(0,$.jsx)(Tt,{title:`New filter set`,value:``,placeholder:r,onCommit:e=>t(e||r),onClose:n})}var js=[{id:`terms`,scope:`item`,keys:[`terms`],label:`is one of these words`,control:`chips`},{id:`regex`,scope:`item`,keys:[`regex`],label:`matches a pattern`,control:`regex`},{id:`shorter`,scope:`item`,keys:[`length`],label:`is shorter than`,control:`num`,dir:`below`,unit:`characters`},{id:`longer`,scope:`item`,keys:[`length`],label:`is longer than`,control:`num`,dir:`above`,unit:`characters`},{id:`fewerWords`,scope:`item`,keys:[`words`],label:`has fewer words than`,control:`num`,dir:`below`,unit:`words`},{id:`moreWords`,scope:`item`,keys:[`words`],label:`has more words than`,control:`num`,dir:`above`,unit:`words`},{id:`duplicate`,scope:`item`,keys:[`duplicate`],label:`is already in the list`,control:`flag`},{id:`echoes`,scope:`item`,keys:[`echoes`],label:`is made only of the prompt's words`,control:`flag`},{id:`blank`,scope:`answer`,keys:[`blank`],label:`it is blank`,control:`blank`},{id:`fewerItems`,scope:`answer`,keys:[`itemCount`],label:`it has fewer items than`,control:`num`,dir:`below`,unit:`items`},{id:`moreItems`,scope:`answer`,keys:[`itemCount`],label:`it has more items than`,control:`num`,dir:`above`,unit:`items`},{id:`share`,scope:`answer`,keys:[`share`,`items`],label:`too many items are one of these words`,control:`share`},{id:`textBlank`,scope:`text`,keys:[`blank`],label:`the text is blank`,control:`blank`},{id:`textRegex`,scope:`text`,keys:[`regex`],label:`the text matches a pattern`,control:`regex`}],Ms=(e,t)=>js.filter(n=>n.scope===e&&(!t||n.keys.every(e=>t.includes(e)))),Ns=e=>{let t=L().FILTER_TYPES[e];return t?Ms(t.scope,t.conditions):[]},Ps=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function Fs(e,t,n,r){let i=Ms(e,r).filter(e=>e.keys[0]===t);return i.length===0?null:i.length===1?i[0]:(Ps(n)&&n.above!=null?i.find(e=>e.dir===`above`):i.find(e=>e.dir===`below`))??i[0]}function Is(e,t,n){let r=[],i=new Set;for(let a of Ms(t,n)){let o=a.keys[0];if(i.has(o)||e[o]==null)continue;let s=Fs(t,o,e[o],n);s&&(r.push(s),s.keys.forEach(e=>i.add(e)))}return r}function Ls(e,t){let n={...e};for(let e of t.keys)delete n[e];switch(t.control){case`chips`:n.terms=[];break;case`regex`:n.regex=``;break;case`num`:n[t.keys[0]]={[t.dir]:``};break;case`blank`:n.blank=!0;break;case`flag`:n[t.keys[0]]=!0;break;case`share`:n.share={above:``},n.items={terms:[]}}return n}function Rs(e,t,n){return Ms(t,n).find(t=>t.keys.every(t=>e[t]==null))??null}function zs(e,t,n){let r=Rs(e,t,n);return r?Ls(e,r):e}function Bs(e,t){let n={...e};for(let e of t.keys)delete n[e];return n}function Vs(e,t,n){return Ls(Bs(e,t),n)}function Hs(e,t,n,r){let i=n.keys[0];return Ms(t,r).filter(t=>t.keys[0]===i||t.keys.every(t=>e[t]==null))}var Us=e=>e==null||e===``?``:String(e),Ws=e=>/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e.trim(),Gs=e=>Array.isArray(e.terms)?e.terms.map(String):[],Ks=(e,t)=>({...e,terms:t}),qs=e=>typeof e.regex==`string`?e.regex:``,Js=(e,t)=>({...e,regex:t}),Ys=(e,t)=>Us(Ps(e[t.keys[0]])?e[t.keys[0]][t.dir]:void 0),Xs=(e,t,n)=>({...e,[t.keys[0]]:{[t.dir]:Ws(n)}}),Zs=e=>({pct:Us(Ps(e.share)&&e.share.above!=null&&e.share.above!==``?Math.round(Number(e.share.above)*100):``),words:Ps(e.items)&&Array.isArray(e.items.terms)?e.items.terms.map(String):[]}),Qs=(e,t)=>({...e,share:{above:/^\d+(\.\d+)?$/.test(t.trim())?Number(t)/100:t.trim()}}),$s=(e,t)=>({...e,items:{terms:t}});function ec(e){switch(e){case`rewrite-item`:return{kind:`tidy`};case`rewrite-text`:return{kind:`thinking`};case`keep-first`:return{n:10};default:return}}function tc(e,t){let n=Ns(t)[0],r=ec(t);return{id:e,type:t,match:n?Ls({},n):{},...r?{op:r}:{},options:{ignoreFailures:!1,repeat:1},tests:[]}}var nc={item:[`Drop an item when it`,`and it`],answer:[`Reject the whole reply when`,`and`],text:[`Reject the reply when`,`and`],list:[``,``]};function rc({scope:e,allowed:t,match:n,onChange:r}){let i=Is(n,e,t),[a,o]=nc[e];return(0,$.jsxs)(`div`,{className:`cond-builder`,children:[i.map((i,s)=>(0,$.jsxs)(`div`,{className:`cond-row`,"data-control":i.control,children:[(0,$.jsxs)(`div`,{className:`cond-line`,children:[(0,$.jsx)(`span`,{className:`cond-prefix`,children:s===0?a:o}),(0,$.jsx)(`select`,{className:`cond-pick`,"aria-label":`Condition`,value:i.id,onChange:a=>{let o=Hs(n,e,i,t).find(e=>e.id===a.target.value);o&&r(Vs(n,i,o))},children:Hs(n,e,i,t).map(e=>(0,$.jsx)(`option`,{value:e.id,children:e.label},e.id))}),i.control===`num`&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`input`,{type:`text`,inputMode:`numeric`,className:`cond-num`,"aria-label":i.label,value:Ys(n,i),onChange:e=>r(Xs(n,i,e.target.value))}),i.unit&&(0,$.jsx)(`span`,{className:`cond-unit`,children:i.unit})]}),i.control===`regex`&&(0,$.jsx)(`input`,{type:`text`,className:`cond-regex`,"aria-label":`Pattern`,placeholder:`a regular expression`,spellCheck:!1,value:qs(n),onChange:e=>r(Js(n,e.target.value))}),(0,$.jsx)(`button`,{type:`button`,className:`cond-x`,"aria-label":`Remove condition ${s+1}`,onClick:()=>r(Bs(n,i)),children:(0,$.jsx)(G,{size:14,"aria-hidden":`true`})})]}),i.control===`chips`&&(0,$.jsx)(ue,{value:Gs(n),onChange:e=>r(Ks(n,e))}),i.control===`share`&&(0,$.jsxs)(`div`,{className:`cond-share`,children:[(0,$.jsx)(`input`,{type:`text`,inputMode:`numeric`,className:`cond-num`,"aria-label":`Share, percent`,value:Zs(n).pct,onChange:e=>r(Qs(n,e.target.value))}),(0,$.jsx)(`span`,{className:`cond-unit`,children:`% or more of items are one of these words`}),(0,$.jsx)(ue,{value:Zs(n).words,onChange:e=>r($s(n,e))})]})]},i.id)),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn cond-add`,disabled:!Rs(n,e,t),onClick:()=>r(zs(n,e,t)),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add condition`]})]})}var ic={comma:`Comma`,lines:`New line`,semicolon:`Semicolon`,none:`None (whole reply)`},ac={"rewrite-item":[{kind:`tidy`,label:`Tidy`,description:`Strips bullets, numbering, stray quotes and extra spaces`},{kind:`case`,label:`Change case`}],"rewrite-text":[{kind:`thinking`,label:`Remove thinking`,description:`Drops a <think>…</think> block`},{kind:`preamble`,label:`Remove preamble`,description:`Drops everything up to the first colon`},{kind:`trim`,label:`Trim`,description:`Removes leading and trailing spaces and blank lines`},{kind:`literal`,label:`Replace text`,description:`Every occurrence, matched exactly`},{kind:`replace`,label:`Replace pattern`},{kind:`fences`,label:`Strip code fences`,description:"Removes ``` lines, keeping what they fence"},{kind:`case`,label:`Change case`},{kind:`first`,label:`Keep first`},{kind:`extract`,label:`Extract`,description:`The first match, or its first group; no match rejects the reply`}]},oc={case:{mode:`LOWER`},first:{n:1,unit:`lines`}},sc=[{value:`lines`,label:`Lines`},{value:`chars`,label:`Characters`}],cc=(e,t)=>JSON.stringify(e)===JSON.stringify(t),lc=e=>/^\d+$/.test(e.trim())?Number(e):e.trim();function uc({filter:e,isNew:t,others:n,onSave:r,onClose:i}){let a=L(),o=a.FILTER_TYPES[e.type],s=o?.scope??`item`,c=o?.label??e.type,l=o?.conditions??[],u=ac[e.type],d=s===`text`,[f,p]=(0,X.useState)(t?``:e.id),[m,h]=(0,X.useState)(e.why??``),[g,_]=(0,X.useState)(()=>structuredClone(e.match??{})),[v,y]=(0,X.useState)(()=>structuredClone(e.op??{})),[b,x]=(0,X.useState)(!!e.options?.ignoreFailures),[S,C]=(0,X.useState)(String(e.options?.repeat??1)),[w,T]=(0,X.useState)(()=>structuredClone(e.tests??[])),[E,D]=(0,X.useState)(null),O=()=>D(null),k=e=>{y(t=>({...t,...e})),O()},A=(0,X.useMemo)(()=>({id:f.trim()||(t?e.id:``),type:e.type,...m.trim()?{why:m.trim()}:{},match:g,...u||e.type===`keep-first`?{op:v}:{},options:{ignoreFailures:b,repeat:lc(S)},tests:w}),[f,m,g,v,b,S,w,e.type,u]),j=a.tryFilter(A),M=(e,t)=>T(n=>n.map((n,r)=>r===e?{...n,...t}:n)),N=()=>{let e=A,t=[...e.id?[]:[`A filter needs a name.`],...n.some(t=>t.id===e.id)?[`A filter is already called ${e.id}.`]:[],...a.filterProblems([e],`This filter`),...j.flatMap((e,t)=>e.ok?[]:[`Test ${t+1} does not come out as expected.`])];if(t.length)return D(t);r(e)},P=[{key:`filter`,rows:[{key:`id`,label:`Name`,width:`full`,required:!0,control:{type:`text`,value:f,onChange:e=>{p(e),O()},...t?{placeholder:e.id}:{}}},{key:`type`,label:`Type`,control:{type:`static`,text:c},...t?{}:{hint:`Set when the filter was created — delete and recreate to change it.`}},{key:`why`,label:`Comments`,control:{type:`textarea`,value:m,onChange:h}}]}];if(u){let e=typeof v.kind==`string`?v.kind:u[0].kind,t=[{key:`op`,label:`Operation`,hint:u.find(t=>t.kind===e)?.description,control:{type:`select`,value:e,options:qt(u.map(e=>({value:e.kind,label:e.label}))),onChange:e=>{y({kind:e,...oc[e]}),O()}}}];e===`case`&&t.push({key:`mode`,label:`Case`,control:{type:`select`,value:v.mode??`LOWER`,options:a.CASE_MODES.map(e=>({value:e,label:e})),onChange:e=>k({mode:e})}}),e===`literal`&&t.push({key:`find`,label:`Find`,control:{type:`text`,value:v.find??``,onChange:e=>k({find:e})}}),(e===`replace`||e===`extract`)&&t.push({key:`pattern`,label:`Pattern`,control:{type:`text`,value:v.pattern??``,onChange:e=>k({pattern:e})}}),(e===`replace`||e===`literal`)&&t.push({key:`replacement`,label:`Replace with`,control:{type:`text`,value:v.replacement??``,onChange:e=>k({replacement:e})}}),e===`first`&&(t.push({key:`n`,label:`Keep`,width:`quarter`,control:{type:`text`,value:String(v.n??``),onChange:e=>k({n:lc(e)})}}),t.push({key:`unit`,label:`Of`,control:{type:`select`,value:v.unit??`lines`,options:sc,onChange:e=>k({unit:e})}})),P.push({key:`operation`,title:`Operation`,rows:t})}else e.type===`keep-first`&&P.push({key:`operation`,title:`Operation`,rows:[{key:`n`,label:`Keep`,hint:`Items to keep`,width:`quarter`,control:{type:`text`,value:String(v.n??``),onChange:e=>k({n:lc(e)})}}]});return l.length&&P.push({key:`match`,title:e.type===`rewrite-item`?`Only items that`:`Match`,children:(0,$.jsx)(rc,{scope:s,allowed:l,match:g,onChange:e=>{_(e),O()}})}),P.push({key:`options`,title:`Options`,rows:[{key:`ignore`,label:`Ignore failures`,control:{type:`checkbox`,checked:b,onChange:e=>{x(e),O()}}},{key:`repeat`,label:`Repeat`,hint:`Times to run the filter`,width:`quarter`,control:{type:`text`,value:S,onChange:e=>{C(e),O()}}}]}),P.push({key:`tests`,title:`Tests`,children:(0,$.jsxs)(`div`,{className:`filter-tests`,children:[(0,$.jsx)(`p`,{className:`note`,children:`Sample replies and what each should leave.`}),w.map((e,t)=>{let n=j[t],r=!!n?.ok;return(0,$.jsxs)(`div`,{className:`filter-test`,children:[(0,$.jsx)(V,{label:`Test ${t+1}`,rows:[...d?[]:[{key:`sep`,label:`Separator`,hint:`Between items in a sample`,control:{type:`select`,value:e.separator,options:a.FILTER_SEPARATORS.filter(e=>e!==`none`).map(e=>({value:e,label:ic[e]??e})),onChange:e=>{M(t,{separator:e}),O()}}}],{key:`in`,label:`Sample input`,control:{type:`textarea`,value:e.sampleInput,onChange:e=>{M(t,{sampleInput:e}),O()}}},{key:`out`,label:`Expected output`,control:{type:`textarea`,value:e.expectedOutput,onChange:e=>{M(t,{expectedOutput:e}),O()}}}]}),(0,$.jsxs)(`div`,{className:`filter-test-result`,children:[(0,$.jsx)(`span`,{className:`filter-test-verdict ${r?`hit`:`fault`}`,role:`status`,children:dc(s,!!o?.rejects,r,n?.got??``,e)}),(0,$.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Remove test ${t+1}`,onClick:()=>{T(e=>e.filter((e,n)=>n!==t)),O()},children:(0,$.jsx)(G,{size:14,"aria-hidden":`true`})})]})]},t)}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:()=>{T(e=>[...e,{separator:d?`none`:`comma`,sampleInput:``,expectedOutput:``}]),O()},children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add test`]})]})}),(0,$.jsx)(st,{title:t?`New filter`:e.id,...E?.length?{status:E.join(` `),statusBad:!0}:{},sections:P,onSave:N,adding:t,dirty:!cc(A,e),focusRow:`id`,wide:!0,onClose:i})}function dc(e,t,n,r,i){if(t)return`${n?`Pass`:`Fail`} — ${r===`rejected`?`rejected`:`kept`}`;if(e===`text`&&r===`rejected`)return`${n?`Pass`:`Fail`} — rejected`;if(e===`text`)return n?`Pass — reads as expected`:`Fail — left ${r?JSON.stringify(r):`nothing`}`;let a=L().splitSample(i.expectedOutput,i.separator);return n?`Pass — ${a.length} of ${a.length} items as expected`:`Fail — kept ${r||`nothing`}`}var fc={text:`Pre-format`,items:`Post-format`},pc=[`text`,`items`].map(e=>({stage:e,label:fc[e]}));function mc({stage:e,title:t=`New filter`,onPick:n,onClose:r}){let i=L(),a=pc.filter(t=>!e||t.stage===e).map(e=>({...e,types:Object.entries(i.FILTER_TYPES).filter(([,t])=>i.stageOfScope(t.scope)===e.stage)})).filter(e=>e.types.length),[o,s]=(0,X.useState)(a[0]?.types[0]?.[0]??``);return(0,$.jsxs)(R,{title:t,onClose:r,className:`new-filter`,footer:(0,$.jsxs)(`div`,{className:`edit-actions`,children:[(0,$.jsx)(`button`,{type:`button`,className:`edit-done ghost`,onClick:r,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`edit-save`,disabled:!o,onClick:()=>o&&n(o),children:`Continue`})]}),children:[(0,$.jsx)(`p`,{className:`note`,children:`A filter's type can't change once it's made.`}),a.map(t=>(0,$.jsxs)(`fieldset`,{className:`nf-types`,children:[(0,$.jsx)(`legend`,{className:e?`sr-only`:`nf-stage`,children:e?`Filter type`:t.label}),t.types.map(([e,t])=>(0,$.jsxs)(`label`,{className:`nf-type${e===o?` on`:``}`,children:[(0,$.jsx)(`input`,{type:`radio`,name:`filter-type`,value:e,checked:e===o,onChange:()=>s(e)}),(0,$.jsxs)(`span`,{className:`nf-type-text`,children:[(0,$.jsx)(`span`,{className:`nf-type-name`,children:t.label}),(0,$.jsx)(`span`,{className:`nf-type-about`,children:t.about})]})]},e))]},t.stage))]})}function hc({label:e,filters:t,onChange:n,onRemoved:r}){let[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(null),u=[...t],d=(e,t)=>{let r=[...u],[i]=r.splice(e,1);r.splice(e+t,0,i),n(r)},f=[{key:`id`,header:`Filter`,role:`title`,sort:e=>e.id.toLowerCase(),cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`ds-file`,onClick:()=>a(u.indexOf(e)),children:e.id})},{key:`examples`,header:`Examples`,sort:e=>{let t=L().tryFilter(e);return t.length?t.filter(e=>e.ok).length/t.length:null},cell:e=>{let t=L().tryFilter(e),n=t.filter(e=>e.ok).length;return t.length?(0,$.jsxs)(`span`,{className:n<t.length?`ds-nomatch`:void 0,children:[n,` of `,t.length,` pass`]}):(0,$.jsx)(`span`,{className:`ds-nomatch`,children:`None`})}},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>{let t=u.indexOf(e),i=[{label:`Edit…`,icon:Y.edit,onSelect:()=>a(t)},{label:`Clone`,icon:Y.clone,onSelect:()=>n([...u.slice(0,t+1),{...structuredClone(e),id:gc(u,`${e.id} copy`)},...u.slice(t+1)])},{label:`Move up`,icon:Y.moveUp,disabled:t===0,onSelect:()=>d(t,-1)},{label:`Move down`,icon:Y.moveDown,disabled:t===u.length-1,onSelect:()=>d(t,1)},{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>{n(u.filter((e,n)=>n!==t)),r?.(`Removed ${e.id}`,u)}}];return(0,$.jsx)(F,{actions:i,label:`${e.id} actions`})}}],p=i==null?void 0:u[i];return(0,$.jsxs)(`div`,{className:`filters-table`,children:[u.length?(0,$.jsx)(m,{className:`rules`,cards:!0,label:e,rows:u,rowKey:e=>e.id,columns:f,defaultSort:null,select:{noun:`filter`,actions:e=>[{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>{let t=new Set(e);n(u.filter(e=>!t.has(e))),r?.(e.length===1?`Removed ${e[0].id}`:`Removed ${e.length} filters`,u)}}]}}):(0,$.jsx)(`p`,{className:`note`,children:`No filters.`}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:()=>s(!0),children:[(0,$.jsx)(Y.add,{size:14,"aria-hidden":`true`}),`Add filter`]}),o&&(0,$.jsx)(mc,{onPick:e=>{s(!1),l(tc(gc(u,`New filter`),e))},onClose:()=>s(!1)}),(c||p)&&(0,$.jsx)(uc,{filter:c??p,isNew:!!c,others:c?u:u.filter((e,t)=>t!==i),onSave:e=>{n(c?[...u,e]:u.map((t,n)=>n===i?e:t)),l(null),a(null)},onClose:()=>{l(null),a(null)}},c?`new`:i)]})}function gc(e,t){let n=t,r=2;for(;e.some(e=>e.id===n);)n=`${t} ${r++}`;return n}function _c({setId:e,undo:t}){let n=vo(),r=xs(),{list:i,error:a}=Ss(),[o]=Q(`promptlab.workflows`),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(!1),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(null),[g,_]=(0,X.useState)(!1),v=Cs(e)?.doc??null,y=v?.body??null,b=i?.find(t=>t.id===e)??null;(0,X.useEffect)(()=>{i&&!b&&Ds()},[i,b]);let x=e=>h({text:e instanceof Error?e.message:String(e),bad:!0}),S=(0,X.useCallback)(t=>r.edit(e,t),[r,e]),C=()=>new Set((r.list().list??[]).map(e=>e.name)),w=async e=>{h(null);try{Es((await r.create(e)).id)}catch(e){x(e)}},T=t=>{let n=t.trim();v&&n&&n!==v.name&&(h(null),r.rename(e,n).catch(e=>{e instanceof mn&&e.status===409?h({text:`A filter set is already called ${n}.`,bad:!0}):x(e)}))},E=async()=>{if(v){h(null);try{await r.flush(e),Es((await r.create(vc(`${v.name} copy`,C()),structuredClone(v.body))).id)}catch(e){x(e)}}},D=async()=>{if(!v)return;h(null);let{name:n}=v;try{await r.flush(e);let i=await r.remove(e);Ts(),t.offer({label:`Deleted ${n}`,restore:()=>{r.restore(i).then(e=>{Es(e.id),e.name!==n&&h({text:`Restored as ${e.name}.`,bad:!1})}).catch(x)}})}catch(e){x(e)}},O=[{label:`Rename…`,icon:Y.rename,disabled:!v,onSelect:()=>c(!0)},{label:`Clone`,icon:Y.clone,disabled:!v,onSelect:()=>void E()},n({tab:`library`,section:`filters`,id:e}),{label:`Copy or move…`,icon:Y.transfer,disabled:!v,onSelect:()=>_(!0)},{label:`Delete`,icon:At,destructive:!0,disabled:!v,onSelect:()=>void D()}],k=y?y.filters.length:0,A=y?`${k} ${k===1?`filter`:`filters`}`:void 0;return(0,$.jsxs)(`div`,{className:`filters-page`,children:[(0,$.jsx)(ce,{kind:`Filter set`,name:v?.name??b?.name??(i===null?`Loading…`:`None`),onPick:i?.length?()=>p(!0):void 0,meta:A,primary:{label:`New filter set`,icon:dt,onSelect:()=>u(!0)},actions:O}),m&&(0,$.jsx)(`p`,{className:`note${m.bad?` bad`:``}`,role:m.bad?`alert`:`status`,children:m.text}),y==null?(0,$.jsx)(Ot,{label:`Filter set`,error:a,onRetry:()=>void r.refresh()}):(0,$.jsx)(J,{id:`filters`,title:`Filters`,level:2,note:k?String(k):void 0,about:`Change a filter here; every run that follows latest grades against it. Filters run top to bottom; the first that matches wins.`,children:(0,$.jsx)(hc,{label:`Filters`,filters:y.filters,onChange:e=>S(t=>({...t,filters:e})),onRemoved:(e,n)=>t.offer({label:e,restore:()=>S(e=>({...e,filters:[...n]}))})})}),f&&i&&(0,$.jsx)(d,{kind:`Filter set`,value:e,onClose:()=>p(!1),options:i.map(e=>({id:e.id,label:e.name})),onPick:e=>{h(null),Es(e)}}),l&&(0,$.jsx)(As,{taken:C(),onCreate:e=>void w(e),onClose:()=>u(!1)}),s&&v&&(0,$.jsx)(Tt,{title:`Rename filter set`,value:v.name,onCommit:T,onClose:()=>c(!1)}),g&&v&&(0,$.jsx)(Co,{subject:{kind:`filter-set`,id:e,name:v.name},scan:{pipelines:o.list},undo:t,onClose:()=>_(!1),onChanged:()=>void r.refresh()})]})}var vc=(e,t)=>{if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`};function yc({setId:e}){let t=Je();return(0,$.jsxs)($.Fragment,{children:[e?(0,$.jsx)(_c,{setId:e,undo:t}):(0,$.jsx)(Os,{undo:t}),(0,$.jsx)(Vt,{undo:t.undo,onUndo:t.undoNow,onDismiss:t.dismiss})]})}var bc=[{value:`all`,label:`All`},{value:`used`,label:`Used`},{value:`unused`,label:`Unused`}],xc=[{value:`all`,label:`All`},{value:`scenario`,label:`Used by this target`},{value:`scenarios`,label:`Used by all targets`}];function Sc(e,t,n){let r=t.trim().toLowerCase();return r&&!e.name.toLowerCase().includes(r)&&!e.text.toLowerCase().includes(r)?!1:n===`all`||n===`used`==e.useCount>0}function Cc(e,t,n,r){let i=t.trim().toLowerCase();return i&&!e.name.toLowerCase().includes(i)&&!e.text.toLowerCase().includes(i)?!1:n===`scenario`?r.byScenario.has(e.id):n!==`scenarios`||r.byAll.has(e.id)}var wc=e=>Ft(e)||e;function Tc(e){return e.id===null?(0,$.jsx)(Ec,{onClose:e.onClose}):(0,$.jsx)(Dc,{...e,id:e.id})}function Ec({onClose:e}){let t=Or(),[n,r]=(0,X.useState)(``),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(!1),u=async()=>{l(!0);try{await t.create({name:n,text:i}),e()}catch(e){s(e instanceof Error?e.message:String(e)),l(!1)}};return(0,$.jsx)(st,{title:`New prompt`,status:o??void 0,statusBad:!!o,focusRow:`text`,wide:!0,sections:[{key:`prompt`,rows:[{key:`name`,label:`Name`,width:`full`,control:{type:`text`,value:n,placeholder:`(First line)`,onChange:r}},{key:`text`,label:`Prompt`,required:!0,control:{type:`textarea`,value:i,placeholder:`None`,onChange:a}}]}],dirty:!!n||!!i,adding:!0,saving:c,onSave:()=>void u(),onClose:e})}function Dc({id:e,onClose:t,onDuplicate:n,onDelete:r}){let i=Or(),a=Ar(e),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(!1),{openRun:d}=di(),[f,p]=(0,X.useState)(new Set),[h,g]=(0,X.useState)(new Set),[_,v]=(0,X.useState)(null),y=vo(),b=a?.doc;if(!b)return(0,$.jsx)(st,{title:`Prompt`,sections:[{key:`loading`,children:(0,$.jsx)(Ot,{label:`Prompt`,error:a?.sync.state===`missing`?a.sync.message:null,onRetry:()=>i.load(e)})}],onClose:t});let x=(e,t,n)=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t),n(r)},S=e=>v(e instanceof Error?e.message:String(e)),C=e=>b.versions.find(t=>t.version===e)?.text??``,w=b.uses.some(e=>e.job>0),T=[{key:`version`,header:`Version`,sort:e=>e.version,cell:e=>`v${e.version}${e.version===b.version?` (newest)`:``}`},{key:`created`,header:`Made`,sort:e=>e.created,cell:e=>wc(e.created)},{key:`uses`,header:`Uses`,className:`num`,sort:e=>e.uses,cell:e=>e.uses},{key:`menu`,header:``,label:``,className:`pl-menu`,role:`menu`,sort:null,cell:t=>(0,$.jsx)(F,{label:`v${t.version} actions`,actions:[{label:f.has(t.version)?`Hide words`:`Show words`,icon:u,onSelect:()=>x(f,t.version,p)},{label:`Restore`,icon:Lt,disabled:t.version===b.version,onSelect:()=>{v(null),i.restoreVersion(e,t.version).catch(S)}}]})}],E=e=>`${e.runId}:${e.scenarioId}:${e.job}`,D=[{key:`run`,header:`Run`,sort:e=>e.submittedAt,cell:e=>(0,$.jsx)(`a`,{className:`pl-run`,href:Lr({tab:`results`,id:e.runId}),onClick:n=>{n.preventDefault(),t(),d(e.runId,{at:e.submittedAt,from:`history`})},children:Oi(e.submittedAt)})},{key:`scenario`,header:`Scenario`,sort:e=>e.scenarioName,cell:e=>e.scenarioName},...w?[{key:`job`,header:`Job`,className:`num`,sort:e=>e.job,cell:e=>e.job+1}]:[],{key:`version`,header:`Version`,sort:e=>e.version,cell:e=>`v${e.version}`},{key:`when`,header:`When`,sort:e=>e.submittedAt,cell:e=>wc(e.submittedAt)},{key:`menu`,header:``,label:``,className:`pl-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${Oi(e.submittedAt)} ${e.scenarioName} actions`,actions:[{label:h.has(E(e))?`Hide words`:`Show words`,icon:u,onSelect:()=>x(h,E(e),g)}]})}],O=[{label:`Set as default`,icon:Zn,disabled:b.default,onSelect:()=>{v(null),i.setDefault(e).catch(S)}},{label:`Duplicate`,icon:Y.clone,onSelect:()=>n(b)},y({tab:`library`,section:`prompts`,id:e}),{label:`Delete`,icon:Y.remove,destructive:!0,disabled:b.default,onSelect:()=>r(b)}],k=o?.name??b.name,A=o?.text??b.text,j=k!==b.name||A!==b.text,M=e=>s({name:k,text:A,...e}),N=async()=>{if(!j){t();return}l(!0),i.edit(e,{name:k,text:A});try{if(await i.flush(e),i.entry(e)?.sync.state===`conflict`){s(null),l(!1);return}t()}catch(e){S(e),l(!1)}},P=_??Sr(a.sync),I=a.sync.state===`conflict`;return(0,$.jsx)(st,{title:xr({...b,name:k,text:A}),status:P??void 0,statusBad:!!P,menu:O,wide:!0,actions:I?[{label:`Take theirs`,onSelect:()=>void i.resolve(e,`theirs`)},{label:`Keep mine`,onSelect:()=>void i.resolve(e,`mine`)}]:[],dirty:j,saving:c,onSave:()=>void N(),onClose:t,sections:[{key:`prompt`,rows:[{key:`name`,label:`Name`,width:`full`,control:{type:`text`,value:k,placeholder:`(First line)`,onChange:e=>M({name:e})}},{key:`version`,label:`Version`,required:!0,control:{type:`static`,text:`v${b.version}${b.default?` (Default)`:``}`}},{key:`text`,label:`Prompt`,required:!0,control:{type:`textarea`,value:A,placeholder:`None`,onChange:e=>M({text:e})}}]},{key:`versions`,title:`Versions`,children:(0,$.jsx)(m,{className:`pltable pl-versions`,label:`Versions`,rows:b.versions,rowKey:e=>String(e.version),defaultSort:{key:`version`,dir:`desc`},columns:T,after:e=>f.has(e.version)&&(0,$.jsx)(`tr`,{className:`pl-words-row`,children:(0,$.jsx)(`td`,{colSpan:T.length,children:(0,$.jsx)(`pre`,{className:`pl-words`,children:e.text})})})})},{key:`uses`,title:`Uses`,children:b.uses.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No uses yet.`}):(0,$.jsx)(m,{className:`pltable pl-uses`,label:`Uses`,rows:b.uses,rowKey:E,pageSize:10,defaultSort:{key:`when`,dir:`desc`},columns:D,after:e=>h.has(E(e))&&(0,$.jsx)(`tr`,{className:`pl-words-row`,children:(0,$.jsx)(`td`,{colSpan:D.length,children:(0,$.jsx)(`pre`,{className:`pl-words`,children:C(e.version)})})})})}]})}var Oc=`#new`,kc={tab:`library`,section:`prompts`,id:null},Ac=e=>({tab:`library`,section:`prompts`,id:e});function jc({promptId:e=null}){let t=Or(),{list:n,error:r}=kr(),[i]=Q(`promptlab.workflows`),o=Je(),[s,c]=a(`prompts`,20),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(``),[p,h]=(0,X.useState)(`all`),[g,_]=(0,X.useState)(!1),v=g?Oc:e,y=t=>{_(t===Oc),t!==Oc&&t!==e&&Rr(t?Ac(t):kc)},b=vo(),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),T=po(),E=(0,X.useRef)(new Set);(0,X.useEffect)(()=>{if(e&&n){if(n.some(t=>t.id===e)){E.current.add(e);return}t.entry(e)?.doc||(zr(kc),E.current.has(e)||o.notify({label:oo(`prompt`,e,T.current)}))}},[e,n,t,o.notify,T.current]);let D=n??[],O=D.filter(e=>Sc(e,d,p)),k=e=>S(e instanceof Error?e.message:String(e)),A=async()=>{S(null),y(Oc)},j=async e=>{S(null);try{await t.flush(e.id);let n=await t.create({name:`${xr(e)} copy`,text:t.entry(e.id)?.doc?.text??e.text});y(n.id)}catch(e){k(e)}},M=async e=>{S(null);let n=[];try{for(let r of e)n.push(await t.remove(r.id)),v===r.id&&y(null)}catch(e){k(e)}n.length&&o.offer({label:e.length===1?`Deleted ${xr(e[0])}`:`Deleted ${n.length} prompts`,restore:()=>{for(let e of n)t.restore(e).catch(k)}})},N=e=>M([e]),P=e=>{S(null),t.setDefault(e.id).catch(k)},I=e=>[{label:`Edit…`,icon:Y.edit,onSelect:()=>y(e.id)},{label:`Set as default`,icon:Zn,disabled:e.default,onSelect:()=>P(e)},{label:`Duplicate`,icon:Y.clone,onSelect:()=>void j(e)},b(Ac(e.id)),{label:`Copy or move…`,icon:Y.transfer,onSelect:()=>w(e)},{label:`Delete`,icon:Y.remove,destructive:!0,disabled:e.default,onSelect:()=>void N(e)}];return(0,$.jsxs)(J,{id:`prompts`,title:`Prompt library`,note:n?`${D.length} ${D.length===1?`prompt`:`prompts`}`:void 0,actions:[{label:`Page size…`,icon:Y.pageSize,onSelect:()=>u(!0)}],about:`Wordings kept with every version and the runs that used them.${D.some(e=>e.default)?` The Default is the one a new target starts from.`:``}`,children:[n===null?(0,$.jsx)(Ot,{label:`Prompts`,error:r,onRetry:()=>void t.refresh()}):D.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No prompts yet.`}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(pe,{noun:`prompts`,search:{label:`Search prompts`,placeholder:`Search prompts`,value:d,onChange:f},filters:[{key:`show`,label:`Show`,value:p,onChange:e=>h(e),options:bc}],count:{shown:O.length,total:D.length}}),O.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No prompts match these filters.`}):(0,$.jsx)(m,{className:`pl-prompts`,cards:!0,label:`Prompts`,rows:O,rowKey:e=>e.id,pageSize:s,rowProps:e=>({"data-default":e.default||void 0}),columns:[{key:`prompt`,header:`Prompt`,role:`title`,sort:e=>xr(e).toLowerCase(),cell:e=>(0,$.jsxs)(`button`,{type:`button`,className:`pl-open`,onClick:()=>y(e.id),children:[(0,$.jsxs)(`span`,{className:`pl-title`,children:[xr(e),e.default&&(0,$.jsx)(`span`,{className:`pl-default`,children:`Default`})]}),e.name.trim()&&e.text.trim()&&(0,$.jsx)(`span`,{className:`pl-preview`,children:e.text.trim()})]})},{key:`version`,header:`Version`,sort:e=>e.version,cell:e=>`v${e.version}`},{key:`uses`,header:`Uses`,className:`num`,sort:e=>e.useCount,cell:e=>e.useCount},{key:`last`,header:`Last used`,sort:e=>e.lastUsed??null,tdProps:e=>({"data-state":e.lastUsed?void 0:`none`}),cell:e=>e.lastUsed?wc(e.lastUsed):`—`},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${xr(e)} actions`,actions:I(e)})}],select:{noun:`prompt`,label:xr,actions:e=>[{label:`Delete`,icon:Y.remove,destructive:!0,disabled:e.every(e=>e.default),onSelect:()=>void M(e.filter(e=>!e.default))}]}})]}),x&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:x}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost pl-add`,onClick:()=>void A(),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add prompt`]}),v&&(0,$.jsx)(Tc,{id:v===Oc?null:v,onClose:()=>y(null),onDuplicate:e=>void j(e),onDelete:e=>void N(e)}),l&&(0,$.jsx)(re,{value:s,onChange:c,onClose:()=>u(!1)}),C&&(0,$.jsx)(Co,{subject:{kind:`prompt`,id:C.id,name:xr(C)},scan:{pipelines:i.list},undo:o,onClose:()=>w(null),onChanged:()=>void t.refresh()}),(0,$.jsx)(Vt,{undo:o.undo,notice:o.notice,onUndo:o.undoNow,onDismiss:o.dismiss})]})}var Mc=[{value:`name`,label:`Name`,dir:1},{value:`added`,label:`Newest`,dir:-1},{value:`size`,label:`Largest`,dir:-1},{value:`type`,label:`Type`,dir:1}],Nc=`evals-lab.sources`,Pc={view:`thumbs`,sort:`name`,dir:1};function Fc(){try{let e=window.localStorage.getItem(Nc);if(e){let t=JSON.parse(e);if(t.view===`thumbs`||t.view===`list`)return{view:t.view,sort:t.sort===`added`||t.sort===`size`||t.sort===`type`?t.sort:`name`,dir:t.dir===-1?-1:1}}}catch{}return Pc}function Ic(e){try{window.localStorage.setItem(Nc,JSON.stringify(e))}catch{}}var Lc=e=>{let t=e.lastIndexOf(`.`);return t<0?``:e.slice(t).toLowerCase()},Rc=[`.heic`,`.heif`,`.dng`,`.tif`,`.tiff`],zc=[`.jpg`,`.jpeg`,`.png`],Bc=e=>zc.includes(Lc(e))||Rc.includes(Lc(e)),Vc=(e,t)=>`/api/sources/${encodeURIComponent(e)}/thumbs/${encodeURIComponent(t.name)}${t.v?`?v=${t.v}`:``}`,Hc=(e,t)=>Rc.includes(Lc(t.name))?`/api/sources/${encodeURIComponent(e)}/zoom/${encodeURIComponent(t.name)}`:`/api/sources/${encodeURIComponent(e)}/files/${encodeURIComponent(t.name)}`;function Uc(e,t,n){let r=[...e],i=(e,t)=>e.name.localeCompare(t.name,void 0,{numeric:!0,sensitivity:`base`});return r.sort((e,r)=>{let a;return a=t===`size`?e.bytes-r.bytes:t===`added`?(e.added??0)-(r.added??0):t===`type`&&Lc(e.name).localeCompare(Lc(r.name))||i(e,r),a*n}),r}function Wc(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>e.name.toLowerCase().includes(n)):[...e]}function Gc(e){if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e,r=-1;do n/=1024,r+=1;while(n>=1024&&r<t.length-1);let i=Math.round(n*10)/10;return`${Number.isInteger(i)?i:i.toFixed(1)} ${t[r]}`}var Kc=e=>St(e*1e3);function qc(e){let t=e.platform??e.config?.platform,n=e.provider??e.config?.provider;return{id:e.id,name:e.name,system:e.system,type:e.type,...t?{platform:t}:{},...n?{provider:n}:{},files:e.files.length,bytes:e.bytes}}var Jc=`[redacted]`,Yc=/^(?:api[-_]?key|x-api-key|authorization|ocp-apim-subscription-key|password|secret|client[-_]?secret|token|access[-_]?token|refresh[-_]?token|sig)$/i,Xc=/^(?:headers|authentication)$/,Zc=[[/sk-ant-[A-Za-z0-9_-]+/g,Jc],[/sk-[A-Za-z0-9_-]{20,}/g,Jc],[/Bearer\s+[A-Za-z0-9._~+/=-]+/g,`Bearer ${Jc}`],[/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,Jc],[/([?&](?:sig|code)=)[^&"\s]+/g,`$1${Jc}`]];function Qc(e){let t=0,n=e=>{let n=e;for(let[e,r]of Zc)n=n.replace(e,(...e)=>(t++,r.replace(`$1`,e[1]??``)));return n},r=e=>{if(Array.isArray(e))return e.map(r);if(e&&typeof e==`object`){let n={};for(let[i,a]of Object.entries(e))Xc.test(i)&&a&&typeof a==`object`&&!Array.isArray(a)?n[i]=Object.fromEntries(Object.keys(a).map(e=>(t++,[e,Jc]))):Xc.test(i)&&typeof a==`string`||Yc.test(i)&&a!=null&&typeof a!=`object`?(t++,n[i]=Jc):n[i]=r(a);return n}return typeof e==`string`?n(e):e};return{value:r(e),count:t}}var $c={import:`evals-lab.flow.importing`,resync:`evals-lab.flow.resyncing`},el=`resume`;function tl(e){try{return sessionStorage.getItem(e)}catch{return null}}function nl(e,t){try{t?sessionStorage.setItem(e,t):sessionStorage.removeItem(e)}catch{}}function rl(e,t){nl($c[e],t)}function il(e,t){let n=tl($c[e]);return n!==null&&nl($c[e],null),n===t}function al(e){let t=new URL(e);for(let e of Object.keys($c)){let n=tl($c[e]);n&&t.searchParams.append(el,`${e}:${n}`)}return t.href}function ol(e){for(let t of e.searchParams.getAll(el)){let e=t.indexOf(`:`),n=t.slice(0,e);e>0&&Object.hasOwn($c,n)&&nl($c[n],t.slice(e+1))}e.searchParams.delete(el)}var sl=[`https://service.flow.microsoft.com//.default`];function cl(e){let t=e.trim();return!t||t.toLowerCase()===`organizations`?`Any organisation`:`${t} only`}var ll=null;function ul(e){let t=`${e.clientId}/${e.tenant}`;return ll?.key!==t&&(ll={key:t,pca:cn(()=>import(`./dist-DI3ewZYj.js`).then(async t=>{let n=await t.createStandardPublicClientApplication({auth:{clientId:e.clientId,authority:`https://login.microsoftonline.com/${e.tenant}`,redirectUri:`${window.location.origin}/`,OIDCOptions:{responseMode:t.ResponseMode.QUERY}},cache:{cacheLocation:`sessionStorage`}}),r=await n.handleRedirectPromise();return r?.account&&n.setActiveAccount(r.account),n}),[])}),ll.pca}var dl=()=>{let e=new URLSearchParams(window.location.search);return e.has(`state`)&&(e.has(`code`)||e.has(`error`))};async function fl(e){await ul(e)}async function pl(e){let t=await ul(e);return(t.getActiveAccount()??t.getAllAccounts()[0]??null)?.username??null}var ml=`signin`;function hl(e=window.location.href){let t=new URL(e);return t.hostname===`127.0.0.1`?(t.hostname=`localhost`,t.searchParams.set(ml,`microsoft`),t.href):null}function gl(){let e=new URL(window.location.href);return e.searchParams.get(`signin`)===`microsoft`&&(e.searchParams.delete(ml),ol(e),window.history.replaceState(window.history.state,``,e.href),!0)}async function _l(e,t=window.location.href){let n=hl();if(n){window.location.assign(al(n));return}await(await ul(e)).loginRedirect({scopes:sl,prompt:`select_account`,redirectStartPage:t})}async function vl(e){let t=await ul(e),n=t.getActiveAccount()??t.getAllAccounts()[0];n&&await t.clearCache({account:n})}async function yl(e){let t=await ul(e),n=t.getActiveAccount()??t.getAllAccounts()[0];if(!n)throw Error(`sign in to Microsoft first`);try{return(await t.acquireTokenSilent({scopes:sl,account:n})).accessToken}catch(e){let{InteractionRequiredAuthError:r}=await cn(async()=>{let{InteractionRequiredAuthError:e}=await import(`./dist-DI3ewZYj.js`);return{InteractionRequiredAuthError:e}},[]);throw e instanceof r&&await t.acquireTokenRedirect({scopes:sl,account:n,redirectStartPage:window.location.href}),e}}var bl=new EventTarget,xl=()=>bl.dispatchEvent(new Event(`change`));function Sl(){let e=Z(),[t,n]=(0,X.useState)({cfg:void 0,editable:!1});return(0,X.useEffect)(()=>{let t=!0,r=()=>e.config().then(e=>{t&&n({cfg:e.microsoft??null,editable:!!e.microsoftEditable})},()=>{t&&n({cfg:null,editable:!1})});return r(),bl.addEventListener(`change`,r),()=>{t=!1,bl.removeEventListener(`change`,r)}},[e]),t}var Cl=()=>Sl().cfg,wl=e=>he(()=>yl(e));async function Tl(e,t,n){let r=await e.flow(t,n);return{name:r.name,definition:Qc(r.definition).value}}async function El(e,t,n,r,i){let a=await e.run(t,n,r),o=S(i),s=new Map,c=new Map,l=t=>t?(c.has(t)||c.set(t,e.content(t)),c.get(t)):Promise.resolve(null),u=i=>(s.has(i)||s.set(i,e.repetitions(t,n,r,i)),s.get(i)),d=async(e,t)=>{let n=o[e]?.loops??[];return n.length?(await u(e)).find(e=>n.every(n=>!(n in t)||e.at[n]===t[n]))??null:a.actions[e]??null},f=e=>e.status!==`Skipped`&&(e.inputsLink||e.outputsLink||e.error),p=async e=>({run:r,at:e.at,startTime:e.startTime,inputs:await l(e.inputsLink),outputs:await l(e.outputsLink),error:e.error});return{detail:a,triggerOutputs:()=>l(a.trigger?.outputsLink??null),actionInputs:async(e,t)=>l((await d(e,t))?.inputsLink??null),actionOutputs:async(e,t)=>l((await d(e,t))?.outputsLink??null),callsOf:async e=>{let t=e.loops.length?await u(e.name):[a.actions[e.name]].filter(e=>!!e);return Promise.all(t.filter(f).map(p))}}}async function Dl(e,t,n,r,i,a){if(!r.length)return[];let o=(await e.runs(t,n)).slice(0,a).map(e=>e.id);if(!o.length)return[];let s=new Set,c=[];for(let a of r){let{records:r}=await Ol(e,t,n,o,a,i,s);for(let e of r)s.add(oe(e)),c.push(e)}return c}async function Ol(e,t,n,r,i,a,o,s){let c=new Set(o),l=[],u=0,d=0;for(let o of r){let r=await El(e,t,n,o,a);for(let e of await r.callsOf(i)){let t=Qc(await Ee(i,e,r,a)).value,n=oe(t);if(c.has(n)){u++;continue}c.add(n),l.push(t)}s?.(++d)}return{records:l,skipped:u}}var kl=5;function Al({typeRow:e,initial:n,onMade:r,bind:i}){let a=Z(),o=Cl(),s=(0,X.useMemo)(()=>o?wl(o):null,[o]),[c,l]=(0,X.useState)(void 0),[u,d]=(0,X.useState)(null),f=n?.config??{},[p,m]=(0,X.useState)(``),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(``),[y,b]=(0,X.useState)(n?.name??``),[x,S]=(0,X.useState)(!1),[C,w]=(0,X.useState)(null),T=e=>w(e instanceof Error?e.message:String(e));(0,X.useEffect)(()=>{o&&pl(o).then(l,()=>l(null))},[o]),(0,X.useEffect)(()=>{s&&c&&s.environments().then(e=>{d(e),m((e.find(e=>e.id===f.environment)??e.find(e=>e.isDefault)??e[0])?.id??``)},T)},[s,c,f.environment]),(0,X.useEffect)(()=>{s&&p&&(g(null),v(``),s.flows(p).then(e=>{if(g(e),n){v(e.find(e=>e.id===f.flow)?.id??``);return}v(e[0]?.id??``),b(e[0]?.name??``)},T))},[s,p,n,f.flow]);let E=!!s&&!!c,D=!!n&&E&&(_!==f.flow||p!==f.environment),O=!!n&&y.trim()!==n.name,k=D||O,A=!!y.trim()&&(n&&!E?!0:E&&!!_),j=(0,X.useRef)(async()=>{});(0,X.useEffect)(()=>{i({enabled:A&&!x,busy:x,changed:k,run:()=>void j.current()})},[i,A,x,k]),(0,X.useEffect)(()=>()=>i(null),[i]);let M=n?n.name:`New Source`,N={key:`name`,label:`Name`,width:`full`,control:{type:`text`,value:y,onChange:b}},P=(0,$.jsx)(V,{label:M,rows:n?[e,N]:[e]}),F=async(e,n,r)=>{try{for(let i of await Dl(e,p,_,Rt(r),r,kl))try{await a.upload(n,t(i),new Blob([JSON.stringify(i,null,2)],{type:`application/json`}))}catch{}}catch{}},I=()=>{let e=u?.find(e=>e.id===p)?.name;return{platform:`power-automate`,environment:p,...e?{environmentName:e}:{},flow:_,displayName:h?.find(e=>e.id===_)?.name??_}},L=async e=>{if(!k){await r(e);return}S(!0),w(null);try{let t=D&&s?await Tl(s,p,_):null,n=await a.updateSource(e.id,{...O?{name:y.trim()}:{},...t?{config:I()}:{}});t&&await a.saveDefinition(e.id,(await a.definition(e.id)).version,t.definition),await r(n)}catch(e){T(e instanceof mn?Error(e.message):e)}finally{S(!1)}};return j.current=async()=>{if(!A)return;if(n){await L(n);return}if(!s)return;S(!0),w(null);let e=null;try{let t=await a.createSource(y.trim(),`workflow`,I());e=t.id;let n=await Tl(s,p,_);await a.saveDefinition(t.id,0,n.definition),F(s,t.id,n.definition),await r(t)}catch(t){e&&await a.removeSource(e).catch(()=>{}),T(t instanceof mn?Error(t.message):t)}finally{S(!1)}},o===void 0||o&&c===void 0?(0,$.jsxs)($.Fragment,{children:[P,(0,$.jsx)(Ot,{label:`Account`})]}):o===null?(0,$.jsxs)($.Fragment,{children:[P,(0,$.jsxs)(`p`,{className:`note`,children:[`(Microsoft sign-in not set up) `,(0,$.jsxs)(`a`,{href:`#/setup`,children:[`Open`,`\xA0`,`Setup`]})]})]}):c?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(V,{label:M,rows:[e,{key:`account`,label:`Account`,control:{type:`static`,text:c}},{key:`env`,label:`Environment`,control:u?{type:`picker`,kind:`Environment`,value:p,options:u.map(e=>({id:e.id,label:e.name})),onChange:m}:{type:`static`,text:`Loading…`}},{key:`flow`,label:`Flow`,control:h?{type:`picker`,kind:`Flow`,value:_,placeholder:`(Not set)`,options:h.map(e=>({id:e.id,label:e.name})),onChange:e=>{v(e),n||b(h.find(t=>t.id===e)?.name??``)}}:{type:`static`,text:p?`Loading…`:`—`}},N]}),h&&!h.length&&(0,$.jsx)(`p`,{className:`note`,children:`No flows in this environment.`}),C&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:C})]}):(0,$.jsxs)($.Fragment,{children:[P,(0,$.jsx)(`div`,{className:`sacts`,children:(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>void _l(o).catch(T),children:[(0,$.jsx)(Rn,{size:14,"aria-hidden":`true`}),` Sign in with Microsoft`]})}),C&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:C})]})}function jl(e){let t=/^https?:\/\/[^/?#]+(\/[^?#]*)?(?:\?([^#]*))?/i.exec(e);if(!t)return{path:e,query:{}};let n={};for(let e of(t[2]??``).split(`&`).filter(Boolean)){let t=e.indexOf(`=`);n[t<0?e:e.slice(0,t)]=t<0?``:e.slice(t+1)}return{path:t[1]||`/`,query:n}}var Ml=e=>{try{return new URL(/^https?:\/\//i.test(e)?e:`https://`+e).host}catch{return null}},Nl=e=>(L().CONNECTION_TYPES[e??``]?.answers??[`prompt`]).includes(`request`);function Pl(e,t){let n=Ml(e);return n&&t.find(e=>Nl(e.type)&&Ml(L().addressOf(e))===n)||null}function Fl(e,t){let n=L(),r=n.httpApiFor(e);if(r!==`raw`)return r;let i=Pl(e,t);return i&&n.CONNECTION_TYPES[i.type]?.speaks?.(i)||`raw`}function Il(e,t){let n=Pl(e,t)??t.find(e=>Nl(e.type));return n?{id:n.id,name:n.name??``}:{id:`http-endpoint`,name:`HTTP endpoint`}}function Ll(e){let t=Ml(e),n=Object.values(L().CONNECTION_TYPES).filter(e=>e.picker!==!1&&Nl(e.id)),r=n.find(e=>e.url&&Ml(e.url)===t);if(r)return{type:r.id,name:r.label,url:``};let i=n.find(e=>!e.url)??n[0],a=(()=>{try{return new URL(e).origin}catch{return``}})();return{type:i.id,name:i.label,url:a}}function Rl(e,t){let n=xe(e,t.name),r=n?Ce(e,n.name):[],i=L();return[...n?[{type:`is-json`,schema:n.schema?JSON.stringify(n.schema,null,2):``}]:[],r.length?{type:`fields-equal-recorded`,fields:r.join(`
8
- `)}:n?{type:`same-as-recorded`}:{type:`judge-vs-production`,...i.METRICS[`judge-vs-production`].defaults()}]}function zl(e,t,n,r,i){let a=L(),o=n.template,s=String(o.uri??``),c=Fl(s,r),l={type:`httpRequest`,method:String(o.method??`POST`).toUpperCase(),...jl(s),body:o.body??null,...a.HTTP_APIS[c].cellOf(o.body??null)},u=xe(t,n.name),d=Il(s,r),f=a.withOut({type:`job`,id:a.newId(),name:n.name,steps:[{type:`attachContent`,content:{type:`source`,ref:e,first:null,loops:1}},{type:`flowStep`,step:n.name,loop:n.loops.at(-1)??null,api:c},...u?.expression?[{type:`readAs`,readAs:u.expression}]:[]]},{kind:`text`,...a.OUTPUT_KINDS.text?.settingDefaults?.()??{},modifiers:a.OUTPUT_KINDS.text?.modifiers?.()??[]});return{version:a.PIPELINE_VERSION,id:a.newId(),name:`${e.name}, ${n.name}`,jobs:[f],targets:[{id:a.newId(),name:`Recorded`,connection:null,profile:null,steps:[{type:`recorded`,prompt:``}]},{id:a.newId(),name:`Draft`,connection:d,profile:null,steps:[structuredClone(l)]}],evals:[a.newLink(i)],pass:{mode:`all`}}}function Bl(e,t,n){let r=e.result;if(!r||!(`status`in r))return null;let i=Rt(t).find(t=>t.name===e.step);if(!i)return null;let a=String(i.template.uri??``),o={step:i.name,loop:i.loops.at(-1)??null,api:Fl(a,n),readAs:xe(t,i.name)?.expression??null};try{return L().httpReplyOf(o,{prompt:``},r.body,r.status,{scope:e.scope,now:e.at}).raw}catch{return null}}function Vl(e,t){let n;try{n=JSON.parse(e)}catch{return[{type:`equals`,value:e,json:!1}]}if(!n||typeof n!=`object`||Array.isArray(n))return[{type:`equals`,value:e,json:!0}];let r=n,i=t.length?t.filter(e=>e in r):Object.keys(r).filter(e=>r[e]==null||typeof r[e]!=`object`);return i.length?i.map(e=>({type:`json-field`,path:e,op:`equals`,value:typeof r[e]==`string`?r[e]:JSON.stringify(r[e])})):[{type:`equals`,value:e,json:!0}]}var Hl=e=>e.replace(/\.json$/i,``).replace(/[^A-Za-z0-9._-]/g,`_`);function Ul(e,t,n){let r=[],i=0;for(let{name:a,record:o}of e){if(Bl(o,t,n)==null){i++;continue}r.push({id:Hl(a),item:a,todo:!1,note:``,metrics:[]})}return{cases:r,skipped:i}}function Wl(e){return e.map(e=>({id:e.replace(/\.[a-z0-9]+$/i,``).replace(/[^A-Za-z0-9._-]/g,`_`),item:e,todo:!0,note:``,metrics:[]}))}function Gl(e,t,n){let r=[],i=0;for(let{name:a,record:o}of e){let e=Bl(o,t,n);if(e==null){i++;continue}let s=xe(t,o.step),c=s?Ce(t,s.name):[];r.push({id:a.replace(/\.json$/i,``).replace(/[^A-Za-z0-9._-]/g,`_`),item:a,todo:!0,note:``,metrics:Vl(e,c)})}return{cases:r,skipped:i}}var Kl=e=>e instanceof Error?e.message:String(e),ql={fetched:`Fetched`,recorded:`Recorded`,uploaded:`Uploaded`,added:`Added`,edited:`Edited`,copied:`Copied`},Jl=e=>e?[ql[e.kind]??e.kind,e.at?Ft(e.at):``].filter(Boolean).join(` `):``;function Yl({status:e,title:t}){return e==null?(0,$.jsx)(`span`,{className:`snone`,children:`(n/a)`}):(0,$.jsxs)(`span`,{className:`sresult`,title:t,children:[(0,$.jsx)(ge,{pass:e>=200&&e<300,decorative:!0}),e]})}function Xl(e,t){return{key:`history`,title:`History`,children:(0,$.jsx)(`div`,{className:`sflow sresponses`,children:(0,$.jsx)(m,{className:`slist`,cards:!0,label:`History`,rows:[...e],rowKey:e=>String(e.n),defaultSort:null,columns:[{key:`updated`,header:`Updated`,role:`title`,sort:e=>e.at,cell:e=>Jl(e)},{key:`status`,header:`Status`,sort:e=>e.status,cell:e=>(0,$.jsx)(Yl,{status:e.status})},{key:`act`,header:``,className:`s-actions`,role:`menu`,sort:null,cell:e=>e.current?(0,$.jsx)(`span`,{className:`snow`,children:`Current`}):(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>t(e.n),children:[(0,$.jsx)(Kn,{size:14,"aria-hidden":`true`}),` Restore`]})}]})})}}function Zl({name:e,facts:t,sections:n,changed:r,valid:i,taken:a,menu:o,onSave:s,onClose:c}){let l=e.lastIndexOf(`.`),u=l>0?e.slice(l):``,d=e.slice(0,e.length-u.length),[f,p]=(0,X.useState)(d),[m,h]=(0,X.useState)(),[g,_]=(0,X.useState)(),[v,y]=(0,X.useState)(!1),b=async()=>{let t=f.trim(),n=t+u;if(!t)return h(`A call needs a name.`);if(n!==e&&a(n))return h(`${n} is taken.`);if(!i||i()){if(n===e&&!r)return c();y(!0),_(void 0);try{await s(n),c()}catch(e){e instanceof mn&&e.body?.field===`name`?h(Kl(e)):_(Kl(e)),y(!1)}}};return(0,$.jsx)(st,{title:e,menu:o,wide:!0,sections:[{key:`call`,rows:s?[{key:`name`,label:`Name`,width:`full`,control:{type:`text`,value:f,suffix:u,onChange:e=>{p(e),h(void 0)}},error:m},...t]:t},...n??[]],...s?{onSave:()=>void b(),saving:v,dirty:f!==d||!!r,refusal:g}:{},onClose:c})}function Ql(e){let[t]=Q(`promptlab.workflows`);return(0,X.useMemo)(()=>t.list.filter(t=>{let n=L().contentOf(t.work);return n?.type===`source`&&n.ref.id===e}),[t.list,e])}var $l=e=>Lr({tab:`runs`,id:e});function eu(e,t){let n=vr(),{list:r}=yr(),i=(0,X.useMemo)(()=>[...new Set([...t.flatMap(e=>{let t=L().evalsDataset(e.work);return t?.id?[t.id]:[]}),...(r??[]).filter(t=>t.preview?.id===e).map(e=>e.id)])],[t,r,e]);(0,X.useEffect)(()=>{for(let e of i)n.load(e)},[n,i]);let a=(0,X.useSyncExternalStore)(n.subscribe,n.held);return(0,X.useMemo)(()=>{let e=new Map,t=new Map;for(let n of i){let r=a.find(e=>e.id===n)?.doc;if(!r)continue;let i=new Set(r.body.cases.flatMap(e=>e.item?[e.item]:[]));e.set(n,i);for(let e of i)t.has(e)||t.set(e,{id:r.id,name:r.name})}return{caseOf:e=>t.get(e)??null,casesIn:t=>t&&e.get(t)||new Set}},[i,a])}function tu({group:e}){return e?(0,$.jsx)(`a`,{href:Lr({tab:`library`,section:`datasets`,id:e.id}),children:e.name}):(0,$.jsx)(`span`,{className:`snone`,children:`(No case)`})}var nu=e=>e?{type:`static`,text:e.name,href:Lr({tab:`library`,section:`datasets`,id:e.id})}:{type:`static`,text:`(No case)`,none:!0};function ru({why:e,disabled:t,busy:n,onClick:r,children:i,className:a=`ghost add-btn`}){let o=(0,X.useId)(),s=t&&e?e:null;return(0,$.jsxs)(`button`,{type:`button`,className:a||void 0,"aria-busy":n||void 0,...s?{"aria-disabled":!0,"aria-describedby":o,title:s}:{disabled:t,onClick:r},children:[i,s&&(0,$.jsx)(`span`,{id:o,hidden:!0,children:s})]})}function iu({pipelines:e,columns:t,itemsOf:n,casesIn:r,footer:i}){let a=e=>{let t=n(e),i=r(L().evalsDataset(e)?.id);return{n:t.filter(e=>i.has(e)).length,of:t.length}};return(0,$.jsxs)(J,{id:`source-pipelines`,title:`Pipelines`,note:String(e.length),children:[e.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(m,{className:`slist`,cards:!0,label:`Pipelines`,rows:[...e],rowKey:e=>e.id,columns:[{key:`name`,header:`Pipeline`,role:`title`,sort:e=>e.name,cell:e=>(0,$.jsx)(`a`,{href:$l(e.id),children:e.name})},...t.map(e=>({key:e.key,header:e.header,sort:e.sort?t=>e.sort(t.work):null,cell:t=>e.cell(t.work)})),{key:`graded`,header:`Graded`,sort:e=>a(e.work).n,cell:e=>{let t=a(e.work);return`${t.n} of ${t.of}`}}]})}):(0,$.jsx)(`p`,{className:`note`,children:`(No pipelines)`}),i]})}var au=e=>e.name.toLowerCase().endsWith(`.json`),ou=e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(r.error),r.readAsText(e)}),su=e=>e instanceof Error?e.message:String(e);function cu({source:e,definition:n,cfg:r}){let i=Z(),a=vr(),[o]=Q(`promptlab.connections`),s=Je(),[c,l]=(0,X.useState)(e.files.filter(au)),[u,d]=(0,X.useState)({}),[f,h]=(0,X.useState)({}),[_,v]=(0,X.useState)(null),[y,b]=(0,X.useState)(()=>il(`import`,e.id)?`import`:null),[x,S]=(0,X.useState)(null),w=(0,X.useMemo)(()=>Rt(n),[n]),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(null),k=(0,X.useCallback)(async()=>{let[t,n]=await Promise.all([i.source(e.id),i.sourceResponses(e.id)]),r=t.files.filter(au);l(r);let a=await Promise.all(r.map(async t=>{try{return[t.name,vt(JSON.parse(await ou(await i.file(e.id,t.name))))]}catch{return[t.name,null]}}));d(Object.fromEntries(a)),h(n.responses)},[i,e.id]),A=(0,X.useCallback)(()=>{O(null),k().then(()=>E(!0),e=>O(su(e)))},[k]);(0,X.useEffect)(A,[A]);let M=e=>{let t=u[e],r=t?w.find(e=>e.name===t.step):void 0;return t&&r?j(r,t,n):null},N=(0,X.useMemo)(()=>new Set(c.flatMap(e=>u[e.name]?[oe(u[e.name])]:[])),[c,u]),P=async(n,r=0)=>{let a=0,o=[];for(let s of n)try{(await i.upload(e.id,t(s),new Blob([JSON.stringify(s,null,2)],{type:`application/json`}))).unchanged?r++:a++}catch(e){o.push(e instanceof mn?e.message:su(e))}await k(),v([`Added ${a}`,r?`Skipped ${r}`:``,o.length?`Refused ${o.length}: ${o[0]}`:``].filter(Boolean).join(`, `))},F=async()=>{let{cases:t,skipped:r}=Gl(c.flatMap(e=>u[e.name]?[{name:e.name,record:u[e.name]}]:[]),n,o.list);if(!t.length)return v(`No call holds a production reply.`);try{let n=await a.create(`${e.name} · production`,{...rr(),cases:t},{id:e.id,name:e.name});v([`Made ${n.name}: ${t.length} ${t.length===1?`case`:`cases`}`,r?`Skipped ${r}`:``].filter(Boolean).join(`, `))}catch(e){v(su(e))}},I=async t=>{try{let{trash:n}=await i.removeFiles(e.id,t);l(e=>e.filter(e=>!t.includes(e.name))),s.offer({label:t.length===1?`Removed ${t[0]}`:`Removed ${t.length} calls`,restore:()=>void i.restoreTrash(n).then(k,e=>v(su(e)))})}catch(e){v(su(e))}},R=async t=>{let n=URL.createObjectURL(await i.file(e.id,t)),r=document.createElement(`a`);r.href=n,r.download=t,document.body.append(r),r.click(),r.remove(),URL.revokeObjectURL(n)},z=async t=>{try{let{call:n}=await i.cloneCall(e.id,t);l(e=>e.flatMap(e=>e.name===t?[e,{...e,name:n.name}]:[e])),d(e=>({...e,[n.name]:e[t]??null})),s.offer({label:`Cloned ${t}`,restore:()=>void i.removeFiles(e.id,[n.name]).then(()=>l(e=>e.filter(e=>e.name!==n.name)),e=>v(su(e)))})}catch(e){v(su(e))}},B=async(t,n,r)=>{let a=r?JSON.stringify(Qc(r).value,null,2):void 0,{call:o}=await i.editCall(e.id,t,{...n===t?{}:{to:n},...a===void 0?{}:{content:a}});await k(),s.offer({label:a===void 0?`Renamed ${t}`:`Edited ${t}`,restore:async()=>{o.n!=null&&o.was!=null&&await i.restoreResponse(e.id,o.name,o.was,o.n),o.name!==t&&await i.editCall(e.id,o.name,{to:t}),await k()}})},V=async(t,n)=>{let r=(f[t]??[]).find(e=>e.current)?.n;try{await i.restoreResponse(e.id,t,n),await k(),S({name:t,seq:Date.now()}),r!=null&&s.offer({label:`Restored ${t}`,restore:()=>i.restoreResponse(e.id,t,r).then(k)})}catch(e){v(su(e))}},ee=(e,t)=>[...t?[]:[{label:`Edit…`,icon:Y.edit,disabled:!u[e],onSelect:()=>S({name:e,seq:Date.now()})}],{label:`Clone`,icon:Y.clone,onSelect:()=>{t&&S(null),z(e)}},{label:`Download`,icon:g,onSelect:()=>void R(e).catch(e=>v(su(e)))},{label:`Remove`,icon:At,destructive:!0,onSelect:()=>{t&&S(null),I([e])}}],te=(0,X.useCallback)(()=>b(null),[]),ne=(0,X.useCallback)(()=>S(null),[]),H=x?u[x.name]:null,U=Ql(e.id),{caseOf:re,casesIn:W}=eu(e.id,U),ie=w.length<=1,ae=e=>(f[e]??[]).find(e=>e.current)??null;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(J,{id:`flow-calls`,title:`Calls`,note:String(c.length),actions:[{label:`Import runs…`,icon:ke,disabled:!w.length||!r,onSelect:()=>b(`import`)},{label:`Upload…`,icon:Ue,disabled:!w.length,onSelect:()=>b(`upload`)},{label:`New dataset`,icon:p,disabled:!c.length,onSelect:()=>void F()}],children:[_&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:_}),T?c.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(m,{className:`slist`,cards:!0,label:`Calls`,rows:c,rowKey:e=>e.name,select:{noun:`call`,actions:e=>[{label:`Download`,icon:g,onSelect:()=>void(async()=>{for(let t of e)await R(t.name)})().catch(e=>v(su(e)))},{label:`Remove`,icon:At,destructive:!0,onSelect:()=>void I(e.map(e=>e.name))}]},columns:[{key:`reads`,header:`Reads`,role:`title`,sort:e=>fu(u[e.name])||e.name,cell:e=>u[e.name]?(0,$.jsx)(`button`,{type:`button`,className:`sopen`,onClick:()=>S({name:e.name,seq:Date.now()}),children:fu(u[e.name])||e.name}):`Unreadable`},...ie?[]:[{key:`action`,header:`Action`,sort:e=>u[e.name]?.step??``,cell:e=>u[e.name]?.step??`—`}],{key:`updated`,header:`Updated`,sort:e=>ae(e.name)?.at??``,cell:e=>Jl(ae(e.name))||`—`},{key:`reply`,header:`Reply`,sort:e=>du(u[e.name])?.code??``,cell:e=>{let t=du(u[e.name]);return u[e.name]?t?(0,$.jsxs)(`span`,{className:`sresult`,title:t.title,children:[(0,$.jsx)(ge,{pass:t.ok,decorative:!0}),t.code]}):(0,$.jsx)(Yl,{status:null}):`—`}},{key:`request`,header:`Request`,sort:e=>uu(u[e.name],M(e.name)),tdProps:e=>{let t=M(e.name);return t&&t.match===!1?{title:t.where}:{}},cell:e=>{let t=uu(u[e.name],M(e.name));return t===lu?(0,$.jsx)(`span`,{className:`snone`,children:t}):t}},{key:`case`,header:`Case`,sort:e=>re(e.name)?.name??``,cell:e=>(0,$.jsx)(tu,{group:re(e.name)})},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(C,{label:`${e.name} actions`,actions:ee(e.name,!1)})}]})}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`p`,{className:`note`,children:`No calls yet.`}),!!w.length&&r&&(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>b(`import`),children:[(0,$.jsx)(ke,{size:14,"aria-hidden":`true`}),` Import runs…`]})]}):(0,$.jsx)(Ot,{label:`Calls`,error:D,onRetry:A}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,disabled:!w.length,onClick:()=>b(`hand`),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),` Add call`]})]}),y===`import`&&r&&(0,$.jsx)(yu,{cfg:r,source:e,steps:w,definition:n,held:N,onClose:te,onRead:async(e,t)=>{b(null),await P(e,t)}}),y===`hand`&&(0,$.jsx)(bu,{steps:w,onClose:te,onAdd:async e=>{b(null),await P([e])}}),y===`upload`&&(0,$.jsx)(Su,{steps:w,onClose:te,onRead:async e=>{b(null),await P(e)}}),(0,$.jsx)(iu,{pipelines:U,casesIn:W,itemsOf:e=>{let t=L().flowStepOf(e.jobs[0])?.step;return c.filter(e=>!t||u[e.name]?.step===t).map(e=>e.name)},columns:[{key:`action`,header:`Action`,cell:e=>L().flowStepOf(e.jobs[0])?.step??`—`},{key:`targets`,header:`Targets`,cell:e=>L().targetsOf(e).map((t,n)=>L().targetLabel(e,n)).join(`, `)||`—`}]}),x&&H&&(0,$.jsx)(vu,{name:x.name,record:H,menu:ee(x.name,!0),caseOf:re(x.name),responses:f[x.name]??[],onRestore:e=>void V(x.name,e),taken:e=>c.some(t=>t.name===e),onSave:(e,t)=>B(x.name,e,t),onClose:ne},x.seq),(0,$.jsx)(Vt,{undo:s.undo,onUndo:s.undoNow,onDismiss:s.dismiss})]})}var lu=`(n/a)`,uu=(e,t)=>e&&!e.request?lu:!t||t.match===null?`—`:t.match?`Matches`:`Differs`;function du(e){let t=e?.result;return t?`error`in t?{ok:!1,code:t.error.code||`Error`,...t.error.message?{title:t.error.message}:{}}:{ok:t.status>=200&&t.status<300,code:String(t.status)}:null}function fu(e){if(!e)return``;let t=e=>{let t=gu(e).replace(/\s+/g,` `).trim();return t.length>60?`${t.slice(0,59)}…`:t};return hu(e).map(e=>`${e.label}: ${t(e.value)}`).join(`, `)}var pu=e=>e.map(e=>({value:e.name,label:e.name})),mu=e=>e.from===`trigger`?`Trigger body`:P(e);function hu(e){let t=e.scope;return[...t.trigger?[{key:`trigger`,label:mu({from:`trigger`}),value:t.trigger.body,put:(e,t)=>{e.scope.trigger={...e.scope.trigger,body:t}}}]:[],...Object.entries(t.actions??{}).map(([e,t])=>({key:`action-${e}`,label:e,value:t.body,put:(t,n)=>{t.scope.actions[e]={...t.scope.actions[e],body:n}}})),...Object.entries(t.variables??{}).map(([e,t])=>({key:`variable-${e}`,label:e,value:t,put:(t,n)=>{t.scope.variables[e]=n}})),...Object.entries(t.items??{}).map(([e,t])=>({key:`item-${e}`,label:e,value:t,put:(t,n)=>{t.scope.items[e]=n}}))]}var gu=e=>typeof e==`string`?e:e==null?``:JSON.stringify(e,null,2),_u=e=>{if(e===``)return null;try{return JSON.parse(e)}catch{return e}};function vu({name:e,record:t,menu:n,caseOf:r,responses:i,onRestore:a,taken:o,onSave:s,onClose:c}){let l=(0,X.useMemo)(()=>hu(t),[t]),u=t.result,d=(0,X.useMemo)(()=>({...Object.fromEntries(l.map(e=>[e.key,gu(e.value)])),...u&&`status`in u?{status:String(u.status),body:gu(u.body)}:{},...u&&`error`in u?{code:u.error.code??``,message:u.error.message??``}:{}}),[l,u]),[f,p]=(0,X.useState)(d),[m,h]=(0,X.useState)(),g=Object.keys(d).filter(e=>f[e]!==d[e]),_=(e,t,n=!0)=>({key:e,label:t,control:{type:`textarea`,mono:n,value:f[e]??``,onChange:t=>p(n=>({...n,[e]:t}))}}),v=async e=>{if(!g.length)return s(e,null);let n=structuredClone(t);for(let e of l)g.includes(e.key)&&e.put(n,_u(f[e.key]));u&&`status`in u?n.result={status:Number(f.status),body:g.includes(`body`)?_u(f.body):u.body}:u&&`error`in u&&(n.result={error:{...u.error,code:f.code,message:f.message}});let{run:r,iteration:i}=t.origin;return n.origin={kind:`edited`,...r?{run:r}:{},...i?{iteration:i}:{}},s(e,n)},y=()=>!(u&&`status`in u)||/^\d+$/.test(f.status.trim())?!0:(h(`A status is a whole number.`),!1),b=t.request?`${t.request.method} ${t.request.uri}`:null,x=[{key:`action`,label:`Action`,control:{type:`static`,text:t.step}},...b?[{key:`request`,label:`Request`,control:{type:`code`,text:b}}]:[],{key:`case`,label:`Case`,control:nu(r)}],S=[...l.length?[{key:`reads`,title:`Reads`,rows:l.map(e=>_(e.key,e.label))}]:[],...u&&`status`in u?[{key:`reply`,title:`Reply`,rows:[{key:`status`,label:`Status`,width:`quarter`,error:m,control:{type:`text`,numeric:!0,value:f.status??``,onChange:e=>{h(void 0),p(t=>({...t,status:e}))}}},_(`body`,`Body`)]}]:[],...u&&`error`in u?[{key:`reply`,title:`Reply`,rows:[{key:`code`,label:`Code`,control:{type:`text`,value:f.code??``,onChange:e=>p(t=>({...t,code:e}))}},_(`message`,`Message`,!1)]}]:[],...i.length?[Xl(i,a)]:[]];return(0,$.jsx)(Zl,{name:e,facts:x,sections:S,changed:g.length>0,taken:o,menu:n,valid:y,onSave:v,onClose:c})}function yu({cfg:e,source:t,steps:n,definition:r,held:i,onClose:a,onRead:o}){let s=(0,X.useMemo)(()=>wl(e),[e]),c=t.config??{},[l,u]=(0,X.useState)(void 0),[d,f]=(0,X.useState)(n[0]?.name??``),[p,h]=(0,X.useState)(null),[g,_]=(0,X.useState)(``),[v,y]=(0,X.useState)(new Set),[b,x]=(0,X.useState)(``),[S,C]=(0,X.useState)(null),[w,T]=(0,X.useState)(null),[E,D]=(0,X.useState)(null),[O,k]=(0,X.useState)(0);(0,X.useEffect)(()=>{pl(e).then(u,()=>u(null))},[e]),(0,X.useEffect)(()=>{l&&c.environment&&c.flow&&(D(null),s.runs(c.environment,c.flow).then(h,e=>D(su(e))))},[l,s,c.environment,c.flow,O]);let A=(0,X.useMemo)(()=>[...new Set((p??[]).map(e=>e.status))].sort(),[p]),j=(0,X.useMemo)(()=>(p??[]).filter(e=>!g||e.status===g),[p,g]),N=e=>y(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),P=j.length>0&&j.every(e=>v.has(e.id)),F=j.filter(e=>v.has(e.id)).map(e=>e.id),I=async()=>{let e=n.find(e=>e.name===d);if(!e||!c.environment||!c.flow)return;let t=F;T(null),C(`Reading 0 of ${t.length}`);try{let{records:n,skipped:a}=await Ol(s,c.environment,c.flow,t,e,r,i,e=>C(`Reading ${e} of ${t.length}`));await o(n,a)}catch(e){T(su(e)),C(null)}};return(0,$.jsxs)(R,{title:`Import runs`,onClose:a,wide:!0,dirty:F.length>0,footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[S&&(0,$.jsx)(`span`,{className:`note`,role:`status`,children:S}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:a,children:`Cancel`}),(0,$.jsxs)(`button`,{type:`button`,disabled:!!S||!F.length||!d,"aria-busy":!!S||void 0,onClick:()=>void I(),children:[S&&(0,$.jsx)(M,{}),`Import `,F.length||``]})]}),children:[l===void 0?(0,$.jsx)(Ot,{label:`Account`}):l?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(V,{label:`Import`,rows:[{key:`step`,label:`Step`,control:{type:`select`,value:d,options:pu(n),onChange:f}},{key:`latest`,label:`Latest`,width:`quarter`,control:{type:`text`,value:b,placeholder:`N`,onChange:e=>{x(e);let t=Number.parseInt(e,10);t>0&&y(new Set(j.slice(0,t).map(e=>e.id)))}}}]}),p?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(pe,{noun:`runs`,count:{shown:j.length,total:p.length},lead:(0,$.jsx)(`input`,{type:`checkbox`,"aria-label":`Select all shown`,checked:P,disabled:!j.length,onChange:()=>y(P?new Set:new Set(j.map(e=>e.id)))}),filters:[{key:`status`,label:`Status`,value:g,onChange:_,options:[{value:``,label:`All`},...A.map(e=>({value:e,label:e}))]}]}),j.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(m,{className:`slist`,label:`Runs`,rows:j,rowKey:e=>e.id,pageSize:20,rowProps:e=>({onClick:()=>N(e.id),"data-selected":v.has(e.id)||void 0}),columns:[{key:`pick`,header:``,sort:null,cell:e=>(0,$.jsx)(`input`,{type:`checkbox`,"aria-label":`Run ${e.id}`,checked:v.has(e.id),onChange:()=>N(e.id),onClick:e=>e.stopPropagation()})},{key:`start`,header:`Started`,sort:e=>e.startTime??``,cell:e=>e.startTime&&St(e.startTime)||`—`},{key:`status`,header:`Status`,sort:e=>e.status,cell:e=>e.status}]})}):(0,$.jsx)(`p`,{className:`note`,children:`No runs.`})]}):(0,$.jsx)(Ot,{label:`Runs`,error:E,onRetry:()=>k(e=>e+1)})]}):(0,$.jsx)(`div`,{className:`sacts`,children:(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>{rl(`import`,t.id),_l(e).catch(e=>{rl(`import`,null),T(su(e))})},children:[(0,$.jsx)(Rn,{size:14,"aria-hidden":`true`}),` Sign in with Microsoft`]})}),w&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:w})]})}function bu({steps:e,onClose:t,onAdd:n}){let[r,i]=(0,X.useState)(e[0]?.name??``),[a,o]=(0,X.useState)({}),s=e.find(e=>e.name===r),c=(s?.reads??[]).filter(e=>P(e));return(0,$.jsxs)(R,{title:`Add call`,onClose:t,wide:!0,dirty:Object.values(a).some(Boolean),footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:t,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,disabled:!s,onClick:()=>{if(!s)return;let e=Object.fromEntries(Object.entries(a).filter(([e,t])=>t!==``&&c.some(t=>P(t)===e))),[t]=We(s,[e]).records;n({...t,origin:{kind:`hand`}})},children:`Add`})]}),children:[(0,$.jsx)(V,{label:`Call`,rows:[{key:`step`,label:`Step`,control:{type:`select`,value:r,options:pu(e),onChange:e=>{i(e),o({})}}},...c.map(e=>({key:`read-${P(e)}`,label:mu(e),control:{type:`textarea`,value:a[P(e)]??``,onChange:t=>o(n=>({...n,[P(e)]:t}))}}))]}),s&&!c.length&&(0,$.jsx)(`p`,{className:`note`,children:`Reads nothing.`})]})}function xu(e,t){if(e.toLowerCase().endsWith(`.csv`))return{rows:Dt(t)};let n=JSON.parse(t),r=Array.isArray(n)?n:[n];if(r.length&&r.every(e=>!!e&&typeof e==`object`&&e.format===`evals-lab/record`))return{records:r.map(vt)};if(r.every(e=>e&&typeof e==`object`&&!Array.isArray(e)))return{rows:r};throw Error(`a file of records, or rows of objects`)}function Su({steps:e,onClose:t,onRead:n}){let r=(0,X.useRef)(null),[i,a]=(0,X.useState)(e[0]?.name??``),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),u=e.find(e=>e.name===i),d=o&&u&&`rows`in o.parsed?We(u,o.parsed.rows):null,f=o?`records`in o.parsed?o.parsed.records:d?.records??[]:[],p=async e=>{if(e){l(null);try{s({name:e.name,parsed:xu(e.name,await ou(e))})}catch(t){s(null),l(`${e.name}: ${su(t)}`)}}};return(0,$.jsxs)(R,{title:`Upload`,onClose:t,wide:!0,dirty:!!o,footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:t,children:`Cancel`}),(0,$.jsxs)(`button`,{type:`button`,disabled:!f.length,onClick:()=>void n(f),children:[`Add `,f.length||``]})]}),children:[(0,$.jsx)(V,{label:`Upload`,rows:[...o&&`records`in o.parsed?[]:[{key:`step`,label:`Step`,control:{type:`select`,value:i,options:pu(e),onChange:a}}],{key:`file`,label:`File`,control:{type:`static`,text:o?.name??`—`}},...o?[{key:`count`,label:`records`in o.parsed?`Calls`:`Rows`,control:{type:`static`,text:String(f.length)}}]:[],...d?.unmatched.length?[{key:`unmatched`,label:`Unmatched`,control:{type:`static`,text:d.unmatched.join(`, `)}}]:[]]}),(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>r.current?.click(),children:[(0,$.jsx)(Ue,{size:14,"aria-hidden":`true`}),` Choose file`]}),(0,$.jsx)(`input`,{ref:r,type:`file`,accept:`.json,.csv`,hidden:!0,"aria-hidden":`true`,onChange:e=>{p(e.target.files?.[0]),e.target.value=``}})]}),c&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:c})]})}var Cu=e=>e instanceof Error?e.message:String(e),wu=e=>e.toLowerCase().endsWith(`.json`),Tu=e=>L().METRICS[e.type]?.label??e.type;function Eu({source:e,definition:t,step:n,connections:r,onClose:i}){let a=Z(),o=vr(),s=Je(),[c,l]=Q(`promptlab.connections`),[u,d]=Q(`promptlab.workflows`),f=Fo(),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(!1),[y,b]=(0,X.useState)(null),x=(0,X.useCallback)(()=>{g(null),(async()=>{try{let t=(await a.source(e.id)).files.filter(e=>wu(e.name)),n=await Promise.all(t.map(async t=>({name:t.name,record:JSON.parse(await ou(await a.file(e.id,t.name)))})));m(n)}catch(e){g(Cu(e))}})()},[a,e.id]);(0,X.useEffect)(x,[x]);let S=Rl(t,n),C=p?Ul(p,t,r):null,w=S.some(e=>L().METRICS[e.type]?.graded),T=(0,X.useMemo)(()=>r.filter(e=>L().listedConnection(e)&&(L().CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`)),[r]),E=r.find(e=>e.id===c.grader)??null,[D,O]=(0,X.useState)(``),k=T.find(e=>e.id===D)??null,A=e=>{if(Pl(e,r))return r;let t={id:L().newId(),model:``,key:``,...Ll(e)};return l({...c,list:[...c.list,t]}),[...r,t]},j=async()=>{if(!C)return;v(!0),b(null);let r=String(n.template.uri??``),a=u;try{let c=await o.create(`${e.name}, ${n.name}`,{...rr(),every:S,cases:C.cases,...k?{grader:{id:k.id,name:k.name}}:{}},{id:e.id,name:e.name}),l={id:c.id,name:c.name},f=zl({id:e.id,name:e.name},t,n,A(r),l),p={id:f.id,name:f.name,work:f};d({...u,list:[...u.list,p],at:p.id}),i(),location.hash=`#/runs`,s.offer({label:`Made a test of ${n.name}`,restore:()=>{d(a),o.remove(c.id).catch(()=>{})}})}catch(e){b(Cu(e)),v(!1)}};return(0,$.jsxs)(R,{title:`Create new pipeline test`,onClose:i,className:`edit`,footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[_&&(0,$.jsx)(`span`,{className:`note`,role:`status`,children:`Making the test…`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:i,children:`Cancel`}),(0,$.jsxs)(`button`,{type:`button`,disabled:_||!C?.cases.length,"aria-busy":_||void 0,onClick:()=>void j(),children:[_&&(0,$.jsx)(M,{}),`Create`]})]}),children:[p?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(V,{label:`Test`,rows:[{key:`pipeline`,label:`Pipeline`,control:{type:`static`,text:`${e.name}, ${n.name}`}},{key:`a`,label:`Target A`,control:{type:`static`,text:`Recorded`}},{key:`b`,label:`Target B`,control:{type:`static`,text:`Draft`}},{key:`checks`,label:`Checks`,control:{type:`static`,text:S.map(Tu).join(`, `)||`—`}},...w?[{key:`grader`,label:`Grader`,control:{type:`picker`,kind:`Connection`,title:`Choose grader connection`,value:D,...f(T,[{id:``,label:E?`Lab (${E.name})`:`(No grader)`}]),onChange:O}}]:[],{key:`calls`,label:`Calls graded`,control:{type:`static`,text:`${C.cases.length}${C.skipped?`, ${C.skipped} with no recorded reply left out`:``}`}}]}),!C.cases.length&&(0,$.jsx)(`p`,{className:`note`,children:`(No recorded replies)`})]}):(0,$.jsx)(Ot,{label:`Calls`,error:h,onRetry:x}),y&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:y})]})}function Du({source:e}){let t=Z(),n=Cl(),[r,i]=(0,X.useState)(null),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(null),d=e.config??{},f=(0,X.useCallback)(()=>{u(null),t.definition(e.id).then(i,e=>{i(null),u(e instanceof Error?e.message:String(e))})},[t,e.id,d.flow]);(0,X.useEffect)(f,[f]);let[p,h]=(0,X.useState)(d.environmentName??``),g=async()=>{if(p||!n||!d.environment)return;let r=(await wl(n).environments()).find(e=>e.id===d.environment);r&&r.name!==r.id&&(h(r.name),await t.updateSource(e.id,{config:{...d,environmentName:r.name}}))};(0,X.useEffect)(()=>{!p&&n&&pl(n).then(e=>e?g():void 0).catch(()=>{})},[n]);let _=async()=>{if(!n||!r||!d.environment||!d.flow)return;c(!0),o(null),rl(`resync`,e.id);let a=!1;try{if(!await pl(n)){await _l(n),a=!0;return}let s=await Tl(wl(n),d.environment,d.flow);i(await t.saveDefinition(e.id,r.version,s.definition)),o(`Synced.`),g().catch(()=>{})}catch(e){e instanceof mn&&e.status===409?(f(),o(`It changed since: reloaded.`)):o(e instanceof Error?e.message:String(e))}finally{a||rl(`resync`,null),c(!1)}},[v,y]=(0,X.useState)(()=>il(`resync`,e.id));(0,X.useEffect)(()=>{v&&n&&r&&(y(!1),pl(n).then(e=>{e&&_()},()=>{}))},[v,n,r]);let b=(0,X.useMemo)(()=>Ou(r?.body),[r]),x=(0,X.useMemo)(()=>Rt(r?.body),[r]),[S]=Q(`promptlab.connections`),[w,T]=(0,X.useState)(null),E=Ql(e.id),D=e=>E.find(t=>L().flowStepOf(t.work.jobs[0])?.step===e)??null,[O,k]=(0,X.useState)(``),[A,j]=(0,X.useState)(`testable`),[M,N]=(0,X.useState)(``),P=e=>x.some(t=>t.name===e.name),F=(0,X.useMemo)(()=>[...new Set(b.map(e=>e.type).filter(Boolean))].sort(),[b]),I=b.filter(e=>(A===`all`||P(e))&&(!M||e.type===M)&&e.name.toLowerCase().includes(O.trim().toLowerCase()));return(0,$.jsxs)(`div`,{className:`sources`,"data-level":`flow`,children:[a&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:a}),(0,$.jsxs)(J,{id:`flow-source`,title:`Flow`,actions:[{label:`Re-sync`,icon:Wn,busy:s,disabled:!n||!r,onSelect:()=>void _()}],children:[(0,$.jsx)(V,{label:`Flow`,rows:[...d.displayName&&d.displayName!==e.name?[{key:`flow`,label:`Flow`,control:{type:`static`,text:d.displayName}}]:[],{key:`env`,label:`Environment`,control:{type:`static`,text:p||d.environment||`—`}},...r?[{key:`version`,label:`Definition`,control:{type:`static`,text:r.version?`V${r.version}${r.at?`, ${St(r.at)}`:``}`:`None`}}]:[]]}),!r&&(0,$.jsx)(Ot,{label:`Definition`,error:l,onRetry:f})]}),(0,$.jsx)(J,{id:`flow-actions`,title:`Actions`,note:r?String(b.length):void 0,children:r?b.length?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(pe,{noun:`actions`,search:{label:`Find an action`,value:O,placeholder:`Name`,onChange:k},quick:{label:`Show`,value:A,onChange:e=>j(e),options:[{value:`all`,label:`All`},{value:`testable`,label:`Can be tested`}]},filters:[{key:`type`,label:`Type`,value:M,onChange:N,options:[{value:``,label:`All`},...F.map(e=>({value:e,label:e}))]}],count:{shown:I.length,total:b.length}}),I.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(m,{className:`slist`,cards:!0,label:`Actions`,rows:I,rowKey:e=>e.name,defaultSort:null,columns:[{key:`name`,header:`Name`,role:`title`,sort:e=>e.name,cell:e=>(0,$.jsxs)($.Fragment,{children:[e.name,e.in&&(0,$.jsxs)(`span`,{className:`sflow-in`,children:[`in `,e.in]})]})},{key:`type`,header:`Type`,sort:e=>e.type,cell:e=>e.type},{key:`calls`,header:`Calls to`,sort:e=>e.calls,cell:e=>e.calls||`—`},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,cell:e=>{let t=x.find(t=>t.name===e.name),n=t?D(t.name):null;return t?(0,$.jsx)(C,{label:`${e.name} actions`,actions:[n?{label:`Open test`,icon:le,onSelect:()=>{location.hash=$l(n.id)}}:{label:`Create test…`,icon:le,onSelect:()=>T(t)}]}):null}}]})}):(0,$.jsx)(`p`,{className:`note`,children:`No actions match.`})]}):(0,$.jsx)(`p`,{className:`note`,children:`No actions.`}):(0,$.jsx)(Ot,{label:`Actions`,error:l,onRetry:f})}),(0,$.jsx)(cu,{source:e,definition:r?.body??null,cfg:n}),w&&r&&(0,$.jsx)(Eu,{source:e,definition:r.body,step:w,connections:S.list,onClose:()=>T(null)})]})}function Ou(e){let t=[],n=(e,i)=>{for(let[a,o]of Object.entries(e??{})){t.push({name:a,type:o.type??``,in:i,calls:r(o)}),n(o.actions,a),n(o.else?.actions,`${a} (else)`);for(let[e,t]of Object.entries(o.cases??{}))n(t.actions,`${a} (${e})`);n(o.default?.actions,`${a} (default)`)}},r=e=>{if(e.type===`Http`&&typeof e.inputs?.uri==`string`)try{return new URL(e.inputs.uri).host}catch{return e.inputs.uri.startsWith(`@`)?`(expression)`:``}let t=e.inputs?.host?.apiId??e.inputs?.host?.connectionName;return t?t.split(`/`).pop()??``:``};return n(e?.actions,``),t}var ku={url:`URL`,reqHeaders:`Headers`,body:`Body`,method:`Method`,connection:`Auth connection`,path:`Path`,command:`Command`,args:`Arguments`},Au=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`],ju=e=>ku[e]??e.charAt(0).toUpperCase()+e.slice(1);function Mu({typeRow:e,which:t,initial:n,onMade:r,bind:i}){let a=Z(),[o]=Q(`promptlab.connections`),[s]=Q(`promptlab.versions`),c=po().current,[l,u]=(0,X.useState)(null);(0,X.useEffect)(()=>{let e=!0;return a.connectionShares().then(t=>{e&&u(t.shares)},()=>{e&&u({})}),()=>{e=!1}},[a]);let d=L().DYNAMIC_PROVIDERS,f=n?n.config?.provider:t,p=f&&f in d?f:n?``:Object.keys(d)[0]??``,m=d[p],h=!!m&&m.tier!==`supplied`&&!n,[g,_]=(0,X.useState)(()=>{let{provider:e,...t}=n?.config??{};return t}),[v,y]=(0,X.useState)(n?.name??null),b=v??Nu(g.url??``),[x,S]=(0,X.useState)(!0),[C,w]=(0,X.useState)(!1),[T,E]=(0,X.useState)(null),D=m?m.configProblems(g):[`unknown provider`],O=!!m&&!!b.trim()&&D.length===0,k={provider:p,...g},A=!!n&&!Pu(k,n.config??{}),j=!!n&&b.trim()!==n.name,M=A||j,N=(0,X.useRef)(async()=>{});(0,X.useEffect)(()=>{i({enabled:O&&!C,busy:C,changed:M,run:()=>void N.current()})},[i,O,C,M,p]),(0,X.useEffect)(()=>()=>i(null),[i]),N.current=async()=>{if(!m||!O)return;if(n&&!M){await r(n);return}w(!0),E(null);let e=null;try{if(n){await r(await a.updateSource(n.id,{...j?{name:b.trim()}:{},...A?{config:k}:{}}));return}let t=await a.createSource(b.trim(),`dynamic`,k);e=t.id;let i;if(h&&x){let e=m.noun;i=await a.snapshotSource(t.id).then(({call:t})=>t.error?`The ${e} failed: ${t.error}`:void 0,t=>`The ${e} failed: ${t instanceof Error?t.message:String(t)}`)}await r(t,i)}catch(t){e&&await a.removeSource(e).catch(()=>{}),E(t instanceof mn||t instanceof Error?t.message:String(t))}finally{w(!1)}};let P=e=>t=>_(n=>({...n,[e]:t})),F=e=>{let t=g[e]??``;if(e===`method`)return{type:`select`,value:t||`GET`,onChange:P(e),options:Au.map(e=>({value:e,label:e}))};if(e===`connection`){let n=o.list.filter(e=>L().listedConnection(e)&&l!==null&&(!c||gn(l,`profile`,e.id,c.id))),r=!n.some(e=>e.id===t)&&o.list.find(e=>e.id===t),i=r?r.name||r.id:``;return{type:`picker`,kind:`Connection`,value:t,onChange:P(e),usedLabel:`Last changed`,...jo(n,e=>s.profile?.[e]?.[0]?.at??null,[{id:``,label:`No auth`}]),...r?{placeholder:l===null?i:`${i}, not shared with ${c?.name??`this workspace`}`}:{}}}return e===`reqHeaders`||e===`body`||e===`args`?{type:`textarea`,value:t,onChange:P(e),placeholder:e===`reqHeaders`?`Name: value; Name: value`:e===`args`?`One a line`:``}:{type:`text`,value:t,onChange:P(e),...e===`url`?{placeholder:`https://…`}:{}}},I=(m?.config??[]).map(e=>({key:e,label:ju(e),control:F(e)}));return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(V,{label:n?n.name:`New Source`,rows:[e,...I,{key:`name`,label:`Name`,width:`full`,control:{type:`text`,value:b,onChange:y}}]}),h&&(0,$.jsx)(`div`,{className:`sacts`,children:(0,$.jsx)(ne,{checked:x,onChange:S,label:m.produceLabel??`Fetch now`})}),m?.warning&&(0,$.jsxs)(`p`,{className:`swarn`,role:`note`,children:[(0,$.jsx)(_t,{size:14,"aria-hidden":`true`}),m.warning]}),!!b.trim()&&D.length>0&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:D[0]}),T&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:T})]})}var Nu=e=>{try{let t=new URL(e.trim());if(t.protocol!==`http:`&&t.protocol!==`https:`)return``;let n=t.pathname.split(`/`).filter(Boolean).pop()??``;return[t.hostname,decodeURIComponent(n)].filter(Boolean).join(` `)}catch{return``}},Pu=(e,t)=>[...new Set([...Object.keys(e),...Object.keys(t)])].every(n=>(e[n]??``)===(t[n]??``)),Fu=e=>`${e.n}:${e.name}`,Iu=e=>e.status==null||e.status>=200&&e.status<300;function Lu(e){return Object.entries(e).flatMap(([e,t])=>t.map(t=>({...t,name:e}))).sort((e,t)=>(t.at??``).localeCompare(e.at??``)||t.n-e.n)}function Ru(e){let t=Lu(e).find(Iu);return t?{name:t.name,n:t.n}:null}function zu(e,t){let n=e[t.name];return n?.find(e=>e.n===t.n)??(t.n===0?n?.find(e=>e.n===1):void 0)}function Bu(e,t){let n=zu(e,t);return n?Fu({name:t.name,n:n.n}):``}var Vu=(e,t)=>[e,Jl(t)].filter(Boolean).join(`, `),Hu=e=>Lu(e).map(e=>({id:Fu(e),label:Vu(e.name,e)}));function Uu(e){let t=e.indexOf(`:`);return{n:Number(e.slice(0,t)),name:e.slice(t+1)}}function Wu(e,t,n=0){let[r,i]=(0,X.useState)(null);return(0,X.useEffect)(()=>{if(!t)return;let n=!0;return e.sourceResponses(t).then(e=>{n&&i({id:t,responses:e.responses})},()=>{n&&i({id:t,responses:{}})}),()=>{n=!1}},[e,t,n]),t?r?.id===t?r.responses:null:{}}var Gu=`Answers the prompt using only what's in the item.`,Ku=`#default`,qu=e=>e instanceof Error?e.message:String(e);function Ju({source:e,responses:t,plural:n,onClose:r}){let i=vr(),a=Je(),[o]=Q(`promptlab.connections`),[s]=Q(`promptlab.connectionProfiles`),[c,l]=Q(`promptlab.workflows`),{list:u,error:d}=kr(),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(null),g=(0,X.useMemo)(()=>o.list.filter(e=>L().listedConnection(e)&&(L().CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`)),[o.list]),_=(0,X.useMemo)(()=>L().answersOf(L().withSlugs(o.list),s.list).split,[o.list,s.list]),v=Fo(),[y,b]=(0,X.useState)(g[0]?.id??``),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),[T,E]=(0,X.useState)(``),[D,O]=(0,X.useState)(Gu),[k,A]=(0,X.useState)(()=>Ru(t)),j=g.find(e=>e.id===o.grader)??null,N=x??_(y)?.id??Ku,P=C??(j?``:y),F=u!==null||d!==null,I=T.trim()||(u?.find(e=>e.default)?.text??``),z=(e,t)=>{let n=e.find(e=>e.id===t);return n?{id:n.id,name:n.name}:null},B=async()=>{let t=z(g,y);if(!t||!k)return;p(!0),h(null);let o=c,u={type:`llm-rubric`,...L().METRICS[`llm-rubric`].defaults(),rubric:D.trim()},d=P?z(g,P):null;try{let f=await i.create(`${e.name}, ${n}`,{...rr(),every:[u],cases:Wl([k.name]).map(e=>({...e,todo:!1})),...d?{grader:d}:{}},{id:e.id,name:e.name}),p=ct(e,{connection:t,profile:N===Ku?null:z(s.list,N)},{id:f.id,name:f.name},I),m=L().contentOf(p),h=m?.type===`source`?L().withContent(p,{...m,live:!1,pin:k}):p,g={id:h.id,name:h.name,work:h};l({...c,list:[...c.list,g],at:g.id}),r(),location.hash=`#/runs`,a.offer({label:`Made a test of ${e.name}`,restore:()=>{l(o),i.remove(f.id).catch(()=>{})}})}catch(e){h(qu(e)),p(!1)}};return(0,$.jsxs)(R,{title:`Create new pipeline test`,onClose:r,className:`edit`,footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[f&&(0,$.jsx)(`span`,{className:`note`,role:`status`,children:`Making the test…`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:r,children:`Cancel`}),(0,$.jsxs)(ru,{className:``,why:F&&!I?`Needs a prompt`:void 0,disabled:f||!y||!k||!F||!I||!D.trim(),busy:f,onClick:()=>void B(),children:[f&&(0,$.jsx)(M,{}),`Create`]})]}),children:[(0,$.jsx)(V,{label:`Test`,rows:[{key:`pipeline`,label:`Pipeline`,control:{type:`static`,text:e.name}},{key:`connection`,label:`Connection`,required:!0,control:{type:`picker`,kind:`Connection`,value:y,...v(g),onChange:e=>{b(e),S(null)}}},{key:`profile`,label:`Profile`,control:{type:`picker`,kind:`Profile`,value:N,...jo(s.list,()=>null,[{id:Ku,label:`(Default)`}]),onChange:S}},{key:`prompt`,label:`Prompt`,required:!I,control:{type:`textarea`,value:T,onChange:E,placeholder:u?.find(e=>e.default)?.text??``}},{key:`rubric`,label:`Rubric`,required:!0,control:{type:`textarea`,value:D,onChange:O}},{key:`grader`,label:`Grader`,control:{type:`picker`,kind:`Connection`,title:`Choose grader connection`,value:P,...v(g,[{id:``,label:j?`Lab (${j.name})`:`(No grader)`}]),onChange:w}},{key:`response`,label:`Response`,required:!0,width:`full`,control:{type:`picker`,kind:`Response`,ordered:!0,value:k?Fu(k):``,options:Hu(t),placeholder:`(Not set)`,onChange:e=>A(Uu(e))}}]}),m&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:m})]})}var Yu=e=>e instanceof Error?e.message:String(e),Xu=e=>e.slice(0,1).toUpperCase()+e.slice(1),Zu=e=>/^[aeiou]/i.test(e)?`an`:`a`;function Qu({source:e,note:t}){let[n]=Q(`promptlab.connections`),r=e.config??{},i=L().DYNAMIC_PROVIDERS[r.provider??``],a=(i?.config??[]).filter(e=>r[e]?.trim()).map(e=>{let t=r[e],i=ju(e);return e===`connection`?{key:e,label:i,control:{type:`static`,text:n.list.find(e=>e.id===t)?.name||t}}:{key:e,label:i,control:{type:`code`,text:t}}});return(0,$.jsxs)(`div`,{className:`sources`,"data-level":`dynamic`,children:[a.length>0&&(0,$.jsx)(J,{id:`dynamic-provider`,title:`Provider`,children:(0,$.jsx)(V,{label:`Provider`,rows:a})}),(0,$.jsx)($u,{source:e,noun:i?.noun??`call`,canProduce:i?.tier!==`supplied`,produceLabel:i?.produceLabel??`Fetch now`,takes:Object.keys(i?.uploads??{}),note:t})]})}function $u({source:e,noun:t,canProduce:n,produceLabel:r,takes:i,note:a}){let o=Z(),s=vr(),c=Je(),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)({}),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(a??null);(0,X.useEffect)(()=>{a&&v(a)},[a]);let[y,b]=(0,X.useState)(!1),x=(0,X.useRef)(null),[S,w]=(0,X.useState)(!1),[T,E]=(0,X.useState)(null),[D,O]=(0,X.useState)(null),[k,A]=(0,X.useState)(!1),j=`${t}s`,M=Xu(j),N=(0,X.useMemo)(()=>(l??[]).filter(e=>!e.error).map(e=>e.name),[l]),P=Ql(e.id),{caseOf:F,casesIn:I}=eu(e.id,P),R=Zu(t),z=n?`Needs ${R} ${t} that succeeded`:`Needs ${R} ${t}`,B=(0,X.useCallback)(()=>{g(null),Promise.all([o.sourceCalls(e.id),o.sourceResponses(e.id)]).then(([e,t])=>{u(e.calls),f(t.responses),O(null)},e=>g(Yu(e)))},[o,e.id]);(0,X.useEffect)(B,[B]);let V=async()=>{b(!0),v(null);try{let{call:t}=await o.snapshotSource(e.id);if(B(),t.outcome===`fetched`&&t.n!=null){let{n,was:r}=t;c.offer({label:`Fetched ${t.name}`,restore:()=>r==null?void 0:o.restoreResponse(e.id,t.name,r,n).then(B)})}else t.outcome===`added`?c.offer({label:`Added ${t.name}`,restore:()=>o.removeCalls(e.id,[t.name]).then(B)}):t.outcome===`unchanged`?c.notify({label:`${t.name} is unchanged`}):c.notify({label:`Fetch failed: ${t.status??t.error??`no answer`}`,bad:!0})}catch(e){c.notify({label:`Fetch failed: ${Yu(e)}`,bad:!0})}finally{b(!1)}},ee=async t=>{if(!t.length)return;v(null);let n=[],r=[];for(let i of t)try{await o.upload(e.id,i.name,i),n.push(i.name)}catch(e){r.push(`${i.name}: ${Yu(e)}`)}B();let i=n.length===1?[`Uploaded ${n[0]}`]:n.length?[`Uploaded ${n.length} ${j}`]:[];v([...i,...r].join(`; `))},te=async()=>{let n=N;if(!n.length)return v(`No ${t} to grade yet.`);try{let t=await s.create(`${e.name}, ${j}`,{...rr(),cases:Wl(n)},{id:e.id,name:e.name});v(`Made ${t.name}: ${n.length} ${n.length===1?`case`:`cases`}`)}catch(e){v(Yu(e))}},ne=async t=>{try{let{trash:n}=await o.removeCalls(e.id,t);u(e=>(e??[]).filter(e=>!t.includes(e.name))),f(e=>Object.fromEntries(Object.entries(e).filter(([e])=>!t.includes(e))));let r=t.length===1?`Removed ${t[0]}`:`Removed ${t.length} ${j}`;n?c.offer({label:r,restore:()=>void o.restoreTrash(n).then(B,e=>v(Yu(e)))}):v(r)}catch(e){v(Yu(e))}},H=async t=>{if(t.error)return E({call:t,text:null,seq:Date.now()});try{E({call:t,text:await(await o.file(e.id,t.name)).text(),seq:Date.now()})}catch(e){v(Yu(e))}},U=async(t,n,r)=>{let{call:i}=await o.editCall(e.id,t.name,{...n===t.name?{}:{to:n},...r===void 0?{}:{content:r}});B(),c.offer({label:r===void 0?`Renamed ${t.name}`:`Edited ${t.name}`,restore:async()=>{i.n!=null&&i.was!=null&&await o.restoreResponse(e.id,i.name,i.was,i.n),i.name!==t.name&&await o.editCall(e.id,i.name,{to:t.name}),B()}})},re=async(t,n)=>{let r=(d[t.name]??[]).find(e=>e.current)?.n;try{await o.restoreResponse(e.id,t.name,n),B(),await H(t),r!=null&&c.offer({label:`Restored ${t.name}`,restore:()=>o.restoreResponse(e.id,t.name,r).then(B)})}catch(e){v(Yu(e))}},W=async t=>{try{let{call:n}=await o.cloneCall(e.id,t),r={kind:`copied`,at:new Date().toISOString()};u(e=>(e??[]).flatMap(e=>e.name===t?[e,{...e,name:n.name,origin:`copy`,updated:r}]:[e])),O(n.name),c.offer({label:`Cloned ${t}`,restore:()=>void o.removeCalls(e.id,[n.name]).then(()=>u(e=>(e??[]).filter(e=>e.name!==n.name)),e=>v(Yu(e)))})}catch(e){v(Yu(e))}},ie=(t,n)=>[...n?[]:[{label:`Edit…`,icon:Y.edit,disabled:!!t.error,onSelect:()=>void H(t)}],{label:`Clone`,icon:Y.clone,disabled:!!t.error,onSelect:()=>{n&&E(null),W(t.name)}},{label:`Download`,icon:Y.export,disabled:!!t.error,onSelect:()=>void nd(o,e.id,t.name).catch(e=>v(Yu(e)))},{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>{n&&E(null),ne([t.name])}}],ae=[{label:`Upload…`,icon:Ue,onSelect:()=>x.current?.click()},{label:`New dataset`,icon:p,disabled:!(l??[]).some(e=>!e.error),onSelect:()=>void te()}],oe=e=>e.error?(0,$.jsxs)(`span`,{className:`sresult`,title:e.error,children:[(0,$.jsx)(ge,{pass:!1,decorative:!0}),e.status??`Failed`]}):(0,$.jsx)(Yl,{status:e.origin===`copy`?null:e.status}),G=e=>e.error?null:F(e.name),K=e=>{let t=L().contentOf(e);return t?.type===`source`&&!(t.live??!(l??[]).length)?{pin:t.pin??null}:null},se=e=>{let t=K(e);if(!t)return`Live data`;if(!t.pin)return(0,$.jsx)(`span`,{className:`snone`,children:`(Not set)`});let n=zu(d,t.pin);return n?Vu(t.pin.name,n):(0,$.jsx)(`span`,{className:`snone`,children:`(Removed)`})};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(J,{id:`dynamic-calls`,title:M,note:l?String(l.length):void 0,actions:ae,children:[_&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:_}),l===null?(0,$.jsx)(Ot,{label:M,error:h,onRetry:B}):l.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(m,{className:`slist`,cards:!0,label:M,rows:l,rowKey:e=>e.name,select:{noun:t,actions:e=>[{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>void ne(e.map(e=>e.name))}]},rowProps:e=>e.name===D?{"data-fresh":``}:{},columns:[{key:`name`,header:`Name`,role:`title`,sort:e=>e.name.replace(/\.[^.]*$/,``),cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`sopen`,onClick:()=>void H(e),children:e.name})},{key:`updated`,header:`Updated`,sort:e=>e.updated?.at??e.at??``,cell:e=>Jl(e.updated)||`—`},...n?[{key:`status`,header:`Status`,sort:e=>String(e.status??``),cell:oe}]:[],{key:`case`,header:`Case`,sort:e=>G(e)?.name??``,cell:e=>(0,$.jsx)(tu,{group:G(e)})},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(C,{label:`${e.name} actions`,actions:ie(e,!1)})}]})}):(0,$.jsxs)(`p`,{className:`note`,children:[`No `,j,` yet.`,n?``:` Write or upload one, or hand them in through the CLI.`]}),n?(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,"aria-busy":y||void 0,disabled:y,onClick:()=>void V(),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),` `,r]}):(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:()=>w(!0),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),` New `,t,`…`]})]}),(0,$.jsx)(iu,{pipelines:P,casesIn:I,itemsOf:e=>{let t=n?K(e):null;return t?.pin?[t.pin.name]:N},columns:n?[{key:`updates`,header:`Data updates`,cell:se}]:[],footer:(0,$.jsxs)(ru,{why:z,disabled:!N.length,onClick:()=>A(!0),children:[(0,$.jsx)(le,{size:14,"aria-hidden":`true`}),` Create test…`]})}),(0,$.jsx)(`input`,{ref:x,type:`file`,multiple:!0,accept:`.txt,.json,.csv,.md`,hidden:!0,"aria-hidden":`true`,onChange:e=>{ee([...e.target.files??[]]),e.target.value=``}}),S&&(0,$.jsx)(ed,{noun:t,takes:i,onSave:async(t,n)=>{try{await o.upload(e.id,t,new Blob([n],{type:`text/plain`}))}finally{B()}},onClose:()=>w(!1)}),k&&(0,$.jsx)(Ju,{source:e,responses:d,plural:j,onClose:()=>A(!1)}),T&&(0,$.jsx)(td,{call:T.call,text:T.text,menu:ie(T.call,!0),caseOf:G(T.call),responses:d[T.call.name]??[],onRestore:e=>void re(T.call,e),taken:e=>(l??[]).some(t=>t.name===e),onSave:(e,t)=>U(T.call,e,t===(T.text??``)?void 0:t),onClose:()=>E(null)},T.seq),(0,$.jsx)(Vt,{undo:c.undo,notice:c.notice,onUndo:c.undoNow,onDismiss:c.dismiss})]})}function ed({noun:e,takes:t,onSave:n,onClose:r}){let[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null),f=async()=>{let a=i.trim(),s=/\.[^./]+$/.exec(a)?.[0].toLowerCase(),c=s?a:`${a}.txt`,u=Xu(Zu(e));if(!a)return d(`${u} ${e} needs a name.`);if(s&&t.length&&!t.includes(s))return d(`${u} ${e}'s name ends ${t.join(`, `)}.`);if(!o.trim())return d(`${u} ${e} needs some text.`);l(!0);try{await n(c,o),r()}catch(e){d(Yu(e)),l(!1)}};return(0,$.jsx)(st,{title:`New ${e}`,focusRow:`name`,status:u??void 0,statusBad:!!u,wide:!0,sections:[{key:`item`,rows:[{key:`name`,label:`Name`,width:`full`,required:!0,control:{type:`text`,value:i,onChange:a,placeholder:`notes.txt`}},{key:`text`,label:`Text`,required:!0,control:{type:`textarea`,value:o,onChange:s}}]}],onSave:()=>void f(),saving:c,adding:!0,onClose:r})}function td({call:e,text:t,menu:n,caseOf:r,responses:i,onRestore:a,taken:o,onSave:s,onClose:c}){let[l,u]=(0,X.useState)(t??``),d=e.request,f=d?.url?`${d.method??`GET`} ${d.url}`:d?.path??d?.command,p=[...f?[{key:`request`,label:`Request`,control:{type:`code`,text:f}}]:[],...e.error?[{key:`error`,label:`Error`,control:{type:`static`,text:e.error}}]:[{key:`case`,label:`Case`,control:nu(r)}]];return t===null?(0,$.jsx)(Zl,{name:e.name,facts:p,taken:o,menu:n,onClose:c}):(0,$.jsx)(Zl,{name:e.name,facts:p,taken:o,menu:n,onClose:c,changed:l!==t,onSave:e=>s(e,l),sections:[{key:`content`,title:`Content`,children:(0,$.jsx)(`textarea`,{className:`mono call-content`,"aria-label":`Content`,spellCheck:!1,value:l,onChange:e=>u(e.target.value)})},...i.length?[Xl(i,a)]:[]]})}async function nd(e,t,n){let r=URL.createObjectURL(await e.file(t,n)),i=document.createElement(`a`);i.href=r,i.download=n,document.body.append(i),i.click(),i.remove(),URL.revokeObjectURL(r)}var rd={workflow:{Create:Al,Level:Du},dynamic:{Create:Mu,Level:Qu}},id=e=>(e.provider?L().DYNAMIC_PROVIDERS[e.provider]?.label??e.provider:null)??(e.platform?L().WORKFLOW_PLATFORMS[e.platform]?.label??e.platform:null)??L().SOURCE_TYPES[e.type]?.label??e.type,ad=e=>e instanceof mn?e.message:`the request failed`;function od({source:e,onSaved:t,onClose:n}){let r={key:`kind`,label:`Kind`,control:{type:`static`,text:id(e)}},i=rd[e.type]?.Create;return i?(0,$.jsx)(cd,{source:e,kindRow:r,Create:i,onSaved:t,onClose:n}):(0,$.jsx)(sd,{source:e,kindRow:r,onSaved:t,onClose:n})}function sd({source:e,kindRow:t,onSaved:n,onClose:r}){let i=Z(),[a,o]=(0,X.useState)(e.name),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(null),d=async()=>{let t=a.trim();if(!t||t===e.name){r();return}c(!0);try{n(await i.updateSource(e.id,{name:t})),r()}catch(e){u(ad(e)),c(!1)}};return(0,$.jsx)(st,{title:`Edit ${e.name}`,focusRow:`name`,status:l??void 0,statusBad:!!l,sections:[{key:`source`,rows:[{key:`name`,label:`Name`,width:`full`,required:!0,control:{type:`text`,value:a,onChange:o}},t]}],onSave:()=>void d(),saving:s,onClose:r})}function cd({source:e,kindRow:t,Create:n,onSaved:r,onClose:i}){let a=Z(),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(0),[f,p]=(0,X.useState)(null);return(0,X.useEffect)(()=>{let t=!0;return a.source(e.id).then(e=>{t&&s(e)},e=>{t&&l(ad(e))}),()=>{t=!1}},[a,e.id,u]),(0,$.jsx)(st,{title:`Edit ${e.name}`,dirty:!!f?.changed,sections:[{key:`source`,children:o?(0,$.jsx)(n,{typeRow:t,initial:o,bind:p,onMade:e=>{r(e),i()}}):(0,$.jsx)(Ot,{label:`Source`,error:c,onRetry:()=>{l(null),d(e=>e+1)}})}],onSave:()=>f?.run(),saving:!!f?.busy,canSave:!!f?.enabled,onClose:i})}var ld={folder:Fe,workflow:n,globe:Ut,upload:Ue,file:kn,terminal:Xn,"square-code":Yn,"arrow-left-right":Sn},ud=new Set([`square-code`,`arrow-left-right`]);function dd(e,t,n){let r=t?L().WORKFLOW_PLATFORMS[t]:void 0,i=n?L().DYNAMIC_PROVIDERS[n]:void 0;return r?.icon??i?.icon??L().SOURCE_TYPES[e]?.icon}function fd({name:e,size:t=16}){let n=e&&ld[e]||Fe;return(0,$.jsx)(n,{className:`skind`,size:t,fill:e&&ud.has(e)?`none`:`currentColor`,"aria-hidden":`true`})}function pd({sourceId:e=null,onOpen:t,onGone:n,mode:r=`browse`,onPick:i,disabled:a}){let o=vo(),s=Z(),c=Je(),[l]=Q(`promptlab.workflows`),f=yr(),[p,h]=(0,X.useState)(null),[v,y]=(0,X.useState)(0),[b,x]=(0,X.useState)(null),[S,C]=(0,X.useState)(Fc),[w,T]=(0,X.useState)(``),[E,D]=(0,X.useState)(new Set),[O,k]=(0,X.useState)(null),[A,j]=(0,X.useState)(!1),[N,P]=(0,X.useState)(()=>r===`browse`&&hd()!==null),[I,z]=(0,X.useState)(null),[B,ee]=(0,X.useState)(null),[te,ne]=(0,X.useState)(null),[H,re]=(0,X.useState)(void 0),[W,ie]=(0,X.useState)(!1),[ae,oe]=(0,X.useState)(``),[G,K]=(0,X.useState)(()=>r===`browse`&&hd()||L().DEFAULT_SOURCE_TYPE),[se,q]=(0,X.useState)(null),[le,ue]=(0,X.useState)(null);(0,X.useEffect)(()=>{ue(t=>t&&t.id!==e?null:t)},[e]);let[de,fe]=(0,X.useState)(``),[me,he]=(0,X.useState)(``),[ge,_e]=(0,X.useState)([]),[ve,ye]=(0,X.useState)(null),[be,xe]=(0,X.useState)([]),[Se,Ce]=(0,X.useState)(!1),[we,Te]=(0,X.useState)(!1),[Ee,De]=(0,X.useState)(null),[Oe,ke]=(0,X.useState)(null),[Ae,je]=(0,X.useState)(0),[Me,Ne]=(0,X.useState)(0),Pe=(0,X.useRef)(null),Fe=(0,X.useRef)(1),{view:Ie,sort:Le,dir:Re}=S,ze=(0,X.useCallback)(()=>z(null),[]),Be=(0,X.useCallback)(()=>P(!1),[]),Ve=(0,X.useCallback)(()=>ee(null),[]),He=(0,X.useCallback)(()=>ie(!1),[]);(0,X.useEffect)(()=>Ic(S),[S]),(0,X.useEffect)(()=>{r===`browse`&&gd(N?G:null)},[r,N,G]),(0,X.useEffect)(()=>{let e=!0;return s.config().then(t=>{e&&_e(t.dynamicProviders??[])},()=>{}),()=>{e=!1}},[s]),(0,X.useEffect)(()=>{if(!te?.platform){re(void 0);return}let e=!0;return Promise.all([s.connections(),s.connectionShares()]).then(([{connections:t},{shares:n}])=>{if(!e)return;let r=t.find(e=>e.id===`microsoft`);if(!r){re(void 0);return}let i=n[hn(`account`,r.id)];re({name:r.label,sharedWith:e=>!i||i.includes(e)||i.includes(`*all`)})},()=>{e&&re(void 0)}),()=>{e=!1}},[te,s]);let We=async()=>{try{let e=await s.sources();h(e.sources),y(e.cap)}catch{}};(0,X.useEffect)(()=>{let e=!0;return s.sources().then(t=>{e&&(h(t.sources),y(t.cap))}).catch(t=>{e&&De(Ye(t))}),()=>{e=!1}},[s,Ae]),(0,X.useEffect)(()=>{D(new Set),xe([]);let t=!0;return ke(null),e?s.source(e).then(e=>{t&&x(e)}).catch(e=>{t&&(x(null),e instanceof mn&&e.status===404&&n?n():ke(Ye(e)))}):x(null),()=>{t=!1}},[e,Me]);let Ge=async()=>{if(!e){x(null);return}try{x(await s.source(e))}catch{x(null)}},Ke=e=>{ye(e),e&&window.setTimeout(()=>ye(null),6e3)},Ye=e=>e instanceof mn?e.message:`the request failed`,Xe=Wc(Uc(b?.files??[],Le,Re),w),Ze=e=>{D(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},Qe=()=>D(new Set),$e=e=>{C(t=>({...t,view:e})),e===`thumbs`&&Qe()},et=async e=>{let t=[];try{for(let n of e)t.push((await s.removeSource(n.id)).trash),h(e=>(e??[]).filter(e=>e.id!==n.id))}catch(e){Ke(Ye(e))}t.length&&c.offer({label:e.length===1?`Deleted ${e[0].name}`:`Deleted ${t.length} Sources`,restore:()=>void(async()=>{try{for(let e of t)await s.restoreTrash(e);await We()}catch(e){Ke(Ye(e))}})()})},tt=e=>et([e]),nt=async e=>{if(b)try{let{trash:t}=await s.removeFiles(b.id,e),n=new Set(e);x(t=>t&&{...t,files:t.files.filter(e=>!n.has(e.name)),bytes:t.bytes-e.reduce((e,n)=>e+(t.files.find(e=>e.name===n)?.bytes??0),0)}),D(e=>new Set([...e].filter(e=>!n.has(e)))),c.offer({label:e.length===1?`Removed ${e[0]}`:`Removed ${e.length} files`,restore:()=>void(async()=>{try{let e=await s.restoreTrash(t);x(e.source)}catch(e){Ke(Ye(e))}})()})}catch(e){Ke(Ye(e))}},rt=(e,t)=>{let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.append(r),r.click(),r.remove(),URL.revokeObjectURL(n)},it=async e=>{if(!b)return;let t=e.length===1?e[0]:null;Te(!0);try{let n=t?await s.file(b.id,t):await s.zip(b.id,e);rt(n,t??`${b.name}.zip`)}catch(e){Ke(Ye(e))}finally{Te(!1)}},at=async e=>{if(!b||b.system)return;let t=[...e];if(!t.length)return;let n=t.map(e=>({id:Fe.current++,file:e,state:`uploading`}));xe(e=>[...e,...n]);for(let e of n)try{await s.upload(b.id,e.file.name,e.file),xe(t=>t.map(t=>t.id===e.id?{...t,state:`done`}:t))}catch(t){xe(n=>n.map(n=>n.id===e.id?{...n,state:`error`,error:Ye(t)}:n))}await Ge()},ot=e=>void at([e.file]),st=async(e,t)=>{if(b&&B)try{await s.copyFiles(t.id,b.id,B.names,e===`move`),ee(null),D(new Set),await Ge(),Ke(e===`move`?`Moved to ${t.name}.`:`Copied to ${t.name}.`)}catch(e){Ke(Ye(e)),ee(null)}},ct=async()=>{if(b&&ae.trim())try{let e=await s.createSource(ae.trim(),b.type);try{await s.copyFiles(e.id,b.id,[...E],!1)}catch(t){throw await s.removeSource(e.id).catch(()=>{}),t}ie(!1),oe(``),D(new Set),await We(),Ke(`Made a new Source.`)}catch(e){Ke(Ye(e))}},lt=async()=>{if(ae.trim())try{await s.createSource(ae.trim(),G),P(!1),oe(``),K(L().DEFAULT_SOURCE_TYPE),await We()}catch(e){Ke(Ye(e))}},ut=O&&(0,$.jsx)(od,{source:O,onSaved:e=>{h(t=>(t??[]).map(t=>t.id===e.id?qc(e):t)),x(t=>t?.id===e.id?{...t,name:e.name,config:e.config??null}:t)},onClose:()=>k(null)}),ft=e=>o({tab:`library`,section:`sources`,id:e.id}),pt=(e,t)=>e.system?[ft(e)]:[{label:`Edit…`,icon:qe,onSelect:()=>k(e)},ft(e),{label:`Copy or move…`,icon:Y.transfer,onSelect:()=>ne(e)},{label:`Delete`,icon:At,destructive:!0,onSelect:()=>void tt(e).then(t)}],mt=e=>[{label:`Preview`,icon:u,onSelect:()=>z(e)},{label:`Download`,icon:g,onSelect:()=>void it([e.name])},...b?.system?[]:[{label:`Remove`,icon:At,destructive:!0,onSelect:()=>void nt([e.name])}]],ht=[...b?.system?[]:[{label:`Remove`,icon:At,destructive:!0,onSelect:()=>void nt([...E])}],{label:`Download`,icon:g,busy:we,onSelect:()=>void it([...E])},...b?.system?[]:[{label:`Move to…`,icon:Nn,onSelect:()=>ee({kind:`move`,names:[...E]})}],{label:`Copy to…`,icon:U,onSelect:()=>ee({kind:`copy`,names:[...E]})},...b?.system?[]:[{label:`New Source from selection…`,icon:Pn,onSelect:()=>ie(!0)}]],gt=e=>{e.preventDefault(),Ce(!1),b&&!b.system&&at(e.dataTransfer.files)},_t=te&&(0,$.jsx)(Co,{subject:{kind:`source`,id:te.id,name:te.name},scan:{pipelines:l.list,groups:f.list??[]},undo:c,accountShare:H,onClose:()=>{ne(null),re(void 0)},onChanged:()=>{We(),e===te.id&&t?.(null)}}),vt=(p??[]).filter(e=>(!me||kd(e)===me)&&e.name.toLowerCase().includes(de.trim().toLowerCase())),yt=(0,$.jsx)(xd,{view:Ie,onChange:$e}),bt=e=>(0,$.jsx)(pe,{noun:`Sources`,search:{label:`Find a Source`,value:de,placeholder:`Name`,onChange:fe},filters:[{key:`type`,label:`Type`,value:me,onChange:he,options:[{value:``,label:`All`},...Ed(ge).filter(e=>!e.disabled)]}],trail:e,count:{shown:vt.length,total:(p??[]).length}}),xt=()=>(0,$.jsxs)(`div`,{className:`sources`,"data-level":`sources`,children:[ve&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:ve}),(0,$.jsxs)(`header`,{className:`shead`,children:[(0,$.jsx)(`h2`,{className:`shead-title`,children:`Sources`}),yt]}),p!==null&&p.length>0&&bt(),p===null?(0,$.jsx)(Ot,{label:`Sources`,error:Ee,onRetry:()=>{De(null),je(e=>e+1)}}):p.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No Sources yet.`}):Ie===`thumbs`?(0,$.jsx)(`ul`,{className:`sfolders`,children:vt.map(e=>(0,$.jsx)(`li`,{className:`sfolder`,children:(0,$.jsxs)(`button`,{type:`button`,className:`sfolder-open${a?.(e)?` off`:``}`,disabled:a?.(e),onClick:()=>i?.(e),children:[(0,$.jsx)(fd,{name:Od(e)}),(0,$.jsx)(`span`,{className:`sfolder-name`,children:e.name}),(0,$.jsx)(`span`,{className:`sfolder-meta`,children:Ad(e)})]})},e.id))}):(0,$.jsx)(m,{className:`slist slist-folders`,label:`Sources`,rows:vt,rowKey:e=>e.id,columns:[{key:`name`,header:`Name`,className:`sfile-name`,role:`title`,sort:e=>e.name,cell:e=>(0,$.jsxs)(`button`,{type:`button`,className:`srow-pick${a?.(e)?` off`:``}`,disabled:a?.(e),onClick:()=>i?.(e),children:[(0,$.jsx)(fd,{name:Od(e)}),e.name]})},{key:`type`,header:`Type`,sort:e=>Ad(e),cell:e=>Ad(e)},{key:`files`,header:`Items`,className:`num`,cell:e=>e.files},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>Gc(e.bytes)}]})]});if(r===`pick`)return xt();if(e){if(!b)return(0,$.jsx)(`div`,{className:`sources`,children:(0,$.jsx)(Ot,{label:`Files`,error:Oe,onRetry:()=>Ne(e=>e+1)})});let e=rd[b.type]?.Level,n=!e&&!b.system,r=()=>t?.(null),i=(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(ce,{kind:`Source`,name:b.name,onPick:p?.length?()=>j(!0):void 0,meta:Ad(qc(b)),primary:n?{label:`Upload…`,icon:Ue,onSelect:()=>Pe.current?.click()}:void 0,actions:pt(qc(b),r)}),A&&p&&(0,$.jsx)(d,{kind:`Source`,value:b.id,onPick:e=>t?.(e),onClose:()=>j(!1),options:p.map(e=>({id:e.id,label:e.name}))}),ut,_t]});return e?(0,$.jsxs)(`div`,{className:`sources`,children:[i,(0,$.jsx)(e,{source:b,onBack:r,note:le?.id===b.id?le.text:void 0}),(0,$.jsx)(Vt,{undo:c.undo,onUndo:c.undoNow,onDismiss:c.dismiss})]}):(0,$.jsxs)(`div`,{className:`sources`,"data-level":`files`,children:[i,ve&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:ve}),(0,$.jsxs)(J,{id:`source-files`,title:`Files`,note:String(b.files.length),children:[b.files.length>0&&(0,$.jsx)(pe,{noun:`files`,search:{label:`Find a file`,value:w,placeholder:`Name`,onChange:T},filters:[{key:`sort`,label:`Sort`,value:Le,neutral:`name`,options:Mc,onChange:e=>C(t=>({...t,sort:e,dir:Mc.find(t=>t.value===e)?.dir??1}))}],trail:yt,count:{shown:Xe.length,total:b.files.length}}),Ie===`list`&&E.size>0&&(0,$.jsx)(_,{count:E.size,noun:`file`,onClear:Qe,actions:ht}),(0,$.jsx)(`div`,{className:`sfiles${Se?` drag`:``}`,onDragOver:e=>{e.preventDefault(),Ce(!0)},onDragLeave:()=>Ce(!1),onDrop:gt,children:Xe.length===0?(0,$.jsx)(`p`,{className:`note`,children:w?`No files match that name.`:`No files in this Source yet.`}):Ie===`thumbs`?(0,$.jsx)(`ul`,{className:`stiles`,children:Xe.map(e=>(0,$.jsxs)(`li`,{className:`stile-cell`,children:[(0,$.jsxs)(`button`,{type:`button`,className:`stile`,title:e.name,"aria-label":e.name,onClick:()=>z(e),children:[(0,$.jsx)(_d,{id:b.id,file:e,text:!!L().SOURCE_TYPES[b.type]?.itemText?.(e.name)}),(0,$.jsx)(`span`,{className:`stile-name`,children:e.name})]}),(0,$.jsx)(`span`,{className:`stile-menu`,children:(0,$.jsx)(F,{label:`${e.name} actions`,actions:mt(e)})})]},e.name))}):(0,$.jsx)(m,{className:`slist`,label:`${b.name} files`,rows:Xe,rowKey:e=>e.name,sort:{key:Le,dir:Re===1?`asc`:`desc`},onSort:e=>C(t=>({...t,sort:e?.key??`name`,dir:e?.dir===`desc`?-1:1})),select:{noun:`file`,selected:E,onChange:D},rowProps:e=>({onClick:()=>Ze(e.name)}),columns:[{key:`name`,header:`Name`,className:`sfile-name`,role:`title`,sort:e=>e.name,cell:e=>e.name},{key:`type`,header:`Type`,className:`stype`,sort:e=>Sd(e.name),cell:e=>Sd(e.name)},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>Gc(e.bytes)},{key:`added`,header:`Added`,sort:e=>e.added,cell:e=>e.added?Kc(e.added):`—`},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,tdProps:()=>({onClick:e=>e.stopPropagation()}),cell:e=>(0,$.jsx)(F,{label:`${e.name} actions`,actions:mt(e)})}]})})]}),n&&(0,$.jsxs)(`div`,{className:`supload`,children:[(0,$.jsx)(`input`,{ref:Pe,type:`file`,multiple:!0,hidden:!0,"aria-hidden":`true`,accept:L().sourceTypeOf(b)?.uploads?.join(`,`),onChange:e=>{e.target.files&&at(e.target.files),e.target.value=``}}),be.length>0&&(0,$.jsx)(`ul`,{className:`suploads`,children:be.map(e=>(0,$.jsxs)(`li`,{className:`supload ${e.state}`,children:[(0,$.jsx)(`span`,{className:`supload-name`,children:e.file.name}),e.state===`uploading`&&(0,$.jsx)(`span`,{className:`supload-bar`,role:`status`,children:`Uploading…`}),e.state===`done`&&(0,$.jsx)(`span`,{className:`note`,children:`Uploaded`}),e.state===`error`&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`span`,{className:`note bad`,children:e.error}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>ot(e),children:`Retry`})]})]},e.id))})]}),I&&(0,$.jsxs)(R,{title:I.name,onClose:ze,wide:!!L().documentTypeOf(I.name),children:[(0,$.jsx)(bd,{id:b.id,file:I}),(0,$.jsx)(`p`,{className:`note`,children:Gc(I.bytes)})]}),B&&(0,$.jsx)(R,{title:B.kind===`move`?`Move to…`:`Copy to…`,onClose:Ve,children:(0,$.jsx)(pd,{mode:`pick`,disabled:e=>e.id===b.id||e.system||e.type!==b.type,onPick:e=>void st(B.kind,e)})}),W&&(0,$.jsxs)(R,{title:`New Source from selection`,onClose:He,dirty:!!ae.trim(),onEnter:ae.trim()?()=>void ct():void 0,children:[(0,$.jsxs)(`label`,{className:`prompt`,children:[(0,$.jsx)(`span`,{className:`prop-name`,children:`Name`}),(0,$.jsx)(`input`,{"aria-label":`New Source name`,value:ae,autoFocus:!0,onChange:e=>oe(e.target.value)})]}),(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>ie(!1),children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,disabled:!ae.trim(),onClick:()=>void ct(),children:`Make`})]})]}),(0,$.jsx)(Vt,{undo:c.undo,onUndo:c.undoNow,onDismiss:c.dismiss})]})}let St=rd[Dd(G,ge)]?.Create,Ct={key:`type`,label:`Type`,control:{type:`cards`,value:G,onChange:e=>{K(e),q(null)},options:Ed(ge).map(e=>({...e,icon:(0,$.jsx)(fd,{name:e.icon})}))}},wt=St?!!se?.enabled&&!se.busy:!!ae.trim(),Tt=()=>{St?se?.enabled&&se.run():lt()};return(0,$.jsxs)(`div`,{className:`sources`,"data-level":`sources`,children:[ve&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:ve}),(0,$.jsxs)(J,{id:`library-sources`,title:`Sources`,children:[p!==null&&p.length>0&&bt(yt),p===null?(0,$.jsx)(Ot,{label:`Sources`,error:Ee,onRetry:()=>{De(null),je(e=>e+1)}}):p.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No Sources yet.`}):Ie===`thumbs`?(0,$.jsx)(`ul`,{className:`sfolders`,children:vt.map(e=>(0,$.jsxs)(`li`,{className:`sfolder`,children:[(0,$.jsxs)(`button`,{type:`button`,className:`sfolder-open`,onClick:()=>t?.(e.id),children:[(0,$.jsx)(fd,{name:Od(e)}),(0,$.jsx)(`span`,{className:`sfolder-name`,children:e.name}),(0,$.jsx)(`span`,{className:`sfolder-meta`,children:Ad(e)}),wd(e)&&(0,$.jsx)(Td,{source:e,cap:v,children:(0,$.jsx)(`span`,{className:`squota-bar`,children:(0,$.jsx)(`span`,{className:`squota-fill`,style:{width:`${Cd(e.bytes,v)}%`}})})})]}),(0,$.jsx)(`span`,{className:`sfolder-menu`,children:(0,$.jsx)(F,{label:`${e.name} actions`,actions:pt(e)})})]},e.id))}):(0,$.jsx)(`div`,{className:`sfiles`,children:(0,$.jsx)(m,{className:`slist slist-folders`,label:`Sources`,rows:vt,rowKey:e=>e.id,rowProps:e=>({"data-open":e.id,onClick:()=>t?.(e.id)}),select:{noun:`Source`,actions:e=>[{label:`Delete`,icon:At,destructive:!0,disabled:e.every(e=>e.system),onSelect:()=>void et(e.filter(e=>!e.system))}]},columns:[{key:`name`,header:`Name`,className:`sfile-name`,role:`title`,sort:e=>e.name,cell:e=>(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(fd,{name:Od(e)}),e.name]})},{key:`type`,header:`Type`,sort:e=>Ad(e),cell:e=>Ad(e)},{key:`files`,header:`Items`,className:`num`,cell:e=>e.files},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>Gc(e.bytes)},{key:`used`,header:`Used`,className:`num`,sort:e=>wd(e)?e.bytes:null,cell:e=>wd(e)?(0,$.jsx)(Td,{source:e,cap:v,children:`${Cd(e.bytes,v)}%`}):(0,$.jsx)(`span`,{className:`snone`,children:`(n/a)`})},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,tdProps:()=>({onClick:e=>e.stopPropagation()}),cell:e=>(0,$.jsx)(F,{label:`${e.name} actions`,actions:pt(e)})}]})}),ut,(0,$.jsx)(`div`,{className:`sfoot`,children:(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:()=>P(!0),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),` Add source`]})})]}),N&&(0,$.jsx)(R,{title:`Add source`,onClose:Be,dirty:!!ae.trim(),className:`edit sadd`,initialFocus:`.prop[data-key="name"] input`,onEnter:wt?Tt:void 0,footer:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:Be,children:`Cancel`}),(0,$.jsxs)(`button`,{type:`button`,disabled:St?!se?.enabled:!ae.trim(),"aria-busy":se?.busy||void 0,onClick:Tt,children:[se?.busy&&(0,$.jsx)(M,{}),`Add source`]})]}),children:St?(0,$.jsx)(St,{typeRow:Ct,which:G,bind:q,onMade:async(e,n)=>{P(!1),K(L().DEFAULT_SOURCE_TYPE),await We(),n&&(ue({id:e.id,text:n}),t?.(e.id))}}):(0,$.jsx)(V,{label:`New Source`,rows:[Ct,{key:`name`,label:`Name`,width:`full`,control:{type:`text`,value:ae,onChange:oe}}]})}),_t,(0,$.jsx)(Vt,{undo:c.undo,onUndo:c.undoNow,onDismiss:c.dismiss})]})}var md=`evals-lab.sources.adding`;function hd(){try{return sessionStorage.getItem(md)}catch{return null}}function gd(e){try{e?sessionStorage.setItem(md,e):sessionStorage.removeItem(md)}catch{}}function _d({id:e,file:t,text:n}){let[r,i]=(0,X.useState)(!1),a=yd(n?e:null,t,vd);return L().documentTypeOf(t.name)?(0,$.jsxs)(`span`,{className:`stile-type`,children:[(0,$.jsx)(kn,{size:32,"aria-hidden":`true`}),Sd(t.name)]}):a?(0,$.jsx)(`span`,{className:`stile-text`,"aria-hidden":`true`,children:a}):!t.thumb||r?(0,$.jsx)(`span`,{className:`stile-type`,children:Sd(t.name)||`FILE`}):(0,$.jsx)(`img`,{className:`stile-img`,src:Vc(e,t),alt:``,loading:`lazy`,onError:()=>i(!0)})}var vd=600;function yd(e,t,n){let r=Z(),[i,a]=(0,X.useState)(null);return(0,X.useEffect)(()=>{if(!e)return;let i=!0;return Promise.resolve().then(()=>r.file(e,t.name)).then(e=>(n?e.slice(0,n):e).text()).then(e=>{i&&a(e)},()=>{}),()=>{i=!1}},[r,e,t.name,t.v,n]),i}function bd({id:e,file:t}){let n=Z(),r=Bc(t.name),i=!r&&!!L().documentTypeOf(t.name),a=yd(r||i?null:e,t),[o,s]=(0,X.useState)(null);return(0,X.useEffect)(()=>{if(!i)return;let r=null,a=!0;return n.file(e,t.name).then(e=>{a&&(r=URL.createObjectURL(new Blob([e],{type:L().documentTypeOf(t.name).media})),s(r))},()=>{}),()=>{a=!1,r&&URL.revokeObjectURL(r)}},[n,e,t.name,i]),r?(0,$.jsx)(`img`,{className:`spreview-img`,src:Hc(e,t),alt:t.name}):i?o?(0,$.jsx)(`iframe`,{className:`spreview-doc`,src:o,title:t.name}):(0,$.jsx)(M,{}):a===null?(0,$.jsx)(M,{}):(0,$.jsx)(`pre`,{className:`spreview-text`,tabIndex:0,children:a})}function xd({view:e,onChange:t}){return(0,$.jsxs)(`div`,{className:`sview`,role:`group`,"aria-label":`View`,children:[(0,$.jsx)(`button`,{type:`button`,className:e===`thumbs`?`on`:void 0,"aria-pressed":e===`thumbs`,onClick:()=>t(`thumbs`),children:`Thumbnails`}),(0,$.jsx)(`button`,{type:`button`,className:e===`list`?`on`:void 0,"aria-pressed":e===`list`,onClick:()=>t(`list`),children:`List`})]})}function Sd(e){let t=e.lastIndexOf(`.`);return t<0?``:e.slice(t+1).toUpperCase()}function Cd(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}var wd=e=>!e.system&&!rd[e.type]?.Level;function Td({source:e,cap:t,children:n}){let r=`Quota: ${Gc(e.bytes)} of ${Gc(t)}`;return(0,$.jsxs)(`span`,{className:`squota`,role:`img`,"aria-label":r,children:[n,(0,$.jsx)(`span`,{className:`squota-pop`,"aria-hidden":`true`,children:r})]})}var Ed=(e=[])=>Object.entries(L().SOURCE_TYPES).flatMap(([t,n])=>n.platforms?n.platforms.flatMap(e=>{let n=L().WORKFLOW_PLATFORMS[e];return n?[{value:e,label:n.label,icon:dd(t,e)}]:[]}):n.providers?e.map(e=>({value:e.id,label:e.label,icon:dd(t,void 0,e.id),...e.enrolled?{}:{disabled:!0,note:e.note??`set by the server`}})):[{value:t,label:n.label,icon:dd(t)}]),Dd=(e,t=[])=>{if(e in L().SOURCE_TYPES)return e;let n=Object.entries(L().SOURCE_TYPES).find(([,t])=>t.platforms?.includes(e))?.[0];if(n)return n;if(t.some(t=>t.id===e)||e in L().DYNAMIC_PROVIDERS){let e=Object.entries(L().SOURCE_TYPES).find(([,e])=>e.providers)?.[0];if(e)return e}return e},Od=e=>dd(e.type,e.platform,e.provider),kd=e=>e.provider??e.platform??e.type,Ad=e=>e.provider?L().DYNAMIC_PROVIDERS[e.provider]?.label??L().SOURCE_TYPES[e.type]?.label??e.type:e.platform?L().WORKFLOW_PLATFORMS[e.platform]?.label??L().SOURCE_TYPES[e.type]?.label??e.type:L().SOURCE_TYPES[e.type]?.label??e.type;function jd({sourceId:e}){let[t,n]=(0,X.useState)(e);return(0,X.useEffect)(()=>n(e),[e]),(0,$.jsx)(pd,{sourceId:t,onOpen:e=>{n(e),Rr({tab:`library`,section:`sources`,id:e})},onGone:()=>zr({tab:`library`,section:`sources`,id:null})})}var Md=[{id:`datasets`,label:`Evals`,icon:p},{id:`filters`,label:`Filter sets`,icon:Qt},{id:`prompts`,label:`Prompts`,icon:wt},{id:`sources`,label:`Sources`,icon:Yt}];function Nd({section:e,id:t}){return(0,$.jsxs)(`div`,{className:`library`,children:[(0,$.jsx)(tn,{label:`Library`,level:`section`,className:`lib-sections`,current:e,items:Md.map(({id:e,label:t,icon:n})=>({key:e,label:t,href:Lr({tab:`library`,section:e,id:null}),icon:n}))}),(0,$.jsx)(`section`,{className:`lib-section`,"data-section":e,children:e===`datasets`?(0,$.jsx)(fs,{groupId:t}):e===`filters`?(0,$.jsx)(yc,{setId:t}):e===`prompts`?(0,$.jsx)(jc,{promptId:t}):(0,$.jsx)(jd,{sourceId:t})})]})}var Pd=`0.14.0 (2026.10.14-830)`,Fd=3,Id=3,Ld=e=>Za.find(t=>t.id===e),Rd=e=>Md.find(t=>t.id===e);function zd(){let e=Z(),[t]=Q(`promptlab.connections`),n=(0,X.useMemo)(()=>t.list.filter(e=>L().listedConnection(e)),[t.list]),[r,i]=Q(`promptlab.workflows`),a=yr(),o=kr(),{pickDataset:s}=ci(),{openRun:c}=di(),l=vr(),u=Or(),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(null),[y,b]=(0,X.useState)(0),[x,S]=(0,X.useState)(0),C=e=>e instanceof Error?e.message:String(e);(0,X.useEffect)(()=>{let t=!0;return g(null),e.sources().then(e=>{t&&f(e.sources)},e=>{t&&g(C(e))}),()=>{t=!1}},[e,y]),(0,X.useEffect)(()=>{let t=!0;return v(null),e.queue({limit:Id}).then(e=>{t&&m(e.runs)},e=>{t&&v(C(e))}),()=>{t=!1}},[e,x]);let w=(0,X.useMemo)(()=>r.list.filter(e=>e.work?.version===18),[r.list]),E=a.list??[],D=E.reduce((e,t)=>e+t.cases,0),O=(p??[]).filter(e=>e.status===`queued`||e.status===`running`).length,k=n.length===0?`setup`:a.list===null?null:E.length===0||D===0?`datasets`:p!==null&&p.length===0?`runs`:null,A=(...e)=>e.filter(Boolean).join(`, `)||void 0,j=Ld(`library`),M=j.icon;return(0,$.jsxs)(`div`,{className:`home`,children:[(0,$.jsx)(`div`,{className:`home-pane`,children:(0,$.jsxs)(`ol`,{className:`home-line`,"aria-label":`Lab`,children:[(0,$.jsx)(Bd,{id:`runs`,icon:Ld(`runs`).icon,name:Ld(`runs`).label,hub:!k||k===`runs`,start:k===`runs`,fact:A(ki(w.length,`pipeline`),O>0&&`${O} running`),total:w.length,items:w.map(e=>({key:e.id,label:e.name,title:e.name,href:Lr({tab:`runs`,id:e.id}),onPick:()=>i({...r,at:e.id})}))}),(0,$.jsx)(Bd,{id:`history`,icon:Ld(`history`).icon,name:Ld(`history`).label,fact:p&&p.length===0?`No runs yet`:void 0,wait:p?void 0:{error:_,onRetry:()=>S(e=>e+1)},items:(p??[]).map(e=>{let{pct:t}=zi(Oa(e)),n=Oi(e.submittedAt),r=e.snapshot?.name||`Untitled`;return{key:e.id,label:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`code`,{children:n}),`, `,r,e.status!==`done`&&(0,$.jsxs)($.Fragment,{children:[` `,Pi(e.status)]})]}),title:[n,r,t!==`—`&&t].filter(Boolean).join(`, `),sub:t===`—`?void 0:t,href:Lr({tab:`results`,id:e.id}),onOpen:()=>c(e.id,{at:e.submittedAt,from:`home`})}})}),(0,$.jsxs)(`li`,{className:`home-stop home-fork`,"data-stop":`library`,children:[(0,$.jsxs)(`a`,{className:`home-name`,href:`#/library`,children:[(0,$.jsx)(`span`,{className:`home-mark`,"aria-hidden":`true`,children:(0,$.jsx)(M,{size:18})}),j.label]}),(0,$.jsxs)(`ol`,{className:`home-branch`,"aria-label":j.label,children:[(0,$.jsx)(Bd,{id:`datasets`,to:`library/datasets`,branch:!0,icon:Rd(`datasets`).icon,name:Rd(`datasets`).label,start:k===`datasets`,fact:a.list?A(ki(E.length,`eval group`),ki(D,`case`)):void 0,total:E.length,wait:a.list?void 0:{error:a.error,onRetry:()=>void l.refresh()},items:E.map(e=>({key:e.id,label:e.name,title:e.name,sub:ki(e.cases,`case`),href:Lr({tab:`library`,section:`datasets`,id:e.id}),onPick:()=>s(e.id)}))}),(0,$.jsx)(Bd,{id:`prompts`,to:`library/prompts`,branch:!0,icon:Rd(`prompts`).icon,name:Rd(`prompts`).label,fact:o.list?A(ki(o.list.length,`prompt`)):void 0,total:o.list?.length??0,wait:o.list?void 0:{error:o.error,onRetry:()=>void u.refresh()},items:(o.list??[]).map(e=>{let t=e.name||e.text.split(`
9
- `)[0]||`Untitled`;return{key:e.id,label:t,title:t,sub:e.default?`Default`:void 0,href:Lr({tab:`library`,section:`prompts`,id:e.id})}})}),(0,$.jsx)(Bd,{id:`sources`,to:`library/sources`,branch:!0,icon:Rd(`sources`).icon,name:Rd(`sources`).label,fact:d?A(ki(d.length,`source`)):void 0,total:d?.length??0,wait:d?void 0:{error:h,onRetry:()=>b(e=>e+1)},items:(d??[]).map(e=>({key:e.id,label:e.name,title:e.name,sub:ki(e.files,T(e)),href:Lr({tab:`library`,section:`sources`,id:e.id})}))})]})]}),(0,$.jsx)(Bd,{id:`setup`,icon:Ld(`setup`).icon,name:Ld(`setup`).label,start:k===`setup`,fact:A(ki(n.length,`connection`)),total:n.length,items:n.map(e=>({key:e.id,label:e.name||`Untitled`,title:e.name||`Untitled`,sub:e.model,href:Lr({tab:`setup`,section:`connections`,id:e.id})}))})]})}),(0,$.jsxs)(`p`,{className:`home-version`,children:[`Evals Lab `,Pd]})]})}function Bd({id:e,icon:t,name:n,to:r,fact:i,items:a,total:o=a.length,hub:s,start:c,branch:l,wait:u}){let d=o-Math.min(a.length,Fd);return(0,$.jsxs)(`li`,{className:[`home-stop`,s&&`hub`,c&&`start`,l&&`branch`].filter(Boolean).join(` `),"data-stop":e,children:[(0,$.jsxs)(`a`,{className:`home-name`,href:`#/${r??e}`,children:[(0,$.jsx)(`span`,{className:`home-mark`,"aria-hidden":`true`,children:(0,$.jsx)(t,{size:l?15:18})}),n]}),c&&(0,$.jsx)(`a`,{className:`home-start`,href:`#/${r??e}`,children:(0,$.jsx)(`span`,{className:`home-start-chip`,children:`Start Here`})}),u&&(0,$.jsx)(Ot,{label:n,error:u.error,onRetry:u.onRetry}),!u&&i&&(0,$.jsx)(`span`,{className:`home-fact`,children:i}),!u&&a.length>0&&(0,$.jsxs)(`ul`,{className:`home-items`,children:[a.slice(0,Fd).map(e=>(0,$.jsx)(`li`,{children:(0,$.jsxs)(`a`,{href:e.href,title:e.title,onClick:t=>{e.onOpen?(t.preventDefault(),e.onOpen()):e.onPick?.()},children:[(0,$.jsx)(`span`,{className:`home-item`,children:e.label}),e.sub&&(0,$.jsx)(`span`,{className:`home-sub`,children:e.sub})]})},e.key)),d>0&&(0,$.jsx)(`li`,{children:(0,$.jsxs)(`a`,{className:`home-more`,href:`#/${r??e}`,children:[d,` more`]})})]})]})}function Vd({list:e,at:t,canRestore:n,onSelect:r,onNew:i,onClone:a,link:o,onCopyMove:s,onRename:c,onDelete:l,onRestore:u,onExport:f,onExportCi:p,onImport:m,used:h={}}){let[_,v]=(0,X.useState)(!1),[y,b]=(0,X.useState)(!1),x=e.find(e=>e.id===t),S=[{label:`Rename…`,icon:qe,onSelect:()=>v(!0)},{label:`Clone`,icon:U,onSelect:a},o,{label:`Copy or move…`,icon:Y.transfer,onSelect:s},{label:`Export YAML`,icon:g,onSelect:f},{label:`Export for CI…`,icon:g,onSelect:p},{label:`Import YAML…`,icon:Ue,onSelect:m},{label:`Restore…`,icon:ke,disabled:!n,onSelect:u},{label:`Delete`,icon:At,destructive:!0,onSelect:l}],C=x?.work.jobs?.length??0,w=x?.work.targets?.length??0;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(ce,{kind:`Pipeline`,name:x?.name?.trim()||`Untitled`,onPick:()=>b(!0),meta:`${Ud(C,`job`)}, ${Ud(w,`target`)}`,primary:{label:`New pipeline`,icon:dt,onSelect:i},actions:S,docked:!0}),y&&(0,$.jsx)(d,{kind:`Pipeline`,value:t,onPick:r,onClose:()=>b(!1),options:e.map(e=>{let t=h[e.id];return{id:e.id,label:e.name||`Untitled`,used:t?{at:t,label:Ft(t)}:null}}),recent:e.filter(e=>h[e.id]).sort((e,t)=>h[t.id].localeCompare(h[e.id])).slice(0,Hd).map(e=>e.id)}),_&&(0,$.jsx)(Tt,{title:`Rename pipeline`,value:x?.name??``,onCommit:c,onClose:()=>v(!1)})]})}var Hd=5,Ud=(e,t)=>`${e} ${e===1?t:`${t}s`}`;function Wd({hasItems:e,onExport:t,onClose:n}){let[r,i]=(0,X.useState)(!1),[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(null),l=async()=>{o(!0),c(null);try{await t(e&&r),n()}catch(e){c(e instanceof Error?e.message:String(e))}finally{o(!1)}};return(0,$.jsx)(st,{title:`Export for CI`,status:s??void 0,statusBad:!!s,onClose:n,sections:[{key:`bundle`,rows:[{key:`items`,label:`Include files`,...e?{hint:`Copy the Source's files into the zip. Off: evals-lab run needs --items.`}:{},control:e?{type:`checkbox`,checked:r,onChange:i}:{type:`static`,text:`None`}}]}],actions:[{label:`Export`,icon:g,busy:a,primary:!0,onSelect:()=>void l()}]})}function Gd({problems:e,error:t,run:n,submitting:r,stopping:i=!1,onRun:a,onStop:o,onOpen:s,onShare:c}){let l=!!n&&!Qi(n.status),u=l&&(i||$i(n)),d=n?.progress?.total??0,f=n?.progress?.n??0,p=l&&d?Math.round(f/d*100):null,m=n&&(0,$.jsxs)(`button`,{type:`button`,className:`runbar-open`,title:`Open this run`,onClick:s,children:[(0,$.jsx)(`span`,{className:`runbar-word`,children:u?`Stopping`:Ni(n.status)}),Kd(n)&&(0,$.jsx)(`span`,{className:`runbar-detail`,children:Kd(n)})]}),h=l?m:e.length?(0,$.jsxs)(`span`,{className:`runbar-why`,children:[Xd(e[0]),Yd(e[0])]}):t?(0,$.jsxs)(`span`,{className:`runbar-why bad`,children:[Xd(t),c&&(0,$.jsxs)($.Fragment,{children:[` `,(0,$.jsx)(`button`,{type:`button`,className:`runbar-fix`,onClick:c,children:`Share`})]})]}):m??(0,$.jsx)(`span`,{className:`runbar-word`,children:`Ready to run`});return(0,$.jsx)(Ze,{className:`runbar`,primary:{label:`Run`,icon:Ve,onSelect:a,disabled:e.length>0,busy:r},status:h,secondary:l?{label:u?`Stopping…`:`Stop`,icon:nt,onSelect:o,busy:u}:void 0,progress:p,progressLabel:`Run progress`})}function Kd(e){if(e.status===`queued`)return e.behind?`behind ${e.behind}`:`next in line`;if(e.status===`running`)return e.progress?.total?`${e.progress.n} of ${e.progress.total}`:``;if(e.status===`done`&&e.progress?.total){let t=Li(e.startedAt,e.finishedAt);return t==null?String(e.progress.total):`${e.progress.total} in ${Ii(t)}`}return``}var qd=[[/^(?:Connection(?: Profile)?|Grader) .* not found$/,`#/setup`,`Open\xA0Setup`],[/^Source .* not found$/,`#/library/sources`,`Open\xA0Sources`],[/^(?:Dataset|Eval group) .* not found$/,`#/library/datasets`,`Open\xA0Evals`]],Jd=e=>qd.find(([t])=>t.test(e.trim()))?.[1];function Yd(e){let t=qd.find(([t])=>t.test(e.trim()));return t?(0,$.jsxs)($.Fragment,{children:[` `,(0,$.jsx)(`a`,{className:`runbar-fix`,href:t[1],children:t[2]})]}):null}var Xd=e=>{let t=e.trim();if(!t)return t;let n=t[0].toUpperCase()+t.slice(1);return/[.!?]$/.test(n)?n:`${n}.`},Zd=10;function Qd({onPick:e,onClose:t,used:n}){let{list:r,error:i}=kr(),a=Or(),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(`all`),[u,d]=(0,X.useState)(0),f=r??[],p=f.filter(e=>Cc(e,o,c,n??{byScenario:new Set,byAll:new Set})).sort((e,t)=>Number(t.default)-Number(e.default)),m=Math.ceil(p.length/Zd),h=Math.min(u,Math.max(0,m-1)),g=p.slice(h*Zd,(h+1)*Zd);return(0,$.jsxs)(R,{title:`Select prompt`,onClose:t,className:`sp`,initialFocus:`.sp input[type=search]`,children:[(0,$.jsx)(pe,{noun:`prompts`,search:{label:`Search prompts`,placeholder:`Search prompts`,value:o,onChange:e=>{s(e),d(0)}},filters:[{key:`show`,label:`Show`,value:c,onChange:e=>{l(e),d(0)},options:xc}],count:{shown:p.length,total:f.length}}),r===null?(0,$.jsx)(Ot,{label:`Prompts`,error:i,onRetry:()=>void a.refresh()}):f.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No prompts yet.`}):p.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No prompts match these filters.`}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`ul`,{className:`sp-list`,"aria-label":`Prompts`,children:g.map(t=>(0,$.jsx)(`li`,{children:(0,$.jsxs)(`button`,{type:`button`,className:`sp-pick`,onClick:()=>e(t),children:[(0,$.jsxs)(`span`,{className:`sp-head`,children:[(0,$.jsx)(`span`,{className:`sp-title`,children:xr(t)}),t.default&&(0,$.jsx)(`span`,{className:`pl-default`,children:`Default`})]}),(0,$.jsx)(`span`,{className:`sp-text`,children:t.text.trim()||`—`}),(0,$.jsxs)(`span`,{className:`sp-meta`,children:[(0,$.jsx)(`span`,{children:t.useCount===1?`1 use`:`${t.useCount} uses`}),t.lastUsed&&(0,$.jsxs)(`span`,{children:[`last `,wc(t.lastUsed)]}),(0,$.jsxs)(`span`,{children:[`v`,t.version]})]})]})},t.id))}),m>1&&(0,$.jsxs)(`div`,{className:`sp-pager`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,disabled:h===0,onClick:()=>d(h-1),children:`Back`}),(0,$.jsxs)(`span`,{className:`sp-page`,children:[h+1,` of `,m]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,disabled:h>=m-1,onClick:()=>d(h+1),children:`Forward`})]})]})]})}function $d({what:e,options:t,recent:n,taken:r,linkedHere:i,ready:a,onPick:o,onMove:s,onClose:c}){let[l,u]=(0,X.useState)(`new`),[d,f]=(0,X.useState)(``),[p,m]=(0,X.useState)(``),[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(null),y=d.trim(),x=l===`new`&&r.has(y),S=t.find(e=>e.id===p),C=!h&&(l===`new`?!!y&&!x:!!p&&a(p)),w=async()=>{if(!C)return;g(!0),v(null);let e=await s(l===`new`?{kind:l,name:y}:{kind:l,id:p});if(e){v(e),g(!1);return}c()};return(0,$.jsxs)(R,{title:`Move ${e} to a filter set`,onClose:c,className:`move-to-set`,dirty:!!y||!!p,initialFocus:`.mv-name`,footer:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:c,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,disabled:!C,"aria-busy":h||void 0,onClick:()=>void w(),children:`Move`})]}),children:[(0,$.jsxs)(`fieldset`,{className:`nf-types`,children:[(0,$.jsx)(`legend`,{className:`sr-only`,children:`Filter set`}),(0,$.jsxs)(`label`,{className:`nf-type${l===`new`?` on`:``}`,children:[(0,$.jsx)(`input`,{type:`radio`,name:`move-to`,checked:l===`new`,onChange:()=>u(`new`)}),(0,$.jsxs)(`span`,{className:`nf-type-text`,children:[(0,$.jsx)(`span`,{className:`nf-type-name`,children:`New filter set`}),(0,$.jsx)(`input`,{className:`mv-name`,type:`text`,"aria-label":`Name`,placeholder:`Name`,value:d,onFocus:()=>u(`new`),onChange:e=>f(e.target.value)})]})]}),(0,$.jsxs)(`div`,{className:`nf-type${l===`existing`?` on`:``}`,children:[(0,$.jsx)(`input`,{type:`radio`,name:`move-to`,id:`mv-existing`,checked:l===`existing`,onChange:()=>u(`existing`)}),(0,$.jsxs)(`span`,{className:`nf-type-text`,children:[(0,$.jsx)(`label`,{className:`nf-type-name`,htmlFor:`mv-existing`,id:`mv-existing-label`,children:`Existing filter set`}),(0,$.jsx)(b,{kind:`Filter set`,value:p,options:t,recent:n,usedLabel:`Last changed`,placeholder:`Choose a filter set`,labelledBy:`mv-existing-label`,onChange:e=>{u(`existing`),m(e),o?.(e)}})]})]})]}),x&&(0,$.jsxs)(`p`,{className:`note bad`,role:`alert`,children:[`A filter set named `,y,` already exists.`]}),l===`existing`&&S&&i.has(p)&&(0,$.jsxs)(`p`,{className:`note`,children:[S.label,` is already linked here, so `,e,` joins its end and runs where it runs.`]}),_&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:_})]})}function ef(e,t){return e==null?`Follow latest`:t!=null&&t>e?`Pinned v${e} · v${t} is latest`:`Pinned v${e}`}function tf(e,t){if(!e||!t)return null;let n=e.cases.map(e=>L().caseItem(e));return{found:L().itemsFound(n,t),total:n.length}}function nf({pipeline:e,edit:t,offer:n,children:r,profiles:i=[],labGrader:a=null,contentFiles:s}){let c=vr(),{list:l}=yr(),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(null),g=e.evals,[,_]=(0,X.useState)(0);(0,X.useEffect)(()=>c.subscribe(()=>_(e=>e+1)),[c]),(0,X.useEffect)(()=>{for(let e of g)e.group&&c.load(e.group.id)},[g,c]);let v=(r,i)=>{let a=e;t(r),n({label:i,restore:()=>t(a)})},y=e=>c.entry(e)?.doc?.body??null,b=new Map((l??[]).map(e=>[e.id,e])),S=new Set(g.flatMap(e=>e.group?[e.group.id]:[])),C=g.flatMap((e,t)=>e.group?[{t:e,j:t}]:[]),w=g.flatMap((e,t)=>e.own?[{t:e,j:t}]:[]),T=async(t,n,r)=>{await c.flush(n),await c.refresh();let{list:i,error:a}=c.list(),o=a?void 0:i?.find(e=>e.id===n)?.versions;o!=null&&v(N(e,t,o),`Pinned ${r}`)},E=({t,j:n})=>{let r=t.group.id;return[{label:`Open in Library`,icon:Yt,onSelect:()=>ro(r)},t.pin==null?{label:`Pin`,icon:Hn,disabled:!b.has(r),onSelect:()=>{T(n,r,t.group.name||r)}}:{label:`Follow latest`,icon:Vn,onSelect:()=>v(N(e,n,null),`${t.group.name||r} follows the latest`)},{label:`Unlink`,icon:Qn,onSelect:()=>v(ee(e,n),`Unlinked ${t.group.name||r}`)}]};return(0,$.jsxs)(J,{id:`evals`,title:`Evals`,level:2,note:g.length?String(g.length):`None`,children:[g.length===0&&(0,$.jsx)(`p`,{className:`note evals-empty`,children:`(No evals)`}),g.length>0&&(0,$.jsx)(af,{pass:e.pass,count:g.length,edit:n=>t(x(e,n))}),C.length>0&&(0,$.jsx)(m,{className:`eg-links`,cards:!0,label:`Linked eval groups`,rows:C,rowKey:e=>e.t.id,columns:[{key:`group`,header:`Eval group`,role:`title`,sort:e=>(e.t.group.name||``).toLowerCase(),cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`eg-open`,onClick:()=>ro(e.t.group.id),children:e.t.group.name||e.t.group.id})},{key:`items`,header:`Items here`,sort:e=>tf(y(e.t.group.id),s)?.found??-1,cell:e=>{let t=tf(y(e.t.group.id),s);if(!t)return`…`;let n=`${t.found} of ${t.total}`;return t.found<t.total?(0,$.jsxs)(`span`,{className:`eval-flag`,title:`${t.total-t.found} not in this run's content`,children:[(0,$.jsx)(jn,{size:12,"aria-hidden":`true`}),n]}):n}},{key:`follows`,header:`Version`,sort:e=>e.t.pin??0,cell:e=>ef(e.t.pin,b.get(e.t.group.id)?.versions)},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${e.t.group.name||e.t.group.id} actions`,actions:E(e)})}]}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost eg-add`,onClick:()=>d(!0),children:[(0,$.jsx)(Y.add,{size:14,"aria-hidden":`true`}),`Link eval group`]}),r,w.map(({t:n,j:r})=>(0,$.jsx)(rf,{ev:n,label:L().evalLabel(e,r),renaming:f===r,onRename:()=>p(r),profiles:i,labGrader:a,rawReply:e.jobs.some(e=>L().readAsOf(e)!=null),casesBody:n.own.casesFrom?y(n.own.casesFrom.id):null,loadCases:()=>{n.own.casesFrom&&c.load(n.own.casesFrom.id)},set:n=>t(o(e,r,n)),undoableSet:(t,n)=>v(o(e,r,t),n),onCommitName:n=>{t(I(e,r,n)),p(null)},onCancelName:()=>p(null),onCopyCases:t=>v(Ht(e,r,t),`Copied ${L().evalLabel(e,r)}'s cases in`),onMoveToLibrary:async()=>{let t=sf((n.name||``).trim()||L().evalLabel(e,r),new Set((l??[]).map(e=>e.name))),{casesFrom:i,...a}=n.own,o=await c.create(t,a);v(h(e,r,{id:o.id,name:o.name}),`Moved ${t} to the Library`)},onRemove:()=>v(ee(e,r),`Removed ${L().evalLabel(e,r)}`)},n.id)),u&&(0,$.jsx)(of,{list:l??[],linkedIds:S,contentFiles:s,onLink:n=>{t(de(e,n)),d(!1)},onNew:async()=>{let n=await c.create(sf(`Untitled eval group`,new Set((l??[]).map(e=>e.name))));t(de(e,{id:n.id,name:n.name})),d(!1)},onClose:()=>d(!1)})]})}function rf({ev:e,label:t,renaming:n,onRename:r,profiles:i,labGrader:a,rawReply:o,casesBody:s,loadCases:c,set:l,undoableSet:u,onCommitName:d,onCancelName:f,onCopyCases:p,onMoveToLibrary:m,onRemove:h}){let g=L(),_=Fo(),v=e.own;(0,X.useEffect)(()=>{v.casesFrom&&c()},[v.casesFrom,c]);let y=g.isWholeRun(g.EVAL_TYPES.group,e),b=y?v.run:v.every,x=t=>l({...e,own:{...v,...t}}),S=t=>({...e,own:{...v,...y?{run:t}:{every:t}}}),C=b.some(e=>g.METRICS[e.type]?.graded),w=i.filter(e=>g.listedConnection(e)&&(g.CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`)),{mode:T,threshold:E}=v.scoring,D=[{label:`Rename…`,icon:Y.rename,onSelect:r},...v.casesFrom?[{label:`Copy cases in`,icon:lt,disabled:!s,onSelect:()=>s&&p(s.cases)}]:[],{label:`Move to Library`,icon:Fn,onSelect:()=>void m()},{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:h}],O=[{key:`mode`,label:`Scored`,control:{type:`select`,value:T,options:[{value:`all`,label:`All must pass`},{value:`weighted`,label:`Weighted points`}],onChange:e=>x({scoring:{mode:e===`weighted`?`weighted`:`all`,threshold:e===`weighted`?E??1:E}})}},...T===`weighted`?[{key:`threshold`,label:`Pass at`,width:`quarter`,control:{type:`text`,value:E==null?``:String(E),onChange:e=>x({scoring:{mode:T,threshold:e.trim()?/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e:null}})}}]:[],...v.casesFrom?[]:[{key:`over`,label:`Reads`,control:{type:`select`,value:y?`run`:`item`,options:[{value:`item`,label:`Each item`},{value:`run`,label:`Whole run`}],onChange:e=>x(e===`run`?{every:[],run:[...v.every,...v.run]}:{every:[...v.every,...v.run],run:[]})}}],...v.casesFrom?[{key:`cases-from`,label:`Cases from`,control:{type:`static`,text:v.casesFrom.name||v.casesFrom.id}}]:[],...C||v.grader?[{key:`grader`,label:`Grader`,control:{type:`picker`,kind:`Connection`,title:`Choose grader connection`,value:v.grader?.id??``,..._(w,[{id:``,label:a?`Lab (${a.name})`:`None`}]),onChange:e=>{let t=i.find(t=>t.id===e);x({grader:t?{id:t.id,name:t.name}:null})}}}]:[]];return(0,$.jsx)(J,{id:`eval-${e.id}`,title:t,level:3,note:g.EVAL_TYPES.group?.label??`Eval group`,about:`A group of this pipeline's own, defined here rather than in the Library.`,actions:D,...n?{rename:{value:e.name||t,onCommit:d,onCancel:f}}:{},children:(0,$.jsxs)(k,{children:[(0,$.jsx)(V,{label:t,rows:O}),(0,$.jsx)(ko,{label:t,metrics:b,over:y?`run`:`item`,rawReply:o,set:e=>l(S(e)),undoable:(e,t)=>u(S(e),t)}),(0,$.jsx)(V,{label:`${t} on failure`,rows:[{key:`continue`,label:`Continue on failure`,control:{type:`checkbox`,checked:e.continueOnFailure,onChange:t=>l({...e,continueOnFailure:t})}}]})]})})}function af({pass:e,count:t,edit:n}){let r=e.mode===`atLeast`?e.count:t,i=[{key:`pass`,label:`Pass when`,control:{type:`select`,value:e.mode,options:[{value:`all`,label:`All groups pass`},{value:`atLeast`,label:`At least`}],onChange:e=>n(e===`atLeast`?{mode:`atLeast`,count:Math.min(Math.max(r,1),t)}:{mode:`all`})}},...e.mode===`atLeast`?[{key:`count`,label:`Groups`,width:`quarter`,control:{type:`text`,value:String(e.count),onChange:e=>{let t=Number(e);n({mode:`atLeast`,count:Number.isInteger(t)&&t>0?t:e.trim()})}}}]:[]];return(0,$.jsx)(V,{label:`Pass rule`,rows:i})}function of({list:e,linkedIds:t,contentFiles:n,onLink:r,onNew:i,onClose:a}){let o=vr(),[,s]=(0,X.useState)(0);(0,X.useEffect)(()=>o.subscribe(()=>s(e=>e+1)),[o]),(0,X.useEffect)(()=>{for(let t of e)o.load(t.id)},[e,o]);let c=e=>tf(o.entry(e)?.doc?.body,n);return(0,$.jsxs)(R,{title:`Link eval group`,onClose:a,children:[e.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No eval groups yet.`}):(0,$.jsx)(`ul`,{className:`pick-list`,"aria-label":`Eval groups`,children:e.map(e=>{let n=t.has(e.id),i=c(e.id),a=n?`Linked`:i&&i.total?`${i.found} of ${i.total} items here`:``;return(0,$.jsx)(`li`,{children:(0,$.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,disabled:n,onClick:()=>r({id:e.id,name:e.name}),children:[(0,$.jsx)(`span`,{children:e.name}),a&&(0,$.jsx)(`span`,{className:`pick-about`,children:a})]})},e.id)})}),(0,$.jsx)(`div`,{className:`pick-others`,children:(0,$.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,onClick:()=>void i(),children:[(0,$.jsx)(Y.add,{size:14,"aria-hidden":`true`}),`New eval group…`]})})]})}function sf(e,t){if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`}var cf=(e,t)=>e.entry(t)?.doc?.body.filters??null,lf=(e,t)=>e.filter(e=>uf(e)===t).length,uf=e=>L().stageOfScope(L().FILTER_TYPES[e.type]?.scope??`item`);function df({pipeline:t,job:n,stage:a,edit:o,offer:s,moveAll:c,onMoveAllClose:l}){let u=xs(),{list:f}=Ss(),[p,h]=(0,X.useState)(new Set),[g,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(null),[b,x]=(0,X.useState)(null),[S,C]=(0,X.useState)(null),w=L().filterSetsOf(t.jobs[n],a),T=L().stageReads(a,L().outOf(t.jobs[n]).kind),E=e=>uf(e)===T?null:uf(e)===a?`Items only`:fc[uf(e)],D=e(w),O=D.flatMap(e=>e.kind===`filter`?[e.filter]:[]),k=new Map((f??[]).map(e=>[e.id,e])),[,A]=(0,X.useState)(0);(0,X.useEffect)(()=>u.subscribe(()=>A(e=>e+1)),[u]);let j=D.flatMap(e=>e.kind===`set`?[e.link.set.id]:[]).join(` `);(0,X.useEffect)(()=>{for(let e of j.split(` `).filter(Boolean))u.load(e)},[u,j]);let M=e=>o(Se(t,n,e,a)),N=(e,n)=>{let r=t;o(e),s({label:n,restore:()=>o(r)})},P=(e,t)=>{let n=[...D],[r]=n.splice(e,1);n.splice(e+t,0,r),M(n)},I=e=>e.set.name||e.set.id,R=(e,r)=>[{label:`Edit…`,icon:Y.edit,onSelect:()=>_(r)},{label:`Clone`,icon:Y.clone,onSelect:()=>{let t=D[r];M([...D.slice(0,r+1),{...t,filter:{...structuredClone(e),id:q(O,`${e.id} copy`)}},...D.slice(r+1)])}},{label:`Move up`,icon:Y.moveUp,disabled:r===0,onSelect:()=>P(r,-1)},{label:`Move down`,icon:Y.moveDown,disabled:r===D.length-1,onSelect:()=>P(r,1)},{label:`Move to filter set…`,icon:Fn,onSelect:()=>C([r])},{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>N(Se(t,n,D.filter((e,t)=>t!==r),a),`Removed ${e.id}`)}],z=async e=>{let r=e.set.id;await u.flush(r),await u.refresh();let{list:i,error:o}=u.list(),s=o?void 0:i?.find(e=>e.id===r)?.versions;s!=null&&N(_e(t,n,e.id,s,a),`Pinned ${I(e)}`)},V=(e,r)=>[{label:`Open in Library`,icon:Yt,onSelect:()=>Es(e.set.id)},e.pin==null?{label:`Pin`,icon:Hn,disabled:!k.has(e.set.id),onSelect:()=>{z(e)}}:{label:`Follow latest`,icon:Vn,onSelect:()=>N(_e(t,n,e.id,null,a),`${I(e)} follows the latest`)},{label:`Move up`,icon:Y.moveUp,disabled:r===0,onSelect:()=>P(r,-1)},{label:`Move down`,icon:Y.moveDown,disabled:r===D.length-1,onSelect:()=>P(r,1)},{label:`Unlink`,icon:Qn,onSelect:()=>N(yt(t,n,e.id,a),`Unlinked ${I(e)}`)}],ee=D.flatMap((e,t)=>{let n={...e,n:t+1,at:t};return e.kind!==`set`||!p.has(e.link.id)?[n]:[n,...(cf(u,e.link.set.id)??[]).map((t,n)=>({kind:`inner`,filter:t,key:`${e.link.id}/${n}`}))]}),te=e=>h(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n}),ne=e=>L().FILTER_TYPES[e.type]?.label??e.type,H=[{key:`n`,header:`#`,label:``,className:`num fs-n`,sort:null,cell:e=>e.kind===`inner`?null:e.n},{key:`filter`,header:`Filter`,role:`title`,sort:null,cell:e=>{if(e.kind===`filter`){let t=E(e.filter);return(0,$.jsxs)(`span`,{className:`fs-inner`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ds-file`,onClick:()=>_(e.at),children:e.filter.id}),t&&(0,$.jsx)(`span`,{className:`fs-badge`,children:t})]})}if(e.kind===`set`){let t=p.has(e.link.id),n=t?B:i;return(0,$.jsxs)(`span`,{className:`fs-set`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost fs-toggle`,"aria-expanded":t,"aria-label":`${t?`Hide`:`Show`} ${I(e.link)}'s filters`,onClick:()=>te(e.link.id),children:(0,$.jsx)(n,{size:14,"aria-hidden":`true`})}),(0,$.jsx)(`button`,{type:`button`,className:`eg-open`,onClick:()=>Es(e.link.set.id),children:I(e.link)}),(0,$.jsx)(`span`,{className:`fs-badge`,children:e.link.pin==null?`Latest`:ef(e.link.pin,k.get(e.link.set.id)?.versions)})]})}let t=E(e.filter);return(0,$.jsxs)(`span`,{className:`fs-inner`,children:[e.filter.id,t&&(0,$.jsx)(`span`,{className:`fs-badge`,children:t})]})}},{key:`type`,header:`Type`,className:`fs-type`,sort:null,cell:e=>{if(e.kind!==`set`)return ne(e.filter);let t=cf(u,e.link.set.id),n=t?lf(t,T):null;return n==null?`Filter set`:`Filter set, ${n===0?`no filters`:n===1?`1 filter`:`${n} filters`}`}},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>e.kind===`filter`?(0,$.jsx)(F,{label:`${e.filter.id} actions`,actions:R(e.filter,e.at)}):e.kind===`set`?(0,$.jsx)(F,{label:`${I(e.link)} actions`,actions:V(e.link,e.at)}):null}],U=g!=null&&D[g]?.kind===`filter`?D[g]:null,re=new Set(w.flatMap(e=>e.set?[e.set.id]:[])),{options:W,recent:ie}=jo((f??[]).filter(e=>!re.has(e.id)),e=>k.get(e)?.updated),ae=`${fc[a]} filters`,oe=D.flatMap((e,t)=>e.kind===`filter`?[t]:[]),G=c?oe:S,K=()=>{C(null),l?.()},se=e=>e.length===1?D[e[0]].filter.id:`${e.length} filters`,ce=async(e,i)=>{let c=e.map(e=>D[e].filter),l=t,d=null,f,p,m;if(i.kind===`new`){let o;try{o=await u.create(i.name,{...L().blankFilterSetBody(),filters:c.map(e=>structuredClone(e))})}catch(e){return e instanceof Error?e.message:String(e)}f=o.name,d=L().newFilterLink({id:o.id,name:f}),p=Se(t,n,r(D,e,d),a),m=()=>{u.remove(o.id).catch(()=>{})}}else{let o=u.entry(i.id)?.doc;if(!o)return`That filter set hasn't loaded.`;u.edit(i.id,e=>pt(e,c.map(e=>structuredClone(e)))),await u.flush(i.id);let s=u.entry(i.id),l=ms(s?.sync);if(l)return u.edit(i.id,()=>o.body),l;f=o.name||o.id;let h=w.find(e=>e.set?.id===i.id);h||(d=L().newFilterLink({id:i.id,name:o.name})),p=Se(t,n,r(D,e,d),a),h?.pin!=null&&s?.doc&&(p=_e(p,n,h.id,s.doc.versions,a)),m=()=>u.edit(i.id,()=>o.body)}let h=se(e);return K(),o(p),s({label:`Moved ${h} to ${f}`,restore:()=>{o(l),m()}}),null},le=jo(f??[],e=>k.get(e)?.updated);return(0,$.jsxs)(`div`,{className:`filter-stage`,id:`job-${n}-filters-${a}`,children:[D.length>0&&(0,$.jsx)(m,{className:`fs-table`,cards:!0,label:ae,rows:ee,defaultSort:null,rowKey:e=>e.kind===`inner`?e.key:e.kind===`set`?e.link.id:`${e.from}/${e.filter.id}`,rowProps:e=>e.kind===`inner`?{className:`fs-inner-row${E(e.filter)?` fs-elsewhere`:``}`}:e.kind===`filter`&&E(e.filter)?{className:`fs-elsewhere`}:{},columns:H}),(0,$.jsx)(`span`,{className:`add-btn fs-add`,children:(0,$.jsx)(F,{label:`Add filter`,trigger:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Y.add,{size:14,"aria-hidden":`true`}),`Add filter`]}),actions:[{label:`New filter…`,icon:Me,onSelect:()=>x(`type`)},{label:`Link filter set…`,icon:Ln,onSelect:()=>x(`link`)}]})}),b===`type`&&(0,$.jsx)(mc,{stage:T,title:`New ${fc[a].toLowerCase()} filter`,onPick:e=>{x(null),y(tc(q(O,`New filter`),e))},onClose:()=>x(null)}),(v||U)&&(0,$.jsx)(uc,{filter:v??U.filter,isNew:!!v,others:v?O:O.filter(e=>e!==U.filter),onSave:e=>{M(v?[...D,{kind:`filter`,filter:e,from:``}]:D.map((t,n)=>n===g?{...U,filter:e}:t)),y(null),_(null)},onClose:()=>{y(null),_(null)}},v?`new`:g),G&&G.length>0&&G.every(e=>D[e]?.kind===`filter`)&&(0,$.jsx)($d,{what:se(G),options:le.options,recent:le.recent,taken:new Set((f??[]).map(e=>e.name)),linkedHere:re,ready:e=>!!u.entry(e)?.doc,onPick:e=>u.load(e),onMove:e=>ce(G,e),onClose:K}),b===`link`&&(0,$.jsx)(d,{kind:`Filter set`,title:`Link filter set`,usedLabel:`Last changed`,value:``,options:W,recent:ie,onPick:e=>o(Gt(t,n,{id:e,name:k.get(e)?.name??``},a)),onClose:()=>x(null),footer:(0,$.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,onClick:()=>x(`new-set`),children:[(0,$.jsx)(Y.add,{size:14,"aria-hidden":`true`}),`New filter set…`]})}),b===`new-set`&&(0,$.jsx)(As,{taken:new Set((f??[]).map(e=>e.name)),onClose:()=>x(null),onCreate:e=>void(async()=>{let r=await u.create(e,L().blankFilterSetBody());o(Gt(t,n,{id:r.id,name:r.name},a))})()})]})}function ff(e,t,n){let r=L().outOf(t.jobs[n]).kind;return[`text`,`items`].reduce((i,a)=>i+L().filterSetsOf(t.jobs[n],a).reduce((t,n)=>t+(n.own?n.own.filters.length:lf(cf(e,n.set.id)??[],L().stageReads(a,r))),0),0)}function pf({k:e,pipeline:t,sources:n,edit:r,offer:i,open:a,onToggle:o}){let[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null),p=Z(),m=L(),h=t.jobs[e],g=e===0?m.contentOf(t):null,_=m.flowStepOf(h),y=m.sendsImage(h),b=m.tokensOf(h),x=m.CONTENT_TYPES,S=m.targetsOf(t).some((n,r)=>m.STEP_TYPES[m.targetStepOf(t,r,e)?.type??``]?.asks===`request`)||e===0&&!!x[g?.type??``]?.inline,C=g?.type===`source`?n.find(e=>e.id===g.ref.id):void 0,T=C?.type===`dynamic`&&(!C?.provider||m.DYNAMIC_PROVIDERS[C.provider]?.tier!==`supplied`),E=T&&g?.type===`source`?g.live??(C?C.files===0:!1):!1,D=g?.type===`source`?g.pin??null:null,O=Wu(p,T&&g?.type===`source`?g.ref.id:null),k=[...e>0?[{kind:`reply`}]:[],...g?[{kind:`attach`}]:[],..._?[{kind:`flow`}]:[],...y?[{kind:`image`}]:[],...b.map(e=>({kind:`mapping`,name:e.name}))],A=(e,n)=>{let a=t;r(n),i({label:e,restore:()=>r(a)})},j=(e,n)=>r(w(m.withContent(t,e),0,n)),M=async e=>{let t=e.type===`dynamic`&&m.DYNAMIC_PROVIDERS[e.provider??``]?.tier!==`supplied`&&e.files>0?await p.sourceResponses(e.id).then(e=>Ru(e.responses),()=>null):null;j({type:`source`,ref:ve(e.id,e.name),first:null,loops:1,...t?{pin:t}:{}},m.sourceTypeOf(e)?.sendsImage??!1)},N=[...e===0&&!g?[{label:`Source…`,icon:Y.add,onSelect:()=>l(!0)},{label:x.text?.label??`Text`,icon:Y.add,onSelect:()=>j({type:`text`,text:``},!1)},{label:x.prompt?.label??`Prompt only`,icon:Y.add,onSelect:()=>j({type:`prompt`},!1)}]:[],...!y&&!S?[{label:m.STEP_TYPES.attachImage?.label??`Image`,icon:Y.add,onSelect:()=>r(w(t,e,!0))}]:[],{label:`Token mapping`,icon:Y.add,onSelect:()=>d({mode:`add`})}],P=n=>{n.kind===`attach`?A(`Removed the content`,m.withContent(t,null)):n.kind===`image`?A(`Stopped sending the image`,w(t,e,!1)):n.kind===`mapping`&&A(`Removed {${n.name}}`,v(t,e,n.name))},F=u?.mode===`edit`?b.find(e=>e.name===u.name):void 0,I=n=>{let a=t;u?.mode===`add`?r(Ke(a,e,n.name,n.type)):F&&(r(Zt(a,e,F.name,n)),n.type!==F.type&&F.value&&i({label:`Changed {${F.name}} to ${m.TOKEN_TYPES[n.type]?.label.toLowerCase()??n.type}`,restore:()=>r(a)})),d(null)},z=(i,a)=>{switch(i.kind){case`reply`:return[{key:`reply`,label:`${m.jobLabel(t,e-1)} reply`,locked:!0,control:{type:`static`,text:`Each target's ${s(m.outOf(t.jobs[e-1]).kind)}`}}];case`attach`:return[g?.type===`text`?{key:`attach`,label:m.CONTENT_TYPES.text?.label??`Text`,required:!0,actions:a,control:{type:`textarea`,value:g.text,placeholder:`Item text`,onChange:e=>r(m.withContent(t,{...g,text:e}))}}:{key:`attach`,label:m.CONTENT_TYPES[g?.type??``]?.label??m.STEP_TYPES.attachContent?.label??`Content`,required:!0,actions:a,control:{type:`static`,text:_f(g,n)}},...T&&g?.type===`source`?[{key:`freshness`,label:`Data updates`,control:{type:`select`,value:E?`live`:`saved`,options:mf,onChange:e=>r(m.withContent(t,{...g,live:e===`live`,...e===`saved`&&!g.pin&&O&&Ru(O)?{pin:Ru(O)}:{}}))}}]:[],...T&&g?.type===`source`&&!E?[{key:`response`,label:`Response`,required:!0,control:{type:`picker`,kind:`Response`,ordered:!0,value:D&&O?Bu(O,D):``,options:O?Hu(O):[],placeholder:D?O?zu(O,D)?D.name:`(Removed)`:D.name:`(Not set)`,onChange:e=>r(m.withContent(t,{...g,pin:Uu(e)}))}}]:[]];case`flow`:return[{key:`flow`,label:m.STEP_TYPES.flowStep?.label??`Flow step`,required:!0,actions:a,control:{type:`static`,text:_?.step??``}}];case`image`:return[{key:`image`,label:m.STEP_TYPES.attachImage?.label??`Attach Image`,required:!0,actions:a,control:{type:`static`,text:`Each item`}}];case`mapping`:{let n=b.find(e=>e.name===i.name),o=m.TOKEN_TYPES[n.type],s=o?.fields??[];return[{key:`mapping-${n.name}`,label:o?o.notation(n.name):`{${n.name}}`,code:!0,required:!0,control:s.includes(`value`)?{type:`text`,value:n.value??``,onChange:i=>r(ye(t,e,n.name,{value:i}))}:{type:`static`,text:o?.label??n.type},...s.includes(`enabled`)?{enabled:{checked:!!n.enabled,onChange:i=>r(ye(t,e,n.name,{enabled:i}))}}:{},actions:[{label:`Edit…`,icon:Y.edit,onSelect:()=>d({mode:`edit`,name:n.name})},...a]}]}}},B=t=>t.kind===`reply`?`Job ${e+1} reply`:t.kind===`flow`?`Job ${e+1} flow step`:t.kind===`mapping`?`{${t.name}}`:t.kind===`attach`?`Content`:`Image`,ee=k.map(r=>hf[r.kind](t,e,n)).join(`, `)||`none`;return(0,$.jsxs)(J,{id:`job-${e}-content`,title:`Content`,level:4,note:ee,open:a,onToggle:o,children:[(0,$.jsx)(et,{noun:`content`,items:k,onAdd:N,onRemove:e=>P(k[e]),locked:e=>e.kind===`reply`||e.kind===`flow`,extra:e=>e.kind===`attach`?[{label:`Change content`,icon:Y.rename,onSelect:()=>l(!0)}]:[],empty:(0,$.jsx)(`p`,{className:`note`,children:`No content yet.`}),renderItem:(t,n,r)=>(0,$.jsx)(`div`,{className:`stage-row`,id:t.kind===`mapping`?void 0:`job-${e}-${t.kind}`,children:(0,$.jsx)(V,{label:B(t),rows:z(t,r)})},t.kind===`mapping`?`m-${t.name}`:t.kind)}),u&&(u.mode===`add`||F)&&(0,$.jsx)(Le,{title:F?m.TOKEN_TYPES[F.type]?.notation(F.name)??`{${F.name}}`:`New mapping`,initial:F?{name:F.name,type:F.type}:{name:``,type:`value`},adding:!F,problem:n=>f(t,e,n,F?.name),onSave:I,onClose:()=>d(null)},u.mode===`edit`?u.name:`add`),c&&(0,$.jsxs)(R,{title:g?`Change content`:`Add content`,onClose:()=>l(!1),children:[(0,$.jsx)(pd,{mode:`pick`,onPick:e=>{l(!1),M(e)}}),(0,$.jsxs)(`div`,{className:`pick-others`,children:[(0,$.jsx)(`h2`,{className:`shead-title`,children:`Without a Source`}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,onClick:()=>{j({type:`text`,text:``},!1),l(!1)},children:[(0,$.jsx)(`span`,{children:x.text?.label??`Text`}),x.text?.description&&(0,$.jsx)(`span`,{className:`pick-about`,children:x.text.description})]}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,onClick:()=>{j({type:`prompt`},!1),l(!1)},children:[(0,$.jsx)(`span`,{children:x.prompt?.label??`Prompt only`}),x.prompt?.description&&(0,$.jsx)(`span`,{className:`pick-about`,children:x.prompt.description})]})]})]})]})}var mf=[{value:`live`,label:`Live data`},{value:`saved`,label:`Saved response`}],hf={reply:(e,t)=>`${L().jobLabel(e,t-1)}, ${s(L().outOf(e.jobs[t-1]).kind)}`,attach:(e,t,n)=>_f(L().contentOf(e),n),flow:(e,t)=>L().flowStepOf(e.jobs[t])?.step??``,image:()=>`image`,mapping:()=>`token mapping`},gf=(e,t)=>{let n=t.find(t=>t.id===e.ref.id);return n?`${n.name}, ${ki(n.files,T(n))}`:`A Source that is gone: ${e.ref.name}`},_f=(e,t)=>e?e.type===`source`?gf(e,t):L().CONTENT_TYPES[e.type]?.label??e.type:`none`;function vf({index:e}){return(0,$.jsx)(`span`,{className:`target-badge`,"aria-hidden":`true`,children:L().targetLetter(e)})}var yf=e=>e instanceof Error?e.message:String(e);function bf({pipeline:e,title:t,onClose:n}){let r=Z(),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),c=L().contentOf(e),l=c?.type===`source`?c.ref.id:null,u=(0,X.useCallback)(()=>{if(s(null),!l){a([]);return}(async()=>{try{let t=(await r.source(l)).files.filter(e=>e.name.toLowerCase().endsWith(`.json`));a(await Promise.all(t.map(async t=>{let n=JSON.parse(await ou(await r.file(l,t.name)));return{name:t.name,reply:L().recordedReplyOf(e,n)}})))}catch(e){s(yf(e))}})()},[r,l,e]);return(0,X.useEffect)(u,[u]),(0,$.jsx)(R,{title:t,wide:!0,className:`edit`,onClose:n,children:i?i.length?(0,$.jsx)(`div`,{className:`recorded-replies`,children:i.map(e=>(0,$.jsxs)(`section`,{"aria-label":e.name,children:[(0,$.jsx)(`h3`,{children:e.name}),(0,$.jsx)(`pre`,{children:e.reply??`(no recorded reply)`})]},e.name))}):(0,$.jsx)(`p`,{className:`note`,children:`No calls.`}):(0,$.jsx)(Ot,{label:`Replies`,error:o,onRetry:u})})}function xf({k:e,pipeline:t,connections:n,connectionProfiles:r,targetCap:i,onRequestRename:a,onAdd:o,onClone:s,onRemove:c,onConnection:l,onProfile:u,onEcho:d,onPrompt:f,onStep:p,onSelectPrompt:m,onClearPrompt:h,onSaveToLibrary:g,onCopyRequest:_,defaultPrompt:v,onRevert:y,joined:b,say:x=()=>{}}){let S=L(),C=Fo(),w=S.targetsOf(t),T=w.length,[E,D]=(0,X.useState)(null),O=zt(t,e),k=O.length===1?()=>o(O[0]):O.map(e=>({label:S.STEP_TYPES[e].label??e,icon:bt(e).icon??dt,onSelect:()=>o(e)}));return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(J,{id:`job-${e}-targets`,title:`Targets`,level:4,note:`${T} ${T===1?`target`:`targets`}`,children:(0,$.jsx)(et,{noun:`target`,items:w,min:1,max:i,onAdd:k,onClone:s,onRemove:c,onRename:a,extra:(n,r)=>bt(S.targetStepOf(t,r,e)?.type).actions?.({pipeline:t,i:r,k:e,say:x,onSelectPrompt:()=>m(r),onClearPrompt:()=>h(r),onSaveToLibrary:()=>g(r),onCopyRequest:()=>_(r),onPreviewReplies:()=>D(r),defaultPrompt:v,onRevert:y&&(()=>y(r))})??[],empty:(0,$.jsx)(`p`,{className:`note`,children:`No targets yet.`}),renderItem:(i,a,o)=>{let s=Ge(t,a),c=je(t,a,e)??{type:`prompt`,prompt:``},m=bt(c.type),h=S.STEP_TYPES[c.type],g=e>0&&!!h?.firstJobOnly,_=!!S.CONNECTION_TYPES[h?.replaces??``]?.replays,v=!g&&_?kt(t,e):null;return(0,$.jsxs)(`div`,{className:`target`,id:`job-${e}-target-${a}`,children:[(0,$.jsxs)(`div`,{className:`target-head`,children:[(0,$.jsx)(vf,{index:a}),(0,$.jsx)(`h5`,{className:`target-name`,children:s}),g&&(0,$.jsx)(`span`,{className:`target-idle`,children:`Job 1 only`}),(0,$.jsx)(F,{actions:o,label:`${s} actions`})]}),!g&&_&&(0,$.jsxs)($.Fragment,{children:[h?.description&&(0,$.jsx)(`p`,{className:`note`,children:h.description}),v!=null&&(0,$.jsxs)(`div`,{className:`prompt`,children:[(0,$.jsx)(`span`,{className:`prop-name`,children:`Prompt`}),(0,$.jsx)(Nt,{className:`readonly`,words:v,showExprs:!1})]})]}),!g&&!_&&(0,$.jsx)(gt,{label:s,asks:Df(e===0?{connection:Tf(c)?Sf:i.connection?.id??``,at:i.connection,profile:i.profile,fixed:Ef(),echo:Tf(c)}:{connection:c.connection?.id??wf,at:c.connection,profile:c.profile,own:c.connection!=null||c.profile!=null,same:`Same as ${S.jobLabel(t,0)}`},n,r,C,{connection:e=>e===Sf?d(a):l(a,e===wf?null:kf(n,e)),profile:e=>u(a,e===wf?`same`:e===Cf?null:kf(r,e))}),prompt:c.prompt,onPrompt:e=>f(a,e),rows:m.rows?.(c,e=>p(a,e))??[],request:m.request?.(c)??[],requestId:`job-${e}-target-${a}-request`,promptLabel:m.promptLabel?.(c)??`Prompt`,words:m.words?.(c),fields:m.fields?.(c),hint:b?.(a)?`Content is attached after the prompt`:void 0})]},`${a}-${e}`)}})}),E!==null&&(0,$.jsx)(bf,{pipeline:t,title:`${Ge(t,E)} replies`,onClose:()=>D(null)})]})}var Sf=`#echo`,Cf=`#default`,wf=``,Tf=e=>!!L().STEP_TYPES[e.type]?.local,Ef=()=>Object.entries(L().STEP_TYPES).filter(([,e])=>e.slot===`target`&&e.local&&!L().CONNECTION_TYPES[e.replaces??``]?.replays).map(([,e])=>({id:Sf,label:e.label??`Echo`}));function Df(e,t,n,r,i){let a=e.same!=null,o={key:`connection`,label:`Connection`,required:!a,control:{type:`picker`,kind:`Connection`,value:e.connection,...r(Of(t,e.at),a?[{id:wf,label:e.same}]:e.fixed),onChange:i.connection}};if(e.echo)return[o];let s=a&&!e.own?wf:e.profile?.id??Cf,c=[...a&&e.connection===wf?[{id:wf,label:e.same}]:[],{id:Cf,label:`(Default)`}];return[o,{key:`profile`,label:`Profile`,control:{type:`picker`,kind:`Profile`,value:s,...jo(Of(n,e.profile),()=>null,c),onChange:i.profile}}]}var Of=(e,t)=>[...t?.id&&!e.some(e=>e.id===t.id)?[{id:t.id,name:`${t.name||t.id} (missing)`,missing:!0}]:[],...e.map(e=>({id:e.id,name:e.name}))],kf=(e,t)=>{let n=e.find(e=>e.id===t);return n?{id:n.id,name:n.name}:null};function Af({text:e,writtenFor:t,say:n,onClose:r}){let i=async()=>{n(await Ne(e)?`Copied the request.`:`Could not copy.`),r()};return(0,$.jsx)(st,{title:`Copy request`,wide:!0,onClose:r,sections:[{key:`request`,rows:[{key:`for`,label:`Written for`,control:{type:`static`,text:t}},{key:`body`,label:`Request`,control:{type:`code`,text:e}}]}],actions:[{label:`Copy`,icon:lt,primary:!0,onSelect:()=>void i()}]})}function jf({pipeline:e,connections:t,connectionProfiles:n,resolve:r,sources:i,joined:a,targetCap:o,prompt:s=``,defaultPrompt:c,protectedTerms:l,edit:u,offer:d}){let[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(null),[g,_]=(0,X.useState)(null),[v,b]=(0,X.useState)(null),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),[T,E]=(0,X.useState)({}),O=e=>T[e]??!1,k=t.filter(e=>L().listedConnection(e)),j=e=>t=>E(n=>({...n,[e]:t})),M=Or(),N=xs(),[,P]=(0,X.useState)(0);(0,X.useEffect)(()=>N.subscribe(()=>P(e=>e+1)),[N]);let F=()=>{let t=L().contentOf(e),n=t?.type===`source`?t.ref.id:null,r=n?i.find(e=>e.id===n)?.platform:void 0;return r&&L().WORKFLOW_PLATFORMS[r]||null},I=(t,n)=>{let r=e;u(n),d({label:t,restore:()=>u(r)})},R=(t,n)=>(0,$.jsx)(df,{pipeline:e,job:t,stage:n,edit:u,offer:d,moveAll:x?.k===t&&x.stage===n,onMoveAllClose:()=>S(null)}),B=(t,n)=>[{label:`Move all to filter set…`,icon:Fn,disabled:!L().filterSetsOf(e.jobs[t],n).some(e=>e.own?.filters.length),onSelect:()=>S({k:t,stage:n})}],V=e=>{let t=r(L().answerKey(e.connection.id,e.profile?.id));return t?L().CONNECTION_TYPES[L().typeOf(t)]?.answers??[`prompt`]:void 0},ee=e=>{let t=n.find(t=>t.fromProfile===e);return t?{id:t.id,name:t.name}:null},te=!L().targetsOf(e).length;return(0,$.jsxs)(`div`,{className:`jobs`,children:[(0,$.jsxs)(J,{id:`jobs`,title:`Jobs`,note:`${e.jobs.length} ${e.jobs.length===1?`job`:`jobs`}`,children:[C&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:C}),(0,$.jsx)(et,{noun:`job`,items:e.jobs,min:1,addDisabled:te,onAdd:()=>u(Be(e)),onClone:t=>u(Ye(e,t)),onRemove:t=>I(`Removed ${L().jobLabel(e,t)}`,W(e,t)),onRename:e=>p({job:e}),renderItem:(r,f,m)=>{let g=`Job ${f+1}${r.name?.trim()?` - ${r.name.trim()}`:``}`,v=L().flowStepOf(r)?L().readAsOf(r):void 0;return(0,$.jsxs)(X.Fragment,{children:[f>0&&(0,$.jsxs)(`div`,{className:`job-reply`,"aria-hidden":`true`,children:[(0,$.jsx)(y,{size:16}),(0,$.jsx)(`span`,{children:`Reply`})]}),(0,$.jsx)(J,{id:`job-${f}`,title:g,level:3,actions:m,note:Nf(e,f),children:(0,$.jsxs)(`div`,{className:`stages`,children:[(0,$.jsx)(pf,{k:f,pipeline:e,sources:i,edit:u,offer:d,open:O(`job-${f}-content`),onToggle:j(`job-${f}-content`)}),(0,$.jsx)(xf,{k:f,pipeline:e,connections:L().flowStepOf(r)?k:k.filter(Mf),connectionProfiles:n,targetCap:o,onRequestRename:e=>p({job:f,scenario:e}),onAdd:n=>u(Ct(e,f,n,Jt(t,ee),s)),onClone:t=>u(Oe(e,t)),onRemove:t=>I(`Removed ${Ge(e,t)}`,D(e,t)),onConnection:(t,r)=>u(be(e,t,f,r,V,e=>n.find(t=>t.id===e)?.fromProfile)),onProfile:(t,n)=>u(ae(e,t,f,n,V)),onEcho:t=>u(Te(e,t)),onPrompt:(t,n)=>u(Et(e,t,f,n)),joined:a&&(e=>a(e,f)),onStep:(t,n)=>u(Pf(e,t,f,n)),say:w,onSelectPrompt:e=>h({i:e,k:f}),onClearPrompt:t=>I(`Cleared ${Ge(e,t)}'s prompt`,Et(e,t,f,``)),onSaveToLibrary:e=>_({i:e,k:f}),onCopyRequest:e=>b({i:e,k:f}),...f===0&&c?{defaultPrompt:c.text,onRevert:t=>I(`Reverted ${Ge(e,t)} to the default`,H(e,t,0,c.text,{id:c.id,name:xr(c)}))}:{}}),(0,$.jsx)(Mt,{id:`job-${f}-responses`,open:O(`job-${f}-responses`),onToggle:j(`job-${f}-responses`),out:L().outOf(r),readAs:v,outputKinds:en(),modifiers:se(),onFormat:t=>u(me(e,f,t)),onSetting:(t,n)=>u(Ff(e,f,e=>({...e,[t]:n}))),onReadAs:t=>t==null?I(`Removed Read as`,A(e,f,null)):u(A(e,f,t)),...l?{protectedTerms:l}:{},offer:d,onModifier:(t,n)=>u(If(e,f,t,n)),onAddModifier:t=>u(Ff(e,f,e=>({...e,modifiers:[...e.modifiers,t]}))),onRemoveModifier:t=>I(`Removed a modifier`,Ff(e,f,e=>({...e,modifiers:e.modifiers.filter((e,n)=>n!==t)}))),filters:ff(N,e,f),pre:R(f,`text`),preActions:B(f,`text`),post:R(f,`items`),postActions:B(f,`items`)})]})})]},r.id||f)}}),te&&(0,$.jsx)(`p`,{className:`note add-why`,children:`Add a target first.`})]}),f&&`scenario`in f?(0,$.jsx)(Tt,{title:`Rename ${Ge(e,f.scenario)}`,value:L().targetsOf(e)[f.scenario]?.name??``,onCommit:t=>u($t(e,f.scenario,t)),onClose:()=>p(null)}):f?(0,$.jsx)(Tt,{title:`Rename ${L().jobLabel(e,f.job)}`,value:e.jobs[f.job]?.name??``,onCommit:t=>u(K(e,f.job,t)),onClose:()=>p(null)}):null,m&&(0,$.jsx)(Qd,{onClose:()=>h(null),used:{byScenario:at(e,m.i),byAll:z(e)},onPick:t=>{let n=e;u(H(n,m.i,m.k,t.text,{id:t.id,name:xr(t)})),h(null),d({label:`Picked ${xr(t)}`,restore:()=>u(n)})}}),g&&(()=>{let{i:t,k:n}=g,r=L().targetStepOf(e,t,n)?.prompt??``;return(0,$.jsx)(Tt,{title:`Save to library`,value:r.split(`
10
- `)[0]?.trim()??``,onCommit:i=>void(async()=>{let a=await M.create({name:i,text:r});u(H(e,t,n,r,{id:a.id,name:xr(a)})),w(`Saved ${xr(a)} to the library.`)})(),onClose:()=>_(null)})})(),v&&(()=>{let t=je(e,v.i,v.k);if(!t)return null;let{text:n,writtenFor:r}=tt(t,F());return(0,$.jsx)(Af,{text:n,writtenFor:r,say:w,onClose:()=>b(null)})})()]})}var Mf=e=>(L().CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`);function Nf(e,t){let n=L(),r=r=>e.jobs[t].steps.filter(e=>n.STEP_TYPES[e.type]?.slot===r).length,i=e.jobs[t],a=i.steps.filter(e=>e.type!==`tokenMappings`&&n.STEP_TYPES[e.type]?.slot===`content`).length+n.tokensOf(i).length;return`Content ${t>0&&!a?`Reply`:a} → Targets ${n.targetsOf(e).length} → Responses ${r(`responses`)}`}var Pf=(e,t,n,r)=>L().withTarget(e,t,n,e=>{let t={...e,...r};for(let[e,n]of Object.entries(r))n===``&&e!==`prompt`&&e!==`system`&&delete t[e];return t}),Ff=(e,t,n)=>({...e,jobs:e.jobs.map((e,r)=>r===t?L().withOut(e,n(L().outOf(e))):e)}),If=(e,t,n,r)=>Ff(e,t,e=>({...e,modifiers:e.modifiers.map((e,t)=>t===n?r:e)}));function Lf({pipeline:e,sourceFiles:t,graded:n,openCaseEditor:r}){let[i,a]=(0,X.useState)({graded:!1,todo:!0,missing:!0});if((L().evalsDataset(e)?.id??null)===null)return null;let o=t??[],s=new Set(n.map(e=>e.item)),c=new Set(o),l=[{key:`graded`,label:`Graded`,tone:`ok`,files:o.filter(e=>s.has(e))},{key:`todo`,label:`To do`,tone:`todo`,files:o.filter(e=>!s.has(e))},{key:`missing`,label:`Missing`,tone:`missing`,files:n.filter(e=>!c.has(e.item)).map(e=>e.item)}];l[0].files.length;let u=l[1].files.length+l[2].files.length,d=l.filter(e=>i[e.key]).flatMap(e=>e.files.map(t=>({file:t,tone:e.tone})));return(0,$.jsx)(J,{id:`mapping`,title:`Mapping`,level:3,note:f(),about:`Items with a case are graded.`,children:o.length?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`pills mkey`,role:`group`,"aria-label":`Show`,children:l.filter(e=>e.files.length).map(e=>(0,$.jsxs)(`label`,{className:`pill`,children:[(0,$.jsx)(`input`,{type:`checkbox`,checked:i[e.key],onChange:()=>a({...i,[e.key]:!i[e.key]})}),(0,$.jsxs)(`span`,{children:[e.label,` `,e.files.length]})]},e.key))}),d.length?(0,$.jsx)(`div`,{className:`mchips`,children:d.map(({file:e,tone:t})=>(0,$.jsx)(`button`,{type:`button`,className:`mchip ${t}`,onClick:()=>r(e),children:e},`${t}-${e}`))}):u?(0,$.jsx)(`p`,{className:`note`,children:`Nothing shown.`}):null]}):(0,$.jsx)(`p`,{className:`note`,children:`(No items)`})});function f(){let r=L().contentOf(e),i=r?L().CONTENT_TYPES[r.type]:void 0;if(i?.inline)return i.label;let a=t??[],o=new Set(n.map(e=>e.item)),s=a.filter(e=>o.has(e)).length;return`${ki(n.length,`case`)}, ${s} of ${a.length} matched`}}function Rf({pipeline:e,edit:t,comment:n,setComment:r,onClear:i,onCopyFailures:a}){let o=[{label:`Clear comment`,icon:fe,destructive:!0,onSelect:i},{label:`Copy last run's failures`,icon:U,onSelect:a}],s=L().contentOf(e),c=s?.type===`source`?[{key:`first`,label:`Run first`,width:`quarter`,control:{type:`text`,value:s.first==null?``:String(s.first),placeholder:`all`,clearable:!0,onChange:n=>t(L().withContent(e,{...s,first:n.trim()?zf(n):null}))}},{key:`loops`,label:`Loop`,width:`quarter`,control:{type:`text`,value:String(s.loops),placeholder:`1`,onChange:n=>t(L().withContent(e,{...s,loops:Math.max(1,zf(n)??1)}))}}]:[];return(0,$.jsx)(J,{id:`control`,title:`Run settings`,level:2,actions:o,children:(0,$.jsx)(`div`,{onKeyDown:e=>{e.key===`Enter`&&!e.nativeEvent.isComposing&&e.target instanceof HTMLInputElement&&(e.preventDefault(),e.target.blur())},children:(0,$.jsx)(V,{label:`Run settings`,rows:[...c,{key:`comment`,label:`Comment`,width:`full`,control:{type:`text`,value:n,placeholder:`Add a note`,onChange:e=>r(e)}}]})})})}var zf=e=>{let t=Number.parseInt(e,10);return Number.isNaN(t)?null:t};function Bf({pipelineId:e=null}){let t=er(),n=Z(),r=Je(),i=po(),a=vo(),{openRun:o}=di(),{openCaseEditor:s}=Zo(),[c,l]=Q(`promptlab.workflows`),[u]=Q(`promptlab.connections`),[d]=Q(`promptlab.connectionProfiles`),f=(0,X.useMemo)(()=>L().answersOf(L().withSlugs(u.list),d.list,d.default??null),[u.list,d.list,d.default]),p=(0,X.useRef)(f);p.current=f;let[m,h]=Q(`promptlab.comment`),[g]=Q(`promptlab.versions`),[_,v]=(0,X.useState)([]),{list:y,error:b}=yr(),{list:x,error:S}=kr(),{list:C}=Ss(),w=x?.find(e=>e.default)??null,T=vr(),E=(0,X.useMemo)(()=>(y??[]).map(e=>ve(e.id,e.name)),[y]),D=(0,X.useCallback)(()=>(y??[]).map(e=>{let t=T.entry(e.id)?.doc?.body;return{id:e.id,name:e.name,grader:t?t.grader??null:e.grader??null}}),[y,T]),[O,k]=(0,X.useState)(4),[A,j]=(0,X.useState)(void 0),[M,N]=(0,X.useState)(null),[P,F]=(0,X.useState)(null),I=(0,X.useRef)(P);I.current=P;let[z,B]=(0,X.useState)(!1),[V,ee]=(0,X.useState)(!1),[te,ne]=(0,X.useState)(null),H=(0,X.useRef)(null),[U,re]=(0,X.useState)(null),[W,ie]=(0,X.useState)(!1),[ae,oe]=(0,X.useState)(!1),G=(0,X.useRef)(null);(0,X.useEffect)(()=>{let e=!0;return n.sources().then(t=>{e&&v(t.sources)}).catch(()=>{}),n.config().then(t=>{e&&k(t.targetCap)}).catch(()=>{}),()=>{e=!1}},[n]),(0,X.useEffect)(()=>{let e=!0,t,r=async()=>{let i=5e3;try{let t=(await n.queue({limit:1})).runs[0]??null;if(!e)return;!H.current&&t&&!Qi(t.status)&&(H.current=t.id),t&&t.id===H.current&&(ne(t),Qi(t.status)||(i=1e3))}catch{}e&&(t=setTimeout(()=>void r(),i))};return r(),()=>{e=!1,t&&clearTimeout(t)}},[n]);let K=(0,X.useMemo)(()=>c.list.filter(e=>e.work?.version===18),[c.list]),se=e?K.find(t=>t.id===e):void 0,ce=se??K.find(e=>e.id===c.at)??K[0],q=ce?.work,le=ce?.id??``,ue=m&&(m.pipeline??le)===le?m.text:``,de=(0,X.useCallback)(e=>h({text:e,pipeline:le}),[h,le]);(0,X.useEffect)(()=>{m&&m.pipeline===void 0&&le&&h({...m,pipeline:le})},[m,le,h]);let fe=!!e&&!se&&K.length>0,pe=(0,X.useRef)(new Set);(0,X.useEffect)(()=>{se&&pe.current.add(se.id)},[se]),(0,X.useEffect)(()=>{fe&&e&&(zr({tab:`runs`,id:null}),pe.current.has(e)||r.notify({label:oo(`pipeline`,e,i.current)}))},[fe,e,r.notify,i.current]);let me=(0,X.useCallback)(e=>Rr({tab:`runs`,id:e}),[]),he=q?L().evalsDataset(q)?.id??null:null,ge=br(he),_e=ge?.doc?.body.cases,ye=(0,X.useMemo)(()=>(_e??[]).map(e=>({id:e.id??``,item:L().caseItem(e)})),[_e]),J=ge?.doc?.body.cases,be=(0,X.useMemo)(()=>[...new Set((J??[]).flatMap(e=>(e.metrics??[]).filter(e=>!e.not&&e.weight!==0&&(e.type===`contains-all`||e.type===`contains-any`)).flatMap(e=>L().metricLines(e.values))))],[J]),xe=w?.text||q&&L().targetStepOf(q,L().targetsOf(q).length-1,0)?.prompt||``,Y=(0,X.useRef)(u.list);Y.current=u.list;let Se=(0,X.useRef)(d.list);Se.current=d.list;let Ce=(0,X.useRef)(d.default);Ce.current=d.default;let we=K.length?null:y?.[0]??null,Te=y!==null||b!==null,Ee=x!==null||S!==null,De=w?.text??``;(0,X.useEffect)(()=>{if(K.length||!Te||!Ee)return;let e=Hf(Y.current,p.current.split,we?{id:we.id,name:we.name}:void 0,De);l({list:[e],at:e.id})},[K.length,l,Te,Ee,we,De]);let Oe=()=>{let e=T.list().list?.[0];return e?{id:e.id,name:e.name}:void 0},ke=(0,X.useRef)(c);ke.current=c;let Ae=(0,X.useRef)(ce);Ae.current=ce;let je=(0,X.useRef)(q);je.current=q;let Me=(0,X.useRef)(null),Ne=(0,X.useRef)(null),Fe=(0,X.useCallback)(()=>{Ne.current&&clearTimeout(Ne.current);let e=Ae.current?.id,n=je.current;e&&n&&(Me.current={id:e,doc:n},Ne.current=setTimeout(()=>{let e=Me.current;e&&pr(t,`pipeline`,e.id,e.doc,`idle`)},lr))},[t]);(0,X.useEffect)(()=>()=>{Ne.current&&clearTimeout(Ne.current)},[]);let Ie=(0,X.useCallback)(e=>{let t=ke.current,n=Ae.current.id,r={...t,list:t.list.filter(e=>e.work?.version===18).map(t=>t.id===n?{...t,work:e}:t)};ke.current=r,l(r),Fe(),N(null)},[l,Fe]),Le=u.list.find(e=>L().listedConnection(e))?.id??``;(0,X.useEffect)(()=>{let e=je.current,t=Ae.current?.id;if(!e||!t||!Le)return;let n=Pe(e,Jt(Y.current,p.current.split));if(n===e)return;let r=ke.current,i={...r,list:r.list.map(e=>e.id===t?{...e,work:n}:e)};ke.current=i,l(i)},[Le,le,l]),(0,X.useEffect)(()=>{let e=Me.current;e&&e.id!==le&&(pr(t,`pipeline`,e.id,e.doc,`idle`),Me.current=null,Ne.current&&=(clearTimeout(Ne.current),null))},[le,t]);let Re=q?L().contentOf(q):null,ze=Re?.type===`source`?Re.ref.id:null;(0,X.useEffect)(()=>{if(ze===null){j(void 0);return}let e=!0;return n.source(ze).then(t=>{e&&j(t.files.map(e=>e.name))}).catch(()=>{}),()=>{e=!1}},[ze,n]);let Be=(0,X.useCallback)(e=>{let t=_.find(t=>t.id===e);return t?{name:t.name,type:t.type,files:e===ze&&A?A:[]}:null},[_,ze,A]),Ve=(0,X.useMemo)(()=>{let e=u.list.find(e=>e.id===u.grader);return e?{id:e.id,name:e.name}:null},[u]),He=(0,X.useMemo)(()=>{if(!q)return[];if(!u.list.length&&L().targetsOf(q).length)return[`add a connection first`];let e={profiles:f.resolve,connections:f.connection,sources:Be,grader:Ve,...y?{groups:y}:{}};return L().validatePipeline(q,e)},[q,u.list,f,Be,y,Ve]),Ue=le?g.pipeline?.[le]??[]:[],We=(0,X.useCallback)(async()=>{let e=je.current,r=Ae.current.id;pr(t,`pipeline`,r,e,`run`);let i=L().resolvePipeline(e,{profiles:f.resolve,grader:Ve,groups:D(),...ze!==null&&A!==void 0?{files:A}:{},comment:ue});B(!0),N(null),F(null);try{let e=await n.submit(i);H.current=e.run.id,ne(e.run),o(e.run.id,{at:e.run.submittedAt,from:`runs`})}catch(e){N(e instanceof Error?e.message:String(e));let t=e instanceof mn&&e.status===403&&e.body?.unshared;F(Array.isArray(t)?t:null),H.current=null,ne(null)}finally{B(!1)}},[n,ue,ze,o,f,A,t,Ve,D]),Ge=(0,X.useCallback)(async()=>{let e=I.current;if(e?.length)try{for(let t of e)await n.shareConnection(t.kind,t.id);F(null),N(null);let t=e.map(e=>e.name).join(`, `);r.offer({label:`Shared ${t} with this workspace`,restore:()=>void(async()=>{for(let t of e)try{await n.shareConnection(t.kind,t.id,!0)}catch{}})()})}catch(e){N(e instanceof Error?e.message:String(e))}},[n,r]),[Ke,qe]=(0,X.useState)(null),Ye=(0,X.useCallback)(async()=>{let e=H.current;if(e){qe(e);try{ne((await n.cancel(e)).run)}catch{qe(null)}}},[n]);(0,X.useEffect)(()=>{te&&Qi(te.status)&&qe(null)},[te]);let Xe=(0,X.useCallback)(async()=>{try{let e=(await n.queue({limit:1})).runs[0];if(!e)return;let t=(e.results??[]).filter(e=>(e.scenarios??[]).some(e=>Object.values(e?.scores??{}).some(L().failedScore))).map(e=>e.name??`an item`);t.length&&await navigator.clipboard?.writeText(t.join(`
11
- `))}catch{}},[n]),Ze=(0,X.useCallback)(async e=>{let r=je.current,i=Ae.current.id;pr(t,`pipeline`,i,r,`run`);let a=L().resolvePipeline(r,{profiles:f.resolve,grader:Ve,groups:D(),files:[e],comment:ue}),o=await n.submit(a),s=o.run;for(;s.status===`queued`||s.status===`running`;)await new Promise(e=>setTimeout(e,500)),s=await n.run(o.run.id);return((s.results??[]).find(t=>t.name===e)?.scenarios??[]).map(e=>e.res??null)},[n,ue,f,t,Ve,D]),Qe=(0,X.useCallback)(e=>{he&&s(e,{dataset:he,files:A??[],run:Ze})},[s,A,Ze,he]),$e=(0,X.useCallback)(()=>{let e={text:ue,pipeline:le};de(``),r.offer({label:`Cleared the comment`,restore:()=>h(e)})},[ue,de,h,le,r]),et=(0,X.useCallback)(()=>{let e=L().pipelineToYaml(je.current,{profiles:Y.current});to(new Blob([e],{type:`text/yaml`}),eo(`pipeline`,je.current.name||`pipeline`,18,`yml`))},[]),tt=(0,X.useCallback)(async e=>{let t=je.current,r={};for(let e of L().evalsOf(t)){let t=L().casesRef(e)?.id??null;if(t&&!r[t]){let e=await n.dataset(t);r[t]={name:e.name,body:e.body}}}let i=L().exportBundle(t,{connections:Y.current,connectionProfiles:Se.current,profileDefault:Ce.current??null,grader:Ve,datasets:r});if(`error`in i)throw Error(i.error);to(await n.bundle({files:i.files,source:ze,items:e}),eo(`ci`,t.name||`pipeline`,18,`zip`))},[n,ze,Ve]),nt=(0,X.useCallback)(async e=>{let t=await n.archivedRules().then(e=>e.rules,()=>({})),r=L().yamlToPipeline(e,{profiles:Y.current,connectionProfiles:Se.current,profileType:e=>p.current.connection(e)?.type,connectionSplit:p.current.split,sources:_,groups:E,rulesFor:e=>t[e]??null});if(`error`in r){re(r);return}let{doc:i,missing:a}=r,o={id:Uf(),name:i.name||`Imported`,work:i},s={...ke.current,at:o.id,list:[...K,o]};ke.current=s,l(s),me(o.id),re({doc:i,missing:a})},[n,K,l,_,E,me]);if(!ce||!q)return(0,$.jsx)(`div`,{className:`runs`,children:(0,$.jsx)(Ot,{label:`Pipelines`})});let rt=e=>{let n=Ae.current.id;pr(t,`pipeline`,n,je.current,`restore`),Ie(e.doc),ee(!1)};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Vd,{list:K,at:le,canRestore:Ue.length>0,used:Object.fromEntries(K.map(e=>[e.id,g.pipeline?.[e.id]?.[0]?.at??null])),onSelect:e=>{l({...ke.current,at:e}),me(e)},onNew:()=>{let e=Vf(K.map(e=>e.name));l({...ke.current,list:[...K,e],at:e.id}),me(e.id)},onClone:()=>{let e={id:Uf(),name:`${ce.name} copy`,work:structuredClone(q)};l({...ke.current,list:[...K,e],at:e.id}),me(e.id)},link:a({tab:`runs`,id:le}),onCopyMove:()=>oe(!0),onRename:e=>{let t=e.trim(),n=ke.current,r=Ae.current.id,i={...n,list:n.list.filter(e=>e.work?.version===18).map(e=>e.id===r?{...e,name:t,work:{...e.work,name:t}}:e)};ke.current=i,l(i),Fe()},onDelete:()=>{let t=ke.current,n=le,i=K.filter(e=>e.id!==n),a=i.length?i:[Hf(u.list,f.split,Oe(),De)],o=a.some(e=>e.id===t.at)?t.at:a[0].id;l({...ke.current,list:a,at:o}),e&&zr({tab:`runs`,id:null}),r.offer({label:`Deleted ${ce.name||`the pipeline`}`,restore:()=>{ke.current=t,l(t),me(n)}})},onRestore:()=>ee(!0),onExport:et,onExportCi:()=>ie(!0),onImport:()=>G.current?.click()}),(0,$.jsx)(Gd,{problems:He,error:M,run:te,submitting:z,stopping:!!te&&Ke===te.id,onRun:()=>void We(),onStop:()=>void Ye(),onOpen:()=>{te&&o(te.id,{at:te.submittedAt,from:`runs`})},...P?.length?{onShare:()=>void Ge()}:{}}),(0,$.jsxs)(`div`,{className:`runs`,children:[(0,$.jsx)(`input`,{ref:G,type:`file`,accept:`.yml,.yaml`,hidden:!0,"aria-hidden":`true`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&t.text().then(nt).catch(()=>re({error:`the file could not be read`}))}}),(0,$.jsx)(Rf,{pipeline:q,edit:Ie,comment:ue,setComment:de,onClear:$e,onCopyFailures:()=>void Xe()}),(0,$.jsx)(jf,{pipeline:q,connections:u.list,connectionProfiles:d.list,resolve:f.resolve,sources:_,joined:(e,t)=>(ze===null||A!==void 0)&&L().contentJoined(q,e,t,{sources:Be}),targetCap:O,prompt:xe,...w?{defaultPrompt:w}:{},protectedTerms:be,edit:Ie,offer:r.offer}),(0,$.jsx)(nf,{contentFiles:A,profiles:u.list,labGrader:Ve,pipeline:q,edit:Ie,offer:r.offer,children:(0,$.jsx)(Lf,{pipeline:q,sourceFiles:A,graded:ye,openCaseEditor:Qe})}),ae&&ce&&(0,$.jsx)(Co,{subject:{kind:`pipeline`,id:ce.id,name:ce.name},scan:{pipelines:K,groups:y??[],prompts:(x??[]).map(e=>({id:e.id,name:xr(e)})),filterSets:C??[],sources:_},undo:r,onClose:()=>oe(!1),onChanged:()=>void t.refresh()}),(0,$.jsx)(Vt,{undo:r.undo,notice:r.notice,onUndo:r.undoNow,onDismiss:r.dismiss}),V&&(0,$.jsx)(R,{title:`Restore pipeline`,onClose:()=>ee(!1),children:(0,$.jsxs)(`div`,{className:`version-list`,children:[Ue.length===0&&(0,$.jsx)(`p`,{className:`note`,children:`No versions of this pipeline yet.`}),Ue.map((e,t)=>(0,$.jsxs)(`div`,{className:`version-row`,children:[(0,$.jsxs)(`span`,{className:`version-when`,children:[Gf(e.at),`, `,Wf(e.reason)]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>rt(e),children:`Restore`})]},`${e.at}-${t}`))]})}),W&&(0,$.jsx)(Wd,{hasItems:ze!==null,onExport:tt,onClose:()=>ie(!1)}),U&&(`doc`in U?(0,$.jsx)(R,{title:`Imported ${U.doc.name||`Untitled`}`,onClose:()=>re(null),children:U.missing.length>0?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`p`,{className:`note`,children:`Missing in this workspace:`}),(0,$.jsx)(`ul`,{className:`import-missing`,children:U.missing.map(e=>{let t=e.replace(/ not found$/,``),n=Jd(e);return(0,$.jsx)(`li`,{children:n?(0,$.jsx)(`a`,{href:n,onClick:()=>re(null),children:t}):t},e)})})]}):(0,$.jsx)(`p`,{className:`note`,children:`Ready to run.`})}):(0,$.jsx)(R,{title:`Nothing imported`,onClose:()=>re(null),children:(0,$.jsx)(`p`,{className:`note`,children:U.error})}))]})]})}var Vf=e=>{let t=l(e),n=L().blankPipeline({name:t});return{id:Uf(),name:t,work:{...n,jobs:n.jobs.map(e=>({...e,steps:[]}))}}},Hf=(e,t,n,r)=>({id:Uf(),name:l([]),work:Qe(Jt(e,t),n,r)}),Uf=()=>`w${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`,Wf=e=>e===`run`?`before a run`:e===`restore`?`before a restore`:e===`pack`?`before a pack update`:`after editing`,Gf=e=>Ft(e)||e,Kf=e=>!!e.id&&Qi(e.status),qf=e=>`Queued ${Oi(e.submittedAt)}`;async function Jf(e,t){try{(await e.run(t)).status===`queued`&&await e.cancel(t)}catch{}}var Yf=[``,`queued`,`running`,`done`,`cancelled`,`failed`,`incomplete`,`interrupted`],Xf=e=>e.numeric?`hnum num`:void 0,Zf=e=>[...new Map(e.map(e=>[e.id,e])).values()].sort((e,t)=>String(t.submittedAt).localeCompare(String(e.submittedAt))||(e.id<t.id?1:e.id>t.id?-1:0)),Qf=(e,t)=>{let n=new Set(e);return n.delete(t),n},$f=(e,t)=>!t||e.some(e=>e.value===t)?e:[...e,{value:t,label:t}],ep=e=>e&&{before:e.submittedAt,beforeId:e.id};function tp({pipeline:e=``,content:t=``}){let n=Z(),r=Je(),{openRun:a}=di(),o=vo(),[s,c]=Q(`promptlab.history.columns`),[l,u]=(0,X.useState)([]),[d,f]=(0,X.useState)(!1),[p,h]=(0,X.useState)(``),[_,v]=(0,X.useState)(new Set),[y,b]=(0,X.useState)(!1),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),[T,E]=(0,X.useState)(null),[D,O]=(0,X.useState)(null),[k,A]=(0,X.useState)(!1),[j,N]=(0,X.useState)(!1),[P,I]=(0,X.useState)(!1),[z,B]=(0,X.useState)(!1),[V,ee]=(0,X.useState)(null),[te,ne]=(0,X.useState)(0),H=(0,X.useRef)(z);H.current=z;let[U,re]=(0,X.useState)(null),[W,ie]=(0,X.useState)(0),[ae,oe]=(0,X.useState)(new Set),G=(0,X.useRef)(l);G.current=l;let[K]=Q(`promptlab.workflows`),[se,ce]=(0,X.useState)(new Set);(0,X.useEffect)(()=>{let e=!0;return n.sources().then(t=>{e&&ce(new Set(t.sources.map(e=>e.id)))},()=>{}),()=>{e=!1}},[n]);let q=(0,X.useMemo)(()=>l.map(e=>{let t=ji(Oa(e),e),n=t.pipelineId?K?.list.find(e=>e.id===t.pipelineId||e.work?.id===t.pipelineId):void 0;return{...t,...n?{pipelineHref:Lr({tab:`runs`,id:n.id})}:{},...t.sourceId&&se.has(t.sourceId)?{contentHref:Lr({tab:`library`,section:`sources`,id:t.sourceId})}:{}}}),[l,K,se]),le=(0,X.useMemo)(()=>ip(s),[s]),ue=(0,X.useCallback)(async(e,t=!1)=>{try{return await n.queue({limit:25,...e,...t?{full:t}:{}})}catch{return null}},[n]),de=(0,X.useCallback)(e=>{let t=new Set(e.runs.map(e=>e.id));u(n=>Zf([...n.filter(e=>!t.has(e.id)),...e.runs])),f(e.more)},[]);(0,X.useEffect)(()=>{let e=!0,t,n=async()=>{let r=await ue();e&&(r?(de(r),B(!0),ee(null)):H.current||ee(`Runs not loaded: server unreachable.`),G.current.some(e=>[`queued`,`running`].includes(e.status))&&(t=setTimeout(()=>void n(),3e3)))};return n(),()=>{e=!1,t&&clearTimeout(t)}},[ue,de,te,W]);let me=(0,X.useMemo)(()=>q.filter(n=>(!p||(n.status||`done`)===p)&&(!e||n.pipelineId===e)&&(!t||n.sourceId===t)),[q,p,e,t]),he=(e,t)=>{let n=new Map;for(let r of q)e(r)&&!n.has(e(r))&&n.set(e(r),t(r)||e(r));return[{value:``,label:`All`},...[...n].map(([e,t])=>({value:e,label:t})).sort((e,t)=>e.label.localeCompare(t.label))]},ge=n=>{let r={pipeline:e,content:t,...n};zr({tab:`history`,...r.pipeline?{pipeline:r.pipeline}:{},...r.content?{content:r.content}:{}})},_e=(e=>({Runs:Ki.filter(t=>e.Runs.has(t.key)),"Run Scenarios":qi.filter(t=>e[`Run Scenarios`].has(t.key))}))(le),ve=(0,X.useCallback)(e=>{v(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),ye=(0,X.useCallback)((e,t)=>{a(e,{at:t,from:`history`})},[a]),be=(0,X.useCallback)(async e=>{oe(t=>Qf(t,e));try{let t=await n.resume(e),r={runs:[t.run],more:G.current.length>25};de(r),ye(e,t.run.submittedAt)}catch{}},[n,de,ye]),xe=(0,X.useCallback)(async e=>{O(null);try{let{run:t}=await n.rerunRun(e);de({runs:[t],more:G.current.length>25}),re(t.id),ie(e=>e+1),r.offer({label:qf(t),restore:()=>void Jf(n,t.id).then(()=>ie(e=>e+1))})}catch(e){O(`Not re-run: ${e instanceof Error?e.message:`server unreachable`}.`)}},[n,de,r]),Y=(0,X.useCallback)(async e=>{oe(t=>new Set(t).add(e));try{let{run:t}=await n.cancel(e);de({runs:[t],more:G.current.length>25})}catch{oe(t=>Qf(t,e))}},[n,de]),Se=e=>{let t=e.run?G.current.find(t=>t.id===e.run):void 0,n=[];if(t&&!Qi(t.status)){let e=ae.has(t.id)||$i(t);n.push({label:e?`Stopping…`:`Stop`,icon:nt,busy:e,onSelect:()=>void Y(t.id)})}return Wi(e)&&n.push({label:`Resume`,icon:Ve,onSelect:()=>void be(e.run)}),t&&Kf(t)&&n.push({label:`Re-run`,icon:qn,onSelect:()=>void xe(t.id)}),e.run&&n.push(o({tab:`results`,id:e.run})),n},Ce=(0,X.useCallback)(async()=>{let e=G.current;I(!0);try{await n.clear()}catch{O(`Not cleared: server unreachable.`);return}finally{I(!1)}u([]),f(!1),r.offer({label:`Cleared ${ki(e.length,`run`)}`,restore:()=>{for(let t of e)n.submit(L().upgradePipeline(t.snapshot)).catch(()=>{})}})},[n,r]),we=(0,X.useCallback)(async()=>{N(!0);let e=[],t=!1,n;for(let r=0;;r++){let i=await ue(n,!0);if(!i){t=!0;break}if(e=Zf([...e,...i.runs]),n=ep(i.runs.at(-1)),!i.more||!n||r>100)break}if(t){let t=new Set(e.map(e=>e.id));e=Zf([...e,...G.current.filter(e=>!t.has(e.id))])}if(N(!1),!e.length){O(`Nothing to export yet.`);return}to(new Blob([JSON.stringify({exported:new Date().toISOString(),runs:e},null,2)],{type:`application/json`}),eo(`runs`,`all`,18,`json`)),O(t?`Exported ${ki(e.length,`run`)}. Server unreachable, so only those this browser had.`:`Exported ${ki(e.length,`run`)}.`)},[n,ue]),Te=[{label:`Select Columns`,icon:En,onSelect:()=>b(!0)},{label:`Export JSON`,icon:g,busy:j,onSelect:()=>void we()},{label:`Clear`,icon:fe,destructive:!0,busy:P,disabled:!z,onSelect:()=>void Ce()}],Ee=(0,X.useCallback)(e=>{let t=e.target.closest(`[data-openrun]`);if(t){e.stopPropagation();let n=t.closest(`tr[data-run]`),r=n?me[Number(n.getAttribute(`data-run`))]:null;r?.run&&ye(r.run,r.at);return}let n=e.target.closest(`[data-editcomment]`);if(n){e.stopPropagation();let t=n.closest(`tr[data-run]`),r=t?me[Number(t.getAttribute(`data-run`))]:null;r?.run&&w({id:r.run,comment:r.comment});return}let r=e.target.closest(`[data-scenario]`);if(r){e.stopPropagation();let t=r.closest(`tr[data-scen]`)?.previousElementSibling,n=t?me[Number(t.getAttribute(`data-run`))]:null,i=n?.run?G.current.find(e=>e.id===n.run):null;i?.snapshot&&E({run:i.snapshot,i:Number(r.getAttribute(`data-scenario`))});return}let i=e.target.closest(`[data-prof]`);if(i){e.stopPropagation();let t=i.closest(`tr[data-scen]`)?.previousElementSibling,n=t?me[Number(t.getAttribute(`data-run`))]:null,r=i.getAttribute(`data-prof`);if(n&&r!=null){let e=n.scenarios[Number(r)];e&&S({name:Bi(e),connection:e.connection,settings:{...e.setupProfile?.settings||{}},images:Di(n)===!0})}}},[me,ye]),De=(0,X.useCallback)((e,t)=>{u(n=>n.map(n=>n.id===e?{...n,snapshot:{...n.snapshot,comment:t}}:n)),w(null)},[]),Oe=(e,t)=>e.image&&Di(t)!==!0?(0,$.jsx)(`span`,{className:`note`,children:`—`}):e.get(t),ke=(e,t,n,r)=>n?e.image&&Di(t)!==!0?(0,$.jsx)(`span`,{className:`note`,children:`—`}):e.get(t,n,r):`—`;return(0,$.jsxs)(`div`,{className:`history`,children:[(0,$.jsxs)(J,{id:`history`,title:`History`,actions:Te,children:[!z&&(0,$.jsx)(Ot,{label:`Runs`,error:V,onRetry:()=>{ee(null),ne(e=>e+1)}}),z&&(q.length>0||p||e||t)&&(0,$.jsx)(pe,{noun:`runs`,lead:me.length>0&&(0,$.jsx)(`p`,{className:`note hstatus`,role:`status`,children:ki(me.length,`run`)}),filters:[{key:`show`,label:`Show`,value:p,onChange:h,options:Yf.map(e=>({value:e,label:e?Ni(e):`All`}))},{key:`pipeline`,label:`Pipeline`,value:e,onChange:e=>ge({pipeline:e}),options:$f(he(e=>e.pipelineId,e=>e.setup),e)},{key:`content`,label:`Content`,value:t,onChange:e=>ge({content:e}),options:$f(he(e=>e.sourceId,e=>e.content),t)}]}),D&&(0,$.jsx)(`p`,{className:`note hstatus`,role:`status`,children:D}),z?me.length?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`scrollx`,onClick:Ee,children:(0,$.jsx)(m,{className:`htable`,label:`Runs`,defaultSort:null,rows:me,rowKey:e=>e.at,rowProps:(e,t)=>({className:`runrow${_.has(e.at)?` open`:``}${e.run&&e.run===U?` fresh`:``}`,"data-run":t}),columns:[{key:`expand`,header:(0,$.jsx)(`span`,{className:`hvh`,children:`Targets`}),label:``,className:`hexpand`,sort:null,cell:(e,t)=>{let n=_.has(e.at);return(0,$.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":n?`Collapse`:`Expand`,"aria-expanded":n,"aria-controls":n?`hscen-${t}`:void 0,onClick:()=>ve(e.at),children:(0,$.jsx)(i,{size:16,"aria-hidden":`true`})})}},..._e.Runs.map(e=>({key:e.key,header:e.label,className:[Xf(e),e.key===`runid`&&`hrunid`].filter(Boolean).join(` `)||void 0,sort:e.sort??(t=>ut(e.get(t))),cell:t=>(0,$.jsx)(`span`,{className:`hval`,children:Oe(e,t)})})),{key:`actions`,header:(0,$.jsx)(`span`,{className:`hvh`,children:`Actions`}),label:``,className:`hactions`,sort:null,cell:e=>{let t=Se(e);return t.length?(0,$.jsx)(F,{actions:t,label:`${Oi(e.at)} actions`}):null}}],after:(e,t)=>_.has(e.at)&&(0,$.jsx)(`tr`,{className:`scenrows`,id:`hscen-${t}`,"data-run":t,"data-scen":e.at,children:(0,$.jsx)(`td`,{colSpan:_e.Runs.length+2,children:(0,$.jsx)(m,{className:`scen-table`,label:`Targets`,defaultSort:null,rows:((e.scenarios||[]).length?e.scenarios:[null]).map((e,t)=>({sc:e,n:t})),rowKey:({sc:e,n:t})=>e?.id??String(t),columns:_e[`Run Scenarios`].map(t=>({key:t.key,header:t.label,className:Xf(t),sort:({sc:n,n:r})=>{if(!n)return null;if(t.sort)return t.sort(n,r);let i=t.get(e,n,r);return ut(i)},cell:({sc:n,n:r})=>(0,$.jsx)(`span`,{className:`hval`,children:ke(t,e,n,r)})}))})})})})}),d&&(0,$.jsxs)(`button`,{type:`button`,className:`ghost older-btn`,disabled:k,"aria-busy":k||void 0,onClick:async()=>{A(!0);let e=await ue(ep(G.current.at(-1)));if(A(!1),!e){O(`Server unreachable.`);return}de(e)},children:[k&&(0,$.jsx)(M,{}),`Older`]})]}):(0,$.jsx)(`p`,{className:`note`,children:D??(q.length?`No runs match this filter.`:(0,$.jsxs)($.Fragment,{children:[`No runs yet. `,(0,$.jsx)(`a`,{href:`#/runs`,children:`Start one in Runs`})]}))}):null]}),(0,$.jsx)(Vt,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss}),y&&(0,$.jsx)(op,{cols:le,onSave:e=>{c(ap(e)),b(!1)},onClose:()=>b(!1)}),T&&(0,$.jsx)(It,{run:T.run,i:T.i,onClose:()=>E(null)}),x&&(0,$.jsx)(R,{title:x.name||`Settings`,onClose:()=>S(null),children:(0,$.jsx)(np,{connection:x.connection,settings:x.settings,images:x.images})}),C&&(0,$.jsx)(rp,{runId:C.id,comment:C.comment,onSaved:e=>De(C.id,e),onClose:()=>w(null)})]})}function np({connection:e,settings:t,images:n}){let r=e=>e.filter(e=>String(t[e]??``)!==``).map(e=>({key:e,label:wi(e),control:{type:`static`,text:Ti(e,t[e])}})),i=[...e?[{key:`connection`,label:`Connection`,control:{type:`static`,text:e}}]:[],...r(bi)],a=n?r(xi):[],o=r(yi.filter(e=>!bi.includes(e)&&!xi.includes(e)));return!i.length&&!o.length&&!a.length?(0,$.jsx)(`p`,{className:`note`,children:`(No settings)`}):(0,$.jsxs)(k,{children:[i.length>0&&(0,$.jsx)(V,{label:e?`Connection`:`Target profile`,rows:i}),o.length>0&&(0,$.jsx)(J,{id:`profile-settings`,title:`Settings`,level:3,children:(0,$.jsx)(V,{label:`Settings`,rows:o})}),a.length>0&&(0,$.jsx)(J,{id:`profile-vision`,title:`Vision Capabilities`,level:3,children:(0,$.jsx)(V,{label:`Vision Capabilities`,rows:a})})]})}function rp({runId:e,comment:t,onSaved:n,onClose:r}){let i=Z(),[a,o]=(0,X.useState)(t),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(!1);return(0,$.jsx)(st,{title:`Run comment`,...s?{status:s,statusBad:!0}:{},sections:[{key:`comment`,rows:[{key:`comment`,label:`Comment`,control:{type:`text`,value:a,onChange:o,placeholder:`Add a note`}}]}],onSave:async()=>{u(!0),c(null);try{await i.setComment(e,a),n(a)}catch{c(`Not saved: the server is unreachable.`),u(!1)}},saving:l,focusRow:`comment`,onClose:r})}function ip(e){let t=()=>({Runs:new Set(Ki.filter(e=>e.on).map(e=>e.key)),"Run Scenarios":new Set(qi.filter(e=>e.on).map(e=>e.key))});if(!e)return t();let n=t();for(let t of Zi){let r=t[0],i=e[r],a=new Set(t[1].map(e=>e.key)),o=e=>Yi[e]??e,s=new Set(i?.seen?.map(o)??[...a]),c=(i?.on??[]).map(o);for(let[e,t]of Object.entries(Xi))a.has(e)&&!s.has(e)&&s.has(t)&&(s.add(e),c.includes(t)&&c.push(e));let l=[...c.filter(e=>a.has(e)),...t[1].filter(e=>e.on&&!s.has(e.key)).map(e=>e.key)];l.length&&(n[r]=new Set(l))}return n}function ap(e){return{Runs:{on:[...e.Runs],seen:Ki.map(e=>e.key)},"Run Scenarios":{on:[...e[`Run Scenarios`]],seen:qi.map(e=>e.key)}}}function op({cols:e,onSave:t,onClose:n}){let[r,i]=(0,X.useState)(()=>({Runs:new Set(e.Runs),"Run Scenarios":new Set(e[`Run Scenarios`])})),[a,o]=(0,X.useState)(null),s=(e,t)=>e.size===t.size&&[...e].every(e=>t.has(e)),c=!s(r.Runs,e.Runs)||!s(r[`Run Scenarios`],e[`Run Scenarios`]);return(0,$.jsx)(R,{title:`Select Columns`,onClose:n,dirty:c,children:(0,$.jsxs)(`div`,{className:`hcols`,children:[Zi.map(([e,t])=>(0,$.jsxs)(`div`,{className:`groups`,children:[(0,$.jsx)(`h3`,{children:Ji[e]??e}),t.map(t=>(0,$.jsxs)(`label`,{children:[(0,$.jsx)(`input`,{type:`checkbox`,checked:r[e].has(t.key),onChange:n=>{let a=new Set(r[e]);n.target.checked?a.add(t.key):a.delete(t.key),i({...r,[e]:a}),o(null)}}),` `,t.label]},t.key))]},e)),a&&(0,$.jsx)(`p`,{className:`note bad`,children:a}),(0,$.jsx)(`div`,{className:`hcols-actions`,children:c?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:n,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`run`,onClick:()=>{if(!r.Runs.size){o(`the Runs group needs at least one column`);return}t(r)},children:`Save & Close`})]}):(0,$.jsx)(`button`,{type:`button`,className:`run`,onClick:n,children:`Close`})})]})})}var sp=e=>!!e&&e.startsWith(`•held:`),cp={"promptlab.workflows":{list:[],at:``},"promptlab.connections":{list:[],at:``},"promptlab.connectionProfiles":{list:[]},"promptlab.comment":null,"promptlab.versions":lp(),"promptlab.history.columns":null,"promptlab.wizard":null,"promptlab.tokens":null};function lp(){return{pipeline:{},profile:{},dataset:{}}}var up=[`promptlab.workflows`,`promptlab.connections`,`promptlab.connectionProfiles`,`promptlab.versions`,`promptlab.tokens`],dp=[`px`,`format`,`quality`],fp=[{value:`200704`,label:`448 square`},{value:`edge448`,label:`448 edge`},{value:`409920`,label:`480p`},{value:`518400`,label:`540p`},{value:`921600`,label:`720p`},{value:`1440000`,label:`900p`},{value:`2073600`,label:`1080p`},{value:`3686400`,label:`1440p`}],pp={"image/jpeg":`JPEG`,"image/webp":`WebP`,"image/png":`PNG`},mp=e=>pp[e]??e.replace(`image/`,``).toUpperCase(),hp={px:`921600`,quality:`0.92`};function gp(e,t,{inherit:n=!1}={}){let r=L().connectionImage({}).format,i=String(e.px??``),a=String(e.format??``),o=String(e.quality??``),s=fp.some(e=>e.value===i)||!i?fp:[...fp,{value:i,label:L().budgetLabel(i)}],c={value:``,label:`(From connection)`},l=n?[c,...s]:s.map(e=>e.value===hp.px?{value:``,label:e.label}:e),u=n?[c,...L().IMAGE_FORMATS.map(e=>({value:e,label:mp(e)}))]:L().IMAGE_FORMATS.map(e=>e===r?{value:``,label:mp(e)}:{value:e,label:mp(e)}),d=(a||r)===`image/png`,f=n?`(From connection)`:hp.quality,p={type:`text`,value:o,onChange:t(`quality`),...d||o?{}:{placeholder:f}};return[{key:`px`,label:`Resolution`,control:{type:`select`,value:!n&&i===hp.px?``:i,options:l,onChange:t(`px`)}},{key:`format`,label:`Format`,control:{type:`select`,value:!n&&a===r?``:a,options:u,onChange:t(`format`)}},{key:`quality`,label:n?`Image quality`:`Quality`,width:`quarter`,...d?{hint:`Unused for PNG`}:{},control:p}]}function _p(e,t){return e===`px`?fp.find(e=>e.value===t)?.label??L().budgetLabel(t):e===`format`?mp(t):t}function vp(e){let{px:t,format:n,quality:r}=L().connectionImage(e),i=n===`image/png`?``:` q${r??hp.quality}`;return`${L().budgetLabel(t??Number(hp.px))}, ${mp(n)}${i}`}var yp=e=>({kind:`pipeline`,id:e.id,name:e.name||`Untitled pipeline`}),bp=e=>({kind:`group`,id:e.id,name:e.name||`Untitled eval group`});function xp(e,t,n,r){let i=new Set(r.filter(t=>t.connection?.id===e).map(e=>e.id)),a=[];for(let n of t)(L().profileIds(n.work).includes(e)||L().answerKeys(n.work).some(e=>{let t=L().answerOfKey(e);return!!t.profile&&i.has(t.profile)}))&&a.push(yp(n));for(let t of n)t.grader?.id===e&&a.push(bp(t));return a}function Sp(e,t,n){let r=[];for(let n of t)L().answerKeys(n.work).some(t=>{let n=L().answerOfKey(t);return n.bare?!!e.fromProfile&&n.connection===e.fromProfile:n.profile===e.id})&&r.push(yp(n));if(e.fromProfile)for(let t of n)t.grader?.id===e.fromProfile&&r.push(bp(t));return r}function Cp(e,t,n){let r=new Set(e.map(e=>e.fromProfile).filter(Boolean)),i=[];for(let e of t)L().answerKeys(e.work).some(e=>{let t=L().answerOfKey(e);return t.bare?!r.has(t.connection):t.profile===null})&&i.push(yp(e));for(let e of n)e.grader?.id&&!r.has(e.grader.id)&&i.push(bp(e));return i}function wp(e){if(!e.length)return`Not used`;let t=(t,n)=>{let r=e.filter(e=>e.kind===t);return r.length===0?null:r.length===1?r[0].name:`${r.length} ${n}`};return[t(`pipeline`,`pipelines`),t(`group`,`eval groups`)].filter(Boolean).join(`, `)}function Tp({uses:e}){return e.length?(0,$.jsx)(`span`,{className:`setup-used`,children:wp(e)}):(0,$.jsx)(`span`,{className:`setup-unset`,children:`Not used`})}function Ep({uses:e}){return(0,$.jsxs)(`div`,{className:`setup-usedby`,children:[(0,$.jsx)(`span`,{className:`setup-usedby-label`,children:`Used by`}),e.length===0?(0,$.jsx)(`span`,{className:`setup-unset`,children:`Not used`}):(0,$.jsx)(`ul`,{className:`setup-usedby-list`,children:e.map(e=>(0,$.jsxs)(`li`,{children:[(0,$.jsx)(`a`,{href:Lr(e.kind===`group`?{tab:`library`,section:`datasets`,id:e.id}:{tab:`runs`,id:e.id}),children:e.name}),(0,$.jsx)(`span`,{className:`setup-usedby-kind`,children:e.kind===`group`?`eval group`:`pipeline`})]},`${e.kind}-${e.id}`))})]})}var Dp={tab:`setup`,section:`connections`,id:null},Op=e=>({tab:`setup`,section:`connections`,id:e,kind:`profile`}),kp=`(Default)`,Ap=e=>({tab:`setup`,section:`connections`,id:e}),jp=()=>{let e=Br();e.tab===`setup`&&e.id&&Rr(Dp)},Mp=[`id`,`name`,`connection`,`fromProfile`];function Np({profileId:e,connections:t,workflows:n,groups:r,presets:i,offer:a}){let o=vo(),[s,c]=Q(`promptlab.connectionProfiles`),l=(0,X.useRef)(s);l.current=s;let[u,d]=(0,X.useState)(null),f=(0,X.useRef)(u);f.current=u;let[p,h]=(0,X.useState)(void 0),[g,_]=(0,X.useState)(`all`),v=(0,X.useCallback)(e=>{let t={...l.current,list:e};l.current=t,c(t)},[c]),y=(0,X.useCallback)(e=>{let{default:t,...n}=l.current,r=Object.keys(e).length?{...n,default:e}:n;l.current=r,c(r)},[c]),b=(0,X.useCallback)((e,t)=>{let n=e===`(Default)`?qp(l.current.default):l.current.list.find(t=>t.id===e);n&&(d({p:structuredClone(n),was:n,start:n}),h(t))},[]),x=(0,X.useCallback)((e,t)=>{b(e,t),Rr(Op(e))},[b]),S=(0,X.useCallback)(()=>{d(null),h(void 0)},[]),C=(0,X.useCallback)(()=>{S(),jp()},[S]);(0,X.useEffect)(()=>{if(!e){f.current?.was&&S();return}f.current?.p.id!==e&&(e===`(Default)`||l.current.list.some(t=>t.id===e)?b(e):zr(Dp))},[e,b,S]);let w=(0,X.useCallback)(()=>{let e={id:Yp(),name:`New profile`};d({p:e,was:null,start:e}),h(`name`)},[]),T=(0,X.useCallback)(e=>{let t=f.current;if(!t)return;let n={...t,p:e,refused:!1};f.current=n,d(n)},[]),E=(0,X.useCallback)(()=>{let e=f.current;if(e){if(e.p.id===`(Default)`){let{id:t,name:n,...r}=Jp(e.p);y(r)}else{if(!e.p.connection?.id){d({...e,refused:!0});return}let t=Jp(e.p),n=l.current.list;v(e.was?n.map(e=>e.id===t.id?t:e):[...n,t])}S(),jp()}},[v,y,S]),D=(0,X.useCallback)(e=>{let t=l.current.list,n=t.filter(t=>e.includes(t.id)).map(e=>{let{fromProfile:t,...n}=structuredClone(e);return{...n,id:Yp(),name:`${e.name||`Profile`} copy`}});n.length&&v([...t,...n])},[v]),O=(0,X.useCallback)(e=>{let t=l.current.list,n=t.filter(t=>e.includes(t.id));n.length&&(v(t.filter(t=>!e.includes(t.id))),S(),jp(),a({label:n.length===1?`Deleted ${n[0].name||`the profile`}`:`Removed ${n.length} profiles`,restore:()=>v(t)}))},[v,S,a]),k=(0,X.useMemo)(()=>{let e=new Map;for(let t of s.list)e.set(t.id,Sp(t,n,r));return e},[s.list,n,r]),A=(0,X.useMemo)(()=>Cp(s.list,n,r),[s.list,n,r]),j=Kp((0,X.useMemo)(()=>qp(s.default),[s.default]),t),M=s.list.filter(e=>g===`all`||Wp(e,t)),N=e=>e.name||`Unnamed profile`,P=e=>[{label:`Edit…`,icon:Y.edit,onSelect:()=>x(e.id)},{label:`Rename…`,icon:Y.rename,onSelect:()=>x(e.id,`name`)},{label:`Clone`,icon:Y.clone,onSelect:()=>D([e.id])},o(Op(e.id)),{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>O([e.id])}],I=[{key:`name`,header:`Profile`,role:`title`,sort:N,cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`setup-open`,onClick:()=>x(e.id),children:N(e)})},{key:`connection`,header:`Connection`,label:``,sort:e=>Up(e,t),cell:e=>{let n=e.connection?.id?t.find(t=>t.id===e.connection.id):void 0;return n?(0,$.jsx)(`button`,{type:`button`,className:`setup-open setup-conn`,onClick:()=>Rr(Ap(n.id)),children:Up(e,t)}):(0,$.jsx)(`span`,{className:`setup-attention`,children:Up(e,t)})}},{key:`settings`,header:`Settings`,label:``,sort:e=>Kp(e,t),cell:e=>{let n=Kp(e,t);return n?(0,$.jsx)(`span`,{className:`setup-sets`,children:n}):(0,$.jsx)(`span`,{className:`setup-unset`,children:`(No settings)`})}},{key:`used`,header:`Used by`,label:``,sort:e=>wp(k.get(e.id)??[]),cell:e=>(0,$.jsx)(Tp,{uses:k.get(e.id)??[]})},{key:`menu`,header:``,label:``,className:`setup-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{actions:P(e),label:`${N(e)} actions`})}],L=u;return(0,$.jsxs)(J,{id:`setup-connection-profiles`,title:`Connection Profiles`,children:[(0,$.jsx)(`div`,{className:`setup-intro`,children:(0,$.jsx)(`p`,{className:`note`,children:`Settings that override an AI Connection's.`})}),s.list.length>0&&(0,$.jsx)(pe,{noun:`profiles`,filters:[],quick:{label:`Show`,value:g,onChange:e=>_(e),options:Gp}}),g!==`all`&&M.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No profiles match these filters.`}):(0,$.jsx)(m,{className:`setup-table`,cards:!0,label:`Connection Profiles`,rows:M,rowKey:e=>e.id,select:{noun:`profile`,label:N,actions:e=>[{label:`Clone`,icon:Y.clone,onSelect:()=>D(e.map(e=>e.id))},{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>O(e.map(e=>e.id))}]},rowProps:e=>({className:`setup-row`,onClick:t=>{t.target.closest(`button, a, .menu`)||x(e.id)}}),pinned:g===`all`&&(0,$.jsxs)(`tr`,{className:`setup-row setup-default`,"data-default":``,onClick:e=>{e.target.closest(`button, a, .menu`)||x(`(Default)`)},children:[(0,$.jsx)(`td`,{className:`dt-select`}),(0,$.jsx)(`td`,{className:`dt-title`,children:(0,$.jsx)(`button`,{type:`button`,className:`setup-open setup-unset`,onClick:()=>x(`(Default)`),children:`(Default)`})}),(0,$.jsx)(`td`,{children:(0,$.jsx)(`span`,{className:`setup-unset`,children:`(Any)`})}),(0,$.jsx)(`td`,{children:j?(0,$.jsx)(`span`,{className:`setup-sets`,children:j}):(0,$.jsx)(`span`,{className:`setup-unset`,children:`(No settings)`})}),(0,$.jsx)(`td`,{children:(0,$.jsx)(Tp,{uses:A})}),(0,$.jsx)(`td`,{className:`setup-menu`})]}),columns:I}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:w,children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add profile`]}),L&&(0,$.jsx)(Pp,{profile:L.p,connections:t,presets:i,uses:L.p.id===`(Default)`?A:k.get(L.p.id)??[],refused:!!L.refused,...p?{focus:p}:{},dirty:JSON.stringify(L.p)!==JSON.stringify(L.start),adding:!L.was,...L.was?{link:o(Op(L.p.id))}:{},onEdit:T,onSave:E,onClose:C})]})}function Pp({profile:e,connections:t,presets:n,uses:r,refused:i,focus:a,dirty:o,adding:s,link:c,onEdit:l,onSave:u,onClose:d}){let f=e.id===kp,p=f?null:Fp(e,t),m=t=>n=>{let r={...e};for(let e of t)r[e]=n;l(r)},h=e=>m([e]),g=e.connection??null,[_]=Q(`promptlab.versions`),{options:v,recent:y}=jo(t.filter(e=>L().listedConnection(e)||e.id===g?.id).map(e=>({id:e.id,name:e.name||`Unnamed connection`})),e=>_.profile?.[e]?.[0]?.at??null),b=[...v,...g&&!t.some(e=>e.id===g.id)?[{id:g.id,label:`${g.name||g.id} (missing)`,missing:!0}]:[]],x=[{key:`name`,label:`Name`,width:`full`,required:!0,control:{type:`text`,value:e.name,onChange:h(`name`)}},{key:`connection`,label:`Connection`,required:!0,hint:`Overrides the AI Connection settings`,...i?{error:`Choose a connection`}:{},control:{type:`picker`,kind:`Connection`,value:g?.id??``,options:b,recent:y,usedLabel:`Last changed`,placeholder:`(No connection)`,onChange:n=>{let r=t.find(e=>e.id===n);r&&l({...e,connection:{id:r.id,name:r.name}})}}}],S=Rp(e,p).map(t=>Hp(e,t,m(t.keys))),C=p?L().CONNECTION_TYPES[p.type]:void 0,w=!C||(C.answers??[`prompt`]).includes(`prompt`)&&!C.local,T=[...f?[]:[{key:`identity`,rows:x}],...S.length?[{key:`model`,title:`Model settings`,rows:S}]:[],...w?[{key:`image`,title:`Image settings`,rows:gp(e,h,{inherit:!0})}]:[],{key:`use`,title:`Use`,rows:[],children:(0,$.jsx)(Ep,{uses:r})}],E=p?n.filter(e=>(e.type??`llama.cpp`)===p.type):[],D=t=>{let n={...e};for(let e of C?.settings??[])e.key!==`temperature`&&e.scope!==`connection`&&delete n[e.key];l({...n,...t.opts})},O=[...c?[c]:[],...E.map(e=>({label:`Apply preset: ${e.label}`,icon:Y.preset,onSelect:()=>D(e)}))];return(0,$.jsx)(st,{title:f?kp:e.name||`Unnamed profile`,...a?{focusRow:a}:{},sections:T,...O.length?{menu:O}:{},dirty:o,adding:s,onSave:u,onClose:d})}function Fp(e,t){let n=e.connection?.id??e.fromProfile;return n&&t.find(e=>e.id===n)||null}function Ip(){let e=Object.values(L().CONNECTION_TYPES).filter(e=>e.picker!==!1&&!e.local&&(e.answers??[`prompt`]).includes(`prompt`)),t=new Map;for(let n of e)for(let e of n.settings){if(e.scope===`connection`)continue;let n=t.get(e.label)??{label:e.label,keys:[],setting:e,n:0};n.keys.includes(e.key)||n.keys.push(e.key),n.n+=1,t.set(e.label,n)}return[...t.values()].filter(t=>t.n*2>e.length).sort((e,t)=>t.n-e.n).map(({n:e,...t})=>t)}function Lp(){let e=Ip().map(e=>e.label);for(let t of Object.values(L().CONNECTION_TYPES))for(let n of t.settings)n.scope!==`connection`&&!e.includes(n.label)&&e.push(n.label);return e}function Rp(e,t){let n;if(t){let r=L().mergeAnswer(t,e);n=(L().CONNECTION_TYPES[t.type]?.settings??[]).filter(e=>e.scope!==`connection`&&(!e.appliesTo||e.appliesTo(r))).map(e=>({label:e.label,keys:[e.key],setting:e}))}else n=Ip();let r=new Set(n.flatMap(e=>e.keys));for(let[t,i]of Object.entries(e)){if(Mp.includes(t)||dp.includes(t)||r.has(t)||i==null||i===``)continue;let e=Vp(t),a=e?.label??Bp(t);n.push({label:a,keys:[t],setting:e??{key:t,label:a,control:`text`,default:``,hint:``}})}let i=Lp(),a=e=>{let t=i.indexOf(e.label);return t<0?i.length:t};return n.sort((e,t)=>a(e)-a(t)||(a(e)===i.length?e.label.localeCompare(t.label):0))}var zp={caseMode:`Case`};function Bp(e){let t=zp[e]??e.replace(/([a-z\d])([A-Z])/g,`$1 $2`).replace(/[_-]+/g,` `).toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)}function Vp(e){for(let t of Object.values(L().CONNECTION_TYPES)){let n=t.settings.find(t=>t.key===e);if(n)return n}}function Hp(e,t,n){let r=String(t.keys.map(t=>e[t]).find(e=>e!=null&&e!==``)??``),i=t.setting;return i.control===`select`&&i.choices?{key:t.keys[0],label:t.label,control:{type:`select`,value:r,onChange:n,options:[{value:``,label:`(From connection)`},...i.choices.filter(e=>e.value!==``)]}}:i.key===`grammar`?{key:t.keys[0],label:t.label,control:{type:`textarea`,value:r,onChange:n}}:{key:t.keys[0],label:t.label,width:`quarter`,control:{type:`text`,value:r,onChange:n,...r?{}:{placeholder:`(From connection)`}}}}function Up(e,t){if(!e.connection?.id)return`(No connection)`;let n=t.find(t=>t.id===e.connection.id);return n?n.name||`Unnamed connection`:`${e.connection.name||e.connection.id} (missing)`}function Wp(e,t){return!e.connection?.id||!t.some(t=>t.id===e.connection.id)}var Gp=[{value:`all`,label:`All`},{value:`attention`,label:`Needs attention`}];function Kp(e,t){let n=[],r=Fp(e,t),i=new Set;for(let t of Rp(e,r)){let r=t.keys.map(t=>e[t]).find(e=>e!=null&&e!==``);r==null||i.has(t.label)||(i.add(t.label),n.push(`${t.label} ${String(r)}`))}let a={px:`Resolution`,format:`Format`,quality:`Image quality`};for(let t of dp){let r=e[t];r!=null&&r!==``&&n.push(`${a[t]} ${_p(t,String(r))}`)}return n.join(` · `)}function qp(e){return{...e,id:kp,name:kp}}function Jp(e){let t={id:e.id,name:e.name};for(let[n,r]of Object.entries(e))n!==`id`&&n!==`name`&&r!=null&&r!==``&&(t[n]=r);return t}var Yp=()=>`cp${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`;function Xp(e){return!e||e.length===0||e.includes(`*all`)?``:[...e].sort().join(`,`)}function Zp(e){let[t,n]=(0,X.useState)({});return(0,X.useEffect)(()=>{let t=!0;return e.connectionShares().then(e=>{t&&n(e.shares)}).catch(()=>{}),()=>{t=!1}},[e]),{sharesFor:(0,X.useCallback)((e,n)=>t[hn(e,n)],[t]),setFor:(0,X.useCallback)((t,r,i)=>{e.setConnectionShares(t,r,i).then(e=>n(e.shares)).catch(()=>{})},[e]),setForEach:(0,X.useCallback)(async(t,r)=>{let i=null;for(let{id:n,workspaces:a}of r)try{i=(await e.setConnectionShares(t,n,a)).shares}catch{}i&&n(i)},[e])}}function Qp({offer:e}){let t=Z(),n=er(),r=vr(),i=Or(),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)(!1),p=(0,X.useRef)(null),h=e=>c({text:e instanceof Error?e.message:String(e),bad:!0}),g=(0,X.useCallback)(()=>{u(null),t.packs().then(e=>o(e.packs),e=>u(e instanceof Error?e.message:String(e)))},[t]);(0,X.useEffect)(g,[g]);let _=async()=>{await Promise.all([n.refresh(),r.refresh(),i.refresh()]),g()},v=async e=>{c({text:`Installing ${e.name}…`,bad:!1}),f(!0);try{let n=await t.installPack(e);await _();let r=(await t.packs()).packs.find(e=>e.id===n.pack),i=r?`${r.name} ${r.version}`:n.pack;c({text:n.installed?`Installed ${i}.`:`${i} is up to date.`,bad:!1})}catch(e){h(e)}finally{f(!1)}},y=async n=>{let r=[];try{for(let e of n)r.push((await t.removePack(e.id)).trash)}catch(e){h(e)}r.length&&(await _(),e({label:n.length===1?`Removed ${n[0].name}`:`Removed ${r.length} packs`,restore:()=>{(async()=>{for(let e of r)await t.restorePack(e);await _()})()}}))};return(0,$.jsxs)(J,{id:`setup-packs`,title:`Packs`,note:a?$p(a.length,`pack`):``,actions:[{label:`Install pack…`,icon:Ue,busy:d,onSelect:()=>p.current?.click()}],children:[a===null&&(0,$.jsx)(Ot,{label:`Packs`,error:l,onRetry:g}),a&&!a.length&&(0,$.jsx)(`p`,{className:`note`,children:`No packs installed.`}),a&&a.length>0&&(0,$.jsx)(m,{className:`setup-table`,cards:!0,label:`Packs`,rows:a,rowKey:e=>e.id,select:{noun:`pack`,actions:e=>[{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>void y(e)}]},columns:[{key:`name`,header:`Pack`,role:`title`,cell:e=>e.name},{key:`version`,header:`Version`,cell:e=>e.version},{key:`made`,header:`Made`,sort:e=>e.datasets.length+e.pipelines.length+e.sources.length+e.presets,cell:e=>em(e)},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${e.name} actions`,actions:[{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>void y([e])}]})}]}),s&&(0,$.jsx)(`p`,{className:`note${s.bad?` bad`:``}`,role:s.bad?`alert`:`status`,children:s.text}),(0,$.jsx)(`input`,{ref:p,type:`file`,accept:`.labpack,.zip,application/zip`,hidden:!0,"aria-label":`Install pack file`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&v(t)}})]})}var $p=(e,t)=>`${e} ${t}${e===1?``:`s`}`,em=e=>[[e.datasets.length,`eval group`],[e.pipelines.length,`pipeline`],[e.sources.length,`source`],[e.presets,`preset`]].filter(([e])=>e>0).map(([e,t])=>$p(e,t)).join(`, `);function tm({offer:e}){let t=Z(),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(!1),u=(0,X.useRef)(null),d=(0,X.useCallback)(()=>{s(null),t.plugins().then(e=>r(e.plugins),e=>s(e instanceof Error?e.message:String(e)))},[t]);(0,X.useEffect)(d,[d]);let f=async e=>{a(null),l(!0);try{let n=await t.installPlugin(e),i=(await t.plugins()).plugins;r(i);let o=i.find(e=>e.id===n.plugin);o&&n.installed&&await fn(o),a({text:n.installed?ln[n.plugin]?`Installed ${n.plugin}, and it did not load: ${ln[n.plugin]}`:`Installed ${n.plugin}.`:`${n.plugin} is up to date.`,bad:!!ln[n.plugin]})}catch(e){a({text:e instanceof Error?e.message:String(e),bad:!0})}finally{l(!1)}},p=async n=>{let r=[];try{for(let e of n)r.push((await t.removePlugin(e.id)).trash)}catch(e){a({text:e instanceof Error?e.message:String(e),bad:!0})}d(),r.length&&e({label:n.length===1?`Removed ${n[0].id}`:`Removed ${r.length} plugins`,restore:()=>{Promise.all(r.map(e=>t.restorePlugin(e))).then(d)}})};return(0,$.jsxs)(J,{id:`setup-plugins`,title:`Plugins`,note:n?`${n.length} ${n.length===1?`plugin`:`plugins`}`:``,actions:[{label:`Install plugin…`,icon:Ue,busy:c,onSelect:()=>u.current?.click()}],children:[n===null&&(0,$.jsx)(Ot,{label:`Plugins`,error:o,onRetry:d}),n&&!n.length&&(0,$.jsx)(`p`,{className:`note`,children:`(No plugins)`}),n&&n.length>0&&(0,$.jsx)(m,{className:`setup-table`,cards:!0,label:`Plugins`,rows:n,rowKey:e=>e.id,select:{noun:`plugin`,actions:e=>[{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>void p(e)}]},columns:[{key:`id`,header:`Plugin`,role:`title`,cell:e=>e.id},{key:`version`,header:`Version`,cell:e=>e.version},{key:`sha`,header:`SHA-256`,sort:e=>e.sha256,cell:e=>(0,$.jsx)(`code`,{title:e.sha256,children:e.sha256.slice(0,12)})},{key:`registers`,header:`Registers`,sort:e=>nm(e),cell:e=>nm(e)||`—`},{key:`state`,header:`State`,cell:e=>rm(e)},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${e.id} actions`,actions:[{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>void p([e])}]})}]}),i&&(0,$.jsx)(`p`,{className:`note${i.bad?` bad`:``}`,role:i.bad?`alert`:`status`,children:i.text}),(0,$.jsx)(`input`,{ref:u,type:`file`,accept:`.labplugin,.zip,application/zip`,hidden:!0,"aria-label":`Install plugin file`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&f(t)}})]})}var nm=e=>[...e.registers.outputKinds??[],...e.registers.modifiers??[],...e.registers.evalTypes??[],...(e.registers.connectionTypes??[]).map(e=>e.id)].join(`, `),rm=e=>ln[e.id]?`Failed: ${ln[e.id]}`:un.has(e.id)?`Loaded`:`Not Loaded`,im={env:`Deployment`,lab:`Own`,default:`Default`};function am({cfg:e,editable:t,onClose:n}){let r=Z(),i=e?.from===`lab`?e:null,[a,o]=(0,X.useState)(i?.clientId??``),[s,c]=(0,X.useState)(i?.tenant??``),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)(!1),p=a!==(i?.clientId??``)||s!==(i?.tenant??``),m=async()=>{if(!p){n();return}f(!0);try{await r.setMicrosoft(a,s),xl(),n()}catch(e){u(e instanceof Error?e.message:String(e)),f(!1)}},h=e=>t=>{u(null),e(t)},g=!t,_=new URL(`/`,hl()??window.location.href).href,v=cl(g?e?.tenant??``:s||`organizations`),y=[g?{key:`client`,label:`Client ID`,control:{type:`code`,text:e?.clientId??`—`}}:{key:`client`,label:`Client ID`,control:{type:`text`,value:a,onChange:h(o),placeholder:e?.from==="default"?e.clientId:`00000000-0000-0000-0000-000000000000`}},g?{key:`tenant`,label:`Tenant`,control:{type:`code`,text:e?.tenant??`—`}}:{key:`tenant`,label:`Tenant`,control:{type:`text`,value:s,onChange:h(c),placeholder:`00000000-0000-0000-0000-000000000000`}},{key:`signin`,label:`Sign-in`,control:{type:`static`,text:v}},{key:`redirect`,label:`Redirect URI`,control:{type:`code`,text:_}},{key:`app`,label:`App`,control:{type:`static`,text:e?.from?im[e.from]:`None`}}];return(0,$.jsx)(st,{title:`Microsoft 365`,status:l??void 0,statusBad:!!l,focusRow:g?void 0:`client`,sections:[{key:`app`,rows:y}],...g?{}:{onSave:()=>void m(),saving:d,dirty:p},onClose:n})}var om={env:`Deployment`,lab:`Own`,default:`Default`},sm=`https://console.cloud.google.com/apis/credentials`,cm=[{value:`installed`,label:`Desktop app`},{value:`web`,label:`Web application`}],lm={installed:`For a lab on this machine; Google needs no redirect registered.`,web:`For a lab at its own address; register the redirect below with the client.`},um=`/api/connections/google/callback`,dm=()=>/^(localhost|127\.|\[::1\])/.test(window.location.hostname);function fm(e){let t;try{t=JSON.parse(e)}catch{return`that file is not JSON`}let n=t??{},r=n.installed?`installed`:n.web?`web`:null,i=r?n[r]:void 0;return!r||typeof i?.client_id!=`string`||typeof i.client_secret!=`string`?`that is not a client file from Google Cloud`:{clientId:i.client_id,clientSecret:i.client_secret,apiKey:``,clientType:r}}function pm({onClose:e,onSaved:t}){let n=Z(),[r,i]=(0,X.useState)(void 0),[a,o]=(0,X.useState)(!0),[s,c]=(0,X.useState)(``),[l,u]=(0,X.useState)(``),[d,f]=(0,X.useState)(``),[p,m]=(0,X.useState)(dm()?`installed`:`web`),[h,g]=(0,X.useState)({clientId:``,apiKey:``,kind:``}),[_,v]=(0,X.useState)(null),[y,b]=(0,X.useState)(null),[x,S]=(0,X.useState)(!1);(0,X.useEffect)(()=>{n.google().then(e=>{i(e.google),o(e.editable);let t=e.google?.from===`lab`?e.google:null;t&&(c(t.clientId),f(t.apiKey??``),m(t.clientType)),g({clientId:t?.clientId??``,apiKey:t?.apiKey??``,kind:t?.clientType??(dm()?`installed`:`web`)})},e=>{i(null),v(e instanceof Error?e.message:String(e))})},[n]);let C=s!==h.clientId||d!==h.apiKey||p!==h.kind||!!l,w=async()=>{if(!C){e();return}S(!0);try{await n.setGoogle({clientId:s,apiKey:d,clientType:p,...l?{clientSecret:l}:{}}),t(),e()}catch(e){v(e instanceof Error?e.message:String(e)),S(!1)}},T=e=>t=>{v(null),b(null),e(t)},E=()=>{let e=document.createElement(`input`);e.type=`file`,e.accept=`.json,application/json`,e.onchange=()=>{let t=e.files?.[0];t&&D(t)},e.click()},D=async e=>{let t=fm(await e.text());if(typeof t==`string`){v(t);return}c(t.clientId),m(t.clientType),u(t.clientSecret??``),b(`Loaded the client file`)};if(r===void 0)return null;let O=!a,k=!!r?.hasSecret&&r.from!=="default",A=O?r?.clientType??`web`:p,j=O?[{key:`client`,label:`Client ID`,control:{type:`code`,text:r?.clientId??`—`}},{key:`secret`,label:`Client secret`,control:{type:`static`,text:r?.hasSecret?`Held`:`None`}},{key:`key`,label:`API key`,control:{type:`code`,text:r?.apiKey??`—`}},{key:`type`,label:`Type`,control:{type:`static`,text:cm.find(e=>e.value===A).label}}]:[{key:`client`,label:`Client ID`,control:{type:`text`,value:s,onChange:T(c),placeholder:r?.from==="default"?r.clientId:`000000000000-….apps.googleusercontent.com`}},{key:`secret`,label:`Client secret`,control:{type:`secret`,value:l,onChange:T(e=>u(e??``)),...k?{placeholder:`Saved`}:{}}},{key:`key`,label:`API key`,control:{type:`text`,value:d,onChange:T(f),placeholder:`AIza…`}},{key:`type`,label:`Type`,hint:lm[p],control:{type:`select`,value:p,options:cm,onChange:e=>T(m)(e)}}];return j.push({key:`redirect`,label:`Redirect URI`,control:A===`web`?{type:`code`,text:new URL(um,window.location.href).href}:{type:`static`,text:`Not Needed`}},{key:`app`,label:`App`,control:{type:`static`,text:r?.from?om[r.from]:`None`}}),(0,$.jsx)(st,{title:`Google Drive`,status:_??y??void 0,statusBad:!!_,focusRow:O?void 0:`client`,sections:[{key:`app`,rows:j}],actions:[{label:`Google Cloud`,icon:Dn,onSelect:()=>{window.open(sm,`_blank`,`noopener`)}},...O?[]:[{label:`Load client file…`,icon:An,onSelect:E}]],...O?{}:{onSave:()=>void w(),saving:x,dirty:C},onClose:e})}var mm=`microsoft`,hm=`google`;function gm(){let e=Z(),{list:t}=po(),n=t.filter(e=>!e.archived).map(e=>({id:e.id,name:e.name})),{sharesFor:r,setFor:i}=Zp(e),{cfg:a,editable:o}=Sl(),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)(void 0),[p,h]=(0,X.useState)(null),g=(0,X.useCallback)(()=>{e.connections().then(e=>u(e.connections),()=>u([]))},[e]);(0,X.useEffect)(g,[g]),(0,X.useEffect)(()=>{if(!a){f(null);return}pl(a).then(f,()=>f(null))},[a]);let _=[...l??[],...a||o?[{id:mm,label:`Microsoft 365`,configured:!!a,signedIn:!!d,account:d??null,problem:null}]:[]],v=async t=>{h(null);try{t.id===mm&&a?await _l(a):window.location.assign((await e.signIn(t.id)).url)}catch(e){h(e instanceof Error?e.message:String(e))}},y=async t=>{h(null);try{t.id===mm&&a?(await vl(a),f(null)):u((await e.signOut(t.id)).connections)}catch(e){h(e instanceof Error?e.message:String(e))}};if(l===null)return(0,$.jsx)(J,{id:`setup-connections`,title:`Accounts`,children:(0,$.jsx)(Ot,{label:`Accounts`})});if(!_.length)return null;let b=_.filter(e=>e.problem);return(0,$.jsxs)(J,{id:`setup-connections`,title:`Accounts`,note:`${_.filter(e=>e.signedIn).length} of ${_.length}`,children:[(0,$.jsx)(m,{className:`setup-table`,cards:!0,label:`Accounts`,rows:_,rowKey:e=>e.id,columns:[{key:`label`,header:`Account`,role:`title`,cell:e=>e.label},{key:`status`,header:`Status`,cell:e=>e.id===mm&&a&&d===void 0?(0,$.jsxs)(`span`,{className:`loading-status`,children:[(0,$.jsx)(M,{}),`Checking`]}):_m(e)},{key:`account`,header:`Signed in as`,cell:e=>e.account||(0,$.jsx)(`span`,{className:`setup-unset`,children:`(No one)`})},{key:`workspaces`,header:`Workspaces`,sort:e=>Xp(r(`account`,e.id)),cell:e=>(0,$.jsx)(Ie,{label:e.label,workspaces:n,shares:r(`account`,e.id),onChange:t=>i(`account`,e.id,t)})},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{label:`${e.label} actions`,actions:[e.signedIn?{label:`Sign out`,icon:zn,onSelect:()=>void y(e)}:{label:`Sign in`,icon:Rn,disabled:!e.configured,onSelect:()=>void v(e)},...e.id===mm||e.id===hm?[{label:`Configure…`,icon:Re,onSelect:()=>c(e.id)}]:[]]})}]}),b.map(e=>(0,$.jsxs)(`p`,{className:`note bad`,role:`alert`,children:[e.label,`: `,e.problem]},e.id)),p&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:p}),s===mm&&a!==void 0&&(0,$.jsx)(am,{cfg:a,editable:o,onClose:()=>c(null)}),s===hm&&(0,$.jsx)(pm,{onClose:()=>c(null),onSaved:g})]})}var _m=e=>e.configured?e.signedIn?`Signed In`:`Signed Out`:`Not Configured`;function vm(e,t){e.focus(t),e.setAttribute(`data-focus-ring`,``);let n=()=>{e.removeAttribute(`data-focus-ring`),e.removeEventListener(`blur`,n),document.removeEventListener(`pointerdown`,n,!0)};e.addEventListener(`blur`,n),document.addEventListener(`pointerdown`,n,!0)}var ym=L().WIZARDS,bm=L().wizardProgress;function xm(e){return!!e?.targets?.some(e=>e.steps?.some(e=>e.type===`recorded`))}L().WIZARDS[`test-workflow`]={id:`test-workflow`,title:`Test a Power Automate workflow`,blurb:`Vary a workflow action's request and grade the replies against what it recorded.`,steps:[{id:`source`,title:`Add a workflow Source`,detail:`In the Library, add the workflow and let it import its recent calls.`,where:`#/library/sources`,focus:`.add-btn`,done:e=>e.sources.some(e=>!!e.platform)},{id:`test`,title:`Test an action`,detail:`Open the Source and Create test… on the action that calls the model.`,where:`#/library/sources`,done:e=>e.pipelines.some(e=>xm(e.work))},{id:`run`,title:`Run the test`,detail:`On Runs, change the editable target's request and run it.`,where:`#/runs`,focus:`.action-bar-primary`,done:e=>e.runs.some(e=>xm(e.snapshot))},{id:`compare`,title:`Compare the replies`,detail:`Open the finished run and read the two replies side by side.`,where:`#/history`,done:e=>e.runs.some(e=>e.status===`done`&&xm(e.snapshot))}]};var Sm=(0,X.createContext)(null);function Cm({children:e}){let t=Z(),[n,r]=Q(`promptlab.wizard`),[i]=Q(`promptlab.connections`),[a]=Q(`promptlab.workflows`),[o,s]=(0,X.useState)([]),[c,l]=(0,X.useState)([]),u=(0,X.useRef)(!!n);u.current=!!n,(0,X.useEffect)(()=>{let e=!0,n=()=>{t.sources().then(t=>{e&&s(t.sources)},()=>{}),t.queue({limit:20}).then(t=>{e&&l(t.runs)},()=>{})};n();let r=()=>{u.current&&n()};return window.addEventListener(`hashchange`,r),_n.addEventListener(`write`,r),()=>{e=!1,window.removeEventListener(`hashchange`,r),_n.removeEventListener(`write`,r)}},[t,n?.id]);let d=(0,X.useMemo)(()=>({profiles:i.list,pipelines:a.list,sources:o,runs:c}),[i.list,a.list,o,c]),f=(0,X.useMemo)(()=>Object.values(ym),[]),p=n?ym[n.id]??null:null,m=(0,X.useCallback)(e=>{ym[e]&&r({id:e})},[r]),h=(0,X.useCallback)(()=>r(null),[r]),g=(0,X.useCallback)(e=>{location.hash!==e.where&&(location.hash=e.where),e.focus&&Em(e.focus)},[]),_=(0,X.useMemo)(()=>({entries:f,active:p,lab:d,start:m,cancel:h,goToStep:g}),[f,p,d,m,h,g]);return(0,$.jsx)(Sm.Provider,{value:_,children:e})}function wm(){let e=(0,X.useContext)(Sm);if(!e)throw Error(`useWizard outside a WizardProvider: the app mounts one at its root`);return e}function Tm(){let{active:e,lab:t}=wm();return(0,X.useMemo)(()=>e?{entry:e,...bm(e,t)}:null,[e,t])}function Em(e,t=20){let n=document.querySelector(e);if(n){vm(n),n.scrollIntoView?.({block:`center`,behavior:`smooth`});return}t>0&&requestAnimationFrame(()=>Em(e,t-1))}var Dm=e=>({tab:`setup`,section:`wizards`,id:e});function Om({wizardId:e=null}){let{entries:t,active:n,lab:r,start:i,cancel:a,goToStep:o}=wm(),s=vo(),c=e?t.find(t=>t.id===e)??null:null;(0,X.useEffect)(()=>{e&&!c&&zr(Dm(null))},[e,c]);let l=c??(e?null:n);if(!l)return(0,$.jsxs)(J,{id:`setup-wizards`,title:`Wizards`,note:`${t.length} available`,children:[(0,$.jsx)(`p`,{className:`note`,children:`Step-by-step guides.`}),(0,$.jsx)(m,{className:`setup-table wiz-table`,cards:!0,label:`Wizards`,rows:t,rowKey:e=>e.id,columns:[{key:`name`,header:`Wizard`,role:`title`,cell:e=>(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`a`,{className:`wiz-list-name`,href:Lr(Dm(e.id)),children:e.title}),(0,$.jsx)(`span`,{className:`note`,children:e.blurb})]})},{key:`progress`,header:`Steps`,sort:e=>bm(e,r).done,cell:e=>{let t=bm(e,r);return`${t.done}/${t.total}`}},{key:`start`,header:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(C,{label:`${e.title} actions`,actions:[{label:`Start`,icon:Ve,onSelect:()=>{i(e.id),Rr(Dm(e.id))}}]})}]})]});let u=l.id===n?.id,{ticks:d,done:f,total:p,current:h}=bm(l,r),g=h>=0?l.steps[h]:null,_=h<0;return(0,$.jsxs)(`div`,{className:`setup-wizard`,children:[(0,$.jsx)(ce,{kind:`Wizard`,name:l.title,meta:`${f} of ${p} complete`,actions:[s(Dm(l.id))],docked:!0}),u?(0,$.jsx)(Ze,{primary:{label:`Next step`,icon:ie,onSelect:()=>g&&o(g),disabled:_},status:_?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`b`,{children:`All steps done.`}),` Cancel to close it.`]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`b`,{children:[`Step `,h+1,` of `,p]}),` · `,g.title]}),secondary:{label:`Cancel wizard`,icon:_?G:nt,onSelect:a}}):(0,$.jsx)(Ze,{primary:{label:`Start`,icon:Ve,onSelect:()=>i(l.id)},status:_?(0,$.jsx)(`b`,{children:`All steps done.`}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`b`,{children:[`Step `,h+1,` of `,p]}),` · `,g.title]})}),(0,$.jsx)(J,{id:`setup-wizard-steps`,title:l.title,note:l.blurb,children:(0,$.jsx)(m,{className:`setup-table wiz-table`,cards:!0,label:`${l.title} steps`,rows:l.steps.map((e,t)=>({...e,n:t,state:d[t]?`done`:t===h?`now`:`todo`})),rowKey:e=>e.id,columns:[{key:`step`,header:`Step`,role:`title`,cell:e=>(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`span`,{className:`wiz-step-title${e.state===`now`?` current`:``}`,children:[e.n+1,`. `,e.title]}),(0,$.jsx)(`span`,{className:`note`,children:e.detail})]})},{key:`state`,header:`Status`,cell:e=>(0,$.jsx)(`span`,{className:`wiz-row-state ${e.state}`,children:e.state===`done`?`Done`:e.state===`now`?`Next`:`To do`})},{key:`go`,header:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(C,{label:`${e.title} actions`,actions:[{label:`Go to step`,icon:mt,onSelect:()=>o(e)}]})}]})})]})}var km={google:`Google Drive`,microsoft:`Microsoft 365`},Am=e=>`/w/${e}`,jm=e=>L().slugOf(e),Mm=e=>{let t=jm(e.name);return!!t&&t!==e.slug&&t!==e.slug.replace(/-\d+$/,``)};function Nm(){let e=Z(),t=Je(),{current:n,switchTo:r}=po(),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(!1),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(null),y=e=>l({text:e instanceof Error?e.message:String(e),bad:!0}),b=(0,X.useCallback)(()=>{s(null),e.workspaces().then(e=>a(e.workspaces),e=>s(e instanceof Error?e.message:String(e)))},[e]);(0,X.useEffect)(b,[b]);let x=(i??[]).filter(e=>!e.archived).length,S=(0,X.useCallback)(async t=>{try{let n=await e.createWorkspace(t);if(n.workspace)return r(n.workspace.slug);a(n.workspaces),l(null)}catch(e){y(e)}},[e,r]),C=(0,X.useCallback)(async(t,n)=>{try{a((await e.renameWorkspace(t.id,n)).workspaces)}catch(e){y(e)}},[e]),w=(0,X.useCallback)(async t=>{try{a((await e.regenerateWorkspace(t.id)).workspaces),l(null)}catch(e){y(e)}},[e]),T=(0,X.useCallback)(async r=>{try{let i=await e.archiveWorkspace(r.id);if(r.slug===n?.slug){let e=uo(i.workspaces);if(e){co({id:r.id,slug:r.slug,name:r.name}),location.assign(ao(e.slug));return}}a(i.workspaces),t.offer({label:`Archived ${r.name}`,restore:()=>void(async()=>{try{a((await e.unarchiveWorkspace(r.id)).workspaces)}catch(e){y(e)}})()})}catch(e){y(e)}},[e,t,n]),E=(0,X.useCallback)(async t=>{try{a((await e.unarchiveWorkspace(t.id)).workspaces)}catch(e){y(e)}},[e]),D=(0,X.useCallback)(async t=>{try{a((await e.setDefaultWorkspace(t.id)).workspaces)}catch(e){y(e)}},[e]),O=(0,X.useCallback)(async n=>{try{let{trash:r}=await e.deleteWorkspace(n.id);a(e=>(e??[]).filter(e=>e.id!==n.id)),t.offer({label:`Deleted ${n.name}`,restore:()=>void(async()=>{try{a((await e.restoreWorkspace(r)).workspaces)}catch(e){y(e)}})()})}catch(e){y(e)}},[e,t]),k=(i??[]).filter(e=>e.archived),A=(i??[]).filter(e=>u||!e.archived);return(0,$.jsxs)(J,{id:`setup-workspaces`,title:`Workspaces`,note:i?Lm(i.length):``,children:[(0,$.jsx)(`p`,{className:`note`,children:`Each has its own pipelines, runs and library.`}),i===null&&(0,$.jsx)(Ot,{label:`Workspaces`,error:o,onRetry:b}),i&&(0,$.jsxs)($.Fragment,{children:[k.length>0&&(0,$.jsx)(`div`,{className:`pills ws-archived`,role:`group`,"aria-label":`Show`,children:(0,$.jsxs)(`label`,{className:`pill`,children:[(0,$.jsx)(`input`,{type:`checkbox`,checked:u,onChange:e=>d(e.target.checked)}),(0,$.jsx)(`span`,{children:`Archived`})]})}),(0,$.jsx)(m,{className:`setup-table ws-table`,cards:!0,label:`Workspaces`,rows:A,rowKey:e=>e.id,columns:Pm({onlyActive:x<=1,currentSlug:n?.slug??null,onRename:g,onRegenerate:v,onArchive:e=>void T(e),onUnarchive:e=>void E(e),onDelete:e=>void O(e),onSetDefault:e=>void D(e)})}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:()=>p(!0),children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add workspace`]})]}),c&&(0,$.jsx)(`p`,{className:`note${c.bad?` bad`:``}`,role:c.bad?`alert`:`status`,children:c.text}),(0,$.jsx)(Vt,{undo:t.undo,onUndo:t.undoNow,onDismiss:t.dismiss}),f&&(0,$.jsx)(Fm,{onCreate:e=>void S(e),onClose:()=>p(!1)}),h&&(0,$.jsx)(Tt,{title:`Rename ${h.name}`,value:h.name,onCommit:e=>void C(h,e),onClose:()=>g(null)}),_&&(0,$.jsx)(Im,{workspace:_,onRegenerate:()=>void w(_),onClose:()=>v(null)})]})}function Pm(e){let t=t=>t.archived?[{label:`Rename…`,icon:Y.rename,onSelect:()=>e.onRename(t)},{label:`Unarchive`,icon:bn,onSelect:()=>e.onUnarchive(t)},{label:`Delete permanently`,icon:Y.remove,destructive:!0,onSelect:()=>e.onDelete(t)}]:[{label:`Rename…`,icon:Y.rename,onSelect:()=>e.onRename(t)},...t.isDefault?[]:[{label:`Set as default`,icon:Zn,onSelect:()=>e.onSetDefault(t)}],...e.onlyActive?[]:[{label:`Archive`,icon:xn,onSelect:()=>e.onArchive(t)}]];return[{key:`name`,header:`Workspace`,role:`title`,sort:e=>e.name,cell:e=>e.name},{key:`slug`,header:`Address`,sort:e=>e.slug,cell:t=>(0,$.jsxs)(`span`,{className:`ws-address`,children:[(0,$.jsx)(`a`,{className:`ws-addr`,href:Am(t.slug),children:(0,$.jsx)(`code`,{children:Am(t.slug)})}),!t.archived&&Mm(t)&&(0,$.jsxs)(`button`,{type:`button`,className:`ws-regen`,onClick:()=>e.onRegenerate(t),children:[(0,$.jsx)(Wn,{size:12,"aria-hidden":`true`}),`Regenerate…`]})]})},{key:`pipelines`,header:`Pipelines`,sort:e=>e.pipelines,cell:e=>e.pipelines},{key:`runs`,header:`Runs`,sort:e=>e.runs,cell:e=>e.runs},{key:`lastUsed`,header:`Last used`,sort:e=>e.lastUsed??``,cell:e=>zm(e.lastUsed)},{key:`status`,header:`Status`,sort:t=>Rm(t,e.currentSlug),cell:t=>{if(t.archived)return(0,$.jsx)(`span`,{className:`setup-unset`,children:`Archived`});let n=[t.slug===e.currentSlug?`Current`:``,t.isDefault?`Default`:``].filter(Boolean);return n.length?(0,$.jsx)(`span`,{className:t.slug===e.currentSlug?`ws-current`:`setup-unset`,children:n.join(`, `)}):(0,$.jsx)(`span`,{className:`setup-unset`,children:`—`})}},{key:`menu`,header:``,label:``,className:`setup-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{actions:t(e),label:`${e.name} actions`})}]}function Fm({onCreate:e,onClose:t}){let n=Z(),[r]=Q(`promptlab.connections`),i=(0,X.useMemo)(()=>r.list.filter(e=>L().listedConnection(e)),[r.list]),[a,o]=(0,X.useState)(``),[s,c]=(0,X.useState)(``),[l,u]=(0,X.useState)(`nothing`),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)({});(0,X.useEffect)(()=>{let e=!0;return n.connectionShares().then(t=>{e&&f(t.shares)}).catch(()=>{e&&f({})}),()=>{e=!1}},[n]);let h=(0,X.useMemo)(()=>{let e=[];for(let[t,n]of Object.entries(d??{})){if(n.includes(`*all`))continue;let r=t.indexOf(`:`),a=t.slice(0,r),o=t.slice(r+1),s=a===`profile`?i.find(e=>e.id===o)?.name:km[o];s&&e.push({key:t,kind:a,id:o,label:s,prefill:n.includes(Wt)})}return e.sort((e,t)=>e.label.localeCompare(t.label))},[d,i]),g=i.filter(e=>!d?.[`profile:${e.id}`]||d[`profile:${e.id}`].includes(`*all`)).length,_=e=>e.key in p?p[e.key]:e.prefill,v=[{key:`new`,rows:[{key:`name`,label:`Name`,width:`full`,required:!0,control:{type:`text`,value:a,onChange:o}},{key:`slug`,label:`Address`,width:`full`,control:{type:`text`,value:s,placeholder:Am(jm(a)||`workspace`),onChange:e=>c(e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+/,``).slice(0,L().SLUG_MAX))}},{key:`content`,label:`Starting content`,control:{type:`select`,value:l,onChange:e=>u(e),options:[{value:`nothing`,label:`Nothing`},{value:`demo`,label:`Demo pack`}]}}]}];return h.length&&v.push({key:`connections`,title:`Also share`,rows:h.map(e=>({key:e.key,label:e.label,control:{type:`checkbox`,checked:_(e),onChange:t=>m(n=>({...n,[e.key]:t}))}})),...g?{children:(0,$.jsxs)(`p`,{className:`note`,children:[g===1?`1 connection is`:`${g} connections are`,` shared with every workspace.`]})}:{}}),d===null?null:(0,$.jsx)(st,{title:`New workspace`,focusRow:`name`,sections:v,dirty:!!a.trim()||!!s.trim()||l!==`nothing`,adding:!0,onSave:()=>{let n=h.filter(_).map(e=>({kind:e.kind,id:e.id}));e({name:a.trim(),...s.trim()?{slug:s.trim()}:{},content:l,...h.length?{connections:n}:{}}),t()},onClose:t})}function Im({workspace:e,onRegenerate:t,onClose:n}){let r=Am(jm(e.name)||`workspace`);return(0,$.jsx)(R,{title:`Regenerate address`,onClose:n,footer:(0,$.jsxs)(`div`,{className:`edit-actions`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:n,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,onClick:()=>{t(),n()},children:`Regenerate`})]}),children:(0,$.jsxs)(`div`,{className:`ws-regen-dialog`,children:[(0,$.jsxs)(`dl`,{className:`ws-regen-rows`,children:[(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`dt`,{children:`Now`}),(0,$.jsx)(`dd`,{children:(0,$.jsx)(`code`,{children:Am(e.slug)})})]}),(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`dt`,{children:`New`}),(0,$.jsx)(`dd`,{children:(0,$.jsx)(`code`,{children:r})})]})]}),(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:`The old address stops working. Bookmarks and links to it break, and the lab will not redirect them.`})]})})}var Lm=e=>e===1?`1 workspace`:`${e} workspaces`,Rm=(e,t)=>e.archived?`Archived`:[e.slug===t?`Current`:``,e.isDefault?`Default`:``].filter(Boolean).join(`, `),zm=e=>e?St(e)||e:`—`,Bm=[{id:`connections`,label:`Connections`,icon:Bt},{id:`workspaces`,label:`Workspaces`,icon:wn},{id:`wizards`,label:`Wizards`,icon:mt}];function Vm({section:e=`connections`,id:t=null,kind:n}){return(0,$.jsxs)(`div`,{className:`setup`,children:[(0,$.jsx)(tn,{label:`Setup`,level:`section`,className:`setup-sections`,current:e,items:Bm.map(({id:e,label:t,icon:n})=>({key:e,label:t,href:Lr({tab:`setup`,section:e,id:null}),icon:n}))}),(0,$.jsx)(`section`,{className:`setup-section`,"data-section":e,children:e===`wizards`?(0,$.jsx)(Om,{wizardId:t}):e===`workspaces`?(0,$.jsx)(Nm,{}):(0,$.jsx)(Gm,{connectionId:n===`profile`?null:t,profileId:n===`profile`?t:null})})]})}var Hm={tab:`setup`,section:`connections`,id:null},Um=e=>({tab:`setup`,section:`connections`,id:e}),Wm=()=>{let e=Br();e.tab===`setup`&&e.id&&Rr(Hm)};function Gm({connectionId:e=null,profileId:t=null}){let n=er(),r=vo(),i=Z(),a=Je(),{list:o}=po(),s=o.filter(e=>!e.archived).map(e=>({id:e.id,name:e.name})),{sharesFor:c,setFor:l,setForEach:u}=Zp(i),[d,f]=Q(`promptlab.connections`),p=(0,X.useMemo)(()=>d.list.filter(e=>L().listedConnection(e)),[d.list]),[h]=Q(`promptlab.connectionProfiles`),[g]=Q(`promptlab.versions`),[v]=Q(`promptlab.workflows`),{list:y}=yr(),b=y??[],[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),T=(0,X.useRef)(C);T.current=C;let[E,D]=(0,X.useState)(null),[O,k]=(0,X.useState)(null),[A,j]=(0,X.useState)({}),[M,N]=(0,X.useState)(``),[P,F]=(0,X.useState)(`all`),[I,R]=(0,X.useState)({key:`name`,dir:`asc`}),[z,B]=(0,X.useState)([]),[V,ee]=(0,X.useState)(``),[te,ne]=(0,X.useState)({}),[H,U]=(0,X.useState)(()=>new Set),re=(0,X.useRef)(null);(0,X.useEffect)(()=>{let e=!0;return i.presets().then(t=>{e&&B(t)}).catch(()=>{}),i.config().then(t=>{e&&ee(t.ollama??``)}).catch(()=>{}),()=>{e=!1}},[i]);let W=(0,X.useRef)(d);W.current=d;let ie=(0,X.useRef)(!0);(0,X.useEffect)(()=>()=>{ie.current=!1},[]);let ae=[...H].sort().join(`,`);(0,X.useEffect)(()=>{re.current=null},[ae]);let oe=(0,X.useCallback)(e=>{let t=T.current;return t?.p.id===e?t.p:W.current.list.find(t=>t.id===e)},[]),G=(0,X.useCallback)(e=>{let t=T.current;if(t?.p.id!==e.id)return;let n={...t,p:e};T.current=n,w(n)},[]),K=(0,X.useCallback)(()=>{let e=T.current;if(!e)return;let t=W.current,r=e.was?e:{...e,p:{...e.p,name:e.p.name.trim()?e.p.name:vh,slug:_h(e.p.name.trim()||vh,t.list)}},i=r.was?{...t,list:t.list.map(e=>e.id===r.p.id?r.p:e)}:{...t,list:[...t.list,r.p],at:r.p.id};W.current=i,f(i),pr(n,`profile`,r.p.id,r.p,`idle`),w(null),S(null),Wm()},[f,n]),se=(0,X.useCallback)(()=>{w(null),S(null)},[]),ce=(0,X.useCallback)(()=>{se(),Wm()},[se]),q=(0,X.useCallback)(()=>{let e=yh();w({p:e,was:null,start:e}),S({id:``,focus:`name`})},[]),le=(0,X.useCallback)(e=>{let t=W.current.list.find(t=>t.id===e);if(!t)return;let n=`${t.name||`Connection`} copy`,r={...structuredClone(t),id:gh(),name:n,slug:_h(n,W.current.list),key:t.key},i={...W.current,list:[...W.current.list,r]};W.current=i,f(i)},[f]),ue=(0,X.useCallback)(e=>{let t=W.current,n=new Set(e),r=t.list.filter(e=>!n.has(e.id));if(!r.length||r.length===t.list.length)return;let i=n.has(t.at)?r[0].id:t.at,o={...t,list:r,at:i,...t.grader&&n.has(t.grader)?{grader:``}:{}};W.current=o,f(o),S(null),w(null),Wm(),U(new Set);let s=t.list.filter(e=>n.has(e.id));a.offer({label:s.length===1?`Deleted ${s[0].name||`the connection`}`:`Removed ${s.length} connections`,restore:()=>{W.current=t,f(t)}})},[f,a]),de=(0,X.useCallback)(e=>ue([e]),[ue]),fe=(0,X.useCallback)(e=>{let t=e.doc.id,r=W.current.list.find(e=>e.id===t);r&&pr(n,`profile`,t,r,`restore`);let i=L().splitProfile(e.doc).connection,a=W.current,o={...a,list:a.list.map(e=>e.id===t?i:e)};W.current=o,f(o),me()},[n,f]),me=(0,X.useCallback)(()=>{D(e=>(e?.back&&ke(e.id),null))},[]),he=(0,X.useCallback)(async e=>{let t=oe(e);if(!t)return;let n=L().CONNECTION_TYPES[t.type];if(n?.local){j(t=>({...t,[e]:{phase:`connected`,ms:0,lines:[`${n.label} answers each text item with its own text, and sends nothing anywhere.`]}}));return}let r=n?.keyless?``:t.key,a=ch(t,n,V)||`Ollama`,o=performance.now(),s=()=>Math.round(performance.now()-o),c=[];j(t=>({...t,[e]:{phase:`checking`,lines:[`Checking…`]}}));try{let o=((await i.models({url:L().addressOf(t),key:r,type:t.type,settings:lh(t,n)})).data||[]).map(e=>e.id).sort();if(ne(t=>({...t,[e]:o})),c.push(`Reached ${a}.`,`${o.length} ${o.length===1?`model`:`models`}: ${o.join(`, `)||`none`}.`),(n?.answers??[`prompt`]).includes(`prompt`)){if(t.model.trim()){let e=L().apiBase(t.url||n?.url||``),a=L().connectionRequest(t,`hi`,null,e,r),o=await i.modelsAsk({url:L().addressOf(t),key:r,type:t.type,body:a.body}),{raw:s}=L().connectionReply(t,o);c.push(``,`Asked ${t.model} “hi”; it replied:`,s||`(an empty reply)`)}else c.push(``,`No model is picked, so nothing was asked.`)}j(t=>({...t,[e]:{phase:`connected`,lines:c,ms:s()}}))}catch(t){c.push(...c.length?[``]:[],t instanceof Error?t.message:String(t)),j(t=>({...t,[e]:{phase:`error`,lines:c,ms:s()}}))}},[i,oe,V]),ge=(0,X.useCallback)(async e=>{let t=L().CONNECTION_TYPES[e.type],n=t?.keyless?``:e.key,r=ch(e,t,V)||`Ollama`,a=performance.now(),o=()=>Math.round(performance.now()-a);try{let a=await i.models({url:L().addressOf(e),key:n,type:e.type,settings:lh(e,t),quiet:!0});if(a.error)return{state:{phase:`error`,lines:[a.error],ms:o()}};let s=(a.data||[]).map(e=>e.id).sort();return{models:s,state:{phase:`connected`,ms:o(),lines:[`Reached ${r}.`,`${s.length} ${s.length===1?`model`:`models`}: ${s.join(`, `)||`none`}.`]}}}catch(e){return{state:{phase:`error`,lines:[e instanceof Error?e.message:String(e)],ms:o()}}}},[i,V]),_e=(0,X.useCallback)(async e=>{let{state:t,models:n}=await ge(e);ie.current&&(n&&ne(t=>({...t,[e.id]:n})),j(n=>e.id in n?n:{...n,[e.id]:t}))},[ge]),ve=(0,X.useCallback)(e=>{let t=new Set(e),n=W.current.list.filter(e=>t.has(e.id)&&oh(e));if(n.length){j(e=>{let t={...e};for(let e of n)t[e.id]={phase:`checking`,lines:[`Checking…`]};return t});for(let e of n)(async()=>{let{state:t,models:n}=await ge(e);ie.current&&(n&&ne(t=>({...t,[e.id]:n})),j(n=>({...n,[e.id]:t})))})()}},[ge]),ye=(0,X.useCallback)((e,t)=>{if(!e.length)return;re.current||=new Map(e.map(e=>[e,c(`profile`,e)]));let n=re.current;u(`profile`,e.map(e=>({id:e,workspaces:t})));let r=e.length===1?W.current.list.find(t=>t.id===e[0])?.name||`the connection`:`${e.length} connections`;a.offer({label:`Workspaces for ${r}`,restore:()=>{u(`profile`,[...n].map(([e,t])=>({id:e,workspaces:t&&t.length?[...t]:[Ae]}))),re.current=null}})},[c,u,a]),be=(0,X.useRef)(!1),[xe,Se]=(0,X.useState)(!1);(0,X.useEffect)(()=>{if(be.current)return;let e=x?.id,t=t=>p.find(n=>n.id!==e&&!(n.id in A)&&!t.has(n.id)&&oh(n));if(!t(new Set))return;be.current=!0,Se(!0);let n=new Set;(async()=>{for(let e=t(n);e;e=t(n))n.add(e.id),await _e(e);be.current=!1,ie.current&&Se(!1)})()},[A,p,x,_e]);let Ce=x?C?.p:void 0,we=Ce?JSON.stringify([Ce.id,Ce.url,Ce.type,Ce.key]):``;(0,X.useEffect)(()=>{if(!Ce)return;let e=Ce;if(L().CONNECTION_TYPES[e.type]?.local||L().CONNECTION_TYPES[e.type]?.lists===!1)return;let t=L().CONNECTION_TYPES[e.type]?.keyless,n=!0,r=setTimeout(()=>{i.models({url:L().addressOf(e),key:t?``:e.key,type:e.type,quiet:!0}).then(t=>{n&&ne(n=>({...n,[e.id]:(t.data||[]).map(e=>e.id).sort()}))}).catch(()=>{n&&ne(t=>({...t,[e.id]:[]}))})},400);return()=>{n=!1,clearTimeout(r)}},[i,we]);let Te=(0,X.useCallback)((e,t)=>{let n=oe(e);if(!n)return;let r={...n};for(let e of hh(n.type))r[e]=``;for(let[e,n]of Object.entries(t))r[e]=n;G(r)},[oe,G]),Ee=(0,X.useCallback)(e=>{j(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return r})},[]),De=(0,X.useCallback)((e,t,n)=>{let r=oe(e);if(r){if([`url`,`key`,`model`].includes(t)&&Ee(e),t===`name`){let t=W.current.list.filter(t=>t.id!==e);if(!r.slug||r.slug===_h(r.name,t)){G({...r,name:n,slug:_h(n,t)});return}}t===`slug`&&(n=n.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+/,``).slice(0,L().SLUG_MAX)),G({...r,[t]:n})}},[oe,G,Ee]),Oe=(0,X.useCallback)((e,t)=>{let n=oe(e);if(!n)return;let r={...n,type:t};Ee(e),ne(t=>({...t,[e]:[]}));let i=L().CONNECTION_TYPES[t];i?.keyless&&(r.key=``);let a=L().CONNECTION_TYPES[n.type]?.url;(i?.url||a&&r.url.trim()===a)&&(r.url=``);for(let e of Object.keys(r))[`id`,`name`,`slug`,`url`,`model`,`key`,`type`].includes(e)||r[e]===``||hh(t).includes(e)||delete r[e];G(r)},[oe,G,Ee]),ke=(0,X.useCallback)((e,t)=>{let n=W.current.list.find(t=>t.id===e);n&&(w({p:structuredClone(n),was:n,start:n}),S(t?{id:e,focus:t}:{id:e}))},[]),je=(0,X.useCallback)((e,t)=>{ke(e,t),Rr(Um(e))},[ke]);(0,X.useEffect)(()=>{if(!e){T.current?.was&&se();return}T.current?.p.id!==e&&(W.current.list.some(t=>t.id===e)?ke(e):zr(Hm))},[e,ke,se]);let Me=(0,X.useCallback)(e=>g.profile?.[e]??[],[g]),Ne=x?C?.p??null:null,Pe=C?C.was?d.list.map(e=>e.id===C.p.id?C.p:e):[...d.list,C.p]:d.list,Fe=d.grader??null,Le=(0,X.useMemo)(()=>{let e=new Map;for(let t of d.list)e.set(t.id,xp(t.id,v.list,b,h.list));return e},[d.list,v.list,b,h.list]),Re=M.trim().toLowerCase(),ze=p.filter(e=>qm(P,e,A[e.id])&&(!Re||[e.name,e.model].some(e=>String(e??``).toLowerCase().includes(Re)))),Be=new Set(ze.map(e=>e.id)),Ve=ze.filter(e=>H.has(e.id)),He=[...H].filter(e=>!Be.has(e)).length,Ue=[{label:`Test connection`,icon:Bt,disabled:!Ve.some(oh),onSelect:()=>ve(Ve.map(e=>e.id))},{label:`Remove`,icon:Y.remove,destructive:!0,disabled:!Ve.length||Ve.length>=p.length,onSelect:()=>ue(Ve.map(e=>e.id))}],We=H.size>0?(0,$.jsx)(_,{count:H.size,noun:`connection`,hidden:He,actions:Ue,onClear:()=>U(new Set),children:Ve.length>0&&(0,$.jsx)(Ie,{label:Ve.length===1?`1 connection`:`${Ve.length} connections`,workspaces:s,shares:sh(Ve.map(e=>c(`profile`,e.id))),onChange:e=>ye(Ve.map(e=>e.id),e)})}):null;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(J,{id:`setup-ai-connections`,title:`AI Connections`,children:[(0,$.jsxs)(`div`,{className:`setup-intro`,children:[(0,$.jsx)(`p`,{className:`note`,children:`Where the lab sends prompts.`}),xe&&(0,$.jsx)(uh,{})]}),p.length>0&&(0,$.jsx)(pe,{noun:`connections`,search:{label:`Search connections`,placeholder:`Name or model`,value:M,onChange:N},filters:[],quick:{label:`Show`,value:P,onChange:e=>F(e),options:Km}}),p.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No connections yet.`}):ze.length===0?(0,$.jsxs)($.Fragment,{children:[We,(0,$.jsx)(`p`,{className:`note`,children:`No connections match these filters.`})]}):(0,$.jsxs)($.Fragment,{children:[We,(0,$.jsx)(m,{className:`setup-table`,cards:!0,label:`AI Connections`,sort:I,onSort:R,rows:ze,rowKey:e=>e.id,select:{noun:`connection`,label:e=>e.name||`Unnamed connection`,selected:H,onChange:U},rowProps:e=>({className:`setup-row`,onClick:t=>{t.target.closest(`button, a, .menu`)||je(e.id)}}),columns:Jm({tests:A,only:p.length===1,grader:Fe,labOllama:V,uses:e=>Le.get(e)??[],onGrader:e=>{let t=W.current,n={...t,grader:t.grader===e?``:e};W.current=n,f(n)},onOpen:je,onClone:le,link:e=>r(Um(e)),onRemove:de,onTest:he,onResult:e=>k({id:e,back:!1}),workspaces:s,sharesFor:e=>c(`profile`,e),onShare:(e,t)=>l(`profile`,e,t)})})]}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:q,children:[(0,$.jsx)(dt,{size:14,"aria-hidden":`true`}),`Add connection`]})]}),(0,$.jsx)(Np,{profileId:t,connections:d.list,workflows:v.list,groups:b,presets:z,offer:a.offer}),(0,$.jsx)(gm,{}),(0,$.jsx)(tm,{offer:a.offer}),(0,$.jsx)(Qp,{offer:a.offer}),(0,$.jsx)(Vt,{undo:a.undo,onUndo:a.undoNow,onDismiss:a.dismiss}),Ne&&(0,$.jsx)(Qm,{connection:Ne,slug:L().withSlugs(Pe).find(e=>e.id===Ne.id)?.slug??``,...x?.focus?{focus:x.focus}:{},test:A[Ne.id],models:te[Ne.id]??[],canRestore:!!C?.was&&!!Me(Ne.id).length,uses:Le.get(Ne.id)??[],isNew:!C?.was,labOllama:V,dirty:!!C&&JSON.stringify(C.p)!==JSON.stringify(C.start),onSave:K,onClose:ce,...C?.was?{link:r(Um(Ne.id))}:{},onSetting:De,onType:Oe,onTest:he,onResult:()=>{S(null),k({id:Ne.id,back:!0})},onRestore:()=>{se(),D({id:Ne.id,back:!0})},onApplyTemplate:e=>Te(Ne.id,e)}),O&&A[O.id]&&(0,$.jsx)(dh,{test:A[O.id],onClose:()=>{O.back&&T.current?.p.id===O.id&&S({id:O.id}),k(null)}}),E&&(0,$.jsx)(th,{versions:Me(E.id),onClose:me,onRestore:fe})]})}var Km=[{value:`all`,label:`All`},{value:`connected`,label:`Connected`},{value:`attention`,label:`Needs attention`}];function qm(e,t,n){if(e===`all`)return!0;let r=ah(t,n)?.kind;return e===`connected`?r===`connected`:r===`key-needed`||r===`unreachable`}function Jm({tests:e,only:t,grader:n,labOllama:r,onGrader:i,onOpen:a,onClone:o,link:s,onRemove:c,onTest:l,onResult:u,uses:d,workspaces:f,sharesFor:p,onShare:m}){let h=e=>e.name||`Unnamed connection`,g=e=>L().CONNECTION_TYPES[e.type]?.label??e.type,_=r=>[{label:`Edit…`,icon:Y.edit,onSelect:()=>a(r.id)},{label:`Rename…`,icon:Y.rename,onSelect:()=>a(r.id,`name`)},{label:`Clone`,icon:Y.clone,onSelect:()=>o(r.id)},s(r.id),{label:`Test connection`,icon:Bt,busy:e[r.id]?.phase===`checking`,onSelect:()=>void l(r.id)},...(L().CONNECTION_TYPES[r.type]?.answers??[`prompt`]).includes(`prompt`)&&!L().CONNECTION_TYPES[r.type]?.local?[{label:n===r.id?`Stop grading`:`Make grader`,icon:In,onSelect:()=>i(r.id)}]:[],...t?[]:[{label:`Remove`,icon:Y.remove,destructive:!0,onSelect:()=>c(r.id)}]];return[{key:`name`,header:`Connection`,role:`title`,sort:h,cell:t=>{let n=ah(t,e[t.id]);return(0,$.jsxs)(`div`,{className:`setup-profile`,children:[n&&(0,$.jsx)(`button`,{type:`button`,className:`setup-dot ${n.kind}`,title:n.title,"aria-label":`Connection status: ${n.label}`,onClick:()=>{e[t.id]?u(t.id):l(t.id)},children:(0,$.jsx)(`span`,{className:`setup-dot-mark`,"aria-hidden":`true`})}),(0,$.jsxs)(`span`,{className:`setup-profile-main`,children:[(0,$.jsx)(`span`,{className:`setup-profile-name`,children:(0,$.jsx)(`button`,{type:`button`,className:`setup-open`,onClick:()=>a(t.id),children:h(t)})}),(0,$.jsx)(`span`,{className:`setup-sub`,children:g(t)})]})]})}},{key:`endpoint`,header:`Endpoint`,label:``,sort:e=>Xm(e,r),cell:e=>{let t=Xm(e,r);return t?(0,$.jsx)(`span`,{className:`setup-endpoint`,children:Zm(t)}):(0,$.jsx)(`span`,{className:`setup-unset`,children:`—`})}},{key:`model`,header:`Model`,label:``,sort:e=>e.model.trim(),cell:e=>(0,$.jsx)(Ym,{p:e})},{key:`used`,header:`Used by`,label:``,sort:e=>wp(d(e.id)),cell:e=>(0,$.jsx)(Tp,{uses:d(e.id)})},{key:`workspaces`,header:`Workspaces`,sort:e=>Xp(p(e.id)),cell:e=>(0,$.jsx)(Ie,{label:h(e),workspaces:f,shares:p(e.id),onChange:t=>m(e.id,t)})},{key:`menu`,header:``,label:``,className:`setup-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(F,{actions:_(e),label:`${h(e)} actions`})}]}function Ym({p:e}){let t=L().CONNECTION_TYPES[e.type];return t?.local?(0,$.jsx)(`span`,{className:`setup-unset`,children:`—`}):(t?.answers??[`prompt`]).includes(`prompt`)?e.model.trim()?(0,$.jsx)($.Fragment,{children:e.model.trim()}):(0,$.jsx)(`span`,{className:`setup-unset`,children:`(No model)`}):(0,$.jsx)(`span`,{className:`setup-unset`,children:`(From request)`})}function Xm(e,t){let n=L().CONNECTION_TYPES[e.type];return n?.local?``:ch(e,n,t).replace(/^https?:\/\//,``).replace(/\/+$/,``)}function Zm(e){return e.split(/(?=[.:])|(?<=\/)/).flatMap((e,t)=>t?[(0,$.jsx)(`wbr`,{},t),e]:[e])}function Qm({connection:e,slug:t,focus:n,test:r,models:i,canRestore:a,uses:o,isNew:s,labOllama:c,dirty:l,link:u,onSave:d,onClose:f,onSetting:p,onType:m,onTest:h,onResult:g,onRestore:_,onApplyTemplate:v}){let y=L().CONNECTION_TYPES[e.type],b=(y?.answers??[`prompt`]).includes(`prompt`),x=(0,X.useMemo)(()=>eh(e),[e]),S=t=>n=>p(e.id,t,n),C=[{key:`name`,label:`Name`,width:`full`,required:!0,control:{type:`text`,value:e.name,onChange:S(`name`),...s?{placeholder:vh}:{}}},...s?[]:[{key:`slug`,label:`Slug`,width:`full`,required:!0,...e.slug&&L().slugOf(e.slug)!==t?{hint:`Taken`}:{},control:{type:`text`,value:e.slug??``,placeholder:t,onChange:S(`slug`)}}],{key:`type`,label:`Type`,required:!0,hint:y?.description,control:{type:`select`,value:e.type,onChange:t=>m(e.id,t),options:qt(Object.entries(L().CONNECTION_TYPES).filter(([t,n])=>n.picker!==!1||t===e.type).map(([e,t])=>({value:e,label:t.label})))}},...y?.local?[]:[...y?.url?[]:[{key:`url`,label:`Address`,width:`full`,control:{type:`text`,value:e.url,placeholder:c,onChange:S(`url`)}}],...y?.keyless?[]:[{key:`key`,label:`Key`,control:{type:`secret`,value:sp(e.key)?``:e.key,held:sp(e.key),onChange:S(`key`)}}],...b?[{key:`model`,label:`Model`,width:`full`,control:mh(e.model,i,S(`model`))}]:[]]],w={...e},T=(y?.settings??[]).filter(e=>e.scope===`connection`&&(!e.appliesTo||e.appliesTo(w))).map(t=>$m(e,t,S(t.key))),[E]=(0,X.useState)(()=>({address:!!e.url.trim()})),D=!y?.local&&!y?.keyless?[{key:`ci`,label:`CI secret`,hint:`Read during CI runs`,control:{type:`code`,text:L().keyVar(e.id,t)}}]:[],O=[{key:`identity`,rows:C},...T.length?[{key:`settings`,title:`Settings`,rows:T}]:[],...s?[]:[{key:`use`,title:`Use`,rows:D,children:(0,$.jsx)(Ep,{uses:o})}],...y?.url&&!y.local?[{key:`advanced`,title:`Advanced`,folded:!E.address,rows:[{key:`url`,label:`Address`,width:`full`,hint:`For a proxy or gateway`,control:{type:`text`,value:e.url,placeholder:y.url,onChange:S(`url`)}}]}]:[],...y?.local||!b?[]:[{key:`debug`,title:`Debug`,rows:x,folded:!0}]],k=[{label:`Restore…`,icon:ke,disabled:!a,onSelect:_},...u?[u]:[],...(y?.templates??[]).map(e=>({label:`Apply template: ${e.label}`,icon:Y.preset,onSelect:()=>v(e.settings)}))];return(0,$.jsx)(st,{title:e.name||(s?vh:`Unnamed connection`),...n?{focusRow:n}:{},sections:O,menu:k,actions:y?.tests===!1?[]:[{label:`Test connection`,icon:Bt,busy:r?.phase===`checking`,onSelect:()=>h(e.id),outcome:r?{label:nh[r.phase],bad:r.phase===`error`,onOpen:g}:void 0}],dirty:l,adding:s,onSave:d,onClose:f})}function $m(e,t,n){let r=e[t.key]??t.default??``;return t.control===`select`&&t.choices?{key:t.key,label:t.label,control:{type:`select`,value:r,options:t.choices,onChange:n}}:{key:t.key,label:t.label,width:`full`,control:{type:`text`,value:r,onChange:n}}}function eh(e){let t=L().apiBase(e.url),n=[];try{let{url:r,body:i}=L().connectionRequest(e,`(prompt)`,null,t);n.push({key:`endpoint`,label:`Endpoint`,required:!0,control:{type:`code`,text:r}});let a=i,o=a.messages,s=Array.isArray(o?.[0]?.content)?o[0].content.find(e=>e.type===`text`)?.text??``:o?.[0]?.content??``;n.push({key:`prompt`,label:`Prompt`,required:!0,control:{type:`static`,text:String(s).slice(0,40)}}),n.push({key:`image`,label:`Image`,required:!0,control:{type:`code`,text:vp(e)}});for(let[e,t]of Object.entries(a))e!==`messages`&&n.push({key:e,label:e,control:{type:`code`,text:typeof t==`object`?JSON.stringify(t):String(t)}})}catch(e){n.push({key:`error`,label:`Error`,required:!0,control:{type:`static`,text:e instanceof Error?e.message:String(e)}})}return n}function th({versions:e,onClose:t,onRestore:n}){return(0,$.jsx)(R,{title:`Restore connection`,onClose:t,children:(0,$.jsxs)(`div`,{className:`version-list`,children:[e.length===0&&(0,$.jsx)(`p`,{className:`note`,children:`No versions of this connection yet.`}),e.map((e,t)=>(0,$.jsxs)(`div`,{className:`version-row`,children:[(0,$.jsxs)(`span`,{className:`version-when`,children:[xh(e.at),`, `,bh(e.reason)]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>n(e),children:`Restore`})]},`${e.at}-${t}`))]})})}var nh={checking:`Checking…`,connected:`Connected`,error:`Error`},rh={untested:`Not tested`,connected:`Connected`,"key-needed":`Key needed`,unreachable:`Unreachable`},ih=(e,t)=>!t?.keyless&&!e.key&&!t?.keyOptional?.(e);function ah(e,t){let n=L().CONNECTION_TYPES[e.type];if(n?.local||n?.tests===!1)return null;let r=(e,t)=>({kind:e,label:rh[e],title:t?`${rh[e]} — ${t}`:rh[e]});return ih(e,n)?r(`key-needed`,`no key is set`):!t||t.phase===`checking`?r(`untested`):t.phase===`error`?r(`unreachable`,t.lines[t.lines.length-1]):r(`connected`)}function oh(e){let t=L().CONNECTION_TYPES[e.type];return t?.local||t?.tests===!1?!1:!ih(e,t)}function sh(e){if(!e.length)return;let t=Xp(e[0]);return e.every(e=>Xp(e)===t)?e[0]:void 0}var ch=(e,t,n)=>e.url.trim()||t?.url||n;function lh(e,t){let n=Object.fromEntries((t?.settings??[]).map(t=>[t.key,String(e[t.key]??``)]));if(`testPath`in n&&!n.testPath.trim()){let r=t?.templates?.find(t=>fh(t.settings.url,e.url));r?.settings.testPath&&(n.testPath=r.settings.testPath)}return n}function uh(){return we(!0)?(0,$.jsxs)(`span`,{className:`loading-status`,role:`status`,children:[(0,$.jsx)(M,{}),`Checking…`]}):null}function dh({test:e,onClose:t}){return(0,$.jsx)(st,{title:`Test connection`,sections:[{key:`result`,rows:[{key:`time`,label:`Time`,required:!0,control:{type:`static`,text:e.ms==null?`—`:ph(e.ms)}},{key:`result`,label:`Result`,required:!0,control:{type:`textarea`,value:e.lines.join(`
12
- `)}}]}],onClose:t})}function fh(e,t){let n=e=>{let t=String(e??``).trim();if(!t)return``;try{return new URL(/^https?:\/\//.test(t)?t:`https://${t}`).origin}catch{return``}},r=n(e);return!!r&&r===n(t)}var ph=e=>e<1e3?`${e} ms`:`${(e/1e3).toFixed(1)}s`;function mh(e,t,n){return t.length?{type:`picker`,kind:`Model`,value:e,onChange:n,placeholder:`Pick a model`,options:(e&&!t.includes(e)?[e,...t]:[...t]).map(e=>({id:e,label:e}))}:{type:`text`,value:e,placeholder:`model name`,onChange:n}}function hh(e){return L().CONNECTION_TYPES[e]?.settings.filter(e=>e.scope===`connection`).map(e=>e.key)??[]}var gh=()=>`p${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,_h=(e,t)=>L().uniqueSlug(L().slugOf(e),new Set(L().withSlugs(t).map(e=>e.slug))),vh=`New connection`,yh=()=>({id:gh(),name:``,slug:``,url:``,model:``,key:``,nPredict:``,maxTokens:``,type:`ollama`}),bh=e=>e===`run`?`before a run`:e===`restore`?`before a restore`:`after editing`,xh=e=>Ft(e)||e,Sh=[];function Ch(e,t){let n=Z(),[r,i]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(t===null)return;let r=!0,a=nr(n);return a.runDataset(e).then(n=>{if(n){r&&i({run:e,cases:L().upgradeDatasetBody(n).cases,current:!1});return}return a.dataset(t).then(t=>{r&&i({run:e,cases:L().upgradeDatasetBody(t.body).cases,current:!0})}).catch(()=>{})}).catch(()=>{}),()=>{r=!1}},[n,e,t]);let a=t!==null&&r?.run===e?r:null;return{cases:a?a.cases:Sh,current:a?.current??!1}}var wh={};function Th(e){let t=Z(),[n,r]=(0,X.useState)(null);return(0,X.useEffect)(()=>{let n=!0;return t.runGroups(e).then(t=>{if(!n)return;let i={};for(let[e,n]of Object.entries(t??{}))i[e]=L().upgradeDatasetBody(n);r({run:e,groups:i})}).catch(()=>{}),()=>{n=!1}},[t,e]),n?.run===e?n.groups:wh}function Eh(e){let t=(e.metrics??[]).filter(e=>e.weight!==0);return{wanted:t.filter(e=>!e.not&&(e.type===`contains-all`||e.type===`contains-any`)).flatMap(e=>L().metricLines(e.values)),forbidden:t.filter(e=>e.not&&e.type===`contains`).map(e=>({value:String(e.value??``),except:L().metricLines(e.except)}))}}var Dh=e=>e==null?`—`:Ii(e);function Oh(e,t){return t.flatMap((t,n)=>{let r=t.replays?[]:e?.scenarios?.[n]?.res?.transcript||[];return r.filter(e=>e.sent).map(e=>({...e,target:t.name,stages:r.length,at:n}))})}function kh(e){let t=e.trim();if(!/^[[{]/.test(t))return null;try{return{value:JSON.parse(t)}}catch{return null}}function Ah({text:e}){let t=kh(e);if(t)return(0,$.jsx)(E,{value:t.value});let n=/^([A-Z]+ \S+)\n\n([\s\S]*)$/.exec(e),r=n?kh(n[2]):null;return n&&r?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`pre`,{className:`tx-line`,children:n[1]}),(0,$.jsx)(E,{value:r.value})]}):(0,$.jsx)(`pre`,{className:`tx-text`,children:e||`(empty)`})}function jh({label:e,text:t,bad:n}){return(0,$.jsxs)(`div`,{className:`tx-part`,children:[(0,$.jsx)(`span`,{className:`tx-label`,children:e}),n?(0,$.jsx)(`pre`,{className:`tx-text err`,children:t}):(0,$.jsx)(Ah,{text:t})]})}function Mh({stages:e,graders:t}){if(!e.length&&!t.length)return null;let n=[...new Set([...e.map(e=>e.at),...t.map(e=>e.at)])].sort((e,t)=>e-t),r=e=>[e.target,e.stages>1?`job ${e.n}`:``,Dh(e.ms)].filter(Boolean).join(`, `);return(0,$.jsx)(`div`,{className:`transcript`,children:n.flatMap(n=>[...e.filter(e=>e.at===n).map(e=>{let t=e.body??e.said??e.got;return(0,$.jsxs)(`section`,{className:`tx-block`,children:[(0,$.jsx)(`h4`,{className:`tx-head`,children:r(e)}),(0,$.jsx)(jh,{label:`Sent`,text:e.sent??``}),t!=null&&(e.body!=null||!e.error)&&(0,$.jsx)(jh,{label:`Returned`,text:t}),e.error&&(0,$.jsx)(jh,{label:`Error`,text:e.error,bad:!0})]},`s-${n}-${e.n}`)}),...t.filter(e=>e.at===n).map(e=>(0,$.jsxs)(`section`,{className:`tx-block`,id:e.id,tabIndex:-1,children:[(0,$.jsx)(`h4`,{className:`tx-head`,children:e.ms==null?e.head:`${e.head}, ${Dh(e.ms)}`}),e.calls.map((e,t)=>(0,$.jsxs)(`div`,{className:`tx-call`,children:[(0,$.jsx)(jh,{label:`Sent`,text:e.sent}),e.error==null?(0,$.jsx)(jh,{label:`Returned`,text:e.got??``}):(0,$.jsx)(jh,{label:`Error`,text:e.error,bad:!0})]},t))]},e.id))])})}function Nh({text:e,kind:t}){return(0,$.jsx)(`span`,{className:`term${t?` ${t}`:``}`,children:e})}function Ph({res:e,kase:t}){let n=e?.dropped||[];if(!n.length)return null;let r=e=>t?Eh(t).wanted.some(t=>L().termIn([e],t)):!1;return(0,$.jsxs)(`details`,{className:`dropped`,children:[(0,$.jsxs)(`summary`,{children:[`Dropped `,n.length]}),n.map((e,t)=>(0,$.jsxs)(`div`,{className:`droppedrow`,children:[(0,$.jsx)(Nh,{text:e.item,kind:`no`}),(0,$.jsxs)(`span`,{className:`note`,children:[e.by,r(e.item)&&(0,$.jsx)(`b`,{className:`fault`,children:`, wanted`})]})]},t))]})}var Fh=e=>e?.transcript?.at(-1)?.kind===`text`;function Ih(e){let t=e.filteredBy,n=new Set((e?.transcript||[]).map(e=>e.n)).size;return[`${L().FILTER_STAGE_LABEL[t.stage]} filter`,n>1?`job ${t.job}`:``].filter(Boolean).join(`, `)}function Lh({res:e}){let t=e?.filteredBy;return t&&!t.rejected?(0,$.jsxs)(`div`,{className:`meta`,children:[`Emptied by `,t.filter,`, `,Ih(e)]}):null}function Rh({res:e}){let t=e?.filteredBy;return t?.rejected?(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`span`,{className:`err`,children:[`Discarded by `,t.filter]}),(0,$.jsx)(`div`,{className:`meta`,children:Ih(e)})]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`span`,{className:`err`,children:e?.error}),(0,$.jsx)(Lh,{res:e})]})}function zh({res:e}){let t=e?.transcript?.at(-1);return t?.filtered?(0,$.jsxs)(`details`,{className:`dropped`,children:[(0,$.jsxs)(`summary`,{children:[`Filtered by `,t.filtered.by.join(`, `)]}),(0,$.jsx)(`pre`,{children:t.got||`(empty)`})]}):null}function Bh({res:e}){if(e?.error)return(0,$.jsx)(Rh,{res:e});if(Fh(e)){let t=L().gradedText(e);return(0,$.jsxs)($.Fragment,{children:[t?(0,$.jsx)(`pre`,{children:t}):(0,$.jsx)(`div`,{className:`note`,children:`(Empty reply)`}),(0,$.jsx)(Vh,{res:e}),(0,$.jsx)(zh,{res:e})]})}return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`chips`,children:(e?.terms||[]).map((e,t)=>(0,$.jsx)(Nh,{text:String(e)},t))}),(0,$.jsx)(Ph,{res:e,kase:null}),(0,$.jsx)(`div`,{className:`meta`,children:ki((e?.terms||[]).length,`item`)}),(0,$.jsx)(Vh,{res:e}),(0,$.jsx)(zh,{res:e}),(0,$.jsx)(Lh,{res:e})]})}function Vh({res:e}){let t=e?.transcript?.at(-1)?.stopped;if(!t)return null;let n=t.limit==null?``:`${t.limit.toLocaleString(`en-US`)} `;return(0,$.jsxs)(`div`,{className:`reply-stopped`,children:[`Stopped at the `,n,`reply-token limit`]})}function Hh({name:e,asked:t}){return(0,$.jsxs)(`span`,{className:`rr-target`,children:[(0,$.jsxs)(`span`,{children:[e,t&&(0,$.jsx)(`span`,{className:`rr-sep`,children:`,`})]}),t&&(0,$.jsx)(`span`,{className:`rr-asked`,children:t})]})}var Uh=e=>e?{"data-asked":e}:{},Wh=(e,t)=>`${L().targetLetter(t)} ${e.scenarios[t]?.name??``}`.trim(),Gh=e=>e?`${e.passed}/${e.ran}`:(0,$.jsx)(`span`,{className:`note`,children:`n/a`});function Kh({id:e,view:t,pinned:n}){let r=pa(t),i=t.evals.flatMap((e,n)=>{let i=r.rows[n];return[{kind:`group`,key:e.id,name:i?.name??``,verdict:(i?.cells??[]).map(e=>e.pass)},...ya(t,e.id).map(t=>({kind:`metric`,key:`${e.id}:${t.key}`,label:t.label,cells:t.cells}))]});return(0,$.jsx)(`div`,{className:`scrollx`,style:{"--scenarios":t.scenarios.length},children:(0,$.jsx)(m,{className:`egtable recorded`,label:`Evals Summary`,rows:i,rowKey:e=>e.key,defaultSort:null,pinned:n,rowProps:e=>e.kind===`group`?{className:`eg-group`,"data-group":e.key}:{className:`eg-metric`},columns:[{key:`eval`,header:`Eval`,label:``,role:`title`,sort:null,className:`col-eg`,cell:e=>e.kind===`group`?(0,$.jsx)(`span`,{className:`eg-name`,children:e.name}):(0,$.jsx)(`span`,{className:`eg-metric-name`,children:e.label})},...t.scenarios.map((e,n)=>({key:`t-${n}`,header:(0,$.jsx)(Hh,{name:Wh(t,n),asked:t.scenarios[n]?.asked??null}),label:Wh(t,n),tdProps:()=>Uh(t.scenarios[n]?.asked??null),sort:null,cell:e=>e.kind===`group`?e.verdict[n]==null?(0,$.jsx)(`span`,{className:`eg-none`,children:`—`}):(0,$.jsx)(ge,{pass:e.verdict[n]}):Gh(e.cells[n])}))]})})}function qh({view:e,x:t,evalId:n,onClose:r}){let i=e.items[t]??e.results[t]?.name??`Call`;return(0,$.jsx)(R,{title:i,wide:!0,onClose:r,children:(0,$.jsx)(`div`,{className:`rec-compare`,style:{"--scenarios":e.scenarios.length},children:e.scenarios.map((r,i)=>{let a=ga(e.results[t]?.scenarios?.[i]?.res),o=n?_a(e,t,i,n):[];return(0,$.jsxs)(`div`,{className:`rec-side`,children:[(0,$.jsx)(`h3`,{className:`rec-side-title`,children:Wh(e,i)}),(0,$.jsx)(`pre`,{className:`raw`,children:a??`(no reply)`}),o.length>0&&(0,$.jsx)(`ul`,{className:`rec-checks`,"aria-label":`${Wh(e,i)} checks`,children:o.map((e,t)=>(0,$.jsxs)(`li`,{children:[(0,$.jsx)(`span`,{className:`eval-name`,children:e.label}),(0,$.jsx)(ge,{pass:e.pass})]},t))})]},r.id)})})})}function Jh({tab:e,undo:t}){let n=Z(),r=Je(),i=t??r,{setShow:a,openRun:o,closeRun:s}=di(),{openCaseEditor:c}=Zo(),[l,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(!1),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(new Set),[y,b]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!y)return;let e=document.getElementById(y);e&&(vm(e,{preventScroll:!0}),e.scrollIntoView?.({block:`nearest`,behavior:`smooth`}),b(null))},[y,_]);let[x,S]=(0,X.useState)(!1),C=vo(),[w,T]=(0,X.useState)(null),[E,D]=(0,X.useState)(null),[O,k]=(0,X.useState)(0),[A,j]=(0,X.useState)(null),[N,P]=(0,X.useState)(null),I=vr();(0,X.useEffect)(()=>{let t=!0,r=!1,i,a=async()=>{try{let o=await n.run(e.id);if(!t)return;r=!0,d(o),D(null),Qi(o.status)?p(!1):i=setTimeout(()=>void a(),1e3)}catch(e){if(!t)return;r?i=setTimeout(()=>void a(),1e3):D(e instanceof mn?e.message:`Run not loaded: server unreachable.`)}};return a(),()=>{t=!1,i&&clearTimeout(i)}},[n,e.id,O]);let R=(0,X.useMemo)(()=>l?Ca(l):null,[l]),z=R?L().evalsDataset(R.snapshot)?.id??null:null,B=R?ma(R):[],V=B.some(Boolean),ee=ha(B),ne=br(V?z:null),H=Ch(e.id,z),re=Th(e.id),W=(0,X.useMemo)(()=>new Map(H.cases.map(e=>[L().caseItem(e),e])),[H.cases]),ie=(0,X.useCallback)(async()=>{j(null);try{let{run:t}=await n.rerunRun(e.id);o(t.id,{at:t.submittedAt,from:e.from}),i.offer({label:qf(t),restore:()=>{Jf(n,t.id),s(t.id)}})}catch(e){j(`Not re-run: ${e instanceof Error?e.message:`server unreachable`}.`)}},[n,e.id,e.from,o,s,i]),ae=(0,X.useCallback)(async()=>{p(!0);try{d((await n.cancel(e.id)).run)}catch{p(!1)}},[n,e.id]);if(!R)return(0,$.jsx)(J,{id:`run-${e.id}`,title:Oi(e.at)||`Run`,children:(0,$.jsx)(Ot,{label:`Run`,error:E,onRetry:()=>{D(null),k(e=>e+1)}})});let oe=R.progress,K=oe.n??oe.total??0,se=!Qi(R.status),ce=oe.total&&K!=null&&se?Math.round(K/oe.total*100):null,q=Ja(R,H.cases),le=R.scenarios.map((e,t)=>Xa(R,H.cases,t)),ue=se&&(f||$i(l)),de=Ia(R,ue),fe=(e,t,n)=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t),n(r)},me=async(e,t,n)=>{let r=Math.max(0,R.scenarios.findIndex((t,n)=>oa(R,e,n))),i=(t.scenarios??[])[r]?.res;i&&await Ne(Ga(R.snapshot,n,i,r))&&(S(!0),setTimeout(()=>S(!1),1600))},he=async()=>{let e=q.map(e=>Ga(R.snapshot,e.kase,e.res,e.scenarioIndex)).join(`
13
-
14
- `+`-`.repeat(60)+`
15
-
16
- `);await Ne(e)&&(S(!0),setTimeout(()=>S(!1),1600))},ge=[C({tab:`results`,id:e.id}),...q.length?[{label:`Copy all failures`,icon:U,onSelect:()=>void he()}]:[],...l&&Kf(l)?[{label:`Re-run`,icon:qn,onSelect:()=>void ie()}]:[],...l?[{label:`Export JSON`,icon:Y.export,onSelect:()=>to(new Blob([JSON.stringify({exported:new Date().toISOString(),runs:[l]},null,2)],{type:`application/json`}),eo(`run`,Oi(e.at)||e.id,18,`json`))}]:[],{label:`Export PDF…`,icon:Un,onSelect:()=>window.print()}],_e={label:`Show`,value:e.show,onChange:t=>a(e.id,t),options:[{value:`all`,label:`All`},{value:`failed`,label:`Failed`}]},ve=R.evals.find(e=>L().casesRef(e))?.id??null,ye=!!(R.content&&L().CONTENT_TYPES[R.content.type]?.inline),be=R.scenarios.map((e,t)=>V?Wh(R,t):e.name),xe=be.map((e,t)=>({name:e,replays:!!B[t]})),Se=e=>{let t=R.results[e]?.name;return t?W.get(t):void 0},Ce=(e,t)=>{let n=R.evals.find(t=>t.id===e);return n?xa(n,R.results[t]?.name,re,H.cases,z):[]},we=R.scenarios.length>1&&(0,$.jsxs)(`tr`,{className:`scenstats`,children:[(0,$.jsx)(`td`,{className:`scenstats-label`,children:`Statistics`}),R.scenarios.map((e,t)=>(0,X.createElement)(`td`,{className:`scenstat`,"data-label":be[t],...Uh(e.asked),key:e.id},(0,$.jsx)(gi,{dense:!0,label:`${e.name} statistics`,...Pa(R,t)})))]}),Te=(e,t)=>{let n=ne?.doc?.body;if(!z||!n||ee<0)return;let{body:r,taken:a}=L().takeAsExpected(n,{[e]:ga(R.results[t]?.scenarios?.[ee]?.res)});if(!a.length){j(`Not taken: ${e} has no Target B reply to take.`);return}j(null),I.edit(z,()=>r),i.offer({label:`Took ${e} as expected`,restore:()=>I.edit(z,()=>n)})},Ee=(t,n,r,i)=>`run-${e.id}-grader-${t}-${n}-${r}-${i}`,De=e=>R.scenarios.flatMap((t,n)=>(R.outcomes[n]??[]).filter(e=>!e.whole).flatMap(t=>{let r=t.items[e];if(!r||L().isSkipped(r)||!r.metrics?.length)return[];let i=Sa(r.metrics,Ce(t.id,e));return r.metrics.flatMap((r,a)=>r.calls?.length?[{id:Ee(e,n,t.id,a),at:n,head:[`${r.label}${i[a]?` ${i[a]}`:``}`,be[n]??``].filter(Boolean).join(`, `),ms:r.asked??null,calls:r.calls}]:[])})),Oe=(e,t,n,r)=>{_.has(e)||v(new Set(_).add(e)),b(Ee(e,t,n,r))},ke=t=>{let r=R.results[t],i=Se(t),a=!!r&&!r.unrun&&Qi(R.status),o=[];if((Oh(r,xe).length||De(t).length)&&o.push(_.has(t)?{label:`Hide details`,icon:Kt,onSelect:()=>fe(_,t,v)}:{label:`Show details`,icon:u,onSelect:()=>fe(_,t,v)}),a&&r?.name&&i&&o.push({label:`Edit case`,icon:Y.edit,onSelect:()=>z&&c(r.name,{dataset:z,resultFor:e=>R.results[t]?.scenarios?.[e]?.res??null,scenarioCount:R.scenarios.length,files:R.results.filter(e=>e.kind!==`text`).map(e=>e.name??``)})}),a&&V&&ee>=0&&r?.name){let e=r.name;o.push({label:`Take B as expected`,icon:te,onSelect:()=>Te(e,t)})}return a&&R.id&&o.push({label:`Re-run row`,icon:Ve,onSelect:()=>void n.rerun(e.id,t).then(e=>d(e.run)).catch(()=>{})}),a&&i&&Yh(R,t)&&o.push({label:`Copy as AI prompt`,icon:U,onSelect:()=>void me(t,r,i)}),o};return(0,$.jsxs)(`div`,{className:`runview`,children:[(0,$.jsxs)(J,{id:`run-${e.id}`,title:R.name||Oi(e.at),actions:ge,children:[(0,$.jsxs)(`div`,{className:`runhead`,children:[de&&(0,$.jsxs)(`span`,{className:`note run-queue`,children:[(0,$.jsx)(`span`,{className:`run-state`,children:de.state}),de.detail&&(0,$.jsx)(`span`,{className:`run-item`,children:de.detail})]}),se&&(0,$.jsx)(`button`,{type:`button`,className:`ghost stop-btn`,disabled:ue,"aria-busy":ue||void 0,onClick:()=>void ae(),children:ue?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(M,{}),`Stopping…`]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(nt,{size:14,"aria-hidden":`true`}),`Stop`]})})]}),se&&(0,$.jsx)(`div`,{className:`rrbar`,children:ce==null?(0,$.jsx)(`span`,{className:`rrprogress`,children:`Waiting`}):(0,$.jsxs)(`div`,{className:`rrmeter`,role:`progressbar`,"aria-valuenow":ce,"aria-valuemin":0,"aria-valuemax":100,children:[(0,$.jsx)(`div`,{className:`rrbarfill`,style:{width:`${ce}%`}}),(0,$.jsxs)(`span`,{className:`rrpct`,style:{"--pct":`${ce}%`},children:[ce,`%`]})]})}),l?.rerunOf&&(0,$.jsxs)(`p`,{className:`note rrorigin`,children:[`Re-run of`,` `,l.rerunOfAt?(0,$.jsx)(`a`,{href:`#`,onClick:t=>{t.preventDefault(),o(l.rerunOf,{at:l.rerunOfAt,from:e.from})},children:Oi(l.rerunOfAt)}):`a cleared run`]}),R.error&&(0,$.jsx)(`p`,{className:`note bad rrstatus`,role:`status`,children:R.error}),A&&(0,$.jsx)(`p`,{className:`note bad rrstatus`,role:`status`,children:A}),(0,$.jsx)(`div`,{id:`run-${e.id}-stats`,className:`runstats`,children:(0,$.jsx)(gi,{label:`Run Statistics`,...Ma(R,ue)})}),x&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:`Copied to clipboard.`})]}),V?(0,$.jsx)(J,{id:`run-${e.id}-evals`,title:`Evals Summary`,children:(0,$.jsx)(Kh,{id:`run-${e.id}-evals-t`,view:R,pinned:we})}):(0,$.jsx)(Zh,{id:`run-${e.id}-evals`,summary:pa(R),scenarios:R.scenarios,pinned:we,onScenario:T}),(0,$.jsxs)(J,{id:`run-${e.id}-results`,title:`Results`,children:[(0,$.jsx)(pe,{noun:`results`,filters:[],quick:_e}),H.current&&(0,$.jsx)(`p`,{className:`note`,children:`Graded against today's dataset.`}),(0,$.jsx)(`div`,{className:`scrollx`,style:{"--scenarios":R.scenarios.length},children:(0,$.jsx)(m,{className:[V?`recorded`:``,`rrtable`].filter(Boolean).join(` `),defaultSort:null,label:`Results`,rows:R.items.map((e,t)=>t),rowKey:e=>`${R.items[e]}-${e}`,pinned:le.some(e=>e.length>0)&&z&&(0,$.jsx)(Xh,{from:Oi(e.at)||R.name,datasetId:z,failing:le,scenarios:R.scenarios,heads:be,items:R.items.length}),rowProps:t=>({"data-item":t,className:_.has(t)?`hasdetail`:void 0,hidden:e.show===`failed`&&!Yh(R,t)}),after:t=>_.has(t)&&(0,$.jsx)(`tr`,{className:`rrdetail`,"data-detail":t,hidden:e.show===`failed`&&!Yh(R,t),children:(0,$.jsx)(`td`,{colSpan:1+R.scenarios.length,children:(0,$.jsxs)(`div`,{className:`rrdetail-panel`,children:[(0,$.jsx)(`button`,{type:`button`,className:`icon-btn rrdetail-x`,"aria-label":`Hide details`,onClick:()=>fe(_,t,v),children:(0,$.jsx)(G,{size:16,"aria-hidden":`true`})}),(0,$.jsx)(Mh,{stages:Oh(R.results[t],xe),graders:De(t)})]})})}),columns:[{key:`item`,header:ye?`Text`:`Item`,label:``,className:`col-item`,sort:e=>R.items[e]||``,cell:e=>{let t=R.results[e],n=R.items[e],r=tg(R.items,e);return(0,$.jsxs)($.Fragment,{children:[t?.name&&!ye&&Bo(t.name)?(0,$.jsx)(`button`,{type:`button`,className:`thumb`,"aria-label":`Open ${t.name}`,onClick:()=>g(t.name),children:(0,$.jsx)(`img`,{src:Ra(R,t.name),alt:``,loading:`lazy`,"data-name":t.name})}):null,(0,$.jsxs)(`div`,{className:`rritem`,children:[V&&t?.name?(0,$.jsx)(`button`,{type:`button`,className:`rrcall`,title:n||void 0,onClick:()=>P(e),children:n||``}):(0,$.jsx)(`div`,{className:`meta rrname`,title:n||void 0,children:n||``}),r&&(0,$.jsx)(`span`,{className:`rrloop`,children:r}),(0,$.jsx)(F,{actions:ke(e),label:`${n||`row`} actions`})]})]})}},...R.scenarios.map((e,t)=>({key:`scenario-${t}`,header:(0,$.jsx)(Hh,{name:be[t]??e.name,asked:e.asked}),label:be[t]??e.name,tdProps:()=>Uh(e.asked),onHeader:()=>T(t),cell:e=>(0,$.jsx)(Qh,{item:R.results[e],i:t,readings:(R.outcomes[t]??[]).filter(e=>!e.whole).map(n=>({label:n.label,dataset:n.id===ve,score:n.items[e]??null,metrics:Ce(n.id,e),open:r=>Oe(e,t,n.id,r)}))})}))]})})]}),w!=null&&(0,$.jsx)(It,{run:R.snapshot,i:w,onClose:()=>T(null)}),N!=null&&(0,$.jsx)(qh,{view:R,x:N,evalId:ve,onClose:()=>P(null)}),h&&(0,$.jsx)(rg,{src:za(R,h),name:h,onClose:()=>g(null)})]})}var Yh=(e,t)=>{let n=e.results[t];return!!n&&(!!n.unrun||(n.scenarios??[]).some((n,r)=>oa(e,t,r)||!!n?.res?.error))};function Xh({from:e,datasetId:t,failing:n,scenarios:r,heads:i,items:a}){let{showCases:o}=ci(),{list:s}=yr(),c=s!==null&&!s.some(e=>e.id===t),l=r.length>1;return(0,$.jsxs)(`tr`,{className:`reasons`,children:[(0,$.jsx)(`td`,{className:`scenstats-label`,children:`Reasons`}),r.map((r,s)=>{let u=r.name,d=n[s]??[];return(0,$.jsx)(`td`,{className:`reasons-cell`,"data-label":i[s]??u,children:d.length===0?(0,$.jsx)(`span`,{className:`reasons-none`,children:`No failures`}):(0,$.jsx)(`ul`,{className:`reasons-list`,"aria-label":`${u} reasons`,children:d.map(n=>{let r=n.files.length,i=(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`span`,{className:`reason-n`,children:r}),(0,$.jsxs)(`span`,{className:`reason-t`,children:[n.label,n.note&&(0,$.jsxs)(`span`,{className:`reason-note`,children:[` `,n.note]})]})]});return(0,$.jsx)(`li`,{"data-group":n.key,style:{"--share":`${Math.round(r/Math.max(a,1)*100)}%`},children:c?(0,$.jsx)(`span`,{className:`reason`,children:i}):(0,$.jsx)(`a`,{className:`reason`,href:`#/library/datasets`,title:`${n.label}${n.note?` (${n.note})`:``}: open ${ki(r,`case`)} in the Library`,"aria-label":`${n.label}: open ${ki(r,`case`)} in the Library`,onClick:r=>{r.preventDefault(),o(t,n.files,`${e}${l?`, ${u}`:``}, ${n.label}`)},children:i})},n.key)})})},r.id)})]})}function Zh({id:e,summary:t,scenarios:n,pinned:r,onScenario:i}){let a=[...t.rows.map(e=>({kind:`group`,group:e})),...t.overall?[{kind:`overall`,...t.overall}]:[]],o=(e,t)=>e==null&&t==null?(0,$.jsx)(`span`,{className:`eg-none`,children:`—`}):(0,$.jsxs)(`span`,{className:`eg-cell`,children:[e!=null&&(0,$.jsx)(ge,{pass:e}),t!=null&&(0,$.jsxs)(`span`,{className:`eg-pct`,children:[t,`%`]})]});return(0,$.jsx)(J,{id:e,title:`Evals Summary`,children:(0,$.jsx)(`div`,{className:`scrollx`,style:{"--scenarios":n.length},children:(0,$.jsx)(m,{className:`egtable`,label:`Evals Summary`,rows:a,rowKey:e=>e.kind===`group`?e.group.key:`overall`,defaultSort:null,pinned:r,rowProps:e=>e.kind===`overall`?{className:`eg-overall`,"data-group":`overall`}:{"data-group":e.group.key},columns:[{key:`group`,header:`Eval group`,label:``,role:`title`,sort:null,className:`col-eg`,cell:e=>e.kind===`group`?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`span`,{className:`eg-name`,children:e.group.name}),e.group.version&&(0,$.jsxs)(`span`,{className:`eg-ver`,children:[` `,e.group.version]})]}):(0,$.jsxs)(`span`,{className:`eg-overall-name`,children:[(0,$.jsx)(`span`,{className:`eg-name`,children:`Overall`}),` `,(0,$.jsx)(`span`,{className:`eg-rule`,children:e.label})]})},...n.map((e,t)=>({key:`scenario-${t}`,header:(0,$.jsx)(Hh,{name:e.name,asked:e.asked}),label:e.name,tdProps:()=>Uh(e.asked),onHeader:()=>i(t),cell:e=>{if(e.kind===`overall`)return o(e.pass[t]??null,e.pct[t]??null);let n=e.group.cells[t];return n?n.skipped?(0,$.jsx)(`span`,{className:`eg-none`,children:`Skipped`}):o(n.pass,n.pct):null}}))]})})})}function Qh({item:e,i:t,readings:n}){let r=e?.scenarios?.[t]?.res;return e?.unrun?(0,$.jsx)(`span`,{className:`err`,children:e.unrun}):r?(0,$.jsxs)($.Fragment,{children:[n.map((e,t)=>e.score&&(0,$.jsx)($h,{reading:e,score:e.score},t)),(0,$.jsx)(Bh,{res:r})]}):(0,$.jsx)(`span`,{className:`spin`,"aria-hidden":`true`})}function $h({reading:e,score:t}){let n=L().isSkipped(t),r=!n&&t.metrics?.length?t:null,i=r?Sa(r.metrics,e.metrics):[],a=(r?.metrics??[]).map((t,n)=>({m:t,want:i[n]??null,open:t.calls?.length?()=>e.open(n):null})),o=a.filter(({m:e})=>e.weight!==0),s=a.filter(({m:e})=>e.weight===0),c=!n&&!!t.points&&t.pass,l=n?`Skipped`:t.pass?`Pass`:`Fail`;return(0,$.jsxs)(`div`,{className:`eval-block`,children:[(0,$.jsxs)(`div`,{className:`eval-head`,children:[(0,$.jsx)(`span`,{className:`eval-group`,children:e.label}),(0,$.jsx)(`span`,{className:`verdict ${l.toLowerCase()}`,children:l}),!n&&t.score!=null&&r&&(0,$.jsx)(`span`,{className:`metric-score`,children:ng(t.score,!!t.points)})]}),o.length>0&&(0,$.jsx)(eg,{lines:o,spared:c}),s.length>0&&(0,$.jsxs)(`div`,{className:`watched`,children:[(0,$.jsx)(`b`,{children:`Watch`}),(0,$.jsx)(eg,{lines:s,spared:!1})]})]})}function eg({lines:e,spared:t}){return(0,$.jsx)(`ul`,{children:e.map(({m:e,want:n,open:r},i)=>{let a=(0,$.jsxs)($.Fragment,{children:[e.label,n&&` ${n}`]}),o=!r&&!e.pass&&!!L().METRICS[e.type]?.graded,s=t&&!e.pass;return(0,$.jsxs)(`li`,{className:e.pass?`pass`:s?`nil`:`fail`,children:[s?(0,$.jsx)(`span`,{className:`mark nil`,role:`img`,"aria-label":`No points`,children:`–`}):(0,$.jsx)(ge,{pass:e.pass}),(0,$.jsxs)(`span`,{className:`metric-line`,children:[r?(0,$.jsx)(`button`,{type:`button`,className:`metric-open`,onClick:r,children:a}):(0,$.jsx)(`span`,{className:`metric-words`,children:a}),(r||o)&&e.reason&&(0,$.jsx)(`span`,{className:o?`metric-reason err`:`metric-reason`,children:e.reason})]})]},i)})})}function tg(e,t){let n=e[t];if(n==null)return null;let r=0,i=0;return e.forEach((e,a)=>{e===n&&(r++,a<=t&&i++)}),r>1?`${i} of ${r}`:null}var ng=(e,t)=>{let n=Math.round(e*100)/100;return t?`${n} ${n===1?`point`:`points`}`:`${Math.round(e*100)}%`};function rg({src:e,name:t,onClose:n}){return(0,$.jsx)(R,{title:t||`Image`,onClose:n,children:(0,$.jsx)(`img`,{className:`lightbox-img`,src:e,alt:t})})}function ig(){let{tabs:e,focusedId:t,closeRun:n,focusRun:r,goBack:i}=di(),a=Je(),o=e.find(e=>e.id===t);return o?(0,$.jsxs)(`div`,{className:`results`,role:`region`,"aria-label":`Open runs`,children:[(0,$.jsxs)(`div`,{className:`results-bar`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost icon-btn rrback`,onClick:i,"aria-label":`Back`,children:(0,$.jsx)(ot,{size:18,"aria-hidden":`true`})}),(0,$.jsx)(`code`,{className:`rrcode`,children:Oi(o.at)||`…`}),(0,$.jsx)(`div`,{className:`rtabs`,role:`tablist`,"aria-label":`Open runs`,children:e.map(e=>(0,$.jsxs)(`div`,{className:`rtab${e.id===t?` on`:``}`,children:[(0,$.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":e.id===t,className:`rname`,title:Oi(e.at)||`run`,onClick:()=>r(e.id),children:Oi(e.at)||`…`}),(0,$.jsx)(`button`,{type:`button`,className:`rx`,"aria-label":`Close`,onClick:()=>n(e.id),children:(0,$.jsx)(G,{size:14,"aria-hidden":`true`})})]},e.id))})]}),(0,$.jsx)(Jh,{tab:o,undo:a}),(0,$.jsx)(Vt,{undo:a.undo,onUndo:a.undoNow,onDismiss:a.dismiss})]}):null}function ag(){let e=vr(),t=(0,X.useSyncExternalStore)(e.subscribe,e.held),n=t.filter(e=>e.sync.state===`conflict`),r=t.filter(e=>e.sync.state===`offline`);return!n.length&&!r.length?null:(0,$.jsxs)($.Fragment,{children:[n.map(t=>(0,$.jsxs)(`div`,{className:`sync bad`,role:`alert`,children:[(0,$.jsxs)(`span`,{children:[t.doc?.name??t.id,` changed in another browser.`]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.resolve(t.id,`theirs`),children:`Use theirs`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.resolve(t.id,`mine`),children:`Keep mine`})]},t.id)),r.map(t=>(0,$.jsxs)(`div`,{className:`sync bad`,role:`status`,children:[(0,$.jsxs)(`span`,{children:[t.doc?.name??t.id,` not saved: `,t.sync.state===`offline`?t.sync.message.replace(/\.$/,``):``,`.`]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.flush(t.id),children:`Retry`})]},t.id))]})}function og(){let e=xs(),t=(0,X.useSyncExternalStore)(e.subscribe,e.held),n=t.filter(e=>e.sync.state===`conflict`),r=t.filter(e=>e.sync.state===`offline`);return!n.length&&!r.length?null:(0,$.jsxs)($.Fragment,{children:[n.map(t=>(0,$.jsxs)(`div`,{className:`sync bad`,role:`alert`,children:[(0,$.jsxs)(`span`,{children:[t.doc?.name??t.id,` changed in another browser.`]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.resolve(t.id,`theirs`),children:`Use theirs`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.resolve(t.id,`mine`),children:`Keep mine`})]},t.id)),r.map(t=>(0,$.jsxs)(`div`,{className:`sync bad`,role:`status`,children:[(0,$.jsxs)(`span`,{children:[t.doc?.name??t.id,` not saved: `,t.sync.state===`offline`?t.sync.message.replace(/\.$/,``):``,`.`]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.flush(t.id),children:`Retry`})]},t.id))]})}var sg=`promptlab.theme`,cg=typeof matchMedia==`function`?matchMedia(`(prefers-color-scheme: light)`):null;function lg(){try{let e=JSON.parse(localStorage.getItem(sg)||`null`)?.choice;return e===`light`||e===`dark`?e:null}catch{return null}}var ug=()=>lg()??`system`,dg=()=>lg()??(cg?.matches?`light`:`dark`),fg=()=>{let e=dg();return document.documentElement.setAttribute(`data-theme`,e),e};fg();function pg(e){try{e===`system`?localStorage.removeItem(sg):localStorage.setItem(sg,JSON.stringify({choice:e}))}catch{}fg()}function mg(){let[e,t]=(0,X.useState)(ug);return(0,X.useEffect)(()=>{let e=()=>{fg(),t(ug())};return cg?.addEventListener?.(`change`,e),()=>cg?.removeEventListener?.(`change`,e)},[]),[e,e=>{pg(e),t(e)}]}var hg=()=>{let{route:e,rewrite:t}=Fr(location.hash);return t&&history.replaceState(null,``,t),e};function gg(){return(0,$.jsx)(He,{children:(0,$.jsx)(_r,{children:(0,$.jsx)(bs,{children:(0,$.jsx)(Dr,{children:(0,$.jsx)(ui,{children:(0,$.jsx)(si,{children:(0,$.jsx)(Xo,{children:(0,$.jsx)(Cm,{children:(0,$.jsx)(go,{children:(0,$.jsx)(_g,{})})})})})})})})})})}function _g(){let[e,t]=(0,X.useState)(hg),n=(0,X.useRef)(e);n.current=e;let{hide:r,tabs:i,focusedId:a,openRun:o,focusRun:s}=di(),c=(0,X.useRef)(i);c.current=i;let l=po(),u=Z(),d=Je();(0,X.useEffect)(()=>{let e=()=>{let e=hg();t(e),e.tab!==`results`&&r()};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[r]);let f=e.tab===`results`?e.id:null;if((0,X.useEffect)(()=>{if(!f)return;if(c.current.some(e=>e.id===f)){s(f);return}let e=!0;return u.run(f).then(t=>{e&&o(f,{at:t.submittedAt,from:`history`})},t=>{e&&(t instanceof mn&&t.status===404?(zr({tab:`history`}),d.notify({label:oo(`run`,f,l.current)})):o(f,{from:`history`}))}),()=>{e=!1}},[f,u,o,s,d.notify,l.current]),(0,X.useEffect)(()=>{let e=n.current;a&&(e.tab!==`results`||e.id!==a)&&Rr({tab:`results`,id:a})},[a]),(0,X.useEffect)(()=>{document.title=l.current?`${l.current.name}, Evals Lab`:`No workspace, Evals Lab`},[l.current]),(0,X.useEffect)(()=>{let e=lo();e&&d.offer({label:`Archived ${e.name}`,restore:()=>u.unarchiveWorkspace(e.id).then(()=>{location.assign(ao(e.slug))})})},[]),!l.current)return(0,$.jsx)(xg,{ws:l});let p=e.tab===`results`?i.find(t=>t.id===e.id)?.from??`history`:e.tab,m=Za.find(e=>e.id===p),h=l.current.archived;return(0,$.jsxs)(`div`,{className:`app`,children:[(0,$.jsxs)(`header`,{className:`app-head`,children:[(0,$.jsx)(`h1`,{children:`Evals Lab`}),(0,$.jsx)(Cg,{}),(0,$.jsx)(ag,{}),(0,$.jsx)(og,{}),(0,$.jsx)(vg,{}),(0,$.jsx)(ze,{}),(0,$.jsx)(yg,{ws:l})]}),(0,$.jsx)(ft,{}),(0,$.jsx)(Vt,{undo:d.undo,notice:d.notice,onUndo:d.undoNow,onDismiss:d.dismiss}),h&&(0,$.jsx)(bg,{id:l.current.id}),(0,$.jsx)(tn,{label:`Lab`,className:`app-tabs`,tablist:!0,current:p,items:Za.map(e=>({key:e.id,label:e.label,href:`#/${e.id}`,icon:e.icon,id:`tab-${e.id}`,controls:`panel-${e.id}`}))}),(0,$.jsx)(Sg,{tab:m,route:e,readOnly:h})]})}function vg(){let{cancel:e}=wm(),t=Tm();return t?(0,$.jsx)(c,{name:t.entry.title,done:t.done,total:t.total,current:t.current,steps:t.entry.steps.map((e,n)=>({title:e.title,done:t.ticks[n]})),onOpen:()=>Rr({tab:`setup`,section:`wizards`,id:t.entry.id}),onCancel:e}):null}function yg({ws:e}){let t=Z(),[n,r]=mg(),[i,a]=(0,X.useState)(!1),o=e.list.filter(e=>!e.archived).map(e=>({id:e.id,slug:e.slug,name:e.name})),s=async e=>{try{let n=await t.createWorkspace(e);n.workspace&&location.assign(ao(n.workspace.slug))}catch{}};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Xt,{current:e.current?{id:e.current.id,slug:e.current.slug,name:e.current.name}:null,workspaces:o,onSwitch:e.switchTo,onNew:()=>a(!0),onManage:()=>Rr({tab:`setup`,section:`workspaces`,id:null}),theme:n,onTheme:r}),i&&(0,$.jsx)(Fm,{onCreate:e=>void s(e),onClose:()=>a(!1)})]})}function bg({id:e}){let t=Z(),[n,r]=(0,X.useState)(!1),i=async()=>{r(!0);try{await t.unarchiveWorkspace(e),location.reload()}catch{r(!1)}};return(0,$.jsxs)(`div`,{className:`ws-archived-bar`,role:`status`,children:[(0,$.jsx)(`span`,{children:`This workspace is archived — read-only until you unarchive it.`}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,disabled:n,onClick:()=>void i(),children:[(0,$.jsx)(bn,{size:14,"aria-hidden":`true`}),`Unarchive`]})]})}function xg({ws:e}){let t=uo(e.list);return(0,$.jsxs)(`div`,{className:`app`,children:[(0,$.jsxs)(`header`,{className:`app-head`,children:[(0,$.jsx)(`h1`,{children:`Evals Lab`}),(0,$.jsx)(yg,{ws:e})]}),(0,$.jsxs)(`main`,{className:`ws-gone`,children:[(0,$.jsxs)(`p`,{role:`alert`,children:[`No workspace at `,(0,$.jsxs)(`code`,{children:[`/w/`,e.requestedSlug]}),`.`]}),t&&(0,$.jsxs)(`button`,{type:`button`,onClick:()=>e.switchTo(t.slug),children:[`Open `,t.name]})]})]})}function Sg({tab:e,route:t,readOnly:n}){let{focusedId:r}=di(),i=r?(0,$.jsx)(ig,{}):e.id===`home`?(0,$.jsx)(zd,{}):e.id===`runs`?(0,$.jsx)(Bf,{pipelineId:t.tab===`runs`?t.id:null}):e.id===`history`?(0,$.jsx)(tp,{...t.tab===`history`?{pipeline:t.pipeline,content:t.content}:{}}):t.tab===`library`?(0,$.jsx)(Nd,{section:t.section,id:t.id}):t.tab===`setup`?(0,$.jsx)(Vm,{section:t.section,id:t.id,...t.kind?{kind:t.kind}:{}}):null,a=n&&e.id!==`setup`;return(0,$.jsx)(`main`,{role:`tabpanel`,id:`panel-${e.id}`,"aria-labelledby":`tab-${e.id}`,"data-tab":e.id,inert:a,children:i})}function Cg(){let{sync:e,resolve:t}=tr();return e.state===`offline`?(0,$.jsxs)(`p`,{className:`sync bad`,role:`status`,children:[`Not saved to the server: `,e.message,`. Kept in this browser.`]}):e.state===`conflict`?(0,$.jsxs)(`div`,{className:`sync bad`,role:`alert`,children:[(0,$.jsx)(`span`,{children:`Changed on another device.`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void t(`theirs`),children:`Use theirs`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void t(`mine`),children:`Keep mine`})]}):null}var wg=`promptlab.sync`,Tg=new Set([`promptlab.workflows`,`promptlab.versions`,wg]),Eg=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Dg=(e,t)=>{let n=cp[e];return Eg(n)&&Eg(t)?{...n,...t}:t};function Og({api:e,storage:t,server:n,workspace:r,pause:i=800}){let a=e=>r&&Tg.has(e)?`${e}@${r}`:e,o=e=>{try{return t.getItem(a(e))}catch{return null}},s=new Map,c=(e,n)=>{s.delete(e);try{n==null?t.removeItem(a(e)):t.setItem(a(e),JSON.stringify(n))}catch{}s.set(e,n??null)},l=e=>{try{return JSON.parse(o(e)??`null`)}catch{return null}},u=(e,t)=>o(e)===(t==null?null:JSON.stringify(t)),d=n!==null,f=l(wg)??{},p={},m=new Set,h=()=>c(wg,{versions:p,dirty:[...m]}),g=new Set,_=()=>g.forEach(e=>e()),v=d?{state:`saved`}:{state:`local`},y=null,b=null,x=e=>{v=e,_()};if(n){for(let e of up){let t=n[e];t&&u(e,t.body)?p[e]=t.version:f.dirty?.includes(e)?(p[e]=f.versions?.[e]??0,m.add(e)):t?(p[e]=t.version,c(e,t.body)):(p[e]=0,o(e)!=null&&m.add(e))}h()}async function S(t=!1){if(!d||v.state===`conflict`)return;if(!m.size){v.state===`saving`&&x({state:`saved`});return}let n=[...m],r=Object.fromEntries(n.map(e=>[e,{version:p[e]??0,body:l(e)}]));x({state:`saving`});try{let{versions:i}=await e.writeState(r,t);Object.assign(p,i);for(let e of n)u(e,r[e].body)&&m.delete(e);if(h(),x({state:`saved`}),m.size)return S(t)}catch(e){if(e instanceof mn&&e.status===409){let t=e.body?.stale??{};for(let[e,n]of Object.entries(t))p[e]=n.version;let n=Object.keys(t).filter(e=>!u(e,t[e].body));for(let e of Object.keys(t))n.includes(e)||m.delete(e);return h(),n.length?(C=t,x({state:`conflict`,keys:n})):S()}x({state:`offline`,message:e instanceof Error?e.message:String(e)})}}let C={};function w(e=!1){return y&&=(clearTimeout(y),null),b??=S(e).finally(()=>{b=null}),b}return m.size&&(y=setTimeout(()=>{w()},0)),{get(e){return s.has(e)||s.set(e,Dg(e,l(e))),s.get(e)??cp[e]},set(e,t){c(e,t),d&&up.includes(e)&&(m.add(e),h(),y&&clearTimeout(y),y=setTimeout(()=>{w()},i)),_()},subscribe(e){return g.add(e),()=>{g.delete(e)}},sync:()=>v,async resolve(e){if(v.state!==`conflict`)return;let t=v.keys;if(e===`theirs`){for(let e of t)c(e,C[e]?.body??null),m.delete(e);h()}C={},x({state:`saved`}),await w()},flush:w,async refresh(){if(!d)return;await w();let{docs:t}=await e.state(),n=!1;for(let e of up){let r=t[e];!r||m.has(e)||r.version<=(p[e]??0)||(p[e]=r.version,c(e,r.body),n=!0)}n&&(h(),_())}}}var kg=e=>[1,2,3,4,5,6,7,8,9,10].includes(e?.version)||L().fatProfileRef(e),Ag=e=>e?.version===1||e?.version===2;function jg(e){let t=[...e.get(`promptlab.workflows`).list.map(e=>e.work),...Object.values(e.get(`promptlab.versions`).pipeline??{}).flat().map(e=>e.doc)].filter(Ag).map(e=>e?.tests?.type===`graded`?e.tests.dataset?.id:void 0);return[...new Set(t.filter(e=>!!e))]}function Mg(e){let t=[...e.get(`promptlab.workflows`).list.map(e=>e.work),...Object.values(e.get(`promptlab.versions`).pipeline??{}).flat().map(e=>e.doc)].filter(e=>e?.version===17).map(e=>{let t=L().contentOf(e);return t?.type===`source`&&t.live!==!0&&t.pin==null?t.ref.id:void 0});return[...new Set(t.filter(e=>!!e))]}function Ng(e,t={},n){let r=L().answersOf(e.get(`promptlab.connections`).list,e.get(`promptlab.connectionProfiles`).list),i={rulesFor:e=>t[e]??null,profileType:e=>r.connection(e)?.type,connectionSplit:r.split,...n?{pinFor:n}:{}},a=e=>L().upgradePipeline(e,i),o=e=>kg(e)||a(e)!==e,s=e.get(`promptlab.workflows`);s.list.some(e=>o(e.work))&&e.set(`promptlab.workflows`,{...s,list:s.list.map(e=>({...e,work:a(e.work)}))});let c=e.get(`promptlab.versions`),l=c.pipeline??{};Object.values(l).some(e=>e.some(e=>o(e.doc)))&&e.set(`promptlab.versions`,{...c,pipeline:Object.fromEntries(Object.entries(l).map(([e,t])=>[e,t.map(e=>({...e,doc:a(e.doc)}))]))})}function Pg(e,t){let n=e=>t.list.find(t=>t.fromProfile===e)??null;return{...e,list:e.list.map(e=>L().mergeAnswer(e,n(e.id)))}}function Fg(e,t){let n=L(),r=new Map(e.list.map(e=>[e.id,n.splitProfile(e)])),i=e=>{let{id:t,name:n,fromProfile:i,...a}=r.get(e)?.profile??{};return a},a=[],o=new Set;for(let n of t.list){if(!n.fromProfile){a.push(n);continue}let t=e.list.find(e=>e.id===n.fromProfile);t&&(o.add(n.fromProfile),a.push({id:n.id,name:t.name,fromProfile:n.fromProfile,...n.connection?{connection:n.connection}:{},...i(t.id)}))}for(let t of e.list){let e=r.get(t.id)?.profile;!o.has(t.id)&&e&&a.push(e)}let{list:s,split:c,...l}=e;return{connections:{...l,list:e.list.map(e=>r.get(e.id).connection)},connectionProfiles:{list:a}}}var Ig=e=>Pg(e.get(`promptlab.connections`),e.get(`promptlab.connectionProfiles`));function Lg(e,t){let n=e.get(`promptlab.connectionProfiles`),r=Fg(t,n);e.set(`promptlab.connections`,r.connections),JSON.stringify(r.connectionProfiles)!==JSON.stringify(n)&&e.set(`promptlab.connectionProfiles`,r.connectionProfiles)}function Rg(e,t){let n=L();if(t)try{let r=JSON.parse(t);Array.isArray(r?.list)&&Lg(e,{list:r.list.map(e=>n.pinReplyTokens(`profile`in e?n.convertProfile(e):e)),at:r.at??``,...r.grader?{grader:r.grader}:{}})}catch{}let r=Ig(e),i=e=>n.splitOllama(`profile`in e?n.convertProfile(e):e);r.list.some(e=>i(e)!==e)&&Lg(e,{...r,list:r.list.map(i)});let a=e.get(`promptlab.connections`),o=L().withSlugs(a.list);o!==a.list&&e.set(`promptlab.connections`,{...a,list:o})}async function zg(e){let t=document.getElementById(`labstate`)?.textContent;if(t)try{return JSON.parse(t).docs??null}catch{return null}try{return(await e.state()).docs}catch{return null}}function Bg(){let e=location.pathname.match(/^\/w\/([^/]+)/);return e?decodeURIComponent(e[1]):null}async function Vg(){L();let e=Bg(),t=yn(void 0,e?`/w/${encodeURIComponent(e)}`:``),n=()=>{},r=new Promise(e=>{n=e});if(/^#\/?history\/?$/.test(location.hash)&&t.askQueue({limit:25},r),dl())try{let e=(await t.config()).microsoft;e&&await fl(e)}catch{}if(gl())try{let e=(await t.config()).microsoft;if(e){await _l(e);return}}catch{}await pn(t),n();let i=await t.workspaces().then(e=>e.workspaces,()=>[]),a=i.find(e=>e.isDefault)?.slug??`default`,o=e?i.find(t=>t.slug===e):i.find(e=>e.isDefault),s=o?{id:o.id,slug:o.slug,name:o.name,archived:o.archived,isDefault:o.isDefault}:null,c={current:s,requestedSlug:e,list:i,switchTo:e=>{location.assign(ao(e))}};document.title=s?`${s.name}, Evals Lab`:`No workspace, Evals Lab`;let l=await zg(t),u=Og({api:t,storage:localStorage,server:l,workspace:s?.slug??a});Rg(u,l||localStorage.getItem(`promptlab.connections`)?null:localStorage.getItem(`promptlab.profiles`));let d={};if(jg(u).length)try{d=(await t.archivedRules()).rules}catch{}let f=new Map,p=Mg(u);if(p.length)try{let{sources:e}=await t.sources();await Promise.all(e.filter(e=>p.includes(e.id)&&e.type===`dynamic`&&L().DYNAMIC_PROVIDERS[e.provider??``]?.tier!==`supplied`).map(async e=>{let{responses:n}=await t.sourceResponses(e.id);f.set(e.id,{holds:e.files>0,pin:Ru(n)})}))}catch{}Ng(u,d,(e,t)=>{let n=f.get(e);return n&&(t??!n.holds)===!1?n.pin:void 0}),addEventListener(`pagehide`,()=>{u.flush(!0)}),(0,nn.createRoot)(document.getElementById(`root`)).render((0,$.jsx)(X.StrictMode,{children:(0,$.jsx)($n.Provider,{value:u,children:(0,$.jsx)(rn.Provider,{value:t,children:(0,$.jsx)(fo.Provider,{value:c,children:(0,$.jsx)(gg,{})})})})}))}Vg();