evals-lab 0.6.0 → 0.7.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.
- package/CHANGELOG.md +40 -0
- package/lab/VERSION +1 -1
- package/lab/evals-core.mjs +285 -45
- package/lab/flows/flowApi.mjs +153 -0
- package/lab/flows/record.mjs +495 -0
- package/lab/metrics/builtin.mjs +39 -34
- package/lab/run-evals.js +24 -4
- package/lab/server.py +586 -167
- package/lab/web/dist/assets/gallery-BsbUQC7Q.js +3 -0
- package/lab/web/dist/assets/main-BQL5j5oF.js +20 -0
- package/lab/web/dist/assets/main-Cza2gwQd.css +1 -0
- package/lab/web/dist/assets/tokens-C3kp9sWp.js +61 -0
- package/lab/web/dist/assets/tokens-CjqaFuXm.css +1 -0
- package/lab/web/dist/gallery.html +3 -3
- package/lab/web/dist/index.html +4 -4
- package/package.json +1 -1
- package/lab/web/dist/assets/gallery-D_MxkfLj.js +0 -3
- package/lab/web/dist/assets/main-DDoeU6hq.css +0 -1
- package/lab/web/dist/assets/main-nz6Q4jVm.js +0 -21
- package/lab/web/dist/assets/tokens-Bl8cOqkf.js +0 -59
- package/lab/web/dist/assets/tokens-DCHW9ru7.css +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import{$ as e,A as t,At as n,B as r,C as i,Ct as a,D as o,Dt as s,E as c,Et as l,F as u,G as d,H as f,I as p,J as m,K as h,L as g,M as _,Mt as v,N as y,O as b,Ot as x,P as S,Q as C,R as w,S as T,St as E,T as D,Tt as O,U as k,V as A,W as j,X as M,Y as N,Z as P,_ as F,_t as I,a as ee,at as L,b as R,bt as z,c as B,ct as V,d as te,dt as ne,et as H,f as re,ft as U,g as W,gt as G,h as ie,ht as ae,it as K,j as oe,jt as q,k as se,kt as ce,l as le,lt as J,m as ue,mt as Y,n as de,nt as fe,o as pe,ot as me,p as he,pt as ge,q as _e,r as ve,rt as ye,s as be,st as X,t as xe,tt as Se,u as Ce,ut as we,v as Te,vt as Ee,w as Z,wt as De,x as Oe,xt as ke,y as Ae,z as je}from"./tokens-C3kp9sWp.js";var Me=q(),Q=v(),Ne=(0,Q.createContext)(null);function Pe(){let e=(0,Q.useContext)(Ne);if(!e)throw Error(`useApi outside an ApiContext: main.tsx mounts one at the root`);return e}var Fe=`modulepreload`,Ie=function(e){return`/`+e},Le={},Re=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=Ie(t,n),t=s(t),t in Le)return;Le[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`:Fe,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)})},ze={},Be=new Set,Ve=e=>`/plugins/${encodeURIComponent(e.id)}/${encodeURIComponent(e.version)}/${e.entry.split(`/`).map(encodeURIComponent).join(`/`)}`;async function He(e){if(!Be.has(e.id))try{let t=await Re(()=>import(Ve(e)),[]);if(typeof t.default!=`function`)throw Error(`its entry exports no register function`);await t.default(J().pluginHost(e.id)),Be.add(e.id),delete ze[e.id]}catch(t){ze[e.id]=t instanceof Error?t.message:String(t)}}async function Ue(e){let t=[];try{t=(await e.plugins()).plugins}catch{return}for(let e of t)await He(e)}var We=class extends Error{status;body;constructor(e,t,n=null){super(t),this.name=`ApiError`,this.status=e,this.body=n}};function Ge(e=(...e)=>fetch(...e)){async function t(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 We(e.status,r||`HTTP ${e.status}`,n)}return n}async function n(n,r){return t(await e(n,r?.body===void 0?{method:r?.method??`GET`}:{method:r.method??`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(r.body),...r.keepalive?{keepalive:!0}:{}}))}let r=e=>({...e,snapshot:J().upgradePipeline(e.snapshot),results:J().upgradeResults(e.results)}),i=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}`:``}`},a=new Map,o=async e=>({...e,runs:await Promise.all(e.runs.map(e=>u(r(e))))}),s=async e=>{let t=await e;return{...t,run:r(t.run)}},c=new Map,l=e=>J().evalsOf(e.snapshot).some(e=>J().isWholeRun(J().EVAL_TYPES[e.type],e)),u=e=>{if(!e.brief||!l(e))return Promise.resolve(e);let t=`${e.status} ${e.progress?.n??0} ${e.finishedAt??``}`,i=c.get(e.id);if(i?.at===t)return i.row;let a=n(`/api/queue/${encodeURIComponent(e.id)}`).then(r,()=>(c.delete(e.id),e));return c.set(e.id,{at:t,row:a}),a};return{config:()=>n(`/api/config`),google:()=>n(`/api/google`),setGoogle:e=>n(`/api/google`,{method:`PUT`,body:e}),setMicrosoft:(e,t)=>n(`/api/microsoft`,{method:`PUT`,body:{clientId:e,tenant:t}}),state:()=>n(`/api/state`),writeState:(e,t=!1)=>n(`/api/state`,{body:{docs:e},keepalive:t}),queue:(e={})=>{let t=i(e),r=a.get(t);return a.delete(t),r??n(t).then(o)},askQueue:(e,t)=>{let r=i(e),s=n(r),c=t.then(()=>s).then(o);c.catch(()=>{}),a.set(r,c)},run:e=>n(`/api/queue/${encodeURIComponent(e)}`).then(r),setComment:(e,t)=>n(`/api/queue/${encodeURIComponent(e)}`,{method:`PATCH`,body:{comment:t}}).then(r),submit:e=>s(n(`/api/queue`,{body:e})),cancel:e=>s(n(`/api/queue/${encodeURIComponent(e)}/cancel`,{body:{}})),resume:e=>s(n(`/api/queue/${encodeURIComponent(e)}/resume`,{body:{}})),rerunRun:e=>s(n(`/api/queue/${encodeURIComponent(e)}/rerun`,{body:{}})),rerun:(e,t)=>s(n(`/api/queue/${encodeURIComponent(e)}/items/${t}`,{body:{}})),rescore:(e,t)=>s(n(`/api/queue/${encodeURIComponent(e)}/rescore/${t}`,{body:{}})),clear:()=>n(`/api/queue`,{method:`DELETE`}),sources:()=>n(`/api/sources`),source:e=>n(`/api/sources/${encodeURIComponent(e)}`),datasets:()=>n(`/api/datasets`),dataset:e=>n(`/api/datasets/${encodeURIComponent(e)}`),archivedRules:()=>n(`/api/datasets/archived-rules`),createDataset:e=>n(`/api/datasets`,{body:e}),renameDataset:(e,t)=>n(`/api/datasets/${encodeURIComponent(e)}`,{method:`PATCH`,body:{name:t}}),saveDataset:(e,t,r)=>n(`/api/datasets/${encodeURIComponent(e)}`,{method:`PUT`,body:{version:t,body:r}}),deleteDataset:e=>n(`/api/datasets/${encodeURIComponent(e)}`,{method:`DELETE`}),restoreDataset:e=>n(`/api/datasets/trash/${encodeURIComponent(e)}/restore`,{body:{}}),exportDatasetUrl:e=>`/api/datasets/${encodeURIComponent(e)}/export`,exportAllDatasetsUrl:()=>`/api/datasets/export`,importDatasets:e=>n(`/api/datasets/import`,{body:e}),runDataset:e=>n(`/api/queue/${encodeURIComponent(e)}/dataset`),prompts:()=>n(`/api/prompts`),prompt:e=>n(`/api/prompts/${encodeURIComponent(e)}`),createPrompt:e=>n(`/api/prompts`,{body:e}),editPrompt:(e,t,r)=>n(`/api/prompts/${encodeURIComponent(e)}`,{method:`PUT`,body:{base:t,...r}}),setDefaultPrompt:e=>n(`/api/prompts/${encodeURIComponent(e)}/default`,{body:{}}),restorePromptVersion:(e,t)=>n(`/api/prompts/${encodeURIComponent(e)}/versions/${t}/restore`,{body:{}}),deletePrompt:e=>n(`/api/prompts/${encodeURIComponent(e)}`,{method:`DELETE`}),restorePrompt:e=>n(`/api/prompts/trash/${encodeURIComponent(e)}/restore`,{body:{}}),createSource:(e,t,r)=>n(`/api/sources`,{body:{name:e,type:t,...r?{config:r}:{}}}),definition:e=>n(`/api/sources/${encodeURIComponent(e)}/definition`),saveDefinition:(e,t,r)=>n(`/api/sources/${encodeURIComponent(e)}/definition`,{method:`PUT`,body:{version:t,body:r}}),renameSource:(e,t)=>n(`/api/sources/${encodeURIComponent(e)}`,{method:`PATCH`,body:{name:t}}),removeSource:e=>n(`/api/sources/${encodeURIComponent(e)}`,{method:`DELETE`}),removeFiles:(e,t)=>n(`/api/sources/${encodeURIComponent(e)}/remove`,{body:{names:t}}),restoreTrash:e=>n(`/api/sources/trash/${encodeURIComponent(e)}/restore`,{body:{}}),copyFiles:(e,t,r,i=!1)=>n(`/api/sources/${encodeURIComponent(e)}/copy`,{body:{from:t,names:r,move:i}}),upload:async(n,r,i)=>t(await e(`/api/sources/${encodeURIComponent(n)}`,{method:`POST`,headers:{"X-File-Name":r},body:i})),zip:async(n,r)=>{let i=await e(`/api/sources/${encodeURIComponent(n)}/zip`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({names:r})});return i.ok||await t(i),i.blob()},bundle:async n=>{let r=await e(`/api/bundle`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)});return r.ok||await t(r),r.blob()},file:async(n,r)=>{let i=await e(`/api/sources/${encodeURIComponent(n)}/files/${encodeURIComponent(r)}`);return i.ok||await t(i),i.blob()},samples:()=>n(`/api/samples`),presets:()=>n(`/api/presets`),plugins:()=>n(`/api/plugins`),installPlugin:async n=>t(await e(`/api/plugins`,{method:`POST`,headers:{"Content-Type":`application/zip`},body:n})),removePlugin:e=>n(`/api/plugins/${encodeURIComponent(e)}`,{method:`DELETE`}),restorePlugin:e=>n(`/api/plugins/trash/${encodeURIComponent(e)}/restore`,{body:{}}),connections:()=>n(`/api/connections`),signIn:e=>n(`/api/connections/${encodeURIComponent(e)}/start`,{body:{}}),signOut:e=>n(`/api/connections/${encodeURIComponent(e)}`,{method:`DELETE`}),packs:()=>n(`/api/packs`),installPack:async n=>t(await e(`/api/packs`,{method:`POST`,headers:{"Content-Type":`application/zip`},body:n})),removePack:e=>n(`/api/packs/${encodeURIComponent(e)}`,{method:`DELETE`}),restorePack:e=>n(`/api/packs/trash/${encodeURIComponent(e)}/restore`,{body:{}}),models:e=>n(`/api/models`,{body:e}),modelsAsk:e=>n(`/api/models/ask`,{body:e})}}var Ke=(0,Q.createContext)(null);function qe(){let e=(0,Q.useContext)(Ke);if(!e)throw Error(`useStore outside a StoreContext: the app mounts one at its root`);return e}function Je(e){let t=qe();return[(0,Q.useSyncExternalStore)(t.subscribe,()=>t.get(e)),(0,Q.useCallback)(n=>t.set(e,n),[t,e])]}function Ye(){let e=qe();return{sync:(0,Q.useSyncExternalStore)(e.subscribe,e.sync),resolve:e.resolve}}var Xe=e=>e,Ze=()=>({version:8,source:null,scoring:{mode:`all`,threshold:null},grader:null,every:[],run:[],cases:[]}),Qe=e=>e?.state===`conflict`?`Not saved: changed in another browser.`:e?.state===`offline`?`Not saved: ${e.message}`:null,$e=(e,t)=>JSON.stringify(e)===JSON.stringify(t),et=e=>e instanceof Error?e.message:String(e),tt=({body:e,...t})=>t;function nt({api:e,pause:t=800,idle:n}){let r=Xe(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(tt(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,cases:n.cases.length};if(p(e,{doc:c,sync:{state:`saved`}}),h(tt(c)),o.has(e))return v(e)}catch(t){let n=a.get(e);if(!n?.doc)return;let r=t instanceof We&&t.status===409?t.body?.current??null:null;if(r){if($e(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:et(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:et(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:et(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){let n=await r.createDataset(t?{name:e,body:t}:{name:e});return _(n),n},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({...tt(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 rt=3e4,it=(e,t)=>e.get(`promptlab.versions`)[t]??{};function at(e,t){return(e.get(`promptlab.versions`).dataset?.[t]??[]).map(e=>({...e,doc:J().upgradeDatasetBody(e?.doc)})).filter(e=>ot(e.doc))}var ot=e=>!!e&&typeof e==`object`&&Array.isArray(e.cases);function st(e,t,n,r,i){let a=e.get(`promptlab.versions`),o=it(e,t),s=(o[n]??[]).slice(),c=structuredClone(r);s[0]&<(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 ct(e,t,n,r){let i=e.get(`promptlab.versions`),a=(i.dataset?.[t]??[]).slice(),o=structuredClone(n);a[0]&<(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 lt=(e,t)=>JSON.stringify(e)===JSON.stringify(t),$=V(),ut=(0,Q.createContext)(null);function dt({children:e,pause:t}){let n=Pe(),r=qe(),i=(0,Q.useMemo)(()=>nt({api:n,...t==null?{}:{pause:t},idle:{ms:rt,cut:(e,t)=>ct(r,e,t,`idle`)}}),[n,r,t]);return(0,Q.useEffect)(()=>{let e=()=>{i.flush()};return addEventListener(`pagehide`,e),()=>removeEventListener(`pagehide`,e)},[i]),(0,$.jsx)(ut.Provider,{value:i,children:e})}function ft(){let e=(0,Q.useContext)(ut);if(!e)throw Error(`useDatasets outside a DatasetsProvider: the app mounts one at its root`);return e}function pt(){let e=ft(),t=(0,Q.useSyncExternalStore)(e.subscribe,e.list);return(0,Q.useEffect)(()=>{e.list().list===null&&e.refresh()},[e]),t}function mt(e){let t=ft(),n=(0,Q.useSyncExternalStore)(t.subscribe,()=>e?t.entry(e):void 0);return(0,Q.useEffect)(()=>{e&&t.load(e)},[t,e]),n}var ht=e=>e.name.trim()||e.text.trim().split(`
|
|
2
|
+
`)[0].trim()||`Untitled prompt`,gt=e=>e?.state===`conflict`?`Not saved: changed in another browser.`:e?.state===`offline`?`Not saved: ${e.message}`:null,_t=e=>e instanceof Error?e.message:String(e),vt=({versions:e,uses:t,...n})=>n;function yt({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(vt(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(vt(f)),u)return p(t)}catch(e){let n=r.get(t);if(!n?.doc)return;let a=e instanceof We&&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:_t(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:_t(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:_t(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(vt(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 bt=(0,Q.createContext)(null);function xt({children:e,pause:t}){let n=Pe(),r=(0,Q.useMemo)(()=>yt({api:n,...t==null?{}:{pause:t}}),[n,t]);return(0,Q.useEffect)(()=>{let e=()=>{r.flush()};return addEventListener(`pagehide`,e),()=>removeEventListener(`pagehide`,e)},[r]),(0,$.jsx)(bt.Provider,{value:r,children:e})}function St(){let e=(0,Q.useContext)(bt);if(!e)throw Error(`usePrompts outside a PromptsProvider: the app mounts one at its root`);return e}function Ct(){let e=St(),t=(0,Q.useSyncExternalStore)(e.subscribe,e.list);return(0,Q.useEffect)(()=>{e.refresh()},[e]),t}function wt(e){let t=St(),n=(0,Q.useSyncExternalStore)(t.subscribe,()=>e?t.entry(e):void 0);return(0,Q.useEffect)(()=>{e&&t.load(e)},[t,e]),n}var Tt=X(`ban`,[[`path`,{d:`M4.929 4.929 19.07 19.071`,key:`196cmz`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),Et=X(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),Dt=X(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),Ot=X(`clipboard-copy`,[[`rect`,{width:`8`,height:`4`,x:`8`,y:`2`,rx:`1`,ry:`1`,key:`tgr4d6`}],[`path`,{d:`M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2`,key:`4jdomd`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v4`,key:`3hqy98`}],[`path`,{d:`M21 14H11`,key:`1bme5i`}],[`path`,{d:`m15 10-4 4 4 4`,key:`5dvupr`}]]),kt=X(`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`}]]),At=X(`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`}]]),jt=X(`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`}]]),Mt=X(`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`}]]),Nt=X(`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`}]]),Pt=X(`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`}]]),Ft=X(`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`}]]),It=X(`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`}]]),Lt=X(`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`}]]),Rt=X(`folder`,[[`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`}]]),zt=X(`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`}]]),Bt=X(`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`}]]),Vt=X(`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`}]]),Ht=X(`minus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}]]),Ut=X(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),Wt=X(`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`}]]),Gt=X(`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`}]]),Kt=X(`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`}]]),qt=X(`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`}]]),Jt=X(`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`}]]),Yt=X(`save`,[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]),Xt=X(`settings-2`,[[`path`,{d:`M14 17H5`,key:`gfn3mx`}],[`path`,{d:`M19 7h-9`,key:`6i9tg`}],[`circle`,{cx:`17`,cy:`17`,r:`3`,key:`18b49y`}],[`circle`,{cx:`7`,cy:`7`,r:`3`,key:`dfmy0x`}]]),Zt=X(`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`}]]),Qt=X(`sparkles`,[[`path`,{d:`M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z`,key:`1s2grr`}],[`path`,{d:`M20 2v4`,key:`1rf3ol`}],[`path`,{d:`M22 4h-4`,key:`gwowj6`}],[`circle`,{cx:`4`,cy:`20`,r:`2`,key:`6kqj1y`}]]),$t=X(`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`}]]),en=X(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),tn=X(`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`}]]),nn=e=>(typeof e.id==`string`?e.id.trim():``)||`item:${J().caseItem(e)}`,rn=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase(),an=e=>Array.isArray(e.metrics)?e.metrics:[],on=e=>!e.not&&e.weight!==0,sn=e=>e.type===`contains`&&e.not===!0&&e.weight!==0,cn=e=>J().metricLines(e);function ln(e,t){let n=an(e);switch(t.type){case`bounds`:{let r=n.findIndex(e=>e.type===`item-count`&&on(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=>sn(e)&&rn(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`&&on(e));return i>=0&&cn(n[i].values).some(e=>rn(e,r))?e:{...e,metrics:i>=0?n.map((e,t)=>t===i?{...e,values:[...cn(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(sn(e)&&rn(String(e.value??``),r))return i=!0,[];if((e.type===`contains-all`||e.type===`contains-any`)&&on(e)&&cn(e.values).some(e=>rn(e,r))){i=!0;let t=cn(e.values).filter(e=>!rn(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 un(e,t,n){let r=[];return n.type===`delete`?{next:e.filter(e=>{let n=t.has(nn(e));return n&&r.push(nn(e)),!n}),changed:r}:{next:e.map(e=>{if(!t.has(nn(e)))return e;let i=ln(e,n);return i!==e&&r.push(nn(e)),i}),changed:r}}function dn(e,t,n){let r=new Map(e.map(e=>[nn(e),e])),i=new Map(t.map(e=>[nn(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(J().validateEvals({cases:[t]})),s=`${n.id}: `,c=J().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:J().caseItem(n),reasons:c})}return{cases:a}}var fn={expect:`Expect`,forbid:`Forbid`},pn=e=>fn[e],mn=e=>`${e} ${e===1?`case`:`cases`}`;function hn(e,t){let n=mn(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 ${fn[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 gn={graded:`Graded`,todo:`To do`,missing:`Missing`};function _n(e,t){return t&&!t.includes(J().caseItem(e))?`missing`:e.todo?`todo`:`graded`}var vn={file:``,status:`all`,show:`all`};function yn(e,t,n,r=null){let i=t.file.trim().toLowerCase();return e.filter(e=>(!i||J().caseItem(e).toLowerCase().includes(i))&&(t.status===`all`||_n(e,r)===t.status)&&(t.show===`all`||n.has(nn(e))))}var bn=(0,Q.createContext)(null);function xn({children:e}){let[t,n]=(0,Q.useState)(null),[r,i]=(0,Q.useState)(new Set),[a,o]=(0,Q.useState)(vn),[s,c]=(0,Q.useState)(null),[l,u]=(0,Q.useState)(null),d=mt(l?.dataset??null),f=(0,Q.useRef)(null),p=(0,Q.useCallback)(e=>{e!==f.current&&(f.current=e,n(e),i(new Set),o(vn),c(null))},[]),m=(0,Q.useCallback)(e=>{i(e)},[]),h=(0,Q.useCallback)(e=>{o(t=>({...t,...e}))},[]),g=(0,Q.useCallback)((e,t,r)=>{f.current=e,n(e),i(new Set),o({...vn,show:`selected`}),c(null),u({dataset:e,files:t,from:r});let a=`#/library/datasets/${encodeURIComponent(e)}`;location.hash===a?window.dispatchEvent(new HashChangeEvent(`hashchange`)):location.hash=a},[]),_=d?.doc?.body??null,v=d?.sync.state===`missing`;(0,Q.useEffect)(()=>{if(!l||!_&&!v)return;let e=new Set(l.files),t=(_?.cases??[]).filter(t=>e.has(J().caseItem(t))).map(nn);i(new Set(t)),c({from:l.from,wanted:e.size,found:t.length}),u(null)},[l,_,v]);let y=(0,Q.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)(bn.Provider,{value:y,children:e})}function Sn(){let e=(0,Q.useContext)(bn);if(!e)throw Error(`useCases outside an CasesProvider: the app mounts one at its root`);return e}var Cn=(0,Q.createContext)(null);function wn({children:e}){let[t,n]=(0,Q.useState)([]),[r,i]=(0,Q.useState)(null),a=(0,Q.useRef)(t);a.current=t;let o=(0,Q.useRef)(r);o.current=r;let s=(0,Q.useRef)(0),c=(0,Q.useCallback)((e,t)=>{a.current=e,n(e),o.current=t,i(t)},[]),l=(0,Q.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,Q.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,Q.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,Q.useCallback)((e,t)=>{c(a.current.map(n=>n.id===e?{...n,show:t}:n),o.current)},[c]),p=(0,Q.useCallback)(()=>{c(a.current,null)},[c]),m=(0,Q.useCallback)(()=>{let e=a.current.find(e=>e.id===o.current);window.location.hash=`#/${e?.from??`runs`}`,p()},[p]),h=(0,Q.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)(Cn.Provider,{value:h,children:e})}function Tn(){let e=(0,Q.useContext)(Cn);if(!e)throw Error(`useResults outside a ResultsProvider: the app mounts one at its root`);return e}function En({n:e,of:t}){return(0,$.jsxs)(`span`,{className:`fig-part`,children:[e,(0,$.jsxs)(`span`,{className:`fig-of`,children:[`/`,t]})]})}var Dn=e=>e===`good`?` fig-good`:e===`bad`?` fig-bad`:``;function On({fig:e}){return(0,$.jsx)(`span`,{className:`fig-value${Dn(e.tone)}`,children:e.value??(e.of?(0,$.jsx)(En,{n:e.of[0],of:e.of[1]}):`—`)})}function kn({fig:e}){return(0,$.jsxs)(`div`,{className:`fig`,children:[(0,$.jsx)(`span`,{className:`fig-label`,children:e.label}),(0,$.jsx)(On,{fig:e})]},e.key)}function An({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)(On,{fig:t}),t.under&&(0,$.jsx)(`span`,{className:`fig-under`,children:(0,$.jsx)(En,{n:t.under[0],of:t.under[1]})})]})]}),!!n.length&&(0,$.jsx)(`div`,{className:`fig-rest`,children:n.map(e=>(0,$.jsx)(kn,{fig:e},e.key))})]})}var jn={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`},Mn={format:`image/jpeg`,quality:`0.92`,seed:``,nPredict:``,repeatPenalty:``,frequencyPenalty:``,presencePenalty:``,dryMultiplier:``,dryBase:``,dryAllowedLength:``,grammar:``,px:`921600`},Nn=[`type`,`profile`,`px`,`format`,`quality`,`seed`,`nPredict`,`repeatPenalty`,`frequencyPenalty`,`presencePenalty`,`dryMultiplier`,`dryBase`,`dryAllowedLength`,`grammar`,`imagePosition`,`cachePrompt`,`thinking`,`rejectLoops`,`url`,`model`,`temperature`];function Pn(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 Fn=(e,t)=>({...Mn,...t?.setupProfile?.settings||{}});function In(e){return jn[e]??e}function Ln(e,t){return e===`type`?Rn(String(t)):e===`profile`?t===`speed`?`Speed`:`Quality`:e===`px`?J().budgetLabel(t):e===`format`?String(t).replace(`image/`,``).toUpperCase():String(t)}function Rn(e){return J().CONNECTION_TYPES[e]?.label??e}var zn=e=>e.content?e.content!==`text`:null;function Bn({pass:e}){return(0,$.jsx)(`span`,{className:`mark ${e?`met`:`not`}`,role:`img`,"aria-label":e?`Passed`:`Failed`,children:(0,$.jsx)(e?K:y,{size:14,strokeWidth:2.5,"aria-hidden":`true`})})}var Vn=e=>Number(new Date(e)).toString(36).slice(-6).toUpperCase(),Hn=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,Un=e=>{let t=e?e.timed??e.ran:0;return t?e.ms/t:null};function Wn(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 Gn=e=>new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}),Kn={queued:`Queued`,running:`Running`,done:`Done`,incomplete:`Incomplete`,cancelled:`Cancelled`,failed:`Failed`,interrupted:`Interrupted`},qn=e=>Kn[e]??e;function Jn(e){return Kn[e]?(0,$.jsx)(`span`,{className:`rchip ${e}`,children:Kn[e]}):null}var Yn=e=>e.length?e.reduce((e,t)=>e+t,0)/e.length:null;function Xn(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 Zn(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 Qn=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(Un).filter(e=>e!=null);return{pct:r?Math.round(100*n/r):null,avgScore:i.length?Math.round(Yn(i)):null,avgTime:a.length?Yn(a):null}},$n=e=>{let t=Qn(e);return{pct:t.pct==null?`—`:`${t.pct}%`,avgScore:t.avgScore==null?`—`:`${t.avgScore}%`,avgTime:t.avgTime==null?`—`:Xn(t.avgTime)}},er=e=>!!e.run&&(e.status===`cancelled`||e.status===`interrupted`),tr=e=>e.rerunOf?(0,$.jsxs)(`span`,{className:`hrerun note`,children:[`Re-run of `,e.rerunOfAt?Vn(e.rerunOfAt):`a cleared run`]}):null,nr=[{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:Vn(e.at)}),tr(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:Gn(e.at)}),e.cancelled&&(0,$.jsx)(`span`,{className:`err`,children:` cancelled`})]})},{key:`state`,label:`State`,on:!0,sort:e=>qn(e.status),get:e=>Jn(e.status)},{key:`content`,label:`Content`,on:!0,get:e=>e.content||`—`},{key:`pct`,label:`% Passed Items`,on:!0,numeric:!0,sort:e=>Qn(e).pct,get:e=>$n(e).pct},{key:`avgscore`,label:`Avg Score`,on:!0,numeric:!0,sort:e=>Qn(e).avgScore,get:e=>$n(e).avgScore},{key:`avgtime`,label:`Avg Time`,on:!0,numeric:!0,sort:e=>Qn(e).avgTime,get:e=>$n(e).avgTime},{key:`duration`,label:`Duration`,on:!1,numeric:!0,sort:e=>Zn(e.startedAt,e.finishedAt),get:e=>{let t=Zn(e.startedAt,e.finishedAt);return t==null?`—`:Xn(t)}},{key:`ran`,label:`Ran`,on:!1,numeric:!0,sort:e=>e.done,get:e=>(0,$.jsx)(En,{n:e.done,of:e.total})},{key:`setup`,label:`Pipeline`,on:!1,get:e=>e.setup||`—`},{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:`——`})})}],rr=[{key:`name`,label:`Name`,on:!0,sort:(e,t)=>e?.name||`Target ${J().targetLetter(t)}`,get:(e,t,n)=>(0,$.jsx)(`button`,{type:`button`,className:`ghost linkish`,"data-scenario":n,children:t?.name||`Target ${J().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)(Bn,{pass:e.mark})]},t)):t.evals||`—`},{key:`profile`,label:`Target Profile`,on:!0,sort:e=>e?.setupProfile?.name,get:(e,t,n)=>t?.setupProfile?.name?(0,$.jsx)(`button`,{type:`button`,className:`ghost linkish`,"data-prof":n,children:t.setupProfile.name}):`—`},{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)(En,{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=>Un(e),get:(e,t)=>{let n=Un(t);return n==null?`—`:Xn(n)}},{key:`total`,label:`Total`,on:!1,numeric:!0,sort:e=>e.ms||null,get:(e,t)=>t.ms?Xn(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(J().budgetLabel(Fn(e,t).px))},{key:`format`,label:`Format`,on:!1,image:!0,get:(e,t)=>String(Fn(e,t).format).replace(`image/`,``).toUpperCase()},{key:`quality`,label:`Quality`,on:!1,image:!0,get:(e,t)=>Fn(e,t).format===`image/png`?`—`:String(Fn(e,t).quality)},{key:`seed`,label:`Seed`,on:!1,get:(e,t)=>String(Fn(e,t).seed||`1234`)},{key:`predict`,label:`Reply tokens`,on:!1,get:(e,t)=>String(Fn(e,t).nPredict||Fn(e,t).maxTokens||`—`)},{key:`penalty`,label:`Repeat penalty`,on:!1,get:(e,t)=>String(Fn(e,t).repeatPenalty||`—`)},{key:`decoding`,label:`Decoding`,on:!1,get:(e,t)=>Pn(Fn(e,t))||`—`},...Object.entries(J().MODIFIERS).map(([e,t])=>({key:`modifier-${e}`,label:t.label||e,on:!1,get:(t,n)=>n.modifiers?.[e]||`—`}))],ir={"Run Scenarios":`Run Targets`},ar={tests:`evals`},or=[[`Runs`,nr],[`Run Scenarios`,rr]],sr=e=>![`queued`,`running`].includes(e),cr=()=>({ran:0,passed:0,found:0,of:0,ms:0,timed:0,share:0,shared:0});function lr(e){return e.of?Math.round(100*e.found/e.of):e.shared?Math.round(100*e.share/e.shared):null}var ur=(e,t)=>e.filter(e=>!e.whole).map(e=>e.items[t]).filter(e=>!!e&&!J().isSkipped(e)),dr=e=>Array.isArray(e)?e.length:typeof e==`number`?e:0;function fr(e,t){let n=t.map(cr);return(e||[]).forEach((e,r)=>{e&&!e.unrun&&(e.scenarios||[]).forEach((e,i)=>{let a=n[i];if(!a||!e)return;let o=ur(t[i],r);if(o.length){a.ran++,o.every(e=>e.pass)&&a.passed++;for(let e of o)a.found+=dr(e.found),a.of+=dr(e.found)+dr(e.missed)+dr(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 pr=(e,t,n)=>J().targetsOf(e).map((r,i)=>J().scenarioEvals(e,i,t,sr(n))),mr=(e,t,n)=>(e.outcomes[n]??[]).some(e=>!e.whole&&J().failedScore(e.items[t]));function hr(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 gr=e=>!e.skipped&&e.whole&&e.verdict?.ran?!!e.verdict.pass:null,_r=e=>e.map(e=>`${e.label} ${hr(e)}`).join(`, `),vr=e=>e.map(e=>({label:e.label,value:hr(e),mark:gr(e)})),yr=e=>{if(!e.group)return null;let t=J().casesRef(e)?.n??e.pin;return t==null?null:`v${t}`},br=(e,t,n)=>e.group?.name||e.group?.id||(e.name||``).trim()||J().evalLabel({evals:n},t);function xr(e){let t=e.evals,n=t.map((n,r)=>({key:n.id,name:br(n,r,t),version:yr(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?J().groupPass(i):null}})})),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)=>J().overallVerdict(e.outcomes[n]??[],r))}:null}}var Sr=e=>e.scenarios.map((t,n)=>J().recordedTargetOf(e.snapshot,n)),Cr=e=>e.findIndex(e=>!e);function wr(e){return!e||e.error?null:e.transcript?.at(-1)?.got??e.raw??null}function Tr(e,t,n,r){let i=e.results[t]?.scenarios?.[n]?.scores?.[r];return i&&!J().isSkipped(i)?i.metrics??[]:[]}var Er=e=>`${e.type}::${e.label}`;function Dr(e,t){let n=e.scenarios.length,r=(n,r)=>Tr(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=Er(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=>Er(e)===t);s&&s.weight!==0&&(o++,s.pass&&a++)}),o?{passed:a,ran:o}:null})}))}function Or(e){let t=e.snapshot||{},n=J().contentOf(t),r=!!(n&&J().CONTENT_TYPES[n.type]?.inline),i=J().lastKind(t),a=e.results||[],o=pr(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:J().targetsOf(t).map((e,n)=>({id:e?.id||`scenario-${n}`,name:J().targetLabel(t,n),kind:i,plain:!(i&&J().OUTPUT_KINDS[i]?.terms)})),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:J().evalsOf(t),snapshot:t,results:a,outcomes:o,tallies:fr(a,o),startedAt:e.startedAt,finishedAt:e.finishedAt}}function kr(e){let t=e.snapshot||{},n=J().contentOf(t),r=e.results||[],i=J().targetsOf(t),a=t.jobs||[],o=pr(t,r,e.status),s=fr(r,o),c=i.map((e,n)=>{let r=s[n]??cr(),i=(a.length?J().stagesFor(t,n).connections:[]).map(e=>String(e.model||``)),c=i[0]?new Set(i).size===1?i[0]:i.join(` → `):``,l=lr(r),u=J().overallVerdict(o[n]??[],t.pass);return{name:J().targetLabel(t,n),id:e?.id,model:c,setupProfile:J().scenarioProfile(t,n),modifiers:Object.fromEntries((J().outOf(t.jobs?.at(-1))?.modifiers||[]).map(e=>[e.type,J().modifierSummary(e)])),percent:l,passed:r.passed,cases:r.ran,pass:u,detail:u==null?`not graded`:_r(o[n]??[]),evals:_r(o[n]??[]),evalParts:vr(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||``,comment:t.comment||``,plugins:(t.plugins||[]).map(e=>`${e.id} ${e.version}`).join(`, `),done:u,total:l.total??u,content:n&&J().CONTENT_TYPES[n.type]?.inline?`text`:n?.type===`source`&&(n.ref?.name||n.ref?.id)||``,scenarios:c,rerunOf:e.rerunOf??null,rerunOfAt:e.rerunOfAt??null}}var Ar=e=>({key:`state`,label:`State`,value:qn(e),tone:e===`done`?`good`:[`failed`,`incomplete`,`cancelled`,`interrupted`].includes(e)?`bad`:null}),jr=e=>e.length?e.reduce((e,t)=>e+t,0)/e.length:null;function Mr(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&&!J().isSkipped(r))for(let e of r.metrics||[])typeof e.asked==`number`&&(t++,n+=e.asked);return{calls:t,ms:n}}function Nr(e){let t=e.tallies,n=t.reduce((e,t)=>e+t.passed,0),r=t.reduce((e,t)=>e+t.ran,0),i=t.map(lr).filter(e=>e!=null),a=i.length?`${Math.round(jr(i))}%`:`—`,o=Zn(e.startedAt,e.finishedAt),s=Mr(e.results),c={key:`ran`,label:`Run Items`,of:e.progress.total?[e.progress.n,e.progress.total]:null};return{lead:r?{key:`pct`,label:`% Passed Items`,value:`${Math.round(100*n/r)}%`,under:[n,r]}:{...c,key:`lead-ran`},rest:[{key:`run`,label:`Run ID`,value:e.at?(0,Q.createElement)(`code`,null,Vn(e.at)):`—`},Ar(e.status),{key:`score`,label:`Avg Score`,value:a},{key:`duration`,label:`Duration`,value:o==null?`—`:Xn(o)},...s.calls?[{key:`grader`,label:`Grader`,value:`${s.calls} ${s.calls===1?`call`:`calls`}, ${Xn(s.ms)}`}]:[],...r?[c]:[],{key:`start`,label:`Start Date`,value:e.at?Lr(e.at):`—`},{key:`comment`,label:`Comment`,value:e.snapshot.comment?(0,Q.createElement)(`span`,{className:`fig-comment`,title:e.snapshot.comment},e.snapshot.comment):`—`}]}}var Pr=e=>e.evals.length&&sr(e.status)?`No assertions`:`—`;function Fr(e,t){let n=e.tallies[t],r=zr(e,t),i={key:`state`,label:`State`,value:r==null?Pr(e):r?`Pass`:`Fail`,tone:r==null?null:r?`good`:`bad`},a={key:`time`,label:`Avg Time`,value:Ir(n)??`—`},o=e.outcomes[t]??[],s=o.length>1?o.map(e=>({key:`eval-${e.id}`,label:e.label,value:gr(e)==null?hr(e):(0,Q.createElement)(Bn,{pass:gr(e)}),tone:e.skipped?null:e.whole?e.verdict?.ran?e.verdict.pass?`good`:`bad`:null:e.ran?e.passed===e.ran?`good`:`bad`:null})):[];return n?.ran?{lead:{key:`pct`,label:`% Passed Items`,value:`${Math.round(100*n.passed/n.ran)}%`,under:[n.passed,n.ran]},rest:[i,...s,{key:`score`,label:`Score`,value:lr(n)==null?`—`:`${lr(n)}%`},a]}:{lead:i,rest:[...s,a]}}function Ir(e){return e?.timed?Xn(e.ms/e.timed):null}function Lr(e){let t=new Date(e);if(Number.isNaN(t.getTime()))return`—`;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function Rr(e){let t=qn(e.status);return e.status===`queued`?{state:t,detail:e.behind?`behind ${e.behind}`:`next in line`}:e.status===`running`?{state:t,detail:e.progress.current||``}:null}function zr(e,t){return J().overallVerdict(e.outcomes[t]??[],e.snapshot.pass)}function Br(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 Vr(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 Hr=(e,t)=>t==null||t===``?null:`${e}: ${t}`,Ur=e=>(e||[]).map(String).join(`, `),Wr=e=>e.length?e.every(t=>t===e[0])?String(e[0]):e.join(` → `):``,Gr=e=>{let t=J().OUTPUT_KINDS[J().lastKind(e)??J().defaultKind()];return t?!t.terms:!1},Kr=e=>{let t=e.metric&&String(e.metric)||J().METRICS[e.type]?.label||e.type,n=J().metricSummary(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 qr(e,t,n,r){let i=J().readCase(t,n,Gr(e)),{stages:a,connections:o}=J().stagesFor(e,r),s=o.map(e=>J().connectionSettings(e)),c=e=>Wr(s.map(e)),l=J().evalsDataset(e);return[`An eval case is failing.`,``,`## The case`,Hr(`item`,J().caseItem(t)),Hr(`case id`,t.id),Hr(`note`,t.note),...(t.metrics||[]).map((e,t)=>Hr(`metric ${t+1}`,Kr(e))),``,`## What came back`,Hr(`verdict`,i.pass?`pass`:`fail`),Hr(`score`,i.score==null?`—`:`${Math.round(i.score*100)}%`),Hr(`items`,Ur(n?.terms)||`(none)`),Hr(`missed`,Ur((i.missed??[]).map(e=>Array.isArray(e)?e.join(` / `):e))),Hr(`invented`,Ur(i.invented)),Hr(`dropped`,Ur((n?.dropped||[]).map(e=>`${e.item} (${e.by})`))),Hr(`reasons`,Ur(i.reasons)),Hr(`error`,n?.error),Hr(`took`,n?.ms==null?null:`${n.ms} ms`),``,`## How it was asked`,Hr(`scenario`,`${r+1} of ${J().targetsOf(e).length}`),Hr(`model`,c(e=>e.model)),Hr(`endpoint`,c(e=>e.url||`(the lab's own Ollama)`)),Hr(`connection type`,c(e=>Rn(String(e.type??``)))),Hr(`image`,a[0]?.withImage?Jr(s[0]):`no image`),Hr(`seed`,c(e=>e.seed||`1234`)),Hr(`reply tokens`,c(e=>e.nPredict||e.maxTokens||`not set`)),Hr(`repeat penalty`,c(e=>e.repeatPenalty||`(profile default)`)),Hr(`other decoding`,Yr(s.at(-1))),Hr(`modifiers`,(J().outOf(e.jobs.at(-1))?.modifiers||[]).map(e=>`${J().MODIFIERS[e.type]?.label??e.type}: ${J().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 Jr(e){let{px:t,format:n}=J().connectionImage(e);return`${t==null?`default budget`:J().budgetLabel(t)}, ${n.replace(`image/`,``).toUpperCase()}`}function Yr(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 Xr(e,t){let n=[];return!sr(e.status)||!J().evalsDataset(e.snapshot)||(e.results||[]).forEach((r,i)=>{r&&!r.unrun&&(r.scenarios||[]).forEach((a,o)=>{let s=t.find(e=>J().caseItem(e)===r.name);mr(e,i,o)&&s&&a.res&&n.push({kase:s,res:a.res,scenarioIndex:o,item:r.name??``})})}),n}var Zr=e=>{let t=Math.min(...e),n=Math.max(...e);return t===n?String(t):`${t}–${n}`};function Qr(e,t,n){let r=J().evalsDataset(e.snapshot);if(!sr(e.status)||!r)return[];let i=e.outcomes[n]?.find(t=>e.evals.find(e=>e.id===t.id&&J().casesRef(e))),a=new Map(t.map(e=>[J().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||J().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?`${Zr(r)}, ${e===`over`?`max`:`min`} ${Zr(i)}`:null}))}var $r=[{id:`home`,label:`Home`,icon:_e,built:!0},{id:`runs`,label:`Runs`,icon:M,built:!0},{id:`history`,label:`History`,icon:m,built:!0},{id:`library`,label:`Library`,icon:h,built:!0},{id:`setup`,label:`Setup`,icon:je,built:!0}],ei=e=>e.replace(/[^A-Za-z0-9._-]+/g,`-`).replace(/^[-.]+|[-.]+$/g,``);function ti(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 ni(e,t,n,r,i=new Date){return`${e}-${ei(t)||e}-v${n}-${ti(i)}.${r}`}function ri(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 ii=`#/library/datasets`,ai=()=>{location.hash=ii},oi=e=>{location.hash=`${ii}/${encodeURIComponent(e)}`};function si({undo:e}){let n=ft(),{list:r,error:i}=pt(),[a]=Je(`promptlab.workflows`),[s,c]=Oe(`eval-groups`,20),[l,u]=(0,Q.useState)(!1),[d,f]=(0,Q.useState)(null),[p,m]=(0,Q.useState)(null),h=(0,Q.useRef)(null),[,g]=(0,Q.useState)(0);(0,Q.useEffect)(()=>n.subscribe(()=>g(e=>e+1)),[n]),(0,Q.useEffect)(()=>{for(let e of r??[])n.load(e.id)},[r,n]);let v=e=>f(e instanceof Error?e.message:String(e)),y=(0,Q.useMemo)(()=>{let e=new Map;for(let t of a.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},[a.list]),b=(r??[]).map(e=>({...e,body:n.entry(e.id)?.doc?.body??null,links:y.get(e.id)??{names:[],pinned:!1}})),x=()=>new Set((n.list().list??[]).map(e=>e.name)),C=async()=>{f(null);try{oi((await n.create(li(`Untitled eval group`,x()))).id)}catch(e){v(e)}},w=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)}},T=async e=>{f(null);let t;try{t=await ci(e)}catch(e){v(e);return}let r;try{r=JSON.parse(t)}catch(e){f(`Not JSON: ${e instanceof Error?e.message:String(e)}`);return}m(`import`);try{let e=await n.importFile(r);e[0]&&oi(e[0].id)}catch(e){v(e)}finally{m(null)}},E=async()=>{m(`exportAll`);try{let e=await fetch(n.exportAllUrl());if(!e.ok)throw Error(`the export answered ${e.status}`);let t=await e.json();ri(new Blob([JSON.stringify(t,null,2)+`
|
|
6
|
+
`],{type:`application/json`}),ni(`eval-groups`,`all`,t.version,`json`))}catch(e){v(e)}finally{m(null)}},D=e=>[{label:`Open`,icon:N,onSelect:()=>oi(e.id)},{label:`Delete`,icon:_.remove,destructive:!0,onSelect:()=>void w(e)}],O=e=>e.scoring.mode===`weighted`?`Points`:`All`,k=[{key:`group`,header:`Eval group`,role:`title`,sort:e=>e.name.toLowerCase(),cell:e=>(0,$.jsx)(`button`,{type:`button`,className:`eg-open`,onClick:()=>oi(e.id),children:e.name})},{key:`source`,header:`Source`,sort:e=>e.body?.source?.name??``,tdProps:e=>({"data-state":e.body?.source?void 0:`none`}),cell:e=>e.body?e.body.source?.name??`Any`:`…`},{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?O(e.body):``,cell:e=>e.body?O(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)(se,{label:`${e.name} actions`,actions:D(e)})}],j=[{label:`Import JSON…`,icon:S,busy:p===`import`,onSelect:()=>h.current?.click()},{label:`Export all`,icon:Pt,disabled:!r?.length,busy:p===`exportAll`,onSelect:()=>void E()},{label:`Page size…`,icon:_.pageSize,onSelect:()=>u(!0)}];return(0,$.jsxs)(o,{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:h,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&&T(t)}}),r===null?(0,$.jsx)(t,{label:`Eval groups`,error:i,onRetry:()=>void n.refresh()}):r.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No eval groups yet.`}):(0,$.jsx)(Te,{className:`eg-groups`,cards:!0,label:`Eval groups`,rows:b,rowKey:e=>e.id,pageSize:s,columns:k}),d&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:d}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost eg-add`,onClick:()=>void C(),children:[(0,$.jsx)(A,{size:14,"aria-hidden":`true`}),`Add eval group`]}),l&&(0,$.jsx)(Ae,{value:s,onChange:c,onClose:()=>u(!1)})]})}function ci(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 li=(e,t)=>{if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`};function ui(e){return[e.every&&`Every reply`,e.not&&`Not`,e.of===`said`&&`Raw reply`,e.weight!=null&&`Weight ${e.weight}`].filter(Boolean).join(`, `)}var di=(e,t)=>({type:e,...J().METRICS[e].defaults(),...t?.weight==null?{}:{weight:t.weight},...t?.not?{not:!0}:{},...t?.metric?{metric:t.metric}:{}});function fi({label:e,metrics:t,set:n,undoable:r,over:a=`item`,rawReply:s}){let c=J(),[l,u]=(0,Q.useState)(null),[d,f]=(0,Q.useState)(null),p=(e,r)=>n(t.map((t,n)=>n===e?r:t)),m=e=>{l===`new`?n([...t,di(e)]):typeof l==`number`&&p(l,di(e,t[l])),u(null)};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(he,{noun:`metric`,items:[...t],empty:(0,$.jsx)(`p`,{className:`note`,children:`No metrics.`}),onAdd:()=>u(`new`),onRemove:e=>r(t.filter((t,n)=>n!==e),`Removed a metric`),onRename:e=>f(e),extra:(e,t)=>[{label:`Change type…`,icon:Zt,onSelect:()=>u(t)}],renderItem:(t,n,r)=>{let l=c.METRICS[t.type],u=(t.metric||l?.label||t.type)+(t.not?` (not)`:``)+(t.weight===0?` (watch)`:``),d=`${e.replace(/\W+/g,`-`).toLowerCase()}-metric-${n}`,f=!!(t.every||t.not||t.of||t.weight!=null),m=s!==!1||t.of===`said`,h=(l?.options??[]).map(e=>pe(e,t,e=>p(n,e)));return(0,$.jsxs)(o,{id:d,title:u,level:3,actions:r,about:l?.description,children:[h.length>0&&(0,$.jsx)(i,{label:`${e}, metric ${n+1}`,rows:h}),(0,$.jsx)(o,{id:`${d}-counts`,title:`Options`,level:3,open:f,note:f?ui(t):`Defaults`,children:(0,$.jsx)(i,{label:`${e}, metric ${n+1}, options`,rows:[...a===`run`?[{key:`every`,label:`Every reply`,control:{type:`checkbox`,checked:!!t.every,onChange:e=>{let{every:r,...i}=t;p(n,e?{...i,every:!0}:i)}}}]:[],{key:`not`,label:`Not`,control:{type:`checkbox`,checked:!!t.not,onChange:e=>{let{not:r,...i}=t;p(n,e?{...i,not:!0}:i)}}},...m?[{key:`of`,label:`Reads`,...s==null?{hint:`Raw reply: the API's 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;p(n,e===`said`?{...i,of:`said`}:i)}}}]:[],{key:`weight`,label:`Weight`,control:{type:`text`,size:`num`,value:t.weight==null?``:String(t.weight),placeholder:`1`,onChange:e=>{let{weight:r,...i}=t;p(n,e.trim()?{...i,weight:/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e}:i)}}}]})})]},n)}}),d!==null&&t[d]&&(0,$.jsx)(re,{title:`Rename metric`,value:t[d].metric||c.METRICS[t[d].type]?.label||t[d].type,onCommit:e=>{let{metric:n,...r}=t[d];p(d,e&&e!==c.METRICS[r.type]?.label?{...r,metric:e}:r)},onClose:()=>f(null)}),l!==null&&(0,$.jsx)(pi,{title:l===`new`?`Add metric`:`Change type`,current:typeof l==`number`?t[l]?.type??null:null,over:a,onPick:m,onClose:()=>u(null)})]})}function pi({title:e,current:t,over:n,onPick:r,onClose:i}){let[a,o]=(0,Q.useState)(``),s=(0,Q.useMemo)(()=>{let e=new Map;for(let[t,r]of Object.entries(J().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)(Z,{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 mi(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:Gn(n)}:null}})],recent:e.filter(e=>t(e.id)).sort((e,n)=>t(n.id).localeCompare(t(e.id))).slice(0,5).map(e=>e.id)}}function hi({name:e,body:t,onSave:n,onClose:r}){let[i]=(0,Q.useState)(()=>JSON.stringify(t,null,2)),[a,o]=(0,Q.useState)(i),[s,c]=(0,Q.useState)(()=>_i(a));(0,Q.useEffect)(()=>{let e=setTimeout(()=>c(_i(a)),400);return()=>clearTimeout(e)},[a]);let l=s.problems;return(0,$.jsxs)(Z,{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.`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:r,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`run`,onClick:()=>{let e=_i(a);e.body?n(e.body):c(e)},disabled:l.length>0,children:`Save & Close`})]})]})}var gi=[`version`,`source`,`scoring`,`grader`,`every`,`run`,`cases`];function _i(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))gi.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=J().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=Ze(),o={version:i,source:n.source??null,scoring:n.scoring??a.scoring,grader:n.grader??null,every:n.every??[],run:n.run??[],cases:n.cases};return r.push(...J().validateEvals(o)),r.length?{body:null,problems:r}:{body:o,problems:[]}}function vi(e,t){return`/api/sources/${encodeURIComponent(e)}/thumbs/${encodeURIComponent(t)}`}function yi(e){return/\.(?:jpe?g|png|gif|webp|bmp|heic|heif|dng|tiff?)$/i.test(e)}function bi({title:e,action:t,source:n,files:r,taken:i,onPick:a,onClose:o}){let s=(0,Q.useMemo)(()=>r.filter(e=>!i.has(e)),[r,i]),[c,l]=(0,Q.useState)(``),[u,d]=(0,Q.useState)(s[0]??null),f=s.filter(e=>!c.trim()||e.toLowerCase().includes(c.trim().toLowerCase()));return(0,$.jsxs)(Z,{title:e,onClose:o,className:`item-picker`,footer:(0,$.jsxs)(`div`,{className:`edit-actions`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:o,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`edit-done`,disabled:!u||!s.includes(u),onClick:()=>{u&&a(u)},children:t})]}),children:[(0,$.jsxs)(`div`,{className:`prop ip-source`,children:[(0,$.jsx)(`span`,{className:`prop-name`,children:`Source`}),(0,$.jsx)(`span`,{className:`prop-value`,children:n.name})]}),(0,$.jsx)(`input`,{type:`search`,className:`ip-search`,"aria-label":`Find an item`,placeholder:`Find an item`,value:c,onChange:e=>l(e.target.value),autoComplete:`off`}),(0,$.jsxs)(`fieldset`,{className:`ip-items`,children:[(0,$.jsxs)(`legend`,{className:`note`,children:[s.length,` `,s.length===1?`item`:`items`,` without a case`]}),s.length?f.length?f.map(e=>(0,$.jsxs)(`label`,{className:`ip-item${e===u?` on`:``}`,children:[(0,$.jsx)(`input`,{type:`radio`,name:`item`,checked:e===u,onChange:()=>d(e)}),yi(e)?(0,$.jsx)(`img`,{src:vi(n.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 `,n.name,` has a case.`]})]})]})}var xi=2e3,Si=e=>({id:``,item:e,todo:!0,note:``,metrics:[]}),Ci=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 wi({item:e,cases:t,onWrite:n,problem:r,resultFor:i,scenarioCount:a,plain:o=!1,files:s,onFile:c,onClose:l,run:u,source:d=null,sourceFiles:f=null,onRemove:m}){let h=t.find(t=>J().caseItem(t)===e),g=!h,[_,v]=(0,Q.useState)(()=>structuredClone(h??Si(e))),[y,b]=(0,Q.useState)(0),[x,S]=(0,Q.useState)(null),[C,w]=(0,Q.useState)(null),[E,D]=(0,Q.useState)(!1),[O,k]=(0,Q.useState)(!1),[A,j]=(0,Q.useState)(!1),M=(0,Q.useRef)(_);M.current=_;let N=(0,Q.useRef)(t);N.current=t;let P=(0,Q.useRef)(null),F=t=>N.current.filter(n=>!(t.id&&n.id===t.id)&&!(!t.id&&J().caseItem(n)===e)).some(e=>J().caseItem(e)===J().caseItem(t))?`${J().caseItem(t)} has a case already`:J().validateEvals({cases:[{...t,id:t.id||`new`}]})[0]?.replace(/^[^:]*: /,``)??null,I=F(_),ee=(0,Q.useCallback)(()=>{let e=M.current;if(F(e))return!1;e.id||(e={...e,id:Ci(N.current)},M.current=e,v(e));let t=e;return n(e=>Ti({cases:e},t)),!0},[n,e]);(0,Q.useEffect)(()=>()=>{P.current&&clearTimeout(P.current)},[]);let[L,R]=(0,Q.useState)(!1),z=e=>{v(e),R(!0)},B=e=>{let t=M.current;z({...t,metrics:e,...t.todo&&!(t.metrics??[]).length&&e.length?{todo:!1}:{}})},V=C&&C[y]?C[y]:i(y),te=!V||_.todo||!(_.metrics??[]).length?null:J().readCase(_,V,o),ne=async()=>{if(u&&!E){D(!0),S(null);try{let e=await u(J().caseItem(M.current));w(e),S(e.length?null:`No reply to grade.`)}catch(e){S(e instanceof Error?e.message:String(e))}finally{D(!1)}}},H=s.indexOf(e),re=e=>{let t=H<0?null:s[H+e];if(!t)return;let n=L||g;(!n||ee())&&(n&&(k(!0),P.current&&clearTimeout(P.current),P.current=setTimeout(()=>k(!1),xi)),c(t))};(0,Q.useEffect)(()=>{let e=e=>{(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.target?.closest?.(`input, textarea, select, [contenteditable]`)||(e.preventDefault(),re(e.key===`ArrowRight`?1:-1)))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)});let U=()=>{(!L&&!g||ee())&&l()},W=J().caseItem(_),G=new Set(t.filter(t=>!(_.id&&t.id===_.id)&&J().caseItem(t)!==e).map(e=>J().caseItem(e))),ie=!!f&&!f.includes(W),ae=[{key:`item`,label:`Item`,control:d?{type:`static`,text:ie?`${W||`None`} (missing)`:W}:{type:`text`,value:W,onChange:e=>z({...M.current,item:e.trim()})}},{key:`todo`,label:`To do`,control:{type:`checkbox`,checked:!!_.todo,label:`Not graded yet`,onChange:e=>z({...M.current,todo:e})}},{key:`note`,label:`Note`,control:{type:`textarea`,value:_.note??``,onChange:e=>z({...M.current,note:e})}}],K=[];a>1&&K.push({key:`scenario`,label:`Show result of`,control:{type:`select`,value:String(y),options:Array.from({length:a},(e,t)=>({value:String(t),label:`Target ${J().targetLetter(t)}`})),onChange:e=>b(Number(e))}}),te&&(K.push({key:`verdict`,label:`Result`,control:{type:`static`,text:te.pass?`Pass`:`Fail`}}),te.watch.length&&K.push({key:`watch`,label:`Watch`,control:{type:`static`,text:`${te.watch.filter(e=>e.pass).length} of ${te.watch.length}`}}));let oe=d&&W&&yi(W)&&f?.includes(W)?{src:vi(d.id,W),file:W,source:d.name}:null,q=[...oe?[{key:`preview`,title:`Preview`,children:(0,$.jsxs)(`div`,{className:`cf-preview`,children:[(0,$.jsx)(`img`,{src:oe.src,alt:oe.file,loading:`lazy`}),(0,$.jsxs)(`p`,{className:`note`,children:[oe.file,` in `,oe.source]})]})}]:[],{key:`case`,title:`Case`,rows:ae},{key:`metrics`,title:`Metrics`,children:(0,$.jsx)(fi,{label:`${W||`Case`} metrics`,metrics:_.metrics??[],set:B,undoable:B})},...K.length?[{key:`result`,title:`Result`,rows:K}]:[]],se=[{label:`Previous`,icon:ye,disabled:H<=0,onSelect:()=>re(-1)},{label:`Next`,icon:fe,disabled:H<0||H>=s.length-1,onSelect:()=>re(1)},...u?[{label:`Run`,icon:Kt,disabled:E,onSelect:()=>void ne()}]:[]],ce=[...d?[{label:`Change item…`,icon:qt,disabled:!f,onSelect:()=>j(!0)}]:[],...m?[{label:`Remove`,icon:p,destructive:!0,onSelect:()=>{m(J().caseItem(M.current)),l()}}]:[]],le=x??r??(I?`Not saved: ${I}`:null);return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(T,{title:W||`Case`,status:le??(E?`Running…`:O?`Saved.`:void 0),...le?{statusBad:!0}:{},sections:q,...ce.length?{menu:ce}:{},actions:se,dirty:L,onSave:U,onClose:l}),A&&d&&f&&(0,$.jsx)(bi,{title:`Change item`,action:`Change`,source:d,files:f,taken:new Set([...G,W]),onPick:e=>{j(!1),z({...M.current,item:e})},onClose:()=>j(!1)})]})}function Ti(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 Ei(e,t){return structuredClone(e.cases).filter(e=>J().caseItem(e)!==t)}function Di(e){let t=Pe(),[n,r]=(0,Q.useState)(null);return(0,Q.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}var Oi=(0,Q.createContext)(null);function ki({children:e}){let t=ft(),[n,r]=(0,Q.useState)(null),i=mt(n?.dataset??null),a=(0,Q.useCallback)((e,t)=>{r({item:e,...t})},[]),o=(0,Q.useCallback)(e=>{r(t=>t&&{...t,item:e})},[]),s=i?.doc?.body.source??null,c=Di(s?.id),l=n?.dataset??``,u=(0,Q.useCallback)(e=>{t.edit(l,t=>({...t,cases:e(t.cases)}))},[t,l]),d=(0,Q.useMemo)(()=>({openCaseEditor:a}),[a]),f=i?.doc;return(0,$.jsxs)(Oi.Provider,{value:d,children:[e,n&&f&&(0,$.jsx)(wi,{item:n.item,cases:f.body.cases,onWrite:u,problem:Qe(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 Ai(){let e=(0,Q.useContext)(Oi);if(!e)throw Error(`useCaseEditor outside a CaseEditorProvider: the app mounts one at its root`);return e}function ji({rows:e,shown:n,filters:r,onFilters:i,selected:a,onSelect:o,selectionActions:s,sourceFiles:c,hasSource:l,pageSize:u,onEdit:d,onAdd:f,onRemove:p,loading:m,loadError:h,onRetry:g,children:_}){let v=n.map(nn),y=v.filter(e=>a.has(e)).length,b=y>0&&y===v.length,x=[{key:`status`,label:`Status`,value:r.status,onChange:e=>i({status:e}),options:[{value:`all`,label:`All`},{value:`graded`,label:`Graded`},{value:`todo`,label:`To do`},...c?[{value:`missing`,label:`Missing`}]:[]]},{key:`show`,label:`Show`,value:r.show,onChange:e=>i({show:e}),options:[{value:`all`,label:`All`},{value:`selected`,label:`Selected`}]}];return m?(0,$.jsxs)(`div`,{className:`ds-casebody`,children:[_,(0,$.jsx)(t,{label:`Cases`,error:h,onRetry:g})]}):(0,$.jsxs)(`div`,{className:`ds-casebody`,children:[e.length>0&&(0,$.jsx)(W,{noun:`cases`,search:{label:`Item`,placeholder:`Search items`,value:r.file,onChange:e=>i({file:e})},filters:x,count:{shown:n.length,total:e.length},lead:(0,$.jsx)(`label`,{className:`ev-check ev-all`,children:(0,$.jsx)(Mi,{all:b,some:y>0,disabled:!n.length,onChange:()=>o(e=>{let t=new Set(e);for(let e of v)b?t.delete(e):t.add(e);return t})})})}),_,e.length===0?(0,$.jsx)(`p`,{className:`ds-none`,children:l?`No cases.`:`No Source yet.`}):(0,$.jsx)($.Fragment,{children:n.length===0?(0,$.jsxs)($.Fragment,{children:[a.size>0&&(0,$.jsx)(F,{count:a.size,noun:`case`,hidden:a.size,actions:s,onClear:()=>o(()=>new Set)}),(0,$.jsx)(`p`,{className:`note`,children:`No cases match these filters.`})]}):(0,$.jsx)(`div`,{className:`ds-cases`,children:(0,$.jsx)(Te,{className:`dstable`,cards:!0,label:`Cases`,rows:n,pageSize:u,defaultSort:null,rowKey:e=>nn(e),select:{noun:`case`,selected:a,onChange:e=>o(()=>e),actions:()=>s},columns:Ni(c,d,p)})})}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost ds-add`,onClick:f,disabled:!l||!c,children:[(0,$.jsx)(A,{size:14,"aria-hidden":`true`}),`Add case`]})]})}function Mi({all:e,some:t,disabled:n,onChange:r}){let i=(0,Q.useRef)(null);return(0,Q.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 Ni(e,t,n){let r=t=>_n(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=>gn[r(e)],tdProps:e=>({"data-state":r(e)}),cell:e=>(0,$.jsx)(`span`,{className:`ds-status ds-${r(e)}`,children:gn[r(e)]})},{key:`metrics`,header:`Metrics`,className:`num`,sort:e=>Pi(e).length,cell:e=>Pi(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)(se,{label:`${e.item} actions`,actions:[{label:`Edit…`,icon:_.edit,onSelect:()=>t(e.item)},{label:`Remove`,icon:_.remove,destructive:!0,onSelect:()=>n(e.item)}]})}]}var Pi=e=>(e.metrics??[]).filter(e=>e.weight!==0),Fi={bounds:`Set count`,addTerm:`Add term`,removeTerm:`Remove term`,todo:`Mark To do`,graded:`Mark graded`},Ii=[{value:`keep`,label:`Keep`},{value:`set`,label:`Set`},{value:`clear`,label:`Clear`}],Li=e=>/^\s*\d+\s*$/.test(e)?Number(e):null;function Ri({kind:e,cases:t,keys:n,onApply:r,onClose:a}){let[o,s]=(0,Q.useState)(`keep`),[c,l]=(0,Q.useState)(`keep`),[u,d]=(0,Q.useState)(``),[f,p]=(0,Q.useState)(``),[m,h]=(0,Q.useState)(`expect`),[g,_]=(0,Q.useState)(``),[v,y]=(0,Q.useState)(null),b=(0,Q.useMemo)(()=>{switch(e){case`bounds`:{let e=o===`set`?Li(u):null,t=c===`set`?Li(f):null;return o===`set`&&e==null?`Min items needs a whole number.`:c===`set`&&t==null?`Max items needs a whole number.`:{type:`bounds`,min:o===`set`?{kind:`set`,n:e}:{kind:o},max:c===`set`?{kind:`set`,n:t}:{kind:c}}}case`addTerm`:return g.trim()?{type:`addTerm`,list:m,term:g}:`Name the term.`;case`removeTerm`:return g.trim()?{type:`removeTerm`,term:g}:`Name the term.`;case`todo`:return{type:`status`,todo:!0};case`graded`:return{type:`status`,todo:!1}}},[e,o,c,u,f,m,g]),x=(0,Q.useMemo)(()=>{if(typeof b==`string`)return null;let{next:e,changed:r}=un(t,n,b);return{changed:r,problems:dn(t,e,r)}},[b,t,n]),S=v??x?.problems??null,C=!!S&&S.cases.length>0,w=x?.changed.length??0,T=(0,Q.useCallback)(()=>{if(typeof b==`string`)return;let e=r(b);e&&y(e)},[b,r]),E=e=>t=>{y(null),e(t)},D=[];return e===`bounds`&&(D.push({key:`min`,label:`Min items`,required:!0,control:{type:`select`,value:o,options:Ii,onChange:E(e=>s(e))}}),o===`set`&&D.push({key:`minN`,label:`Min`,required:!0,control:{type:`text`,value:u,size:`num`,onChange:E(d)}}),D.push({key:`max`,label:`Max items`,required:!0,control:{type:`select`,value:c,options:Ii,onChange:E(e=>l(e))}}),c===`set`&&D.push({key:`maxN`,label:`Max`,required:!0,control:{type:`text`,value:f,size:`num`,onChange:E(p)}})),e===`addTerm`&&D.push({key:`list`,label:`List`,required:!0,control:{type:`select`,value:m,onChange:E(e=>h(e)),options:[`expect`,`forbid`].map(e=>({value:e,label:pn(e)}))}}),(e===`addTerm`||e===`removeTerm`)&&D.push({key:`term`,label:`Term`,required:!0,control:{type:`text`,value:g,onChange:E(_)}}),(0,$.jsxs)(Z,{title:Fi[e],onClose:a,dirty:o!==`keep`||c!==`keep`||!!u||!!f||!!g,className:`ev-bulk`,footer:(0,$.jsxs)(`div`,{className:`edit-actions`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:a,children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,className:`edit-done`,disabled:!w||C,onClick:T,children:`Apply`})]}),children:[D.length>0&&(0,$.jsx)(i,{label:Fi[e],rows:D}),(0,$.jsx)(`p`,{className:`note ev-changes`,role:`status`,children:typeof b==`string`?b:`Changes ${w} of ${n.size}`}),C&&S&&(0,$.jsx)(`div`,{className:`ev-refusal`,role:`alert`,children:S.cases.length>0&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`p`,{className:`ev-refusal-head`,children:[S.cases.length,` of `,n.size,` would break`]}),(0,$.jsx)(`ul`,{children:S.cases.map(e=>(0,$.jsxs)(`li`,{children:[(0,$.jsx)(`b`,{children:e.file}),` `,e.reasons.join(`; `)]},e.key))})]})})]})}function zi({pageSize:e=20}){let t=qe(),n=ft(),r=te(),{openCaseEditor:i}=Ai(),{list:a}=pt(),{datasetId:o,selected:s,setSelected:c,filters:l,setFilters:u,handedOver:d}=Sn(),[f,p]=(0,Q.useState)(null),[m,h]=(0,Q.useState)(!1),g=(0,Q.useCallback)(()=>p(null),[]),v=a?.find(e=>e.id===o)??a?.[0]??null,y=v?.id??``,b=mt(y||null),x=b?.doc?.body??null,S=x?.cases,C=(0,Q.useMemo)(()=>S?J().gradedSetFrom({cases:S}):[],[S]),T=Di(x?.source?.id),E=(0,Q.useMemo)(()=>new Set(C.map(nn)),[C]),D=(0,Q.useMemo)(()=>new Set([...s].filter(e=>E.has(e))),[s,E]),O=(0,Q.useMemo)(()=>yn(C,l,D,T),[C,l,D,T]),k=!!x&&!x.source;(0,Q.useEffect)(()=>{k&&l.status===`missing`&&u({status:`all`})},[k,l.status,u]);let A=(0,Q.useCallback)(()=>n.entry(y)?.doc?.body??null,[n,y]),j=(0,Q.useCallback)(e=>{y&&n.edit(y,t=>({...t,cases:e}))},[n,y]),M=e=>{i(e,{dataset:y,files:O.map(e=>e.item),onRemove:P})},N=e=>{h(!1),i(e,{dataset:y,files:[...C.map(e=>e.item),e],onRemove:P})};function P(e){let t=A()?.cases??[];j(Ei({cases:t},e)),r.offer({label:`Removed ${e}`,restore:()=>j(t)})}let F=e=>{let i=A();if(!y||!i)return null;let{next:a,changed:o}=un(i.cases,D,e);if(!o.length)return p(null),null;if(e.type!==`delete`){let e=dn(i.cases,a,o);if(e.cases.length)return e}ct(t,y,i,`bulk`);let s=i.cases;if(n.edit(y,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:hn(e,o.length),restore:()=>n.edit(y,e=>({...e,cases:s}))}),p(null),null},I=D.size===0,ee=[{label:`Set count…`,icon:w,disabled:I,onSelect:()=>p(`bounds`)},{label:`Add term…`,icon:_.add,disabled:I,onSelect:()=>p(`addTerm`)},{label:`Remove term…`,icon:Ht,disabled:I,onSelect:()=>p(`removeTerm`)},{label:`Mark To do…`,icon:Tt,disabled:I,onSelect:()=>p(`todo`)},{label:`Mark graded…`,icon:Dt,disabled:I,onSelect:()=>p(`graded`)},{label:`Delete`,icon:_.remove,destructive:!0,disabled:I,onSelect:()=>void F({type:`delete`})}];return(0,$.jsxs)(`div`,{className:`cases`,children:[a?.length?(0,$.jsx)(ji,{rows:C,shown:O,filters:l,onFilters:u,selected:D,onSelect:c,selectionActions:ee,sourceFiles:T,hasSource:!!x?.source,loading:!x,loadError:b?.sync.state===`missing`?b.sync.message:null,onRetry:()=>{y&&n.load(y)},pageSize:e,onEdit:M,onAdd:()=>h(!0),onRemove:P,children:d&&v&&(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 `,v.name,` now`]})]})}):null,m&&x?.source&&T&&(0,$.jsx)(bi,{title:`Add case`,action:`Add case`,source:x.source,files:T,taken:new Set(C.map(e=>e.item)),onPick:N,onClose:()=>h(!1)}),f&&x&&(0,$.jsx)(Ri,{kind:f,cases:x.cases,keys:D,onApply:F,onClose:g}),(0,$.jsx)(le,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss})]})}function Bi({groupId:n,undo:r}){let a=Pe(),s=qe(),c=ft(),{list:l,error:u}=pt(),{pickDataset:d}=Sn(),[f,h]=(0,Q.useState)(!1),[g,v]=(0,Q.useState)(!1),[y,b]=(0,Q.useState)(null),[x,C]=(0,Q.useState)(!1),[w,T]=(0,Q.useState)(!1),[E,O]=Oe(`dataset-cases`,20),[k,M]=(0,Q.useState)(!1),[N,P]=(0,Q.useState)(null),F=(0,Q.useRef)(null),[I]=Je(`promptlab.versions`),[ee]=Je(`promptlab.profiles`),L=e=>I.profile?.[e]?.[0]?.at??null,[R,z]=(0,Q.useState)(null);(0,Q.useEffect)(()=>{let e=!0;return a.sources().then(t=>{e&&z(t.sources)}).catch(()=>{e&&z([])}),()=>{e=!1}},[a]);let B=mt(n)?.doc??null,V=B?.body??null,te=l?.find(e=>e.id===n)??null;(0,Q.useEffect)(()=>{d(n)},[n,d]),(0,Q.useEffect)(()=>{l&&!te&&ai()},[l,te]);let ne=(0,Q.useMemo)(()=>n?at(s,n):[],[s,n,I]),H=e=>b({text:e instanceof Error?e.message:String(e),bad:!0}),U=(0,Q.useCallback)(()=>c.entry(n)?.doc?.body??null,[c,n]),W=(0,Q.useCallback)(e=>c.edit(n,e),[c,n]),G=()=>new Set((c.list().list??[]).map(e=>e.name)),ae=async()=>{b(null);try{oi((await c.create(Hi(`Untitled eval group`,G()))).id)}catch(e){H(e)}},K=e=>{let t=e.trim();B&&t&&t!==B.name&&(b(null),c.rename(n,t).catch(e=>{e instanceof We&&e.status===409?b({text:`An eval group is already called ${t}.`,bad:!0}):H(e)}))},oe=async()=>{if(B){b(null);try{await c.flush(n),oi((await c.create(Hi(`${B.name} copy`,G()),structuredClone(B.body))).id)}catch(e){H(e)}}},q=async()=>{if(!B)return;b(null);let{name:e}=B;try{await c.flush(n);let t=await c.remove(n);ai(),r.offer({label:`Deleted ${e}`,restore:()=>{c.restore(t).then(t=>{oi(t.id),t.name!==e&&b({text:`Restored as ${t.name}.`,bad:!1})}).catch(H)}})}catch(e){H(e)}},se=async e=>{b(null);let t;try{t=await Vi(e)}catch(e){H(e);return}let n;try{n=JSON.parse(t)}catch(e){b({text:`Not JSON: ${e instanceof Error?e.message:String(e)}`,bad:!0});return}P(`import`);try{let e=await c.importFile(n);e[0]&&oi(e[0].id),b({text:`Imported ${e.map(e=>e.name).join(`, `)}.`,bad:!1})}catch(e){H(e)}finally{P(null)}},ce=async()=>{n&&(P(`export`),await c.flush(n).catch(()=>{}),await le(c.exportUrl(n),e=>ni(`eval-group`,e.group?.name??e.dataset?.name??``,e.version,`json`)),P(null))},le=async(e,t)=>{try{let n=await fetch(e);if(!n.ok)throw Error(`the export answered ${n.status}`);let r=await n.json();ri(new Blob([JSON.stringify(r,null,2)+`
|
|
7
|
+
`],{type:`application/json`}),t(r))}catch(e){H(e)}},ue=e=>{let t=U();t&&(ct(s,n,t,`restore`),W(()=>structuredClone(e.doc)),T(!1),r.offer({label:`Restored the eval group`,restore:()=>W(()=>t)}))},Y=(0,Q.useMemo)(()=>{let e=ee.list.find(e=>e.id===ee.grader);return e?{id:e.id,name:e.name}:null},[ee]),de=(0,Q.useMemo)(()=>ee.list.filter(e=>(J().CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`)),[ee.list]),fe=e=>{let{mode:t,threshold:n}=e.scoring,r=e.source&&!(R??[]).some(t=>t.id===e.source.id)?e.source:null;return[{key:`source`,label:`Source`,control:{type:`picker`,kind:`Source`,value:e.source?.id??``,usedLabel:`Last changed`,...mi([...r?[{id:r.id,name:`${r.name} (missing)`}]:[],...R??[]],e=>R?.find(t=>t.id===e)?.changed??null,[{id:``,label:`Any`}]),onChange:e=>{let t=R?.find(t=>t.id===e);W(n=>({...n,source:t?{id:t.id,name:t.name}:r&&r.id===e?r:null}))}}},{key:`mode`,label:`Scoring`,control:{type:`select`,value:t,options:[{value:`all`,label:`All must pass`},{value:`weighted`,label:`Weighted points`}],onChange:e=>W(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`,control:{type:`text`,size:`num`,value:n==null?``:String(n),onChange:e=>W(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:`Profile`,value:e.grader?.id??``,usedLabel:`Last changed`,...mi(de,L,[{id:``,label:Y?`Lab (${Y.name})`:`None`}]),onChange:e=>{let t=de.find(t=>t.id===e);W(e=>({...e,grader:t?{id:t.id,name:t.name}:null}))}}}]},pe=e=>t=>W(n=>({...n,[e]:t})),me=e=>(t,n)=>{let i=U()?.[e]??[];pe(e)(t),r.offer({label:n,restore:()=>W(t=>({...t,[e]:i}))})},he=V?V.cases.filter(e=>!e.todo).length:0,ge=[{label:`Rename…`,icon:j,disabled:!B,onSelect:()=>h(!0)},{label:`Clone`,icon:_.clone,disabled:!B,onSelect:()=>void oe()},{label:`Import JSON…`,icon:S,busy:N===`import`,onSelect:()=>F.current?.click()},{label:`Export JSON`,icon:e,disabled:!B,busy:N===`export`,onSelect:()=>void ce()},{label:`Export all`,icon:Pt,disabled:!l?.length,busy:N===`exportAll`,onSelect:()=>{P(`exportAll`),le(c.exportAllUrl(),e=>ni(`eval-groups`,`all`,e.version,`json`)).finally(()=>P(null))}},{label:`Restore…`,icon:m,disabled:!ne.length||!B,onSelect:()=>T(!0)},{label:`Edit raw…`,icon:jt,disabled:!B,onSelect:()=>C(!0)},{label:`Delete`,icon:p,destructive:!0,disabled:!B,onSelect:()=>void q()}],_e=(0,$.jsx)(`input`,{ref:F,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&&se(t)}}),ve=V?`${V.cases.length} cases, ${he} graded`:void 0;return(0,$.jsxs)(`div`,{className:`datasets`,children:[(0,$.jsx)(D,{kind:`Eval group`,name:B?.name??te?.name??(l===null?`Loading…`:`None`),onPick:l?.length?()=>v(!0):void 0,meta:ve,primary:{label:`New eval group`,icon:A,onSelect:()=>void ae()},actions:ge}),y&&(0,$.jsx)(`p`,{className:`note${y.bad?` bad`:``}`,role:y.bad?`alert`:`status`,children:y.text}),_e,V==null?(0,$.jsx)(t,{label:`Eval group`,error:u,onRetry:()=>void c.refresh()}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(o,{id:`grades`,title:`Grades`,level:2,children:(0,$.jsx)(i,{label:`Grades`,rows:fe(V)})}),(0,$.jsx)(o,{id:`every`,title:`Every item`,level:2,note:V.every.length?String(V.every.length):void 0,children:(0,$.jsx)(fi,{label:`Every item`,metrics:V.every,over:`item`,set:pe(`every`),undoable:me(`every`)})}),(0,$.jsx)(o,{id:`run`,title:`Whole run`,level:2,note:V.run.length?String(V.run.length):void 0,children:(0,$.jsx)(fi,{label:`Whole run`,metrics:V.run,over:`run`,set:pe(`run`),undoable:me(`run`)})}),(0,$.jsx)(o,{id:`cases`,title:`Cases`,level:2,note:String(V.cases.length),actions:[{label:`Page size…`,icon:_.pageSize,onSelect:()=>M(!0)}],children:(0,$.jsx)(zi,{pageSize:E})})]}),g&&l&&(0,$.jsx)(ie,{kind:`Eval group`,value:n,onClose:()=>v(!1),options:l.map(e=>({id:e.id,label:e.name})),onPick:e=>{b(null),oi(e)}}),f&&B&&(0,$.jsx)(re,{title:`Rename eval group`,value:B.name,onCommit:K,onClose:()=>h(!1)}),k&&(0,$.jsx)(Ae,{value:E,onChange:O,onClose:()=>M(!1)}),w&&B&&(0,$.jsx)(Z,{title:`Restore eval group`,onClose:()=>T(!1),children:(0,$.jsxs)(`div`,{className:`version-list`,children:[ne.length===0&&(0,$.jsx)(`p`,{className:`note`,children:`No versions of this eval group yet.`}),ne.map((e,t)=>(0,$.jsxs)(`div`,{className:`version-row`,children:[(0,$.jsxs)(`span`,{className:`version-when`,children:[Wi(e.at),`, `,Ui(e.reason)]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>ue(e),children:`Restore`})]},`${e.at}-${t}`))]})}),x&&B&&(0,$.jsx)(hi,{name:B.name,body:B.body,onSave:e=>{W(()=>e),C(!1)},onClose:()=>C(!1)})]})}function Vi(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 Hi=(e,t)=>{if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`},Ui=e=>e===`idle`?`after editing`:e===`restore`?`before a restore`:e===`bulk`?`before a bulk edit`:e===`pack`?`before a pack update`:e,Wi=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()};function Gi({groupId:e}){let t=te();return(0,$.jsxs)($.Fragment,{children:[e?(0,$.jsx)(Bi,{groupId:e,undo:t}):(0,$.jsx)(si,{undo:t}),(0,$.jsx)(le,{undo:t.undo,onUndo:t.undoNow,onDismiss:t.dismiss})]})}var Ki=[{value:`all`,label:`All`},{value:`used`,label:`Used`},{value:`unused`,label:`Unused`}],qi=[{value:`all`,label:`All`},{value:`scenario`,label:`Used by this target`},{value:`scenarios`,label:`Used by all targets`}];function Ji(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 Yi(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 Xi=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()};function Zi(e){return e.id===null?(0,$.jsx)(Qi,{onClose:e.onClose}):(0,$.jsx)($i,{...e,id:e.id})}function Qi({onClose:e}){let t=St(),[n,r]=(0,Q.useState)(``),[i,a]=(0,Q.useState)(``),[o,s]=(0,Q.useState)(null),[c,l]=(0,Q.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)(T,{title:`New prompt`,status:o??void 0,statusBad:!!o,focusRow:`text`,wide:!0,sections:[{key:`prompt`,rows:[{key:`name`,label:`Name`,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,saving:c,onSave:()=>void u(),onClose:e})}function $i({id:e,onClose:n,onDuplicate:r,onDelete:i}){let a=St(),o=wt(e),[s,c]=(0,Q.useState)(null),[l,d]=(0,Q.useState)(!1),{openRun:f}=Tn(),[p,m]=(0,Q.useState)(new Set),[h,g]=(0,Q.useState)(new Set),[v,y]=(0,Q.useState)(null),b=o?.doc;if(!b)return(0,$.jsx)(T,{title:`Prompt`,sections:[{key:`loading`,children:(0,$.jsx)(t,{label:`Prompt`,error:o?.sync.state===`missing`?o.sync.message:null,onRetry:()=>a.load(e)})}],onClose:n});let x=(e,t,n)=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t),n(r)},S=e=>y(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),E=[{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=>Xi(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)(se,{label:`v${t.version} actions`,actions:[{label:p.has(t.version)?`Hide words`:`Show words`,icon:P,onSelect:()=>x(p,t.version,m)},{label:`Restore`,icon:u,disabled:t.version===b.version,onSelect:()=>{y(null),a.restoreVersion(e,t.version).catch(S)}}]})}],D=e=>`${e.runId}:${e.scenarioId}:${e.job}`,O=[{key:`run`,header:`Run`,sort:e=>e.submittedAt,cell:e=>(0,$.jsx)(`a`,{className:`pl-run`,href:`#/history`,onClick:t=>{t.preventDefault(),n(),f(e.runId,{at:e.submittedAt,from:`history`})},children:Vn(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=>Xi(e.submittedAt)},{key:`menu`,header:``,label:``,className:`pl-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(se,{label:`${Vn(e.submittedAt)} ${e.scenarioName} actions`,actions:[{label:h.has(D(e))?`Hide words`:`Show words`,icon:P,onSelect:()=>x(h,D(e),g)}]})}],k=[{label:`Set as default`,icon:$t,disabled:b.default,onSelect:()=>{y(null),a.setDefault(e).catch(S)}},{label:`Duplicate`,icon:_.clone,onSelect:()=>r(b)},{label:`Delete`,icon:_.remove,destructive:!0,disabled:b.default,onSelect:()=>i(b)}],A=s?.name??b.name,j=s?.text??b.text,M=A!==b.name||j!==b.text,N=e=>c({name:A,text:j,...e}),F=async()=>{if(!M){n();return}d(!0),a.edit(e,{name:A,text:j});try{if(await a.flush(e),a.entry(e)?.sync.state===`conflict`){c(null),d(!1);return}n()}catch(e){S(e),d(!1)}},I=v??gt(o.sync),ee=o.sync.state===`conflict`;return(0,$.jsx)(T,{title:ht({...b,name:A,text:j}),status:I??void 0,statusBad:!!I,menu:k,wide:!0,actions:ee?[{label:`Take theirs`,onSelect:()=>void a.resolve(e,`theirs`)},{label:`Keep mine`,onSelect:()=>void a.resolve(e,`mine`)}]:[],dirty:M,saving:l,onSave:()=>void F(),onClose:n,sections:[{key:`prompt`,rows:[{key:`name`,label:`Name`,control:{type:`text`,value:A,placeholder:`First line`,onChange:e=>N({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:j,placeholder:`None`,onChange:e=>N({text:e})}}]},{key:`versions`,title:`Versions`,children:(0,$.jsx)(Te,{className:`pltable pl-versions`,label:`Versions`,rows:b.versions,rowKey:e=>String(e.version),defaultSort:{key:`version`,dir:`desc`},columns:E,after:e=>p.has(e.version)&&(0,$.jsx)(`tr`,{className:`pl-words-row`,children:(0,$.jsx)(`td`,{colSpan:E.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)(Te,{className:`pltable pl-uses`,label:`Uses`,rows:b.uses,rowKey:D,pageSize:10,defaultSort:{key:`when`,dir:`desc`},columns:O,after:e=>h.has(D(e))&&(0,$.jsx)(`tr`,{className:`pl-words-row`,children:(0,$.jsx)(`td`,{colSpan:O.length,children:(0,$.jsx)(`pre`,{className:`pl-words`,children:C(e.version)})})})})}]})}var ea=`#new`;function ta(){let e=St(),{list:n,error:r}=Ct(),i=te(),[a,s]=Oe(`prompts`,20),[c,l]=(0,Q.useState)(!1),[u,d]=(0,Q.useState)(``),[f,p]=(0,Q.useState)(`all`),[m,h]=(0,Q.useState)(null),[g,v]=(0,Q.useState)(null),y=n??[],b=y.filter(e=>Ji(e,u,f)),x=e=>v(e instanceof Error?e.message:String(e)),S=async()=>{v(null),h(ea)},C=async t=>{v(null);try{await e.flush(t.id);let n=await e.create({name:`${ht(t)} copy`,text:e.entry(t.id)?.doc?.text??t.text});h(n.id)}catch(e){x(e)}},w=async t=>{v(null);let n=[];try{for(let r of t)n.push(await e.remove(r.id)),m===r.id&&h(null)}catch(e){x(e)}n.length&&i.offer({label:t.length===1?`Deleted ${ht(t[0])}`:`Deleted ${n.length} prompts`,restore:()=>{for(let t of n)e.restore(t).catch(x)}})},T=e=>w([e]),E=t=>{v(null),e.setDefault(t.id).catch(x)},D=e=>[{label:`Edit…`,icon:_.edit,onSelect:()=>h(e.id)},{label:`Set as default`,icon:$t,disabled:e.default,onSelect:()=>E(e)},{label:`Duplicate`,icon:_.clone,onSelect:()=>void C(e)},{label:`Delete`,icon:_.remove,destructive:!0,disabled:e.default,onSelect:()=>void T(e)}];return(0,$.jsxs)(o,{id:`prompts`,title:`Prompt library`,note:n?`${y.length} ${y.length===1?`prompt`:`prompts`}`:void 0,actions:[{label:`Page size…`,icon:_.pageSize,onSelect:()=>l(!0)}],about:`Wordings kept with every version and the runs that used them. The Default is the one a new target starts from.`,children:[n===null?(0,$.jsx)(t,{label:`Prompts`,error:r,onRetry:()=>void e.refresh()}):y.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No prompts yet.`}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(W,{noun:`prompts`,search:{label:`Search prompts`,placeholder:`Search prompts`,value:u,onChange:d},filters:[{key:`show`,label:`Show`,value:f,onChange:e=>p(e),options:Ki}],count:{shown:b.length,total:y.length}}),b.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No prompts match these filters.`}):(0,$.jsx)(Te,{className:`pl-prompts`,cards:!0,label:`Prompts`,rows:b,rowKey:e=>e.id,pageSize:a,rowProps:e=>({"data-default":e.default||void 0}),columns:[{key:`prompt`,header:`Prompt`,role:`title`,sort:e=>ht(e).toLowerCase(),cell:e=>(0,$.jsxs)(`button`,{type:`button`,className:`pl-open`,onClick:()=>h(e.id),children:[(0,$.jsxs)(`span`,{className:`pl-title`,children:[ht(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?Xi(e.lastUsed):`—`},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(se,{label:`${ht(e)} actions`,actions:D(e)})}],select:{noun:`prompt`,label:ht,actions:e=>[{label:`Delete`,icon:_.remove,destructive:!0,disabled:e.every(e=>e.default),onSelect:()=>void w(e.filter(e=>!e.default))}]}})]}),g&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:g}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost pl-add`,onClick:()=>void S(),children:[(0,$.jsx)(A,{size:14,"aria-hidden":`true`}),`Add prompt`]}),m&&(0,$.jsx)(Zi,{id:m===ea?null:m,onClose:()=>h(null),onDuplicate:e=>void C(e),onDelete:e=>void T(e)}),c&&(0,$.jsx)(Ae,{value:a,onChange:s,onClose:()=>l(!1)}),(0,$.jsx)(le,{undo:i.undo,onUndo:i.undoNow,onDismiss:i.dismiss})]})}var na=`evals-lab.sources`,ra={view:`thumbs`,sort:`name`,dir:1};function ia(){try{let e=window.localStorage.getItem(na);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:`name`,dir:t.dir===-1?-1:1}}}catch{}return ra}function aa(e){try{window.localStorage.setItem(na,JSON.stringify(e))}catch{}}var oa=e=>{let t=e.lastIndexOf(`.`);return t<0?``:e.slice(t).toLowerCase()},sa=[`.heic`,`.heif`,`.dng`,`.tif`,`.tiff`],ca=[`.jpg`,`.jpeg`,`.png`],la=e=>ca.includes(oa(e))||sa.includes(oa(e)),ua=(e,t)=>`/api/sources/${encodeURIComponent(e)}/thumbs/${encodeURIComponent(t.name)}${t.v?`?v=${t.v}`:``}`,da=(e,t)=>sa.includes(oa(t.name))?`/api/sources/${encodeURIComponent(e)}/zoom/${encodeURIComponent(t.name)}`:`/api/sources/${encodeURIComponent(e)}/files/${encodeURIComponent(t.name)}`;function fa(e,t,n){let r=[...e];return r.sort((e,r)=>{let i;return i=t===`size`?e.bytes-r.bytes:t===`added`?(e.added??0)-(r.added??0):e.name.localeCompare(r.name,void 0,{numeric:!0,sensitivity:`base`}),i*n}),r}function pa(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>e.name.toLowerCase().includes(n)):[...e]}function ma(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]}`}function ha(e){return new Date(e*1e3).toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`})}function ga(e){let t=e.platform??e.config?.platform;return{id:e.id,name:e.name,system:e.system,type:e.type,...t?{platform:t}:{},files:e.files.length,bytes:e.bytes}}var _a=`[redacted]`,va=/^(?:api[-_]?key|x-api-key|authorization|ocp-apim-subscription-key|password|secret|client[-_]?secret|token|access[-_]?token|refresh[-_]?token|sig)$/i,ya=/^(?:headers|authentication)$/,ba=[[/sk-ant-[A-Za-z0-9_-]+/g,_a],[/sk-[A-Za-z0-9_-]{20,}/g,_a],[/Bearer\s+[A-Za-z0-9._~+/=-]+/g,`Bearer ${_a}`],[/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,_a],[/([?&](?:sig|code)=)[^&"\s]+/g,`$1${_a}`]];function xa(e){let t=0,n=e=>{let n=e;for(let[e,r]of ba)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))ya.test(i)&&a&&typeof a==`object`&&!Array.isArray(a)?n[i]=Object.fromEntries(Object.keys(a).map(e=>(t++,[e,_a]))):ya.test(i)&&typeof a==`string`||va.test(i)&&a!=null&&typeof a!=`object`?(t++,n[i]=_a):n[i]=r(a);return n}return typeof e==`string`?n(e):e};return{value:r(e),count:t}}var Sa=[`https://service.flow.microsoft.com//.default`],Ca=null;function wa(e){let t=`${e.clientId}/${e.tenant}`;return Ca?.key!==t&&(Ca={key:t,pca:Re(()=>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}),[])}),Ca.pca}var Ta=()=>{let e=new URLSearchParams(window.location.search);return e.has(`state`)&&(e.has(`code`)||e.has(`error`))};async function Ea(e){await wa(e)}async function Da(e){let t=await wa(e);return(t.getActiveAccount()??t.getAllAccounts()[0]??null)?.username??null}var Oa=`signin`;function ka(e=window.location.href){let t=new URL(e);return t.hostname===`127.0.0.1`?(t.hostname=`localhost`,t.searchParams.set(Oa,`microsoft`),t.href):null}function Aa(){let e=new URL(window.location.href);return e.searchParams.get(`signin`)===`microsoft`&&(e.searchParams.delete(Oa),window.history.replaceState(window.history.state,``,e.href),!0)}async function ja(e,t=window.location.href){let n=ka();if(n){window.location.assign(n);return}await(await wa(e)).loginRedirect({scopes:Sa,prompt:`select_account`,redirectStartPage:t})}async function Ma(e){let t=await wa(e),n=t.getActiveAccount()??t.getAllAccounts()[0];n&&await t.clearCache({account:n})}async function Na(e){let t=await wa(e),n=t.getActiveAccount()??t.getAllAccounts()[0];if(!n)throw Error(`sign in to Microsoft first`);try{return(await t.acquireTokenSilent({scopes:Sa,account:n})).accessToken}catch(e){let{InteractionRequiredAuthError:r}=await Re(async()=>{let{InteractionRequiredAuthError:e}=await import(`./dist-DI3ewZYj.js`);return{InteractionRequiredAuthError:e}},[]);throw e instanceof r&&await t.acquireTokenRedirect({scopes:Sa,account:n,redirectStartPage:window.location.href}),e}}var Pa=new EventTarget,Fa=()=>Pa.dispatchEvent(new Event(`change`));function Ia(){let e=Pe(),[t,n]=(0,Q.useState)({cfg:void 0,editable:!1});return(0,Q.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(),Pa.addEventListener(`change`,r),()=>{t=!1,Pa.removeEventListener(`change`,r)}},[e]),t}var La=()=>Ia().cfg,Ra=e=>Ee(()=>Na(e));async function za(e,t,n){let r=await e.flow(t,n);return{name:r.name,definition:xa(r.definition).value}}async function Ba(e,t,n,r,i){let a=await e.run(t,n,r),o=z(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 Va(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 c=new Set,l=[];for(let a of r){let{records:r}=await Ha(e,t,n,o,a,i,c);for(let e of r)c.add(s(e)),l.push(e)}return l}async function Ha(e,t,n,r,i,a,o,c){let u=new Set(o),d=[],f=0,p=0;for(let o of r){let r=await Ba(e,t,n,o,a);for(let e of await r.callsOf(i)){let t=xa(await l(i,e,r,a)).value,n=s(t);if(u.has(n)){f++;continue}u.add(n),d.push(t)}c?.(++p)}return{records:d,skipped:f}}var Ua=5;function Wa({onMade:e}){let r=Pe(),a=La(),o=(0,Q.useMemo)(()=>a?Ra(a):null,[a]),[s,c]=(0,Q.useState)(void 0),[l,u]=(0,Q.useState)(null),[d,f]=(0,Q.useState)(``),[p,m]=(0,Q.useState)(null),[h,g]=(0,Q.useState)(``),[_,v]=(0,Q.useState)(``),[y,b]=(0,Q.useState)(!1),[S,C]=(0,Q.useState)(null),w=e=>C(e instanceof Error?e.message:String(e));if((0,Q.useEffect)(()=>{a&&Da(a).then(c,()=>c(null))},[a]),(0,Q.useEffect)(()=>{o&&s&&o.environments().then(e=>{u(e),f((e.find(e=>e.isDefault)??e[0])?.id??``)},w)},[o,s]),(0,Q.useEffect)(()=>{o&&d&&(m(null),g(``),o.flows(d).then(e=>{m(e),g(e[0]?.id??``),v(e[0]?.name??``)},w))},[o,d]),a===void 0||a&&s===void 0)return(0,$.jsx)(t,{label:`Account`});if(a===null)return(0,$.jsx)(`p`,{className:`note`,children:`Microsoft: Not Configured`});if(!s)return(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>void ja(a).catch(w),children:[(0,$.jsx)(Bt,{size:14,"aria-hidden":`true`}),` Sign in with Microsoft`]}),S&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:S})]});let T=async(e,t,i)=>{try{for(let a of await Va(e,d,h,n(i),i,Ua))try{await r.upload(t,x(a),new Blob([JSON.stringify(a,null,2)],{type:`application/json`}))}catch{}}catch{}},E=async()=>{if(!o||!h||!_.trim())return;b(!0),C(null);let t=null;try{let n=p?.find(e=>e.id===h),i=await r.createSource(_.trim(),`workflow`,{platform:`power-automate`,environment:d,flow:h,displayName:n?.name??h});t=i.id;let a=await za(o,d,h);await r.saveDefinition(i.id,0,a.definition),T(o,i.id,a.definition),await e()}catch(e){t&&await r.removeSource(t).catch(()=>{}),w(e instanceof We?Error(e.message):e)}finally{b(!1)}};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(i,{label:`Flow`,rows:[{key:`account`,label:`Account`,control:{type:`static`,text:s}},{key:`env`,label:`Environment`,control:l?{type:`select`,value:d,options:l.map(e=>({value:e.id,label:e.name})),onChange:f}:{type:`static`,text:`Loading…`}},{key:`flow`,label:`Flow`,control:p?{type:`select`,value:h,options:p.map(e=>({value:e.id,label:e.name})),onChange:e=>{g(e),v(p.find(t=>t.id===e)?.name??``)}}:{type:`static`,text:d?`Loading…`:`—`}},{key:`name`,label:`Name`,control:{type:`text`,value:_,onChange:v}}]}),p&&!p.length&&(0,$.jsx)(`p`,{className:`note`,children:`No flows in this environment.`}),S&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:S}),(0,$.jsx)(`div`,{className:`sacts`,children:(0,$.jsx)(`button`,{type:`button`,disabled:y||!h||!_.trim(),onClick:()=>void E(),children:`Add`})})]})}function Ga(e,t){let r=e.result;if(!r||!(`status`in r))return null;let i=n(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:J().httpApiFor(a),readAs:O(t,i.name)?.expression??null};try{return J().httpReplyOf(o,{prompt:``},r.body,r.status,{scope:e.scope,now:e.at}).raw}catch{return null}}function Ka(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 qa=e=>e.replace(/\.json$/i,``).replace(/[^A-Za-z0-9._-]/g,`_`);function Ja(e,t){let n=[],r=0;for(let{name:i,record:a}of e){if(Ga(a,t)==null){r++;continue}n.push({id:qa(i),item:i,todo:!1,note:``,metrics:[]})}return{cases:n,skipped:r}}function Ya(e,t){let n=[],r=0;for(let{name:i,record:a}of e){let e=Ga(a,t);if(e==null){r++;continue}let o=O(t,a.step),s=o?De(t,o.name):[];n.push({id:i.replace(/\.json$/i,``).replace(/[^A-Za-z0-9._-]/g,`_`),item:i,todo:!0,note:``,metrics:Ka(e,s)})}return{cases:n,skipped:r}}var Xa=e=>e.name.toLowerCase().endsWith(`.json`),Za=e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(r.error),r.readAsText(e)}),Qa=`evals-lab.flow.importing`;function $a(e){try{return sessionStorage.getItem(e)}catch{return null}}function eo(e,t){try{t?sessionStorage.setItem(e,t):sessionStorage.removeItem(e)}catch{}}var to=e=>e instanceof Error?e.message:String(e);function no({source:r,definition:i,cfg:c}){let l=Pe(),u=ft(),d=te(),[f,h]=(0,Q.useState)(r.files.filter(Xa)),[g,_]=(0,Q.useState)({}),[v,y]=(0,Q.useState)(null),[C,w]=(0,Q.useState)(()=>{let e=$a(Qa)===r.id;return e&&eo(Qa,null),e?`import`:null}),[T,E]=(0,Q.useState)(null),D=(0,Q.useMemo)(()=>n(i),[i]),[O,k]=(0,Q.useState)(!1),[j,M]=(0,Q.useState)(null),N=(0,Q.useCallback)(async()=>{let e=(await l.source(r.id)).files.filter(Xa);h(e);let t=await Promise.all(e.map(async e=>{try{return[e.name,JSON.parse(await Za(await l.file(r.id,e.name)))]}catch{return[e.name,null]}}));_(Object.fromEntries(t))},[l,r.id]),F=(0,Q.useCallback)(()=>{M(null),N().then(()=>k(!0),e=>M(to(e)))},[N]);(0,Q.useEffect)(F,[F]);let I=e=>{let t=g[e],n=t?D.find(e=>e.name===t.step):void 0;return t&&n?a(n,t,i):null},ee=(0,Q.useMemo)(()=>new Set(f.flatMap(e=>g[e.name]?[s(g[e.name])]:[])),[f,g]),L=async(e,t=0)=>{let n=0,i=[];for(let t of e)try{await l.upload(r.id,x(t),new Blob([JSON.stringify(t,null,2)],{type:`application/json`})),n++}catch(e){i.push(e instanceof We?e.message:to(e))}await N(),y([`Added ${n}`,t?`Skipped ${t}`:``,i.length?`Refused ${i.length}: ${i[0]}`:``].filter(Boolean).join(`, `))},R=async()=>{let{cases:e,skipped:t}=Ya(f.flatMap(e=>g[e.name]?[{name:e.name,record:g[e.name]}]:[]),i);if(!e.length)return y(`No call holds a production reply.`);try{let n=await u.create(`${r.name} · production`,{...Ze(),source:{id:r.id,name:r.name},cases:e});y([`Made ${n.name}: ${e.length} ${e.length===1?`case`:`cases`}`,t?`Skipped ${t}`:``].filter(Boolean).join(`, `))}catch(e){y(to(e))}},z=async e=>{try{let{trash:t}=await l.removeFiles(r.id,e);h(t=>t.filter(t=>!e.includes(t.name))),d.offer({label:e.length===1?`Removed ${e[0]}`:`Removed ${e.length} calls`,restore:()=>void l.restoreTrash(t).then(N,e=>y(to(e)))})}catch(e){y(to(e))}},B=async e=>{let t=URL.createObjectURL(await l.file(r.id,e)),n=document.createElement(`a`);n.href=t,n.download=e,document.body.append(n),n.click(),n.remove(),URL.revokeObjectURL(t)},V=t=>[{label:`View…`,icon:P,onSelect:()=>E(t.name)},{label:`Download`,icon:e,onSelect:()=>void B(t.name).catch(e=>y(to(e)))},{label:`Remove`,icon:p,destructive:!0,onSelect:()=>void z([t.name])}],ne=(0,Q.useCallback)(()=>w(null),[]),re=(0,Q.useCallback)(()=>E(null),[]),U=T?g[T]:null;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(o,{id:`flow-calls`,title:`Calls`,note:String(f.length),about:`Each is one call of a Power Automate step: what it read, the request it sent and the reply it got. Request says whether the lab rebuilds that request exactly.`,actions:[{label:`Import runs`,icon:m,disabled:!D.length||!c,onSelect:()=>w(`import`)},{label:`Upload…`,icon:S,disabled:!D.length,onSelect:()=>w(`upload`)},{label:`New dataset`,icon:H,disabled:!f.length,onSelect:()=>void R()}],children:[v&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:v}),O?f.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(Te,{className:`slist`,label:`Calls`,rows:f,rowKey:e=>e.name,select:{noun:`call`,actions:t=>[{label:`Download`,icon:e,onSelect:()=>void(async()=>{for(let e of t)await B(e.name)})().catch(e=>y(to(e)))},{label:`Remove`,icon:p,destructive:!0,onSelect:()=>void z(t.map(e=>e.name))}]},columns:[{key:`name`,header:`Name`,role:`title`,sort:e=>e.name,cell:e=>(0,$.jsxs)($.Fragment,{children:[e.name,(0,$.jsx)(`span`,{className:`sflow-in`,children:ao(g[e.name])})]})},{key:`result`,header:`Result`,sort:e=>oo(g[e.name]),cell:e=>oo(g[e.name])},{key:`request`,header:`Request`,sort:e=>ro(I(e.name)),tdProps:e=>{let t=I(e.name);return t&&t.match===!1?{title:t.where}:{}},cell:e=>ro(I(e.name))},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(b,{label:`${e.name} actions`,actions:V(e)})}]})}):(0,$.jsx)(`p`,{className:`note`,children:`No calls yet. Import runs, in this group's menu, reads them from the flow's run history.`}):(0,$.jsx)(t,{label:`Calls`,error:j,onRetry:F}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,disabled:!D.length,onClick:()=>w(`hand`),children:[(0,$.jsx)(A,{size:14,"aria-hidden":`true`}),` Add call`]})]}),C===`import`&&c&&(0,$.jsx)(lo,{cfg:c,source:r,steps:D,definition:i,held:ee,onClose:ne,onRead:async(e,t)=>{w(null),await L(e,t)}}),C===`hand`&&(0,$.jsx)(uo,{steps:D,onClose:ne,onAdd:async e=>{w(null),await L([e])}}),C===`upload`&&(0,$.jsx)(po,{steps:D,onClose:ne,onRead:async e=>{w(null),await L(e)}}),T&&(0,$.jsx)(Z,{title:T,onClose:re,wide:!0,children:(0,$.jsx)(`pre`,{className:`pl-words`,children:U?JSON.stringify(U,null,2):`Unreadable.`})}),(0,$.jsx)(le,{undo:d.undo,onUndo:d.undoNow,onDismiss:d.dismiss})]})}var ro=e=>!e||e.match===null?`—`:e.match?`Match`:`Differs`,io={run:`Run`,hand:`Hand`,upload:`Upload`},ao=e=>e?[e.step,io[e.origin.kind]??e.origin.kind,e.at?ha(Date.parse(e.at)/1e3):``].filter(Boolean).join(`, `):`Unreadable`;function oo(e){let t=e?.result;return t?`error`in t?t.error.code||`Error`:String(t.status):`—`}var so=e=>e.map(e=>({value:e.name,label:e.name})),co=e=>e.from===`trigger`?`Trigger body`:ke(e);function lo({cfg:e,source:n,steps:r,definition:a,held:o,onClose:s,onRead:c}){let l=(0,Q.useMemo)(()=>Ra(e),[e]),u=n.config??{},[d,f]=(0,Q.useState)(void 0),[p,m]=(0,Q.useState)(r[0]?.name??``),[h,g]=(0,Q.useState)(null),[_,v]=(0,Q.useState)(``),[y,b]=(0,Q.useState)(new Set),[x,S]=(0,Q.useState)(``),[C,w]=(0,Q.useState)(null),[T,E]=(0,Q.useState)(null),[D,O]=(0,Q.useState)(null),[k,A]=(0,Q.useState)(0);(0,Q.useEffect)(()=>{Da(e).then(f,()=>f(null))},[e]),(0,Q.useEffect)(()=>{d&&u.environment&&u.flow&&(O(null),l.runs(u.environment,u.flow).then(g,e=>O(to(e))))},[d,l,u.environment,u.flow,k]);let j=(0,Q.useMemo)(()=>[...new Set((h??[]).map(e=>e.status))].sort(),[h]),M=(0,Q.useMemo)(()=>(h??[]).filter(e=>!_||e.status===_),[h,_]),N=e=>b(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),P=M.length>0&&M.every(e=>y.has(e.id)),F=M.filter(e=>y.has(e.id)).map(e=>e.id),I=async()=>{let e=r.find(e=>e.name===p);if(!e||!u.environment||!u.flow)return;let t=F;E(null),w(`Reading 0 of ${t.length}`);try{let{records:n,skipped:r}=await Ha(l,u.environment,u.flow,t,e,a,o,e=>w(`Reading ${e} of ${t.length}`));await c(n,r)}catch(e){E(to(e)),w(null)}};return(0,$.jsxs)(Z,{title:`Import runs`,onClose:s,wide:!0,dirty:F.length>0,footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[C&&(0,$.jsx)(`span`,{className:`note`,role:`status`,children:C}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:s,children:`Cancel`}),(0,$.jsxs)(`button`,{type:`button`,disabled:!!C||!F.length||!p,"aria-busy":!!C||void 0,onClick:()=>void I(),children:[C&&(0,$.jsx)(oe,{}),`Import `,F.length||``]})]}),children:[d===void 0?(0,$.jsx)(t,{label:`Account`}):d?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(i,{label:`Import`,rows:[{key:`step`,label:`Step`,control:{type:`select`,value:p,options:so(r),onChange:m}},{key:`latest`,label:`Latest`,control:{type:`text`,value:x,size:`num`,placeholder:`N`,onChange:e=>{S(e);let t=Number.parseInt(e,10);t>0&&b(new Set(M.slice(0,t).map(e=>e.id)))}}}]}),h?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(W,{noun:`runs`,count:{shown:M.length,total:h.length},lead:(0,$.jsx)(`input`,{type:`checkbox`,"aria-label":`Select all shown`,checked:P,disabled:!M.length,onChange:()=>b(P?new Set:new Set(M.map(e=>e.id)))}),filters:[{key:`status`,label:`Status`,value:_,onChange:v,options:[{value:``,label:`All`},...j.map(e=>({value:e,label:e}))]}]}),M.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(Te,{className:`slist`,label:`Runs`,rows:M,rowKey:e=>e.id,pageSize:20,rowProps:e=>({onClick:()=>N(e.id),"data-selected":y.has(e.id)||void 0}),columns:[{key:`pick`,header:``,sort:null,cell:e=>(0,$.jsx)(`input`,{type:`checkbox`,"aria-label":`Run ${e.id}`,checked:y.has(e.id),onChange:()=>N(e.id),onClick:e=>e.stopPropagation()})},{key:`start`,header:`Started`,sort:e=>e.startTime??``,cell:e=>e.startTime?ha(Date.parse(e.startTime)/1e3):`—`},{key:`status`,header:`Status`,sort:e=>e.status,cell:e=>e.status}]})}):(0,$.jsx)(`p`,{className:`note`,children:`No runs.`})]}):(0,$.jsx)(t,{label:`Runs`,error:D,onRetry:()=>A(e=>e+1)})]}):(0,$.jsx)(`div`,{className:`sacts`,children:(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>{eo(Qa,n.id),ja(e).catch(e=>{eo(Qa,null),E(to(e))})},children:[(0,$.jsx)(Bt,{size:14,"aria-hidden":`true`}),` Sign in with Microsoft`]})}),T&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:T})]})}function uo({steps:e,onClose:t,onAdd:n}){let[r,a]=(0,Q.useState)(e[0]?.name??``),[o,s]=(0,Q.useState)({}),c=e.find(e=>e.name===r),l=(c?.reads??[]).filter(e=>ke(e));return(0,$.jsxs)(Z,{title:`Add call`,onClose:t,wide:!0,dirty:Object.values(o).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:!c,onClick:()=>{if(!c)return;let e=Object.fromEntries(Object.entries(o).filter(([e,t])=>t!==``&&l.some(t=>ke(t)===e))),[t]=ce(c,[e]).records;n({...t,origin:{kind:`hand`}})},children:`Add`})]}),children:[(0,$.jsx)(i,{label:`Call`,rows:[{key:`step`,label:`Step`,control:{type:`select`,value:r,options:so(e),onChange:e=>{a(e),s({})}}},...l.map(e=>({key:`read-${ke(e)}`,label:co(e),control:{type:`textarea`,value:o[ke(e)]??``,onChange:t=>s(n=>({...n,[ke(e)]:t}))}}))]}),c&&!l.length&&(0,$.jsx)(`p`,{className:`note`,children:`Reads nothing.`})]})}function fo(e,t){if(e.toLowerCase().endsWith(`.csv`))return{rows:E(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};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 po({steps:e,onClose:t,onRead:n}){let r=(0,Q.useRef)(null),[a,o]=(0,Q.useState)(e[0]?.name??``),[s,c]=(0,Q.useState)(null),[l,u]=(0,Q.useState)(null),d=e.find(e=>e.name===a),f=s&&d&&`rows`in s.parsed?ce(d,s.parsed.rows):null,p=s?`records`in s.parsed?s.parsed.records:f?.records??[]:[],m=async e=>{if(e){u(null);try{c({name:e.name,parsed:fo(e.name,await Za(e))})}catch(t){c(null),u(`${e.name}: ${to(t)}`)}}};return(0,$.jsxs)(Z,{title:`Upload`,onClose:t,wide:!0,dirty:!!s,footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:t,children:`Cancel`}),(0,$.jsxs)(`button`,{type:`button`,disabled:!p.length,onClick:()=>void n(p),children:[`Add `,p.length||``]})]}),children:[(0,$.jsx)(i,{label:`Upload`,rows:[...s&&`records`in s.parsed?[]:[{key:`step`,label:`Step`,control:{type:`select`,value:a,options:so(e),onChange:o}}],{key:`file`,label:`File`,control:{type:`static`,text:s?.name??`—`}},...s?[{key:`count`,label:`records`in s.parsed?`Calls`:`Rows`,control:{type:`static`,text:String(p.length)}}]:[],...f?.unmatched.length?[{key:`unmatched`,label:`Unmatched`,control:{type:`static`,text:f.unmatched.join(`, `)}}]:[]]}),(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>r.current?.click(),children:[(0,$.jsx)(S,{size:14,"aria-hidden":`true`}),` Choose file`]}),(0,$.jsx)(`input`,{ref:r,type:`file`,accept:`.json,.csv`,hidden:!0,"aria-hidden":`true`,onChange:e=>{m(e.target.files?.[0]),e.target.value=``}})]}),l&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:l})]})}function mo(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}}function ho(e,t){let n=J(),r=t.filter(e=>(n.CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`request`)),i=(()=>{try{return new URL(e).host}catch{return null}})(),a=r.find(e=>{try{return new URL(n.connectionBase(e)).host===i}catch{return!1}})??r[0];return a?{id:a.id,name:a.name??``}:{id:`http-endpoint`,name:`HTTP endpoint`}}function go(e,t){let n=O(e,t.name),r=n?De(e,n.name):[];return[...n?[{type:`is-json`,schema:n.schema?JSON.stringify(n.schema,null,2):``}]:[],r.length?{type:`fields-equal-recorded`,fields:r.join(`
|
|
8
|
+
`)}:{type:`same-as-recorded`}]}function _o(e,t,n,r,i){let a=J(),o=n.template,s=String(o.uri??``),c=a.httpApiFor(s),l={type:`httpRequest`,api:c,method:String(o.method??`POST`).toUpperCase(),...mo(s),body:o.body??null,...a.HTTP_APIS[c].cellOf(o.body??null)},u=O(t,n.name),d=ho(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`,profile:null,steps:[{type:`recorded`,prompt:``}]},{id:a.newId(),name:`Edited`,profile:d,steps:[structuredClone(l)]}],evals:[a.newLink(i)],pass:{mode:`all`}}}var vo=e=>e instanceof Error?e.message:String(e),yo=e=>e.toLowerCase().endsWith(`.json`),bo=e=>J().METRICS[e.type]?.label??e.type;function xo({source:e,definition:n,step:r,profiles:a,onClose:o}){let s=Pe(),c=ft(),l=te(),[u,d]=Je(`promptlab.profiles`),[f,p]=Je(`promptlab.workflows`),[m,h]=(0,Q.useState)(null),[g,_]=(0,Q.useState)(null),[v,y]=(0,Q.useState)(!1),[b,x]=(0,Q.useState)(null),S=(0,Q.useCallback)(()=>{_(null),(async()=>{try{let t=(await s.source(e.id)).files.filter(e=>yo(e.name)),n=await Promise.all(t.map(async t=>({name:t.name,record:JSON.parse(await Za(await s.file(e.id,t.name)))})));h(n)}catch(e){_(vo(e))}})()},[s,e.id]);(0,Q.useEffect)(S,[S]);let C=go(n,r),w=m?Ja(m,n):null,T=e=>{if(ho(e,a).id!==`http-endpoint`)return a;let t=(()=>{try{return new URL(e).origin}catch{return``}})(),n={id:J().newId(),name:`HTTP endpoint`,url:t,model:``,key:``,temperature:``,type:`http`};return d({...u,list:[...u.list,n]}),[...a,n]},E=async()=>{if(!w)return;y(!0),x(null);let t=String(r.template.uri??``),i=f;try{let a=await c.create(`${e.name} · ${r.name}`,{...Ze(),source:{id:e.id,name:e.name},every:C,cases:w.cases}),s={id:a.id,name:a.name},u=_o({id:e.id,name:e.name},n,r,T(t),s),d={id:u.id,name:u.name,work:u};p({...f,list:[...f.list,d],at:d.id}),o(),location.hash=`#/runs`,l.offer({label:`Made a test of ${r.name}`,restore:()=>{p(i),c.remove(a.id).catch(()=>{})}})}catch(e){x(vo(e)),y(!1)}};return(0,$.jsxs)(Z,{title:`Test ${r.name}`,onClose:o,wide:!0,footer:(0,$.jsxs)(`div`,{className:`sacts`,children:[v&&(0,$.jsx)(`span`,{className:`note`,role:`status`,children:`Making the test…`}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:o,children:`Cancel`}),(0,$.jsxs)(`button`,{type:`button`,disabled:v||!w?.cases.length,"aria-busy":v||void 0,onClick:()=>void E(),children:[v&&(0,$.jsx)(oe,{}),`Save & Close`]})]}),children:[m?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(i,{label:`Test`,rows:[{key:`a`,label:`Target A`,control:{type:`static`,text:`Recorded — replays the reply production recorded`}},{key:`b`,label:`Target B`,control:{type:`static`,text:`Edited — the step's own request, to change`}},{key:`checks`,label:`Checks`,control:{type:`static`,text:C.map(bo).join(`, `)||`—`}},{key:`calls`,label:`Calls graded`,control:{type:`static`,text:`${w.cases.length}${w.skipped?`, ${w.skipped} with no recorded reply left out`:``}`}}]}),!w.cases.length&&(0,$.jsx)(`p`,{className:`note`,children:`No call holds a recorded reply to grade against.`})]}):(0,$.jsx)(t,{label:`Calls`,error:g,onRetry:S}),b&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:b})]})}function So({source:e}){let r=Pe(),a=La(),[s,c]=(0,Q.useState)(null),[l,u]=(0,Q.useState)(null),[d,f]=(0,Q.useState)(!1),[p,m]=(0,Q.useState)(null),h=e.config??{},g=(0,Q.useCallback)(()=>{m(null),r.definition(e.id).then(c,e=>{c(null),m(e instanceof Error?e.message:String(e))})},[r,e.id]);(0,Q.useEffect)(g,[g]);let _=async()=>{if(a&&s&&h.environment&&h.flow){f(!0),u(null);try{if(!await Da(a)){await ja(a);return}let t=await za(Ra(a),h.environment,h.flow);c(await r.saveDefinition(e.id,s.version,t.definition)),u(`Synced.`)}catch(e){e instanceof We&&e.status===409?(g(),u(`It changed since: reloaded.`)):u(e instanceof Error?e.message:String(e))}finally{f(!1)}}},v=(0,Q.useMemo)(()=>Co(s?.body),[s]),y=(0,Q.useMemo)(()=>n(s?.body),[s]),[x]=Je(`promptlab.profiles`),[S,C]=(0,Q.useState)(null);return(0,$.jsxs)(`div`,{className:`sources`,"data-level":`flow`,children:[l&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:l}),(0,$.jsxs)(o,{id:`flow-source`,title:`Flow`,note:h.displayName,actions:[{label:`Re-sync`,icon:Kt,busy:d,disabled:!a||!s,onSelect:()=>void _()}],children:[(0,$.jsx)(i,{label:`Flow`,rows:[{key:`flow`,label:`Flow`,control:{type:`static`,text:h.displayName||h.flow||`—`}},{key:`env`,label:`Environment`,control:{type:`static`,text:h.environment||`—`}},...s?[{key:`version`,label:`Definition`,control:{type:`static`,text:s.version?`Version ${s.version}${s.at?`, ${ha(Date.parse(s.at)/1e3)}`:``}`:`None`}}]:[]]}),!s&&(0,$.jsx)(t,{label:`Definition`,error:p,onRetry:g})]}),(0,$.jsx)(no,{source:e,definition:s?.body??null,cfg:a}),(0,$.jsx)(o,{id:`flow-actions`,title:`Actions`,note:s?String(v.length):void 0,children:s?v.length?(0,$.jsx)(`div`,{className:`sflow`,children:(0,$.jsx)(Te,{className:`slist`,label:`Actions`,rows:v,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`,sort:e=>e.calls,cell:e=>e.calls||`—`},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,cell:e=>{let t=y.find(t=>t.name===e.name);return t?(0,$.jsx)(b,{label:`${e.name} actions`,actions:[{label:`Test…`,icon:M,onSelect:()=>C(t)}]}):null}}]})}):(0,$.jsx)(`p`,{className:`note`,children:`No actions.`}):(0,$.jsx)(t,{label:`Actions`,error:p,onRetry:g})}),S&&s&&(0,$.jsx)(xo,{source:e,definition:s.body,step:S,profiles:x.list,onClose:()=>C(null)})]})}function Co(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 wo={workflow:{Create:Wa,Level:So}};function To({sourceId:n=null,onOpen:a,mode:o=`browse`,onPick:s,disabled:c}){let l=Pe(),u=te(),[d,f]=(0,Q.useState)(null),[m,h]=(0,Q.useState)(0),[g,_]=(0,Q.useState)(0),[v,y]=(0,Q.useState)(null),[b,x]=(0,Q.useState)(ia),[C,w]=(0,Q.useState)(``),[T,E]=(0,Q.useState)(new Set),[O,k]=(0,Q.useState)(null),[M,N]=(0,Q.useState)(!1),[I,ee]=(0,Q.useState)(!1),[L,R]=(0,Q.useState)(()=>o===`browse`&&Do()!==null),[z,B]=(0,Q.useState)(null),[V,ne]=(0,Q.useState)(null),[H,U]=(0,Q.useState)(!1),[G,ae]=(0,Q.useState)(``),[oe,q]=(0,Q.useState)(()=>o===`browse`&&Do()||J().DEFAULT_SOURCE_TYPE),[ce,ue]=(0,Q.useState)(``),[Y,de]=(0,Q.useState)(``),[fe,pe]=(0,Q.useState)(null),[me,he]=(0,Q.useState)([]),[ge,_e]=(0,Q.useState)(!1),[ve,ye]=(0,Q.useState)(!1),[be,X]=(0,Q.useState)(null),[xe,Ce]=(0,Q.useState)(null),[we,Ee]=(0,Q.useState)(0),[De,Oe]=(0,Q.useState)(0),ke=(0,Q.useRef)(null),Ae=(0,Q.useRef)(1),{view:je,sort:Me,dir:Ne}=b,Fe=(0,Q.useCallback)(()=>B(null),[]),Ie=(0,Q.useCallback)(()=>R(!1),[]),Le=(0,Q.useCallback)(()=>ne(null),[]),Re=(0,Q.useCallback)(()=>U(!1),[]);(0,Q.useEffect)(()=>aa(b),[b]),(0,Q.useEffect)(()=>{o===`browse`&&Oo(L?oe:null)},[o,L,oe]);let ze=async()=>{try{let e=await l.sources();f(e.sources),h(e.cap),_(e.used)}catch{}};(0,Q.useEffect)(()=>{let e=!0;return l.sources().then(t=>{e&&(f(t.sources),h(t.cap),_(t.used))}).catch(t=>{e&&X(He(t))}),()=>{e=!1}},[l,we]),(0,Q.useEffect)(()=>{E(new Set),he([]);let e=!0;return Ce(null),n?l.source(n).then(t=>{e&&y(t)}).catch(t=>{e&&(y(null),Ce(He(t)))}):y(null),()=>{e=!1}},[n,De]);let Be=async()=>{if(!n){y(null);return}try{y(await l.source(n))}catch{y(null)}},Ve=e=>{pe(e),e&&window.setTimeout(()=>pe(null),6e3)},He=e=>e instanceof We?e.message:`the request failed`,Ue=pa(fa(v?.files??[],Me,Ne),C),Ge=e=>{E(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},Ke=()=>E(new Set(Ue.map(e=>e.name))),qe=()=>E(new Set),Je=async e=>{let t=[];try{for(let n of e)t.push((await l.removeSource(n.id)).trash),f(e=>(e??[]).filter(e=>e.id!==n.id))}catch(e){Ve(He(e))}t.length&&u.offer({label:e.length===1?`Deleted ${e[0].name}`:`Deleted ${t.length} Sources`,restore:()=>void(async()=>{try{for(let e of t)await l.restoreTrash(e);await ze()}catch(e){Ve(He(e))}})()})},Ye=e=>Je([e]),Xe=async e=>{if(v)try{let{trash:t}=await l.removeFiles(v.id,e),n=new Set(e);y(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)}),E(e=>new Set([...e].filter(e=>!n.has(e)))),u.offer({label:e.length===1?`Removed ${e[0]}`:`Removed ${e.length} files`,restore:()=>void(async()=>{try{let e=await l.restoreTrash(t);y(e.source)}catch(e){Ve(He(e))}})()})}catch(e){Ve(He(e))}},Ze=(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)},Qe=async e=>{if(!v)return;let t=e.length===1?e[0]:null;ye(!0);try{let n=t?await l.file(v.id,t):await l.zip(v.id,e);Ze(n,t??`${v.name}.zip`)}catch(e){Ve(He(e))}finally{ye(!1)}},$e=async e=>{if(!v||v.system)return;let t=[...e];if(!t.length)return;let n=t.map(e=>({id:Ae.current++,file:e,state:`uploading`}));he(e=>[...e,...n]);for(let e of n)try{await l.upload(v.id,e.file.name,e.file),he(t=>t.map(t=>t.id===e.id?{...t,state:`done`}:t))}catch(t){he(n=>n.map(n=>n.id===e.id?{...n,state:`error`,error:He(t)}:n))}await Be()},et=e=>void $e([e.file]),tt=async(e,t)=>{if(v&&V)try{await l.copyFiles(t.id,v.id,V.names,e===`move`),ne(null),E(new Set),await Be(),Ve(e===`move`?`Moved to ${t.name}.`:`Copied to ${t.name}.`)}catch(e){Ve(He(e)),ne(null)}},nt=async()=>{if(v&&G.trim())try{let e=await l.createSource(G.trim(),v.type);try{await l.copyFiles(e.id,v.id,[...T],!1)}catch(t){throw await l.removeSource(e.id).catch(()=>{}),t}U(!1),ae(``),E(new Set),await ze(),Ve(`Made a new Source.`)}catch(e){Ve(He(e))}},rt=async()=>{if(G.trim())try{await l.createSource(G.trim(),oe),R(!1),ae(``),q(J().DEFAULT_SOURCE_TYPE),await ze()}catch(e){Ve(He(e))}},it=async(e,t)=>{try{let n=await l.renameSource(e.id,t);f(t=>(t??[]).map(t=>t.id===e.id?ga(n):t)),y(e=>e?.id===n.id?{...e,name:n.name}:e)}catch(e){Ve(He(e))}},at=(e,t=()=>k(e.id),n)=>e.system?[]:[{label:`Rename…`,icon:j,onSelect:t},{label:`Delete`,icon:p,destructive:!0,onSelect:()=>void Ye(e).then(n)}],ot=t=>[{label:`Preview`,icon:P,disabled:!la(t.name),onSelect:()=>B(t)},{label:`Download`,icon:e,onSelect:()=>void Qe([t.name])},...v?.system?[]:[{label:`Remove`,icon:p,destructive:!0,onSelect:()=>void Xe([t.name])}]],st=[...v?.system?[]:[{label:`Remove`,icon:p,destructive:!0,onSelect:()=>void Xe([...T])}],{label:`Download`,icon:e,busy:ve,onSelect:()=>void Qe([...T])},...v?.system?[]:[{label:`Move to…`,icon:Ft,onSelect:()=>ne({kind:`move`,names:[...T]})}],{label:`Copy to…`,icon:Se,onSelect:()=>ne({kind:`copy`,names:[...T]})},...v?.system?[]:[{label:`New Source from selection…`,icon:It,onSelect:()=>U(!0)}]],ct=e=>{e.preventDefault(),_e(!1),v&&!v.system&&$e(e.dataTransfer.files)},lt=(d??[]).filter(e=>(!Y||zo(e)===Y)&&e.name.toLowerCase().includes(ce.trim().toLowerCase())),ut=(0,$.jsx)(W,{noun:`Sources`,search:{label:`Find a Source`,value:ce,placeholder:`Name`,onChange:ue},filters:[{key:`type`,label:`Type`,value:Y,onChange:de,options:[{value:``,label:`All`},...Lo()]}],count:{shown:lt.length,total:(d??[]).length}}),dt=()=>(0,$.jsxs)(`div`,{className:`sources`,"data-level":`sources`,children:[fe&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:fe}),(0,$.jsxs)(`header`,{className:`shead`,children:[(0,$.jsx)(`h2`,{className:`shead-title`,children:`Sources`}),(0,$.jsx)(Ao,{view:je,onChange:e=>x(t=>({...t,view:e}))})]}),d!==null&&d.length>0&&ut,d===null?(0,$.jsx)(t,{label:`Sources`,error:be,onRetry:()=>{X(null),Ee(e=>e+1)}}):d.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No Sources on the server yet.`}):je===`thumbs`?(0,$.jsx)(`ul`,{className:`sfolders`,children:lt.map(e=>(0,$.jsx)(`li`,{className:`sfolder`,children:(0,$.jsxs)(`button`,{type:`button`,className:`sfolder-open${c?.(e)?` off`:``}`,disabled:c?.(e),onClick:()=>s?.(e),children:[(0,$.jsx)(No,{}),(0,$.jsx)(`span`,{className:`sfolder-name`,children:e.name}),(0,$.jsxs)(`span`,{className:`sfolder-meta`,children:[Bo(e),`. `,Vo(e)]})]})},e.id))}):(0,$.jsx)(Te,{className:`slist slist-folders`,label:`Sources`,rows:lt,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${c?.(e)?` off`:``}`,disabled:c?.(e),onClick:()=>s?.(e),children:[(0,$.jsx)(No,{}),` `,e.name]})},{key:`type`,header:`Type`,sort:e=>Bo(e),cell:e=>Bo(e)},{key:`files`,header:`Items`,className:`num`,cell:e=>e.files},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>ma(e.bytes)}]})]});if(o===`pick`)return dt();if(n){if(!v)return(0,$.jsx)(`div`,{className:`sources`,children:(0,$.jsx)(t,{label:`Files`,error:xe,onRetry:()=>Oe(e=>e+1)})});let e=wo[v.type]?.Level,n=!e&&!v.system,i=()=>a?.(null),o=(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(D,{kind:`Source`,name:v.name,onPick:d?.length?()=>ee(!0):void 0,meta:`${Bo(ga(v))}. ${[Vo(ga(v)),ma(v.bytes)].join(`, `)}`,primary:n?{label:`Upload…`,icon:S,onSelect:()=>ke.current?.click()}:void 0,actions:at(ga(v),()=>N(!0),i)}),I&&d&&(0,$.jsx)(ie,{kind:`Source`,value:v.id,onPick:e=>a?.(e),onClose:()=>ee(!1),options:d.map(e=>({id:e.id,label:e.name}))}),M&&(0,$.jsx)(re,{title:`Rename Source`,value:v.name,onCommit:e=>{e&&e!==v.name&&it(v,e)},onClose:()=>N(!1)})]});return e?(0,$.jsxs)(`div`,{className:`sources`,children:[o,(0,$.jsx)(e,{source:v,onBack:i}),(0,$.jsx)(le,{undo:u.undo,onUndo:u.undoNow,onDismiss:u.dismiss})]}):(0,$.jsxs)(`div`,{className:`sources`,"data-level":`files`,children:[o,fe&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:fe}),(0,$.jsxs)(`header`,{className:`shead`,children:[(0,$.jsx)(Ao,{view:je,onChange:e=>x(t=>({...t,view:e}))}),(0,$.jsx)(jo,{sort:Me,dir:Ne,onChange:(e,t)=>x(n=>({...n,sort:e,dir:t}))}),(0,$.jsxs)(`label`,{className:`sfilter`,children:[(0,$.jsx)(r,{size:14,"aria-hidden":`true`}),(0,$.jsx)(`input`,{type:`search`,"aria-label":`Filter by name`,placeholder:`Filter`,value:C,onChange:e=>w(e.target.value)})]})]}),T.size>0&&(0,$.jsx)(F,{count:T.size,noun:`file`,onClear:qe,actions:je===`thumbs`?[{label:`Select all`,icon:Et,disabled:T.size===Ue.length,onSelect:Ke},...st]:st}),(0,$.jsx)(`div`,{className:`sfiles${ge?` drag`:``}`,onDragOver:e=>{e.preventDefault(),_e(!0)},onDragLeave:()=>_e(!1),onDrop:ct,children:Ue.length===0?(0,$.jsx)(`p`,{className:`note`,children:C?`No files match that name.`:`No files in this Source yet.`}):je===`thumbs`?(0,$.jsx)(`ul`,{className:`stiles`,children:Ue.map(e=>(0,$.jsx)(`li`,{children:(0,$.jsxs)(`button`,{type:`button`,className:`stile${T.has(e.name)?` sel`:``}`,"aria-pressed":T.has(e.name),"aria-label":e.name,onClick:()=>Ge(e.name),children:[(0,$.jsx)(ko,{id:v.id,file:e}),(0,$.jsx)(`span`,{className:`stile-name`,children:e.name}),T.has(e.name)&&(0,$.jsx)(`span`,{className:`stile-check`,children:(0,$.jsx)(K,{size:12,"aria-hidden":`true`})})]})},e.name))}):(0,$.jsx)(Te,{className:`slist`,label:`${v.name} files`,rows:Ue,rowKey:e=>e.name,defaultSort:null,select:{noun:`file`,selected:T,onChange:E},rowProps:e=>({onClick:()=>Ge(e.name)}),columns:[{key:`name`,header:`Name`,className:`sfile-name`,role:`title`,cell:e=>e.name},{key:`type`,header:`Type`,className:`stype`,cell:e=>Mo(e.name)},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>ma(e.bytes)},{key:`added`,header:`Added`,sort:e=>e.added,cell:e=>e.added?ha(e.added):`—`},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,tdProps:()=>({onClick:e=>e.stopPropagation()}),cell:e=>(0,$.jsx)(se,{label:`${e.name} actions`,actions:ot(e)})}]})}),n&&(0,$.jsxs)(`div`,{className:`supload`,children:[(0,$.jsx)(`input`,{ref:ke,type:`file`,multiple:!0,hidden:!0,"aria-hidden":`true`,accept:J().sourceTypeOf(v)?.uploads?.join(`,`),onChange:e=>{e.target.files&&$e(e.target.files),e.target.value=``}}),me.length>0&&(0,$.jsx)(`ul`,{className:`suploads`,children:me.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:()=>et(e),children:`Retry`})]})]},e.id))})]}),z&&(0,$.jsxs)(Z,{title:z.name,onClose:Fe,children:[la(z.name)?(0,$.jsx)(`img`,{className:`spreview-img`,src:da(v.id,z),alt:z.name}):null,(0,$.jsx)(`p`,{className:`note`,children:ma(z.bytes)})]}),V&&(0,$.jsx)(Z,{title:V.kind===`move`?`Move to…`:`Copy to…`,onClose:Le,children:(0,$.jsx)(To,{mode:`pick`,disabled:e=>e.id===v.id||e.system||e.type!==v.type,onPick:e=>void tt(V.kind,e)})}),H&&(0,$.jsxs)(Z,{title:`New Source from selection`,onClose:Re,dirty:!!G.trim(),children:[(0,$.jsxs)(`label`,{className:`prompt`,children:[(0,$.jsx)(`span`,{className:`prop-name`,children:`Name`}),(0,$.jsx)(`input`,{"aria-label":`New Source name`,value:G,autoFocus:!0,onChange:e=>ae(e.target.value),onKeyDown:e=>{e.key===`Enter`&&nt()}})]}),(0,$.jsxs)(`div`,{className:`sacts`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>U(!1),children:`Cancel`}),(0,$.jsx)(`button`,{type:`button`,disabled:!G.trim(),onClick:()=>void nt(),children:`Make`})]})]}),(0,$.jsx)(le,{undo:u.undo,onUndo:u.undoNow,onDismiss:u.dismiss})]})}return(0,$.jsxs)(`div`,{className:`sources`,"data-level":`sources`,children:[fe&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:fe}),(0,$.jsxs)(`header`,{className:`shead`,children:[(0,$.jsx)(`h2`,{className:`shead-title`,children:`Sources`}),(0,$.jsxs)(`p`,{className:`note suste`,children:[`Used `,ma(g),` of `,ma(m)]}),(0,$.jsx)(Ao,{view:je,onChange:e=>x(t=>({...t,view:e}))})]}),d!==null&&d.length>0&&ut,d===null?(0,$.jsx)(t,{label:`Sources`,error:be,onRetry:()=>{X(null),Ee(e=>e+1)}}):d.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No Sources yet — Add source below.`}):je===`thumbs`?(0,$.jsx)(`ul`,{className:`sfolders`,children:lt.map(e=>(0,$.jsxs)(`li`,{className:`sfolder`,children:[(0,$.jsxs)(`button`,{type:`button`,className:`sfolder-open`,onClick:()=>a?.(e.id),children:[(0,$.jsx)(No,{}),(0,$.jsx)(`span`,{className:`sfolder-name`,children:e.name}),(0,$.jsxs)(`span`,{className:`sfolder-meta`,children:[Bo(e),`. `,Vo(e)]}),(0,$.jsx)(Io,{source:e,cap:m,children:e.system?(0,$.jsx)(`span`,{className:`squota-none`,children:`—`}):(0,$.jsx)(`span`,{className:`squota-bar`,children:(0,$.jsx)(`span`,{className:`squota-fill`,style:{width:`${Po(e.bytes,m)}%`}})})})]}),(0,$.jsx)(`span`,{className:`sfolder-menu`,children:(0,$.jsx)(se,{label:`${e.name} actions`,actions:at(e)})})]},e.id))}):(0,$.jsx)(`div`,{className:`sfiles`,children:(0,$.jsx)(Te,{className:`slist slist-folders`,label:`Sources`,rows:lt,rowKey:e=>e.id,rowProps:e=>({"data-open":e.id,onClick:()=>a?.(e.id)}),select:{noun:`Source`,actions:e=>[{label:`Delete`,icon:p,destructive:!0,disabled:e.every(e=>e.system),onSelect:()=>void Je(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)(No,{}),` `,e.name]})},{key:`type`,header:`Type`,sort:e=>Bo(e),cell:e=>Bo(e)},{key:`files`,header:`Items`,className:`num`,cell:e=>e.files},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>ma(e.bytes)},{key:`used`,header:`Used`,className:`num`,sort:e=>e.system?null:e.bytes,cell:e=>(0,$.jsx)(Io,{source:e,cap:m,children:e.system?`—`:`${Po(e.bytes,m)}%`})},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,tdProps:()=>({onClick:e=>e.stopPropagation()}),cell:e=>(0,$.jsx)(se,{label:`${e.name} actions`,actions:at(e)})}]})}),O&&d&&(()=>{let e=d.find(e=>e.id===O);return e?(0,$.jsxs)(`label`,{className:`srename`,children:[(0,$.jsxs)(`span`,{className:`prop-name`,children:[`Rename `,e.name]}),(0,$.jsx)(`input`,{"aria-label":`Rename ${e.name}`,defaultValue:e.name,autoFocus:!0,onKeyDown:t=>{if(t.key===`Enter`){let n=t.target.value.trim();n&&n!==e.name&&it(e,n),k(null)}t.key===`Escape`&&k(null)},onBlur:t=>{let n=t.target.value.trim();n&&n!==e.name&&it(e,n),k(null)}})]}):null})(),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:()=>R(!0),children:[(0,$.jsx)(A,{size:14,"aria-hidden":`true`}),` Add source`]}),L&&(0,$.jsxs)(Z,{title:`Add source`,onClose:Ie,dirty:!!G.trim(),children:[(0,$.jsx)(i,{label:`New Source`,rows:[{key:`type`,label:`Type`,hint:J().SOURCE_TYPES[Ro(oe)]?.description,control:{type:`select`,value:oe,options:Lo(),onChange:q}}]}),(()=>{let e=wo[Ro(oe)]?.Create,t=(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>R(!1),children:`Cancel`});return e?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(e,{onMade:async()=>{R(!1),q(J().DEFAULT_SOURCE_TYPE),await ze()}}),(0,$.jsx)(`div`,{className:`sacts`,children:t})]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`label`,{className:`prompt`,children:[(0,$.jsx)(`span`,{className:`prop-name`,children:`Name`}),(0,$.jsx)(`input`,{"aria-label":`Source name`,value:G,autoFocus:!0,onChange:e=>ae(e.target.value),onKeyDown:e=>{e.key===`Enter`&&rt()}})]}),(0,$.jsxs)(`div`,{className:`sacts`,children:[t,(0,$.jsx)(`button`,{type:`button`,disabled:!G.trim(),onClick:()=>void rt(),children:`Add`})]})]})})()]}),(0,$.jsx)(le,{undo:u.undo,onUndo:u.undoNow,onDismiss:u.dismiss})]})}var Eo=`evals-lab.sources.adding`;function Do(){try{return sessionStorage.getItem(Eo)}catch{return null}}function Oo(e){try{e?sessionStorage.setItem(Eo,e):sessionStorage.removeItem(Eo)}catch{}}function ko({id:e,file:t}){let[n,r]=(0,Q.useState)(!1);return!t.thumb||n?(0,$.jsx)(`span`,{className:`stile-type`,children:Mo(t.name)||`FILE`}):(0,$.jsx)(`img`,{className:`stile-img`,src:ua(e,t),alt:``,loading:`lazy`,onError:()=>r(!0)})}function Ao({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 jo({sort:e,dir:t,onChange:n}){return(0,$.jsxs)(`div`,{className:`ssort`,role:`group`,"aria-label":`Sort`,children:[(0,$.jsxs)(`select`,{"aria-label":`Sort by`,value:e,onChange:e=>n(e.target.value,t),children:[(0,$.jsx)(`option`,{value:`name`,children:`Name`}),(0,$.jsx)(`option`,{value:`added`,children:`Date added`}),(0,$.jsx)(`option`,{value:`size`,children:`Size`})]}),(0,$.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Sort ${t===1?`ascending`:`descending`}`,onClick:()=>n(e,t===1?-1:1),children:(0,$.jsx)(t===1?L:me,{size:14,"aria-hidden":`true`})})]})}function Mo(e){let t=e.lastIndexOf(`.`);return t<0?``:e.slice(t+1).toUpperCase()}function No(){return(0,$.jsx)(Rt,{size:16,"aria-hidden":`true`})}function Po(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}function Fo(e,t){return e.system?`Quota: not counted`:`Quota: ${ma(e.bytes)} of ${ma(t)}`}function Io({source:e,cap:t,children:n}){let r=Fo(e,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 Lo=()=>Object.entries(J().SOURCE_TYPES).flatMap(([e,t])=>t.platforms?t.platforms.flatMap(e=>{let t=J().WORKFLOW_PLATFORMS[e];return t?[{value:e,label:t.label}]:[]}):[{value:e,label:t.label}]),Ro=e=>e in J().SOURCE_TYPES?e:Object.entries(J().SOURCE_TYPES).find(([,t])=>t.platforms?.includes(e))?.[0]??e,zo=e=>e.platform??e.type,Bo=e=>Lo().find(t=>t.value===zo(e))?.label??J().SOURCE_TYPES[e.type]?.label??e.type,Vo=e=>{let t=J().sourceTypeOf(e)?.noun??`item`;return`${e.files} ${e.files===1?t:`${t}s`}`};function Ho({sourceId:e}){let[t,n]=(0,Q.useState)(e);return(0,Q.useEffect)(()=>n(e),[e]),(0,$.jsx)(To,{sourceId:t,onOpen:e=>{n(e),e?location.hash=`/library/sources/${encodeURIComponent(e)}`:location.hash=`#/library/sources`}})}var Uo=[{id:`datasets`,label:`Evals`,icon:H},{id:`prompts`,label:`Prompts`,icon:d},{id:`sources`,label:`Sources`,icon:N}];function Wo({section:e,sourceId:t,groupId:n}){return(0,$.jsxs)(`div`,{className:`library`,children:[(0,$.jsx)(c,{label:`Library`,level:`section`,className:`lib-sections`,current:e,items:Uo.map(({id:e,label:t,icon:n})=>({key:e,label:t,href:`#/library/${e}`,icon:n}))}),(0,$.jsx)(`section`,{className:`lib-section`,"data-section":e,children:e===`datasets`?(0,$.jsx)(Gi,{groupId:n}):e===`prompts`?(0,$.jsx)(ta,{}):(0,$.jsx)(Ho,{sourceId:t})})]})}var Go=`0.7.0 (2026.10.06-456)`,Ko=3,qo=3,Jo=e=>$r.find(t=>t.id===e),Yo=e=>Uo.find(t=>t.id===e),Xo=e=>new Date(e).toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`});function Zo(){let e=Pe(),[t]=Je(`promptlab.profiles`),[n,r]=Je(`promptlab.workflows`),i=pt(),a=Ct(),{pickDataset:o}=Sn(),{openRun:s}=Tn(),c=ft(),l=St(),[u,d]=(0,Q.useState)(null),[f,p]=(0,Q.useState)(null),[m,h]=(0,Q.useState)(null),[g,_]=(0,Q.useState)(null),[v,y]=(0,Q.useState)(0),[b,x]=(0,Q.useState)(0),S=e=>e instanceof Error?e.message:String(e);(0,Q.useEffect)(()=>{let t=!0;return h(null),e.sources().then(e=>{t&&d(e.sources)},e=>{t&&h(S(e))}),()=>{t=!1}},[e,v]),(0,Q.useEffect)(()=>{let t=!0;return _(null),e.queue({limit:qo}).then(e=>{t&&p(e.runs)},e=>{t&&_(S(e))}),()=>{t=!1}},[e,b]);let C=(0,Q.useMemo)(()=>n.list.filter(e=>e.work?.version===13),[n.list]),w=i.list??[],T=w.reduce((e,t)=>e+t.cases,0),E=(f??[]).filter(e=>e.status===`queued`||e.status===`running`).length,D=t.list.length===0?`setup`:i.list===null?null:w.length===0||T===0?`datasets`:f!==null&&f.length===0?`runs`:null,O=(...e)=>e.filter(Boolean).join(`, `)||void 0,k=Jo(`library`),A=k.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)(Qo,{id:`runs`,icon:Jo(`runs`).icon,name:Jo(`runs`).label,hub:!0,start:D===`runs`,fact:O(Hn(C.length,`pipeline`),E>0&&`${E} running`),total:C.length,items:C.map(e=>({key:e.id,label:e.name,href:`#/runs`,onPick:()=>r({...n,at:e.id})}))}),(0,$.jsx)(Qo,{id:`history`,icon:Jo(`history`).icon,name:Jo(`history`).label,fact:f&&f.length===0?`No runs yet`:void 0,wait:f?void 0:{error:g,onRetry:()=>x(e=>e+1)},items:(f??[]).map(e=>{let t=kr(e).scenarios.map(e=>e.percent==null?`–`:`${e.percent}%`).join(`, `);return{key:e.id,label:(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`code`,{children:Vn(e.submittedAt)}),e.status!==`done`&&Jn(e.status)]}),sub:O(Xo(e.submittedAt),!!t&&t),href:`#/history`,onOpen:()=>s(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)(A,{size:18})}),k.label]}),(0,$.jsxs)(`ol`,{className:`home-branch`,"aria-label":k.label,children:[(0,$.jsx)(Qo,{id:`datasets`,to:`library/datasets`,branch:!0,icon:Yo(`datasets`).icon,name:Yo(`datasets`).label,start:D===`datasets`,fact:i.list?O(Hn(w.length,`eval group`),Hn(T,`case`)):void 0,total:w.length,wait:i.list?void 0:{error:i.error,onRetry:()=>void c.refresh()},items:w.map(e=>({key:e.id,label:e.name,sub:Hn(e.cases,`case`),href:`#/library/datasets/${encodeURIComponent(e.id)}`,onPick:()=>o(e.id)}))}),(0,$.jsx)(Qo,{id:`prompts`,to:`library/prompts`,branch:!0,icon:Yo(`prompts`).icon,name:Yo(`prompts`).label,fact:a.list?O(Hn(a.list.length,`prompt`)):void 0,total:a.list?.length??0,wait:a.list?void 0:{error:a.error,onRetry:()=>void l.refresh()},items:(a.list??[]).map(e=>({key:e.id,label:e.name||e.text.split(`
|
|
9
|
+
`)[0]||`Untitled`,sub:e.default?`Default`:void 0,href:`#/library/prompts`}))}),(0,$.jsx)(Qo,{id:`sources`,to:`library/sources`,branch:!0,icon:Yo(`sources`).icon,name:Yo(`sources`).label,fact:u?O(Hn(u.length,`source`)):void 0,total:u?.length??0,wait:u?void 0:{error:m,onRetry:()=>y(e=>e+1)},items:(u??[]).map(e=>({key:e.id,label:e.name,sub:Hn(e.files,`file`),href:`#/library/sources/${encodeURIComponent(e.id)}`}))})]})]}),(0,$.jsx)(Qo,{id:`setup`,icon:Jo(`setup`).icon,name:Jo(`setup`).label,start:D===`setup`,fact:O(Hn(t.list.length,`profile`)),total:t.list.length,items:t.list.map(e=>({key:e.id,label:e.name||`Untitled`,sub:e.model,href:`#/setup`}))})]})}),(0,$.jsxs)(`p`,{className:`home-version`,children:[`Evals Lab `,Go]})]})}function Qo({id:e,icon:n,name:r,to:i,fact:a,items:o,total:s=o.length,hub:c,start:l,branch:u,wait:d}){let f=s-Math.min(o.length,Ko);return(0,$.jsxs)(`li`,{className:[`home-stop`,c&&`hub`,l&&`start`,u&&`branch`].filter(Boolean).join(` `),"data-stop":e,children:[(0,$.jsxs)(`a`,{className:`home-name`,href:`#/${i??e}`,children:[(0,$.jsx)(`span`,{className:`home-mark`,"aria-hidden":`true`,children:(0,$.jsx)(n,{size:u?15:18})}),r]}),l&&(0,$.jsx)(`span`,{className:`home-start`,children:`Start Here`}),d&&(0,$.jsx)(t,{label:r,error:d.error,onRetry:d.onRetry}),!d&&a&&(0,$.jsx)(`span`,{className:`home-fact`,children:a}),!d&&o.length>0&&(0,$.jsxs)(`ul`,{className:`home-items`,children:[o.slice(0,Ko).map(e=>(0,$.jsx)(`li`,{children:(0,$.jsxs)(`a`,{href:e.href,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)),f>0&&(0,$.jsx)(`li`,{children:(0,$.jsxs)(`a`,{className:`home-more`,href:`#/${i??e}`,children:[f,` more`]})})]})]})}function $o({list:t,at:n,canRestore:r,onSelect:i,onNew:a,onClone:o,onRename:s,onDelete:c,onRestore:l,onExport:u,onExportCi:d,onImport:f,used:h={}}){let[g,_]=(0,Q.useState)(!1),[v,y]=(0,Q.useState)(!1),b=t.find(e=>e.id===n),x=[{label:`Rename…`,icon:j,onSelect:()=>_(!0)},{label:`Clone`,icon:Se,onSelect:o},{label:`Export YAML`,icon:e,onSelect:u},{label:`Export for CI…`,icon:e,onSelect:d},{label:`Import YAML…`,icon:S,onSelect:f},{label:`Restore…`,icon:m,disabled:!r,onSelect:l},{label:`Delete`,icon:p,destructive:!0,onSelect:c}],C=b?.work.jobs?.length??0,w=b?.work.targets?.length??0;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(D,{kind:`Pipeline`,name:b?.name?.trim()||`Untitled`,onPick:()=>y(!0),meta:`${ts(C,`job`)}, ${ts(w,`target`)}`,primary:{label:`New pipeline`,icon:A,onSelect:a},actions:x,docked:!0}),v&&(0,$.jsx)(ie,{kind:`Pipeline`,value:n,onPick:i,onClose:()=>y(!1),options:t.map(e=>{let t=h[e.id];return{id:e.id,label:e.name||`Untitled`,used:t?{at:t,label:Gn(t)}:null}}),recent:t.filter(e=>h[e.id]).sort((e,t)=>h[t.id].localeCompare(h[e.id])).slice(0,es).map(e=>e.id)}),g&&(0,$.jsx)(re,{title:`Rename pipeline`,value:b?.name??``,onCommit:s,onClose:()=>_(!1)})]})}var es=5,ts=(e,t)=>`${e} ${e===1?t:`${t}s`}`;function ns({hasItems:t,onExport:n,onClose:r}){let[i,a]=(0,Q.useState)(!1),[o,s]=(0,Q.useState)(!1),[c,l]=(0,Q.useState)(null),u=async()=>{s(!0),l(null);try{await n(t&&i),r()}catch(e){l(e instanceof Error?e.message:String(e))}finally{s(!1)}};return(0,$.jsx)(T,{title:`Export for CI`,status:c??void 0,statusBad:!!c,onClose:r,sections:[{key:`bundle`,rows:[{key:`items`,label:`Include files`,...t?{hint:`Copy the Source's files into the zip. Off, evals-lab run needs --items`}:{},control:t?{type:`checkbox`,checked:i,onChange:a}:{type:`static`,text:`None`}}]}],actions:[{label:`Export`,icon:e,busy:o,primary:!0,onSelect:()=>void u()}]})}function rs({problems:e,error:t,run:n,submitting:r,onRun:i,onStop:a,onOpen:o}){let s=!!n&&!sr(n.status),c=n?.progress?.total??0,l=n?.progress?.n??0,u=s&&c?Math.round(l/c*100):null,d=n&&(0,$.jsxs)(`button`,{type:`button`,className:`runbar-open`,title:`Open this run`,onClick:o,children:[(0,$.jsx)(`span`,{className:`runbar-word`,children:qn(n.status)}),is(n)&&(0,$.jsx)(`span`,{className:`runbar-detail`,children:is(n)})]}),f=s?d:e.length?(0,$.jsxs)(`span`,{className:`runbar-why`,children:[ss(e[0]),os(e[0])]}):t?(0,$.jsx)(`span`,{className:`runbar-why bad`,children:ss(t)}):d??(0,$.jsx)(`span`,{className:`runbar-word`,children:`Ready to run`});return(0,$.jsx)(ue,{className:`runbar`,primary:{label:`Run`,icon:k,onSelect:i,disabled:e.length>0,busy:r},status:f,secondary:s?{label:`Stop`,icon:g,onSelect:a}:void 0,progress:u,progressLabel:`Run progress`})}function is(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=Zn(e.startedAt,e.finishedAt);return t==null?String(e.progress.total):`${e.progress.total} in ${Xn(t)}`}return``}var as=[[/^Target profile .* not found$/,`#/setup`,`Open\xA0Setup`],[/^Source .* not found$/,`#/library/sources`,`Open\xA0Sources`],[/^Dataset .* not found$/,`#/library/datasets`,`Open\xA0Evals`]];function os(e){let t=as.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 ss=e=>{let t=e.trim();if(!t)return t;let n=t[0].toUpperCase()+t.slice(1);return/[.!?]$/.test(n)?n:`${n}.`},cs=10;function ls({onPick:e,onClose:n,used:r}){let{list:i,error:a}=Ct(),o=St(),[s,c]=(0,Q.useState)(``),[l,u]=(0,Q.useState)(`all`),[d,f]=(0,Q.useState)(0),p=i??[],m=p.filter(e=>Yi(e,s,l,r??{byScenario:new Set,byAll:new Set})).sort((e,t)=>Number(t.default)-Number(e.default)),h=Math.ceil(m.length/cs),g=Math.min(d,Math.max(0,h-1)),_=m.slice(g*cs,(g+1)*cs);return(0,$.jsxs)(Z,{title:`Select prompt`,onClose:n,className:`sp`,initialFocus:`.sp input[type=search]`,children:[(0,$.jsx)(W,{noun:`prompts`,search:{label:`Search prompts`,placeholder:`Search prompts`,value:s,onChange:e=>{c(e),f(0)}},filters:[{key:`show`,label:`Show`,value:l,onChange:e=>{u(e),f(0)},options:qi}],count:{shown:m.length,total:p.length}}),i===null?(0,$.jsx)(t,{label:`Prompts`,error:a,onRetry:()=>void o.refresh()}):p.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No prompts yet.`}):m.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:_.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:ht(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 `,Xi(t.lastUsed)]}),(0,$.jsxs)(`span`,{children:[`v`,t.version]})]})]})},t.id))}),h>1&&(0,$.jsxs)(`div`,{className:`sp-pager`,children:[(0,$.jsx)(`button`,{type:`button`,className:`ghost`,disabled:g===0,onClick:()=>f(g-1),children:`Back`}),(0,$.jsxs)(`span`,{className:`sp-page`,children:[g+1,` of `,h]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,disabled:g>=h-1,onClick:()=>f(g+1),children:`Forward`})]})]})]})}function us(e){let t=J(),n=e.jobs.at(-1),r=ne(t.defaultKind()),i=t.outOf(n),a=t.outOf(r),o=e=>!ge(e.type)||ge(e.type).includes(a.kind),s=i.modifiers.filter(o);return s.length&&(r=t.withOut(r,{...a,modifiers:s})),Gs(e,[...e.jobs.slice(0,-1),t.withOut(n,{...i,modifiers:i.modifiers.filter(e=>!o(e))}),r],()=>({type:`prompt`,prompt:``}))}function ds(e,t){if(e.jobs.length<2)return e;let n=e.jobs.slice();if(t===n.length-1){let e=J(),r=e.outOf(n[t]),i=e.outOf(n[t-1]),a=r.modifiers.filter(e=>!ge(e.type)||ge(e.type).includes(i.kind)),o=[...i.modifiers,...a];n[t-1]=e.withOut(n[t-1],{...i,modifiers:o.length?o:we(i.kind)})}return n.splice(t,1),{...e,jobs:n,targets:e.targets.map(e=>({...e,steps:e.steps.filter((e,n)=>n!==t)}))}}function fs(e,t){let n={...structuredClone(e.jobs[t]),id:J().newId()};n.name=`${J().jobLabel(e,t)} copy`;let r=[...e.jobs.slice(0,t+1),n,...e.jobs.slice(t+1)],i=e.targets.map(e=>({...e,steps:[...e.steps.slice(0,t+1),structuredClone(e.steps[t]),...e.steps.slice(t+1)]}));return{...e,jobs:r,targets:i}}function ps(e,t,n){let r=e.jobs.map((e,r)=>r===t?{...e,name:n.trim()}:e);return{...e,jobs:r}}function ms(e,t,n){let r=J().outOf(e.jobs[t]);if(r.kind===n||!n)return e;let i=t===e.jobs.length-1,a=r.modifiers.filter(e=>!ge(e.type)||ge(e.type).includes(n));return{...e,jobs:e.jobs.map((e,r)=>r===t?J().withOut(e,{kind:n,...U(n),modifiers:i?a.length?a:we(n):[]}):e)}}var hs=(e,t)=>({...e,evals:[...e.evals,t]}),gs=(e,t)=>({...e,evals:e.evals.filter((e,n)=>n!==t)}),_s=(e,t,n)=>({...e,evals:e.evals.map((e,r)=>r===t?{...e,name:n.trim()}:e)}),vs=(e,t,n)=>({...e,evals:e.evals.map((e,r)=>r===t?n:e)}),ys=(e,t)=>hs(e,J().newLink(t)),bs=(e,t,n)=>({...e,evals:e.evals.map((e,r)=>r===t?{...e,pin:n}:e)}),xs=(e,t,n)=>({...e,evals:e.evals.map((e,r)=>r===t?{id:e.id,name:e.name,continueOnFailure:e.continueOnFailure,type:`group`,group:{id:n.id,name:n.name},pin:null}:e)}),Ss=(e,t,n)=>({...e,evals:e.evals.map((e,r)=>r===t&&e.own?{...e,own:{...e.own,cases:[...e.own.cases,...n],casesFrom:null}}:e)}),Cs=(e,t)=>({...e,pass:t}),ws=e=>e[0]?{id:e[0].id,name:e[0].name}:{id:``,name:``};function Ts(e,t,n=``){let r=J(),i=!!r.targetEntryOf(e,0,0)?.newStep,a={id:r.newId(),name:``,profile:i?e.targets.at(-1)?.profile??t:t,steps:e.jobs.map((t,i)=>{let a=r.targetStepOf(e,0,i),o=r.STEP_TYPES[r.jobTargetType(e,i)]?.local?`prompt`:r.jobTargetType(e,i);return a&&r.targetEntryOf(e,0,i)?.newStep?.(a)||{type:o,prompt:i===0?n:``}})};return{...e,targets:[...e.targets,a]}}function Es(e){let t=new Set(e.map(e=>e.trim().toLowerCase())),n=1;for(;t.has(`pipeline ${n}`);)n+=1;return`Pipeline ${n}`}var Ds={id:`samples`,name:`Sample library`};function Os(e,t,n=``){let r=J().withContent({...J().blankPipeline({name:Es([])}),evals:t?[J().newLink(t)]:[]},{type:`source`,ref:{...Ds},first:null,loops:1});if(t){let e=J();r={...r,jobs:[e.withTokens(e.withOut(r.jobs[0],{kind:`list`,...U(`list`),modifiers:[{type:`tidy`},{type:`dedupe`}]}),e.mappingsFor(n))]}}return r=Ts(r,e,n),Ts(r,e,n)}function ks(e,t){let n=e=>!!e.profile&&!e.profile.id;return!t.id||!e.targets.some(n)?e:{...e,targets:e.targets.map(e=>n(e)?{...e,profile:{...t}}:e)}}function As(e,t){let n={...structuredClone(e.targets[t]),id:J().newId(),name:`${J().targetLabel(e,t)} copy`};return{...e,targets:[...e.targets.slice(0,t+1),n,...e.targets.slice(t+1)]}}function js(e,t){return{...e,targets:e.targets.filter((e,n)=>n!==t)}}function Ms(e,t,n){return{...e,targets:e.targets.map((e,r)=>r===t?{...e,name:n.trim()}:e)}}function Ns(e,t,n,r){return n===0?{...e,targets:e.targets.map((e,n)=>n===t?{...e,profile:r??e.profile}:e)}:J().withTarget(e,t,n,e=>{if(r)return{...e,profile:r};let{profile:t,...n}=e;return n})}function Ps(e,t,n,r){return J().withTarget(e,t,n,{prompt:r})}function Fs(e,t,n,r,i){return J().withTarget(e,t,n,{prompt:r,from:{...i}})}function Is(e,t){return new Set(e.jobs.flatMap((n,r)=>J().targetStepOf(e,t,r)?.from?.id??[]))}function Ls(e){let t=J().targetsOf(e).length,n=Is(e,0);for(let r=1;r<t;r++){let t=Is(e,r);for(let e of[...n])t.has(e)||n.delete(e)}return n}function Rs(e,t,n,r){return Ws(e,t,e=>e.map(e=>e.name===n?{...e,...r}:e))}function zs(e,t,n,r){let i=n.trim();return i?Ws(e,t,e=>e.some(e=>e.name===i)?e:[...e,J().tokenMapping(i,r)]):e}function Bs(e,t,n,r){let i=r.name.trim();return i?Ws(e,t,e=>i!==n&&e.some(e=>e.name===i)?e:e.map(e=>e.name===n?e.type===r.type?{...e,name:i}:J().tokenMapping(i,r.type):e)):e}function Vs(e,t,n){return Ws(e,t,e=>e.filter(e=>e.name!==n))}var Hs=/^(?:text|reply|stage[1-9]\d*(?:\..*)?)$/;function Us(e,t,n,r){let i=n.trim();return i?/[{}\s]/.test(i)?`A name has no braces or spaces.`:Hs.test(i)?`{${i}} is filled in by the lab.`:i!==r&&J().tokensOf(e.jobs[t]).some(e=>e.name===i)?`{${i}} is already mapped.`:null:`A mapping needs a name.`}function Ws(e,t,n){let r=J();return{...e,jobs:e.jobs.map((e,i)=>i===t?r.withTokens(e,n(r.tokensOf(e))):e)}}function Gs(e,t,n){let r=t.length,i=e.targets.map(e=>{let t=e.steps.slice(0,r);for(;t.length<r;)t.push(n(t.length));return{...e,steps:t}});return{...e,jobs:t,targets:i}}var Ks=(e,t)=>J().targetLabel(e,t);function qs(e,t){let n=J().STEP_TYPES;return t.includes(n[e]?.asks??`prompt`)?e:Object.entries(n).find(([,e])=>e.slot===`target`&&t.includes(e.asks??`prompt`))?.[0]??e}function Js(e,t,n,r){if(n.type===r)return n;let i={prompt:n.prompt,...n.profile?{profile:n.profile}:{},...n.from?{from:n.from}:{}},a=J();if(a.STEP_TYPES[r]?.asks!==`request`)return{type:r,...i};let o=a.targetsOf(e).map((n,r)=>a.targetStepOf(e,r,t)).find(e=>e?.type===r);return{type:r,...o?{api:o.api,method:o.method,path:o.path,query:structuredClone(o.query),body:structuredClone(o.body)}:{api:a.flowStepOf(e.jobs[t])?.api??`raw`,method:`POST`,path:`/`,query:{},body:null},...i}}function Ys(e,t,n,r,i){let a=Ns(e,t,n,r),o=J();return a.jobs.forEach((e,n)=>{let r=o.targetProfileOf(a,t,n),s=r?i(r.id):void 0,c=o.targetStepOf(a,t,n);if(!s||!c)return;let l=qs(c.type,s);l!==c.type&&(a=o.withTarget(a,t,n,e=>Js(a,n,e,l)))}),a}var Xs=(e,t,n)=>({...e,jobs:e.jobs.map((e,r)=>r===t?J().withImage(e,n):e)});function Zs(e,t,n){let r=J();return{...e,jobs:e.jobs.map((e,i)=>{if(i!==t)return e;let a=e.steps.filter(e=>e.type!==`readAs`),o=a.findIndex(e=>r.STEP_TYPES[e.type]?.slot===`responses`);if(n==null)return{...e,steps:a};let s={type:`readAs`,readAs:n};return{...e,steps:o<0?[...a,s]:[...a.slice(0,o),s,...a.slice(o)]}})}}function Qs(e,t){let n=J(),r=n.defaultKind(),i=n.outOf(e.jobs[t]).modifiers.filter(e=>!ge(e.type)||ge(e.type).includes(r));return{...e,jobs:e.jobs.map((e,a)=>a===t?n.withOut(e,{kind:r,...U(r),modifiers:i}):e)}}function $s(e,t){let n=J().outOf(e.jobs[t]).modifiers.filter(e=>!ge(e.type)||ge(e.type).includes(`text`));return{...e,jobs:e.jobs.map((e,r)=>{if(r!==t)return e;let i=e.steps.filter(e=>e.type!==`readReply`&&e.type!==`modifier`);return{...e,steps:[...i,...n.map(e=>({type:`modifier`,modifier:e}))]}})}}function ec(e,t){let n=J().withTarget(e,t,0,e=>({type:`echo`,prompt:e.prompt,...e.from?{from:e.from}:{}}));return e.jobs.length===1&&(n={...n,targets:n.targets.map((e,n)=>n===t?{...e,profile:null}:e)}),n}function tc({k:e,pipeline:t,sources:n,edit:r,offer:a,open:s,onToggle:c}){let[l,u]=(0,Q.useState)(!1),[d,f]=(0,Q.useState)(null),p=J(),m=t.jobs[e],h=e===0?p.contentOf(t):null,g=p.flowStepOf(m),v=p.sendsImage(m),y=p.tokensOf(m),b=p.CONTENT_TYPES,x=p.targetsOf(t).some((n,r)=>p.STEP_TYPES[p.targetStepOf(t,r,e)?.type??``]?.asks===`request`)||e===0&&!!b[h?.type??``]?.inline,S=[...e>0?[{kind:`reply`}]:[],...h?[{kind:`attach`}]:[],...g?[{kind:`flow`}]:[],...v?[{kind:`image`}]:[],...y.map(e=>({kind:`mapping`,name:e.name}))],C=(e,n)=>{let i=t;r(n),a({label:e,restore:()=>r(i)})},w=(e,n)=>r(Xs(p.withContent(t,e),0,n)),T=[...e===0&&!h?[{label:`Source…`,icon:_.add,onSelect:()=>u(!0)},{label:b.text?.label??`Text`,icon:_.add,onSelect:()=>w({type:`text`,text:``},!1)},{label:b.prompt?.label??`Prompt only`,icon:_.add,onSelect:()=>w({type:`prompt`},!1)}]:[],...!v&&!x?[{label:p.STEP_TYPES.attachImage?.label??`Image`,icon:_.add,onSelect:()=>r(Xs(t,e,!0))}]:[],{label:`Token mapping`,icon:_.add,onSelect:()=>f({mode:`add`})}],E=n=>{n.kind===`attach`?C(`Removed the content`,p.withContent(t,null)):n.kind===`image`?C(`Stopped sending the image`,Xs(t,e,!1)):n.kind===`mapping`&&C(`Removed {${n.name}}`,Vs(t,e,n.name))},D=d?.mode===`edit`?y.find(e=>e.name===d.name):void 0,O=n=>{let i=t;d?.mode===`add`?r(zs(i,e,n.name,n.type)):D&&(r(Bs(i,e,D.name,n)),n.type!==D.type&&D.value&&a({label:`Changed {${D.name}} to ${p.TOKEN_TYPES[n.type]?.label.toLowerCase()??n.type}`,restore:()=>r(i)})),f(null)},k=(i,a)=>{switch(i.kind){case`reply`:return[{key:`reply`,label:`${p.jobLabel(t,e-1)} reply`,locked:!0,control:{type:`static`,text:`Each target's ${G(p.outOf(t.jobs[e-1]).kind)}`}}];case`attach`:return[h?.type===`text`?{key:`attach`,label:p.STEP_TYPES.attachContent?.label??`Attach Content`,required:!0,actions:a,control:{type:`textarea`,value:h.text,placeholder:`The item every target is sent`,onChange:e=>r(p.withContent(t,{...h,text:e}))}}:{key:`attach`,label:p.STEP_TYPES.attachContent?.label??`Attach Content`,required:!0,actions:a,control:{type:`static`,text:ic(h,n)}}];case`flow`:return[{key:`flow`,label:p.STEP_TYPES.flowStep?.label??`Flow step`,required:!0,actions:a,control:{type:`static`,text:g?.step??``}},{key:`api`,label:`API`,required:!0,control:{type:`select`,value:g?.api??``,onChange:n=>r({...t,jobs:t.jobs.map((t,r)=>r===e?{...t,steps:t.steps.map(e=>e.type===`flowStep`?{...e,api:n}:e)}:t)}),options:Object.entries(p.HTTP_APIS).map(([e,t])=>({value:e,label:t.label}))}}];case`image`:return[{key:`image`,label:p.STEP_TYPES.attachImage?.label??`Attach Image`,required:!0,actions:a,control:{type:`static`,text:`Each item`}}];case`mapping`:{let n=y.find(e=>e.name===i.name),o=p.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(Rs(t,e,n.name,{value:i}))}:{type:`static`,text:o?.label??n.type},...s.includes(`enabled`)?{enabled:{checked:!!n.enabled,onChange:i=>r(Rs(t,e,n.name,{enabled:i}))}}:{},actions:[{label:`Edit…`,icon:_.edit,onSelect:()=>f({mode:`edit`,name:n.name})},...a]}]}}},A=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`,j=S.map(r=>nc[r.kind](t,e,n)).join(`, `)||`none`;return(0,$.jsxs)(o,{id:`job-${e}-content`,title:`Content`,level:3,note:j,open:s,onToggle:c,children:[(0,$.jsx)(he,{noun:`content`,items:S,onAdd:T,onRemove:e=>E(S[e]),locked:e=>e.kind===`reply`||e.kind===`flow`,extra:e=>e.kind===`attach`?[{label:`Change content`,icon:_.rename,onSelect:()=>u(!0)}]:[],empty:(0,$.jsx)(`p`,{className:`note`,children:`No content`}),renderItem:(t,n,r)=>(0,$.jsx)(`div`,{className:`stage-row`,id:t.kind===`mapping`?void 0:`job-${e}-${t.kind}`,children:(0,$.jsx)(i,{label:A(t),rows:k(t,r)})},t.kind===`mapping`?`m-${t.name}`:t.kind)}),d&&(d.mode===`add`||D)&&(0,$.jsx)(ve,{title:D?p.TOKEN_TYPES[D.type]?.notation(D.name)??`{${D.name}}`:`New mapping`,initial:D?{name:D.name,type:D.type}:{name:``,type:`value`},problem:n=>Us(t,e,n,D?.name),onSave:O,onClose:()=>f(null)},d.mode===`edit`?d.name:`add`),l&&(0,$.jsxs)(Z,{title:h?`Change content`:`Add content`,onClose:()=>u(!1),children:[(0,$.jsx)(To,{mode:`pick`,onPick:e=>{w({type:`source`,ref:I(e.id,e.name),first:null,loops:1},p.sourceTypeOf(e)?.sendsImage??!1),u(!1)}}),(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:()=>{w({type:`text`,text:``},!1),u(!1)},children:[(0,$.jsx)(`span`,{children:b.text?.label??`Text`}),b.text?.description&&(0,$.jsx)(`span`,{className:`pick-about`,children:b.text.description})]}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,onClick:()=>{w({type:`prompt`},!1),u(!1)},children:[(0,$.jsx)(`span`,{children:b.prompt?.label??`Prompt only`}),b.prompt?.description&&(0,$.jsx)(`span`,{className:`pick-about`,children:b.prompt.description})]})]})]})]})}var nc={reply:(e,t)=>`${J().jobLabel(e,t-1)}, ${G(J().outOf(e.jobs[t-1]).kind)}`,attach:(e,t,n)=>ic(J().contentOf(e),n),flow:(e,t)=>J().flowStepOf(e.jobs[t])?.step??``,image:()=>`image`,mapping:()=>`token mapping`},rc=(e,t)=>{let n=t.find(t=>t.id===e.ref.id);return n?`${n.name}, ${n.files} ${n.files===1?`file`:`files`}`:`A Source that is gone: ${e.ref.name}`},ic=(e,t)=>e?e.type===`source`?rc(e,t):J().CONTENT_TYPES[e.type]?.label??e.type:`none`;async function ac(e){try{return await navigator.clipboard.writeText(e),!0}catch{}let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=!1;try{n=document.execCommand(`copy`)}catch{n=!1}return t.remove(),n}var oc={prompt:{actions:cc},echo:{actions:cc},recorded:{promptLabel:()=>``,rows:()=>[],actions:()=>[]},httpRequest:{promptLabel:e=>lc(e)?.fields.length?`Prompt`:`Body`,rows:dc,words:_c,actions:vc}},sc=e=>oc[e??``]??oc.prompt;function cc({pipeline:e,i:t,k:n,onSelectPrompt:r,onClearPrompt:i,onSaveToLibrary:a,defaultPrompt:o,onRevert:s}){let c=J().targetStepOf(e,t,n)?.prompt??``;return[{label:`Select prompt…`,icon:h,onSelect:r},...a?[{label:`Save to library…`,icon:Yt,disabled:!c,onSelect:a}]:[],{label:`Clear prompt`,icon:_.clear,disabled:!c,onSelect:i},...s&&o!=null?[{label:`Revert to default`,icon:_.revert,disabled:c===o,onSelect:s}]:[]]}var lc=e=>J().HTTP_APIS[e?.api??``],uc=e=>{let t=Object.entries(e??{}).map(([e,t])=>`${e}=${t}`).join(`&`);return t?`?${t}`:``};function dc(e,t){let n=e,r=[{key:`api`,label:`API`,control:t?{type:`select`,value:n.api,onChange:e=>t({api:e}),options:Object.entries(J().HTTP_APIS).map(([e,t])=>({value:e,label:t.label}))}:{type:`static`,text:lc(e)?.label??n.api}},{key:`request`,label:`Request`,control:{type:`code`,text:`${n.method} ${n.path}${uc(n.query)}`}},{key:`body`,label:`Template`,control:{type:`code`,text:JSON.stringify(n.body,null,2)}}],i=lc(e);if(!i)return r;let a=(n,r,i=!1)=>({key:n,label:r,control:t?i?{type:`textarea`,value:e[n]??``,onChange:e=>t({[n]:e})}:{type:`text`,value:e[n]??``,onChange:e=>t({[n]:e})}:{type:`static`,text:e[n]??`—`}});if(i.fields.includes(`system`)&&r.push(a(`system`,`System`,!0)),i.fields.includes(`model`)&&r.push(a(`model`,`Model`)),i.fields.includes(`settings`))for(let n of i.settings){let i=e.settings?.[n]??``;r.push({key:`setting-${n}`,label:n,control:t?{type:`text`,value:i,size:`num`,onChange:r=>t({settings:{...e.settings,[n]:r}})}:{type:`static`,text:i||`—`}})}return i.fields.includes(`prefill`)&&r.push(a(`prefill`,`Prefill`)),r}function fc(e){return(lc(e)??J().HTTP_APIS.raw).place(e.body,e)}function pc(e){return JSON.stringify(fc(e),null,2)}function mc(e,t){let n=fc(e);return t?{text:t.render(n),writtenFor:t.label}:{text:pc(e),writtenFor:`JSON`}}function hc(e,t,n){let r=J().targetStepOf(e,t,n);if(!r)return``;let i=lc(r),a=e.jobs[n],o=J().flowStepOf(a),s=J().readAsOf(a),c=J().contentOf(e),l=c?.type===`source`?c.ref.name:null,u=i?.cellOf(r.body),d=u?[`prompt`,`system`,`model`,`prefill`].filter(e=>(r[e]??``)!==(u[e]??``)).concat(Object.keys({...u.settings,...r.settings}).filter(e=>(r.settings?.[e]??``)!==(u.settings?.[e]??``))):[],f=[`In the Power Automate flow${l?` "${l}"`:``}, edit the HTTP action "${o?.step??``}".`,`Replace its Body with the JSON below, exactly as written. Leave its URI, method and headers as they are.`,`Expressions such as @{items('Apply_to_each')} are Power Automate's own; keep them as they are.`];return d.length&&f.push(`What changes from the flow as it is: ${d.join(`, `)} (the lab's target "${Ks(e,t)}").`),r.prefill&&f.push(`The body ends with an assistant message, ${JSON.stringify(r.prefill)}, which starts the model's reply. The reply the action returns does not repeat it, so wherever the flow reads the reply`+(s?` (${s})`:``)+` put ${JSON.stringify(r.prefill)} back in front of the text, for example with concat('${r.prefill.replace(/'/g,`''`)}', …).`),f.push(``,`Body:`,"```json",pc(r),"```"),f.join(`
|
|
10
|
+
`)}var gc=e=>(lc(e)??J().HTTP_APIS.raw).cellOf(e.body??null).prompt??``;function _c(e){let t=gc(e),n=e.prompt??``;return de(t)||de(n)?{text:n,was:t}:null}function vc({pipeline:e,i:t,k:n,say:r,onSelectPrompt:i,onSaveToLibrary:a,onCopyRequest:o}){let s=J().targetStepOf(e,t,n);if(!s)return[];let c=s.prompt??``,l=async(e,t)=>r(await ac(e)?`Copied ${t}.`:`Could not copy.`);return[{label:`Select prompt…`,icon:h,onSelect:i},...a?[{label:`Save to library…`,icon:Yt,disabled:!c,onSelect:a}]:[],...o?[{label:`Copy request…`,icon:Ot,onSelect:o}]:[],{label:`Copy as AI prompt`,icon:Qt,onSelect:()=>void l(hc(e,t,n),`the AI prompt`)}]}function yc({label:e,profile:t,prompt:n,onPrompt:r,rows:a=[],promptLabel:o=`Prompt`,words:s}){return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(i,{label:`${e} setup`,rows:[{key:`profile`,label:`Profile`,control:t},...a]}),s?(0,$.jsxs)(`div`,{className:`prompt`,children:[(0,$.jsx)(`span`,{className:`prop-name`,children:o}),(0,$.jsx)(xe,{words:s.text,was:s.was})]}):(0,$.jsxs)(`label`,{className:`prompt`,children:[(0,$.jsx)(`span`,{className:`prop-name`,children:o}),(0,$.jsx)(`textarea`,{value:n,"aria-label":`${e}, prompt`,rows:8,readOnly:!r,onChange:e=>r?.(e.target.value)})]})]})}function bc({run:e,i:t,onClose:n}){let r=J(),i=r.targetLabel(e,t),a=r.targetsOf(e)[t],o=t=>t&&(e.profiles?.[t.id]?.name||t.name)||`—`,s=e.jobs.length;return(0,$.jsx)(T,{title:i,sections:e.jobs.flatMap((n,i)=>{let a=r.targetStepOf(e,t,i);return a?[{cell:a,k:i}]:[]}).map(({cell:t,k:n})=>({key:`job-${n}`,...s>1?{title:r.jobLabel(e,n)}:{},children:(0,$.jsx)(yc,{label:s>1?`${i}, ${r.jobLabel(e,n)}`:i,profile:{type:`static`,text:n===0?r.STEP_TYPES[t.type]?.local?r.STEP_TYPES[t.type].label??`Echo`:o(a?.profile??void 0):t.profile?o(t.profile):`Same as ${r.jobLabel(e,0)}`},prompt:t.prompt,rows:sc(t.type).rows?.(t)??[],promptLabel:sc(t.type).promptLabel?.(t)??`Prompt`,words:sc(t.type).words?.(t)})})),onClose:n})}function xc({index:e}){return(0,$.jsx)(`span`,{className:`target-badge`,"aria-hidden":`true`,children:J().targetLetter(e)})}function Sc({k:e,pipeline:t,profiles:n,targetCap:r,onRequestRename:i,onAdd:a,onClone:s,onRemove:c,onProfile:l,onEcho:u,onPrompt:d,onStep:f,onSelectPrompt:p,onClearPrompt:m,onSaveToLibrary:h,onCopyRequest:g,defaultPrompt:_,onRevert:v,say:y=()=>{}}){let b=J(),[x]=Je(`promptlab.versions`),S=e=>x.profile?.[e]?.[0]?.at??null,C=b.targetsOf(t),w=C.length;return(0,$.jsx)(o,{id:`job-${e}-targets`,title:`Targets`,level:3,note:`${w} ${w===1?`target`:`targets`}`,children:(0,$.jsx)(he,{noun:`target`,items:C,min:1,max:r,onAdd:a,onClone:s,onRemove:c,onRename:i,extra:(n,r)=>sc(b.targetStepOf(t,r,e)?.type).actions?.({pipeline:t,i:r,k:e,say:y,onSelectPrompt:()=>p(r),onClearPrompt:()=>m(r),onSaveToLibrary:()=>h(r),onCopyRequest:()=>g(r),defaultPrompt:_,onRevert:v&&(()=>v(r))})??[],empty:(0,$.jsx)(`p`,{className:`note`,children:`No targets`}),renderItem:(r,i,a)=>{let o=Ks(t,i),s=b.targetStepOf(t,i,e)??{type:`prompt`,prompt:``},c=sc(s.type),p=b.STEP_TYPES[s.type],m=e>0&&!!p?.firstJobOnly,h=!!b.CONNECTION_TYPES[p?.replaces??``]?.replays;return(0,$.jsxs)(`div`,{className:`target`,id:`job-${e}-target-${i}`,children:[(0,$.jsxs)(`div`,{className:`target-head`,children:[(0,$.jsx)(xc,{index:i}),(0,$.jsx)(`h4`,{className:`target-name`,children:o}),m&&(0,$.jsx)(`span`,{className:`target-idle`,children:`Job 1 only`}),(0,$.jsx)(se,{actions:a,label:`${o} actions`})]}),!m&&h&&(0,$.jsx)(`p`,{className:`note`,children:p?.description??`Replays the recorded reply. Sends nothing.`}),!m&&!h&&(0,$.jsx)(yc,{label:o,profile:e===0?{type:`picker`,kind:`Profile`,value:wc(s)?Cc:r.profile?.id??``,usedLabel:`Last changed`,...mi(Ec(n,r.profile),S,Tc()),onChange:e=>e===Cc?u(i):l(i,Dc(n,e))}:{type:`picker`,kind:`Profile`,value:s.profile?.id??``,usedLabel:`Last changed`,...mi(Ec(n,s.profile),S,[{id:``,label:`Same as ${b.jobLabel(t,0)}`}]),onChange:e=>l(i,e?Dc(n,e):null)},prompt:s.prompt,onPrompt:e=>d(i,e),rows:c.rows?.(s,e=>f(i,e))??[],promptLabel:c.promptLabel?.(s)??`Prompt`,words:c.words?.(s)})]},`${i}-${e}`)}})})}var Cc=`#echo`,wc=e=>!!J().STEP_TYPES[e.type]?.local,Tc=()=>Object.entries(J().STEP_TYPES).filter(([,e])=>e.slot===`target`&&e.local&&!J().CONNECTION_TYPES[e.replaces??``]?.replays).map(([,e])=>({id:Cc,label:e.label??`Echo`})),Ec=(e,t)=>[...t?.id&&!e.some(e=>e.id===t.id)?[{id:t.id,name:`${t.name||t.id} (missing)`}]:[],...e.map(e=>({id:e.id,name:e.name}))],Dc=(e,t)=>{let n=e.find(e=>e.id===t);return n?{id:n.id,name:n.name}:null};function Oc({text:e,writtenFor:t,say:n,onClose:r}){let i=async()=>{n(await ac(e)?`Copied the request.`:`Could not copy.`),r()};return(0,$.jsx)(T,{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:Ot,primary:!0,onSelect:()=>void i()}]})}function kc({pipeline:e,profiles:t,sources:n,targetCap:r,prompt:i=``,defaultPrompt:a,protectedTerms:s,edit:c,offer:l}){let[u,d]=(0,Q.useState)(null),[f,p]=(0,Q.useState)(null),[m,h]=(0,Q.useState)(null),[g,_]=(0,Q.useState)(null),[v,y]=(0,Q.useState)(null),[b,x]=(0,Q.useState)({}),S=e=>b[e]??!1,C=e=>t=>x(n=>({...n,[e]:t})),w=St(),T=()=>{let t=J().contentOf(e),r=t?.type===`source`?t.ref.id:null,i=r?n.find(e=>e.id===r)?.platform:void 0;return i&&J().WORKFLOW_PLATFORMS[i]||null},E=(t,n)=>{let r=e;c(n),l({label:t,restore:()=>c(r)})},D=e=>{let n=t.find(t=>t.id===e);return n?J().CONNECTION_TYPES[J().typeOf(n)]?.answers??[`prompt`]:void 0},O=!J().targetsOf(e).length;return(0,$.jsxs)(`div`,{className:`jobs`,children:[v&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:v}),(0,$.jsx)(he,{noun:`job`,items:e.jobs,min:1,addDisabled:O,onAdd:()=>c(us(e)),onClone:t=>c(fs(e,t)),onRemove:t=>E(`Removed ${J().jobLabel(e,t)}`,ds(e,t)),onRename:e=>d({job:e}),renderItem:(u,f,m)=>{let g=`Job ${f+1}${u.name?.trim()?` - ${u.name.trim()}`:``}`,v=J().flowStepOf(u)?J().readAsOf(u):void 0;return(0,$.jsxs)(Q.Fragment,{children:[f>0&&(0,$.jsxs)(`div`,{className:`job-reply`,"aria-hidden":`true`,children:[(0,$.jsx)(me,{size:16}),(0,$.jsx)(`span`,{children:`Reply`})]}),(0,$.jsx)(o,{id:`job-${f}`,title:g,level:2,actions:m,note:Ac(e,f),children:(0,$.jsxs)(`div`,{className:`stages`,children:[(0,$.jsx)(tc,{k:f,pipeline:e,sources:n,edit:c,offer:l,open:S(`job-${f}-content`),onToggle:C(`job-${f}-content`)}),(0,$.jsx)(Sc,{k:f,pipeline:e,profiles:t,targetCap:r,onRequestRename:e=>d({job:f,scenario:e}),onAdd:()=>c(Ts(e,ws(t),i)),onClone:t=>c(As(e,t)),onRemove:t=>E(`Removed ${Ks(e,t)}`,js(e,t)),onProfile:(t,n)=>c(Ys(e,t,f,n,D)),onEcho:t=>c(ec(e,t)),onPrompt:(t,n)=>c(Ps(e,t,f,n)),onStep:(t,n)=>c(jc(e,t,f,n)),say:y,onSelectPrompt:e=>p({i:e,k:f}),onClearPrompt:t=>E(`Cleared ${Ks(e,t)}'s prompt`,Ps(e,t,f,``)),onSaveToLibrary:e=>h({i:e,k:f}),onCopyRequest:e=>_({i:e,k:f}),...f===0&&a?{defaultPrompt:a.text,onRevert:t=>E(`Reverted ${Ks(e,t)} to the default`,Fs(e,t,0,a.text,{id:a.id,name:ht(a)}))}:{}}),(0,$.jsx)(ee,{id:`job-${f}-responses`,open:S(`job-${f}-responses`),onToggle:C(`job-${f}-responses`),out:J().outOf(u),format:!!J().replyOf(u),readAs:v,outputKinds:ae(),modifiers:Y(),onKind:t=>c(ms(e,f,t)),onSetting:(t,n)=>c(Mc(e,f,e=>({...e,[t]:n}))),onAddFormat:()=>c(Qs(e,f)),onRemoveFormat:()=>E(`Removed the format validation`,$s(e,f)),onReadAs:t=>t==null?E(`Removed Read as`,Zs(e,f,null)):c(Zs(e,f,t)),...s?{protectedTerms:s}:{},offer:l,onModifier:(t,n)=>c(Nc(e,f,t,n)),onAddModifier:t=>c(Mc(e,f,e=>({...e,modifiers:[...e.modifiers,t]}))),onRemoveModifier:t=>E(`Removed a modifier`,Mc(e,f,e=>({...e,modifiers:e.modifiers.filter((e,n)=>n!==t)})))})]})})]},u.id||f)}}),O&&(0,$.jsx)(`p`,{className:`note add-why`,children:`Add a target first.`}),u&&`scenario`in u?(0,$.jsx)(re,{title:`Rename ${Ks(e,u.scenario)}`,value:J().targetsOf(e)[u.scenario]?.name??``,onCommit:t=>c(Ms(e,u.scenario,t)),onClose:()=>d(null)}):u?(0,$.jsx)(re,{title:`Rename ${J().jobLabel(e,u.job)}`,value:e.jobs[u.job]?.name??``,onCommit:t=>c(ps(e,u.job,t)),onClose:()=>d(null)}):null,f&&(0,$.jsx)(ls,{onClose:()=>p(null),used:{byScenario:Is(e,f.i),byAll:Ls(e)},onPick:t=>{let n=e;c(Fs(n,f.i,f.k,t.text,{id:t.id,name:ht(t)})),p(null),l({label:`Picked ${ht(t)}`,restore:()=>c(n)})}}),m&&(()=>{let{i:t,k:n}=m,r=J().targetStepOf(e,t,n)?.prompt??``;return(0,$.jsx)(re,{title:`Save to library`,value:r.split(`
|
|
11
|
+
`)[0]?.trim()??``,onCommit:i=>void(async()=>{let a=await w.create({name:i,text:r});c(Fs(e,t,n,r,{id:a.id,name:ht(a)})),y(`Saved ${ht(a)} to the library.`)})(),onClose:()=>h(null)})})(),g&&(()=>{let t=J().targetStepOf(e,g.i,g.k);if(!t)return null;let{text:n,writtenFor:r}=mc(t,T());return(0,$.jsx)(Oc,{text:n,writtenFor:r,say:y,onClose:()=>_(null)})})()]})}function Ac(e,t){let n=J(),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 jc=(e,t,n,r)=>J().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}),Mc=(e,t,n)=>({...e,jobs:e.jobs.map((e,r)=>r===t?J().withOut(e,n(J().outOf(e))):e)}),Nc=(e,t,n,r)=>Mc(e,t,e=>({...e,modifiers:e.modifiers.map((e,t)=>t===n?r:e)}));function Pc({pipeline:e,edit:t,offer:n,children:r,profiles:i=[],labGrader:a=null}){let s=ft(),{list:c}=pt(),[l,u]=(0,Q.useState)(!1),[d,f]=(0,Q.useState)(null),p=e.evals,m=J().contentOf(e),h=m?.type===`source`?m.ref.id:null,[,g]=(0,Q.useState)(0);(0,Q.useEffect)(()=>s.subscribe(()=>g(e=>e+1)),[s]),(0,Q.useEffect)(()=>{for(let e of p)e.group&&s.load(e.group.id)},[p,s]);let v=(r,i)=>{let a=e;t(r),n({label:i,restore:()=>t(a)})},y=e=>s.entry(e)?.doc?.body??null,b=e=>!!e?.source&&e.source.id!==h,x=new Map((c??[]).map(e=>[e.id,e])),S=new Set(p.flatMap(e=>e.group?[e.group.id]:[])),C=p.flatMap((e,t)=>e.group?[{t:e,j:t}]:[]),w=p.flatMap((e,t)=>e.own?[{t:e,j:t}]:[]),T=({t,j:n})=>{let r=t.group.id,i=x.get(r)?.versions;return[{label:`Open in Library`,icon:N,onSelect:()=>oi(r)},t.pin==null?{label:`Pin`,icon:Gt,disabled:i==null,onSelect:()=>v(bs(e,n,i),`Pinned ${t.group.name||r}`)}:{label:`Follow latest`,icon:Wt,onSelect:()=>v(bs(e,n,null),`${t.group.name||r} follows the latest`)},{label:`Unlink`,icon:tn,onSelect:()=>v(gs(e,n),`Unlinked ${t.group.name||r}`)}]};return(0,$.jsxs)(o,{id:`evals`,title:`Evals`,level:2,note:p.length?String(p.length):`None`,children:[p.length===0&&(0,$.jsx)(`p`,{className:`note evals-empty`,children:`No evals — the run is unscored.`}),p.length>0&&(0,$.jsx)(Ic,{pass:e.pass,count:p.length,edit:n=>t(Cs(e,n))}),C.length>0&&(0,$.jsx)(Te,{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:()=>oi(e.t.group.id),children:e.t.group.name||e.t.group.id})},{key:`source`,header:`Source`,sort:e=>y(e.t.group.id)?.source?.name??``,tdProps:e=>({"data-state":y(e.t.group.id)?.source?void 0:`none`}),cell:e=>{let t=y(e.t.group.id);return t?t.source?b(t)?(0,$.jsxs)(`span`,{className:`eval-flag`,title:`Grades ${t.source.name}, not this run's content`,children:[(0,$.jsx)(Nt,{size:12,"aria-hidden":`true`}),t.source.name]}):t.source.name:`Any`:`…`}},{key:`follows`,header:`Version`,sort:e=>e.t.pin??0,cell:e=>e.t.pin==null?`Follow latest`:`Pinned v${e.t.pin}`},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,$.jsx)(se,{label:`${e.t.group.name||e.t.group.id} actions`,actions:T(e)})}]}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost eg-add`,onClick:()=>u(!0),children:[(0,$.jsx)(_.add,{size:14,"aria-hidden":`true`}),`Link eval group`]}),r,w.map(({t:n,j:r})=>(0,$.jsx)(Fc,{ev:n,label:J().evalLabel(e,r),renaming:d===r,onRename:()=>f(r),profiles:i,labGrader:a,rawReply:e.jobs.some(e=>J().readAsOf(e)!=null),casesBody:n.own.casesFrom?y(n.own.casesFrom.id):null,loadCases:()=>{n.own.casesFrom&&s.load(n.own.casesFrom.id)},set:n=>t(vs(e,r,n)),undoableSet:(t,n)=>v(vs(e,r,t),n),onCommitName:n=>{t(_s(e,r,n)),f(null)},onCancelName:()=>f(null),onCopyCases:t=>v(Ss(e,r,t),`Copied ${J().evalLabel(e,r)}'s cases in`),onMoveToLibrary:async()=>{let t=Rc((n.name||``).trim()||J().evalLabel(e,r),new Set((c??[]).map(e=>e.name))),{casesFrom:i,...a}=n.own,o=await s.create(t,a);v(xs(e,r,{id:o.id,name:o.name}),`Moved ${t} to the Library`)},onRemove:()=>v(gs(e,r),`Removed ${J().evalLabel(e,r)}`)},n.id)),l&&(0,$.jsx)(Lc,{list:c??[],linkedIds:S,contentSourceId:h,onLink:n=>{t(ys(e,n)),u(!1)},onNew:async()=>{let n=await s.create(Rc(`Untitled eval group`,new Set((c??[]).map(e=>e.name))));t(ys(e,{id:n.id,name:n.name})),u(!1)},onClose:()=>u(!1)})]})}function Fc({ev:e,label:t,renaming:n,onRename:r,profiles:a,labGrader:s,rawReply:c,casesBody:l,loadCases:u,set:d,undoableSet:f,onCommitName:p,onCancelName:m,onCopyCases:h,onMoveToLibrary:g,onRemove:v}){let y=J(),[b]=Je(`promptlab.versions`),x=e.own;(0,Q.useEffect)(()=>{x.casesFrom&&u()},[x.casesFrom,u]);let S=y.isWholeRun(y.EVAL_TYPES.group,e),C=S?x.run:x.every,w=t=>d({...e,own:{...x,...t}}),T=t=>({...e,own:{...x,...S?{run:t}:{every:t}}}),E=C.some(e=>y.METRICS[e.type]?.graded),D=a.filter(e=>(y.CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`)),{mode:O,threshold:k}=x.scoring,A=[{label:`Rename…`,icon:_.rename,onSelect:r},...x.casesFrom?[{label:`Copy cases in`,icon:Ot,disabled:!l,onSelect:()=>l&&h(l.cases)}]:[],{label:`Move to Library`,icon:Lt,onSelect:()=>void g()},{label:`Remove`,icon:_.remove,destructive:!0,onSelect:v}],j=[{key:`mode`,label:`Scored`,control:{type:`select`,value:O,options:[{value:`all`,label:`All must pass`},{value:`weighted`,label:`Weighted points`}],onChange:e=>w({scoring:{mode:e===`weighted`?`weighted`:`all`,threshold:e===`weighted`?k??1:k}})}},...O===`weighted`?[{key:`threshold`,label:`Pass at`,control:{type:`text`,size:`num`,value:k==null?``:String(k),onChange:e=>w({scoring:{mode:O,threshold:e.trim()?/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e:null}})}}]:[],...x.casesFrom?[]:[{key:`over`,label:`Reads`,control:{type:`select`,value:S?`run`:`item`,options:[{value:`item`,label:`Each item`},{value:`run`,label:`Whole run`}],onChange:e=>w(e===`run`?{every:[],run:[...x.every,...x.run]}:{every:[...x.every,...x.run],run:[]})}}],...x.casesFrom?[{key:`cases-from`,label:`Cases from`,control:{type:`static`,text:x.casesFrom.name||x.casesFrom.id}}]:[],...E||x.grader?[{key:`grader`,label:`Grader`,control:{type:`picker`,kind:`Profile`,value:x.grader?.id??``,usedLabel:`Last changed`,...mi(D,e=>b.profile?.[e]?.[0]?.at??null,[{id:``,label:s?`Lab (${s.name})`:`None`}]),onChange:e=>{let t=a.find(t=>t.id===e);w({grader:t?{id:t.id,name:t.name}:null})}}}]:[]];return(0,$.jsxs)(o,{id:`eval-${e.id}`,title:t,level:3,note:y.EVAL_TYPES.group?.label??`Eval group`,about:`A group of this pipeline's own, defined here rather than in the Library.`,actions:A,...n?{rename:{value:e.name||t,onCommit:p,onCancel:m}}:{},children:[(0,$.jsx)(i,{label:t,rows:j}),(0,$.jsx)(fi,{label:t,metrics:C,over:S?`run`:`item`,rawReply:c,set:e=>d(T(e)),undoable:(e,t)=>f(T(e),t)}),(0,$.jsx)(i,{label:`${t} on failure`,rows:[{key:`continue`,label:`Continue on failure`,control:{type:`checkbox`,checked:e.continueOnFailure,onChange:t=>d({...e,continueOnFailure:t})}}]})]})}function Ic({pass:e,count:t,edit:n}){let r=e.mode===`atLeast`?e.count:t,a=[{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`,control:{type:`text`,size:`num`,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)(i,{label:`Pass rule`,rows:a})}function Lc({list:e,linkedIds:t,contentSourceId:n,onLink:r,onNew:i,onClose:a}){let o=ft(),[,s]=(0,Q.useState)(0);(0,Q.useEffect)(()=>o.subscribe(()=>s(e=>e+1)),[o]),(0,Q.useEffect)(()=>{for(let t of e)o.load(t.id)},[e,o]);let c=e=>{let t=o.entry(e)?.doc?.body;return t?!t.source||t.source.id===n:null};return(0,$.jsxs)(Z,{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===!1?`Another Source`:i?`Grades this content`:``;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)(_.add,{size:14,"aria-hidden":`true`}),`New eval group…`]})})]})}function Rc(e,t){if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`}function zc({pipeline:e,sourceFiles:t,graded:n,openCaseEditor:r}){let[i,a]=(0,Q.useState)({graded:!1,todo:!0,missing:!0});if((J().evalsDataset(e)?.id??null)===null)return null;let s=t??[],c=new Set(n.map(e=>e.item)),l=new Set(s),u=[{key:`graded`,label:`Graded`,tone:`ok`,files:s.filter(e=>c.has(e))},{key:`todo`,label:`To do`,tone:`todo`,files:s.filter(e=>!c.has(e))},{key:`missing`,label:`Missing`,tone:`missing`,files:n.filter(e=>!l.has(e.item)).map(e=>e.item)}];u[0].files.length;let d=u[1].files.length+u[2].files.length,f=u.filter(e=>i[e.key]).flatMap(e=>e.files.map(t=>({file:t,tone:e.tone})));return(0,$.jsx)(o,{id:`mapping`,title:`Mapping`,level:3,note:p(),about:`Which of the content's items the dataset has a case for, and so which are graded.`,children:s.length?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`pills mkey`,role:`group`,"aria-label":`Show`,children:u.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))}),f.length?(0,$.jsx)(`div`,{className:`mchips`,children:f.map(({file:e,tone:t})=>(0,$.jsx)(`button`,{type:`button`,className:`mchip ${t}`,onClick:()=>r(e),children:e},`${t}-${e}`))}):(0,$.jsx)(`p`,{className:`note`,children:d?`Nothing shown.`:`Every content item is graded.`})]}):(0,$.jsx)(`p`,{className:`note`,children:`No items in the content to map against.`})});function p(){let r=J().contentOf(e),i=r?J().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`${Hn(n.length,`case`)}, ${s} of ${a.length} matched`}}function Bc({pipeline:e,edit:t,comment:n,setComment:r,onClear:a,onCopyFailures:s}){let c=[{label:`Clear comment`,icon:C,destructive:!0,onSelect:a},{label:`Copy last run's failures`,icon:Se,onSelect:s}],l=J().contentOf(e),u=l?.type===`source`?[{key:`first`,label:`Run first`,control:{type:`text`,value:l.first==null?``:String(l.first),placeholder:`all`,size:`num`,clearable:!0,onChange:n=>t(J().withContent(e,{...l,first:n.trim()?Vc(n):null}))}},{key:`loops`,label:`Loop`,control:{type:`text`,value:String(l.loops),placeholder:`1`,onChange:n=>t(J().withContent(e,{...l,loops:Math.max(1,Vc(n)??1)}))}}]:[];return(0,$.jsx)(o,{id:`control`,title:`Run settings`,level:2,actions:c,children:(0,$.jsx)(i,{label:`Run settings`,rows:[...u,{key:`comment`,label:`Comment`,control:{type:`text`,value:n,placeholder:`A note to find this run by in History`,onChange:e=>r(e)}}]})})}var Vc=e=>{let t=Number.parseInt(e,10);return Number.isNaN(t)?null:t};function Hc(){let e=qe(),n=Pe(),r=te(),{openRun:i}=Tn(),{openCaseEditor:a}=Ai(),[o,s]=Je(`promptlab.workflows`),[c]=Je(`promptlab.profiles`),[l,u]=Je(`promptlab.comment`),[d]=Je(`promptlab.versions`),[f,p]=(0,Q.useState)([]),{list:m,error:h}=pt(),{list:g,error:_}=Ct(),v=g?.find(e=>e.default)??null,y=ft(),b=(0,Q.useMemo)(()=>(m??[]).map(e=>I(e.id,e.name)),[m]),[x,S]=(0,Q.useState)(4),[C,w]=(0,Q.useState)(void 0),[T,E]=(0,Q.useState)(null),[D,O]=(0,Q.useState)(!1),[k,A]=(0,Q.useState)(!1),[j,M]=(0,Q.useState)(null),N=(0,Q.useRef)(null),[P,F]=(0,Q.useState)(null),[ee,L]=(0,Q.useState)(!1),R=(0,Q.useRef)(null);(0,Q.useEffect)(()=>{let e=!0;return n.sources().then(t=>{e&&p(t.sources)}).catch(()=>{}),n.config().then(t=>{e&&S(t.targetCap)}).catch(()=>{}),()=>{e=!1}},[n]),(0,Q.useEffect)(()=>{let e=!0,t,r=async()=>{let i=5e3;try{let t=(await n.queue({limit:1})).runs[0]??null;if(!e)return;!N.current&&t&&!sr(t.status)&&(N.current=t.id),t&&t.id===N.current&&(M(t),sr(t.status)||(i=1e3))}catch{}e&&(t=setTimeout(()=>void r(),i))};return r(),()=>{e=!1,t&&clearTimeout(t)}},[n]);let z=(0,Q.useMemo)(()=>o.list.filter(e=>e.work?.version===13),[o.list]),B=z.find(e=>e.id===o.at)??z[0],V=B?.work,ne=B?.id??``,H=V?J().evalsDataset(V)?.id??null:null,re=mt(H),U=re?.doc?.body.cases,W=(0,Q.useMemo)(()=>(U??[]).map(e=>({id:e.id??``,item:J().caseItem(e)})),[U]),G=re?.doc?.body.cases,ie=(0,Q.useMemo)(()=>[...new Set((G??[]).flatMap(e=>(e.metrics??[]).filter(e=>!e.not&&e.weight!==0&&(e.type===`contains-all`||e.type===`contains-any`)).flatMap(e=>J().metricLines(e.values))))],[G]),ae=v?.text||V&&J().targetStepOf(V,J().targetsOf(V).length-1,0)?.prompt||``,K=(0,Q.useRef)(c.list);K.current=c.list;let oe=z.length?null:m?.[0]??null,q=m!==null||h!==null,se=g!==null||_!==null,ce=v?.text??``;(0,Q.useEffect)(()=>{if(z.length||!q||!se)return;let e=Wc(K.current,oe?{id:oe.id,name:oe.name}:void 0,ce);s({list:[e],at:e.id})},[z.length,s,q,se,oe,ce]);let ue=()=>{let e=y.list().list?.[0];return e?{id:e.id,name:e.name}:void 0},Y=(0,Q.useRef)(o);Y.current=o;let de=(0,Q.useRef)(B);de.current=B;let fe=(0,Q.useRef)(V);fe.current=V;let pe=(0,Q.useRef)(null),me=(0,Q.useRef)(null),he=(0,Q.useCallback)(()=>{me.current&&clearTimeout(me.current);let t=de.current?.id,n=fe.current;t&&n&&(pe.current={id:t,doc:n},me.current=setTimeout(()=>{let t=pe.current;t&&st(e,`pipeline`,t.id,t.doc,`idle`)},rt))},[e]);(0,Q.useEffect)(()=>()=>{me.current&&clearTimeout(me.current)},[]);let ge=(0,Q.useCallback)(e=>{let t=Y.current,n=de.current.id,r={...t,at:n,list:t.list.filter(e=>e.work?.version===13).map(t=>t.id===n?{...t,work:e}:t)};Y.current=r,s(r),he(),E(null)},[s,he]),_e=c.list[0]?.id??``;(0,Q.useEffect)(()=>{let e=fe.current,t=de.current?.id;if(!e||!t||!_e)return;let n=ks(e,ws(K.current));if(n===e)return;let r=Y.current,i={...r,list:r.list.map(e=>e.id===t?{...e,work:n}:e)};Y.current=i,s(i)},[_e,ne,s]),(0,Q.useEffect)(()=>{let t=pe.current;t&&t.id!==ne&&(st(e,`pipeline`,t.id,t.doc,`idle`),pe.current=null,me.current&&=(clearTimeout(me.current),null))},[ne,e]);let ve=V?J().contentOf(V):null,ye=ve?.type===`source`?ve.ref.id:null;(0,Q.useEffect)(()=>{if(ye===null){w(void 0);return}let e=!0;return n.source(ye).then(t=>{e&&w(t.files.map(e=>e.name))}).catch(()=>{}),()=>{e=!1}},[ye,n]);let be=(0,Q.useCallback)(e=>{let t=f.find(t=>t.id===e);return t?{name:t.name,type:t.type,files:e===ye&&C?C:[]}:null},[f,ye,C]),X=(0,Q.useMemo)(()=>{let e=c.list.find(e=>e.id===c.grader);return e?{id:e.id,name:e.name}:null},[c]),xe=(0,Q.useMemo)(()=>{if(!V)return[];if(!c.list.length&&J().targetsOf(V).length)return[`add a Target profile first`];let e={profiles:e=>c.list.find(t=>t.id===e)??null,sources:be,grader:X,...m?{groups:m}:{}};return J().validatePipeline(V,e)},[V,c.list,be,m,X]),Se=ne?d.pipeline?.[ne]??[]:[],Ce=(0,Q.useCallback)(async()=>{let t=fe.current,r=de.current.id;st(e,`pipeline`,r,t,`run`);let a=J().resolvePipeline(t,{profiles:e=>J().withSlugs(c.list).find(t=>t.id===e)??null,grader:X,...ye!==null&&C!==void 0?{files:C}:{},comment:l?.text??``});O(!0),E(null);try{let e=await n.submit(a);N.current=e.run.id,M(e.run),i(e.run.id,{at:e.run.submittedAt,from:`runs`})}catch(e){E(e instanceof Error?e.message:String(e)),N.current=null,M(null)}finally{O(!1)}},[n,l,ye,i,c.list,C,e,X]),we=(0,Q.useCallback)(async()=>{let e=N.current;if(e)try{M((await n.cancel(e)).run)}catch{}},[n]),Te=(0,Q.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(J().failedScore))).map(e=>e.name??`an item`);t.length&&await navigator.clipboard?.writeText(t.join(`
|
|
12
|
+
`))}catch{}},[n]),Ee=(0,Q.useCallback)(async t=>{let r=fe.current,i=de.current.id;st(e,`pipeline`,i,r,`run`);let a=J().resolvePipeline(r,{profiles:e=>J().withSlugs(c.list).find(t=>t.id===e)??null,grader:X,files:[t],comment:l?.text??``}),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(e=>e.name===t)?.scenarios??[]).map(e=>e.res??null)},[n,l,c.list,e]),De=(0,Q.useCallback)(e=>{H&&a(e,{dataset:H,files:C??[],run:Ee})},[a,C,Ee,H]),Oe=(0,Q.useCallback)(()=>{let e=l?.text??``;u({text:``}),r.offer({label:`Cleared the comment`,restore:()=>u({text:e})})},[l,u,r]),ke=(0,Q.useCallback)(()=>{let e=J().pipelineToYaml(fe.current,{profiles:K.current});ri(new Blob([e],{type:`text/yaml`}),ni(`pipeline`,fe.current.name||`pipeline`,13,`yml`))},[]),Ae=(0,Q.useCallback)(async e=>{let t=fe.current,r={};for(let e of J().evalsOf(t)){let t=J().casesRef(e)?.id??null;if(t&&!r[t]){let e=await n.dataset(t);r[t]={name:e.name,body:e.body}}}let i=J().exportBundle(t,{profiles:K.current,grader:X,datasets:r});if(`error`in i)throw Error(i.error);ri(await n.bundle({files:i.files,source:ye,items:e}),ni(`ci`,t.name||`pipeline`,13,`zip`))},[n,ye,X]),je=(0,Q.useCallback)(async e=>{let t=await n.archivedRules().then(e=>e.rules,()=>({})),r=J().yamlToPipeline(e,{profiles:K.current,profileType:e=>K.current.find(t=>t.id===e)?.type,sources:f,groups:b,rulesFor:e=>t[e]??null});if(`error`in r){F(r);return}let{doc:i,missing:a}=r,o={id:Gc(),name:i.name||`Imported`,work:i},c={...Y.current,at:o.id,list:[...z,o]};Y.current=c,s(c),F({doc:i,missing:a})},[n,z,s,f,b]);if(!B||!V)return(0,$.jsx)(`div`,{className:`runs`,children:(0,$.jsx)(t,{label:`Pipelines`})});let Me=t=>{let n=de.current.id;st(e,`pipeline`,n,fe.current,`restore`),ge(t.doc),A(!1)};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)($o,{list:z,at:ne,canRestore:Se.length>0,used:Object.fromEntries(z.map(e=>[e.id,d.pipeline?.[e.id]?.[0]?.at??null])),onSelect:e=>s({...Y.current,at:e}),onNew:()=>{let e=Uc(z.map(e=>e.name));if(s({...Y.current,list:[...z,e],at:e.id}),l?.text){let e=l.text;u({text:``}),r.offer({label:`Cleared the comment`,restore:()=>u({text:e})})}},onClone:()=>{let e={id:Gc(),name:`${B.name} copy`,work:structuredClone(V)};s({...Y.current,list:[...z,e],at:e.id})},onRename:e=>{let t=e.trim(),n=Y.current,r=de.current.id,i={...n,at:r,list:n.list.filter(e=>e.work?.version===13).map(e=>e.id===r?{...e,name:t,work:{...e.work,name:t}}:e)};Y.current=i,s(i),he()},onDelete:()=>{let e=Y.current,t=z.filter(e=>e.id!==ne),n=t.length?t:[Wc(c.list,ue(),ce)],i=t.length?t[0].id:n[0].id;s({...Y.current,list:n,at:i}),r.offer({label:`Deleted ${B.name||`the pipeline`}`,restore:()=>{Y.current=e,s(e)}})},onRestore:()=>A(!0),onExport:ke,onExportCi:()=>L(!0),onImport:()=>R.current?.click()}),(0,$.jsx)(rs,{problems:xe,error:T,run:j,submitting:D,onRun:()=>void Ce(),onStop:()=>void we(),onOpen:()=>{j&&i(j.id,{at:j.submittedAt,from:`runs`})}}),(0,$.jsxs)(`div`,{className:`runs`,children:[(0,$.jsx)(`input`,{ref:R,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(je).catch(()=>F({error:`the file could not be read`}))}}),(0,$.jsx)(Bc,{pipeline:V,edit:ge,comment:l?.text??``,setComment:e=>u({text:e}),onClear:Oe,onCopyFailures:()=>void Te()}),(0,$.jsx)(kc,{pipeline:V,profiles:c.list,sources:f,targetCap:x,prompt:ae,...v?{defaultPrompt:v}:{},protectedTerms:ie,edit:ge,offer:r.offer}),(0,$.jsx)(Pc,{profiles:c.list,labGrader:X,pipeline:V,edit:ge,offer:r.offer,children:(0,$.jsx)(zc,{pipeline:V,sourceFiles:C,graded:W,openCaseEditor:De})}),(0,$.jsx)(le,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss}),k&&(0,$.jsx)(Z,{title:`Restore pipeline`,onClose:()=>A(!1),children:(0,$.jsxs)(`div`,{className:`version-list`,children:[Se.length===0&&(0,$.jsx)(`p`,{className:`note`,children:`No versions of this pipeline yet.`}),Se.map((e,t)=>(0,$.jsxs)(`div`,{className:`version-row`,children:[(0,$.jsxs)(`span`,{className:`version-when`,children:[qc(e.at),`, `,Kc(e.reason)]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>Me(e),children:`Restore`})]},`${e.at}-${t}`))]})}),ee&&(0,$.jsx)(ns,{hasItems:ye!==null,onExport:Ae,onClose:()=>L(!1)}),P&&(`doc`in P?(0,$.jsx)(Z,{title:`Imported ${P.doc.name||`Untitled`}`,onClose:()=>F(null),children:P.missing.length>0?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`p`,{className:`note`,children:`A run is blocked until each of these exists here — create it, or pick a replacement in the Content and Target profile rows:`}),(0,$.jsx)(`ul`,{className:`import-missing`,children:P.missing.map(e=>(0,$.jsx)(`li`,{children:e},e))})]}):(0,$.jsx)(`p`,{className:`note`,children:`Ready to run.`})}):(0,$.jsx)(Z,{title:`Nothing imported`,onClose:()=>F(null),children:(0,$.jsx)(`p`,{className:`note`,children:P.error})}))]})]})}var Uc=e=>{let t=Es(e),n=J().blankPipeline({name:t});return{id:Gc(),name:t,work:{...n,jobs:n.jobs.map(e=>({...e,steps:[]}))}}},Wc=(e,t,n)=>({id:Gc(),name:Es([]),work:Os(ws(e),t,n)}),Gc=()=>`w${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`,Kc=e=>e===`run`?`before a run`:e===`restore`?`before a restore`:e===`pack`?`before a pack update`:`after editing`,qc=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()},Jc=e=>!!e.id&&sr(e.status),Yc=e=>`Queued ${Vn(e.submittedAt)}`;async function Xc(e,t){try{(await e.run(t)).status===`queued`&&await e.cancel(t)}catch{}}var Zc=[``,`queued`,`running`,`done`,`cancelled`,`failed`,`incomplete`,`interrupted`],Qc=e=>e.numeric?`hnum num`:void 0,$c=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)),el=e=>e&&{before:e.submittedAt,beforeId:e.id};function tl(){let n=Pe(),r=te(),{openRun:i}=Tn(),[a,s]=Je(`promptlab.history.columns`),[c,l]=(0,Q.useState)([]),[u,d]=(0,Q.useState)(!1),[f,p]=(0,Q.useState)(``),[m,h]=(0,Q.useState)(new Set),[g,_]=(0,Q.useState)(!1),[v,y]=(0,Q.useState)(null),[b,x]=(0,Q.useState)(null),[S,w]=(0,Q.useState)(null),[T,E]=(0,Q.useState)(null),[D,O]=(0,Q.useState)(!1),[A,j]=(0,Q.useState)(!1),[M,N]=(0,Q.useState)(!1),[P,F]=(0,Q.useState)(!1),[I,ee]=(0,Q.useState)(null),[L,z]=(0,Q.useState)(0),B=(0,Q.useRef)(P);B.current=P;let[V,ne]=(0,Q.useState)(null),[H,re]=(0,Q.useState)(0),U=(0,Q.useRef)(c);U.current=c;let G=(0,Q.useMemo)(()=>c.map(e=>Wn(kr(e),e)),[c]),ie=(0,Q.useMemo)(()=>il(a),[a]),ae=(0,Q.useCallback)(async(e,t=!1)=>{try{return await n.queue({limit:25,...e,...t?{full:t}:{}})}catch{return null}},[n]),K=(0,Q.useCallback)(e=>{let t=new Set(e.runs.map(e=>e.id));l(n=>$c([...n.filter(e=>!t.has(e.id)),...e.runs])),d(e.more)},[]);(0,Q.useEffect)(()=>{let e=!0,t,n=async()=>{let r=await ae();e&&(r?(K(r),F(!0),ee(null)):B.current||ee(`Runs not loaded: server unreachable.`),U.current.some(e=>[`queued`,`running`].includes(e.status))&&(t=setTimeout(()=>void n(),3e3)))};return n(),()=>{e=!1,t&&clearTimeout(t)}},[ae,K,L,H]);let q=(0,Q.useMemo)(()=>G.filter(e=>!f||(e.status||`done`)===f),[G,f]),ce=(e=>({Runs:nr.filter(t=>e.Runs.has(t.key)),"Run Scenarios":rr.filter(t=>e[`Run Scenarios`].has(t.key))}))(ie),ue=(0,Q.useCallback)(e=>{h(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Y=(0,Q.useCallback)((e,t)=>{i(e,{at:t,from:`history`})},[i]),de=(0,Q.useCallback)(async e=>{try{let t=await n.resume(e),r={runs:[t.run],more:U.current.length>25};K(r),Y(e,t.run.submittedAt)}catch{}},[n,K,Y]),pe=(0,Q.useCallback)(async e=>{E(null);try{let{run:t}=await n.rerunRun(e);K({runs:[t],more:U.current.length>25}),ne(t.id),re(e=>e+1),r.offer({label:Yc(t),restore:()=>void Xc(n,t.id).then(()=>re(e=>e+1))})}catch(e){E(`Not re-run: ${e instanceof Error?e.message:`server unreachable`}.`)}},[n,K,r]),me=e=>{let t=e.run?U.current.find(t=>t.id===e.run):void 0,n=[];return er(e)&&n.push({label:`Resume`,icon:k,onSelect:()=>void de(e.run)}),t&&Jc(t)&&n.push({label:`Re-run`,icon:Jt,onSelect:()=>void pe(t.id)}),n},he=(0,Q.useCallback)(async()=>{let e=U.current;N(!0);try{await n.clear()}catch{E(`Not cleared: server unreachable.`);return}finally{N(!1)}l([]),d(!1),r.offer({label:`Cleared ${Hn(e.length,`run`)}`,restore:()=>{for(let t of e)n.submit(J().upgradePipeline(t.snapshot)).catch(()=>{})}})},[n,r]),ge=(0,Q.useCallback)(async()=>{j(!0);let e=[],t=!1,n;for(let r=0;;r++){let i=await ae(n,!0);if(!i){t=!0;break}if(e=$c([...e,...i.runs]),n=el(i.runs.at(-1)),!i.more||!n||r>100)break}if(t){let t=new Set(e.map(e=>e.id));e=$c([...e,...U.current.filter(e=>!t.has(e.id))])}if(j(!1),!e.length){E(`Nothing to export yet.`);return}ri(new Blob([JSON.stringify({exported:new Date().toISOString(),runs:e},null,2)],{type:`application/json`}),ni(`runs`,`all`,13,`json`)),E(t?`Exported ${Hn(e.length,`run`)}. Server unreachable, so only those this browser had.`:`Exported ${Hn(e.length,`run`)}.`)},[n,ae]),_e=[{label:`Select Columns`,icon:kt,onSelect:()=>_(!0)},{label:`Export JSON`,icon:e,busy:A,onSelect:()=>void ge()},{label:`Clear`,icon:C,destructive:!0,busy:M,disabled:!P,onSelect:()=>void he()}],ve=(0,Q.useCallback)(e=>{let t=e.target.closest(`[data-openrun]`);if(t){e.stopPropagation();let n=t.closest(`tr[data-run]`),r=n?q[Number(n.getAttribute(`data-run`))]:null;r?.run&&Y(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?q[Number(t.getAttribute(`data-run`))]:null;r?.run&&x({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?q[Number(t.getAttribute(`data-run`))]:null,i=n?.run?U.current.find(e=>e.id===n.run):null;i?.snapshot&&w({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?q[Number(t.getAttribute(`data-run`))]:null,r=i.getAttribute(`data-prof`);if(n&&r!=null){let e=n.scenarios[Number(r)];y({name:e?.setupProfile?.name??``,settings:Fn(n,e??{})})}}},[q,Y]),ye=(0,Q.useCallback)((e,t)=>{l(n=>n.map(n=>n.id===e?{...n,snapshot:{...n.snapshot,comment:t}}:n)),x(null)},[]),be=(e,t)=>e.image&&zn(t)!==!0?(0,$.jsx)(`span`,{className:`note`,children:`—`}):e.get(t),X=(e,t,n,r)=>n?e.image&&zn(t)!==!0?(0,$.jsx)(`span`,{className:`note`,children:`—`}):e.get(t,n,r):`—`;return(0,$.jsxs)(`div`,{className:`history`,children:[(0,$.jsxs)(o,{id:`history`,title:`History`,actions:_e,children:[!P&&(0,$.jsx)(t,{label:`Runs`,error:I,onRetry:()=>{ee(null),z(e=>e+1)}}),P&&(G.length>0||f)&&(0,$.jsx)(W,{noun:`runs`,lead:q.length>0&&(0,$.jsx)(`p`,{className:`note hstatus`,role:`status`,children:Hn(q.length,`run`)}),filters:[{key:`show`,label:`Show`,value:f,onChange:p,options:Zc.map(e=>({value:e,label:e?qn(e):`All`}))}]}),T&&(0,$.jsx)(`p`,{className:`note hstatus`,role:`status`,children:T}),P?q.length?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`scrollx`,onClick:ve,children:(0,$.jsx)(Te,{className:`htable`,label:`Runs`,defaultSort:null,rows:q,rowKey:e=>e.at,rowProps:(e,t)=>({className:`runrow${m.has(e.at)?` open`:``}${e.run&&e.run===V?` 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=m.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:()=>ue(e.at),children:(0,$.jsx)(fe,{size:16,"aria-hidden":`true`})})}},...ce.Runs.map(e=>({key:e.key,header:e.label,className:Qc(e),sort:e.sort??(t=>R(e.get(t))),cell:t=>(0,$.jsx)(`span`,{className:`hval`,children:be(e,t)})})),{key:`actions`,header:(0,$.jsx)(`span`,{className:`hvh`,children:`Actions`}),label:``,className:`hactions`,sort:null,cell:e=>{let t=me(e);return t.length?(0,$.jsx)(se,{actions:t,label:`${Vn(e.at)} actions`}):null}}],after:(e,t)=>m.has(e.at)&&(0,$.jsx)(`tr`,{className:`scenrows`,id:`hscen-${t}`,"data-run":t,"data-scen":e.at,children:(0,$.jsx)(`td`,{colSpan:ce.Runs.length+2,children:(0,$.jsx)(Te,{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:ce[`Run Scenarios`].map(t=>({key:t.key,header:t.label,className:Qc(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 R(i)},cell:({sc:n,n:r})=>(0,$.jsx)(`span`,{className:`hval`,children:X(t,e,n,r)})}))})})})})}),u&&(0,$.jsxs)(`button`,{type:`button`,className:`ghost older-btn`,disabled:D,"aria-busy":D||void 0,onClick:async()=>{O(!0);let e=await ae(el(U.current.at(-1)));if(O(!1),!e){E(`Server unreachable.`);return}K(e)},children:[D&&(0,$.jsx)(oe,{}),`Older`]})]}):(0,$.jsx)(`p`,{className:`note`,children:T??(G.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)(le,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss}),g&&(0,$.jsx)(ol,{cols:ie,onSave:e=>{s(al(e)),_(!1)},onClose:()=>_(!1)}),S&&(0,$.jsx)(bc,{run:S.run,i:S.i,onClose:()=>w(null)}),v&&(0,$.jsx)(Z,{title:v.name||`Settings`,onClose:()=>y(null),children:(0,$.jsx)(nl,{settings:v.settings})}),b&&(0,$.jsx)(rl,{runId:b.id,comment:b.comment,onSaved:e=>ye(b.id,e),onClose:()=>x(null)})]})}function nl({settings:e}){let t=Nn.filter(t=>String(e[t]??``)!==``).map(t=>({key:t,label:In(t),control:{type:`static`,text:Ln(t,e[t])}}));return t.length?(0,$.jsx)(i,{label:`Target profile`,rows:t}):(0,$.jsx)(`p`,{className:`note`,children:`No settings recorded.`})}function rl({runId:e,comment:t,onSaved:n,onClose:r}){let i=Pe(),[a,o]=(0,Q.useState)(t),[s,c]=(0,Q.useState)(null),[l,u]=(0,Q.useState)(!1);return(0,$.jsx)(T,{title:`Run comment`,...s?{status:s,statusBad:!0}:{},sections:[{key:`comment`,rows:[{key:`comment`,label:`Comment`,control:{type:`text`,value:a,onChange:o,placeholder:`optional`}}]}],actions:[{label:`Save & Close`,icon:K,busy:l,primary:!0,onSelect:async()=>{u(!0),c(null);try{await i.setComment(e,a),n(a)}catch{c(`Not saved: the server is unreachable.`),u(!1)}}}],focusRow:`comment`,dirty:a!==t,onClose:r})}function il(e){let t=()=>({Runs:new Set(nr.filter(e=>e.on).map(e=>e.key)),"Run Scenarios":new Set(rr.filter(e=>e.on).map(e=>e.key))});if(!e)return t();let n=t();for(let t of or){let r=t[0],i=e[r],a=new Set(t[1].map(e=>e.key)),o=e=>ar[e]??e,s=new Set(i?.seen?.map(o)??[...a]),c=[...(i?.on??[]).map(o).filter(e=>a.has(e)),...t[1].filter(e=>e.on&&!s.has(e.key)).map(e=>e.key)];c.length&&(n[r]=new Set(c))}return n}function al(e){return{Runs:{on:[...e.Runs],seen:nr.map(e=>e.key)},"Run Scenarios":{on:[...e[`Run Scenarios`]],seen:rr.map(e=>e.key)}}}function ol({cols:e,onSave:t,onClose:n}){let[r,i]=(0,Q.useState)(()=>({Runs:new Set(e.Runs),"Run Scenarios":new Set(e[`Run Scenarios`])})),[a,o]=(0,Q.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)(Z,{title:`Select Columns`,onClose:n,dirty:c,children:(0,$.jsxs)(`div`,{className:`hcols`,children:[or.map(([e,t])=>(0,$.jsxs)(`div`,{className:`groups`,children:[(0,$.jsx)(`h3`,{children:ir[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,$.jsxs)(`div`,{className:`hcols-actions`,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`})]})]})})}var sl=e=>!!e&&e.startsWith(`•held:`),cl={"promptlab.workflows":{list:[],at:``},"promptlab.profiles":{list:[],at:``},"promptlab.comment":null,"promptlab.versions":ll(),"promptlab.history.columns":null,"promptlab.tokens":null};function ll(){return{pipeline:{},profile:{},dataset:{}}}var ul=[`promptlab.workflows`,`promptlab.profiles`,`promptlab.versions`,`promptlab.tokens`],dl=[`px`,`format`,`quality`],fl=[{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`}],pl={"image/jpeg":`JPEG`,"image/webp":`WebP`,"image/png":`PNG`},ml=e=>pl[e]??e.replace(`image/`,``).toUpperCase(),hl={px:`921600`,quality:`0.92`};function gl(e,t){let n=J().connectionImage({}).format,r=String(e.px??``),i=String(e.format??``),a=String(e.quality??``),o=(fl.some(e=>e.value===r)||!r?fl:[...fl,{value:r,label:J().budgetLabel(r)}]).map(e=>e.value===hl.px?{value:``,label:e.label}:e),s=J().IMAGE_FORMATS.map(e=>e===n?{value:``,label:ml(e)}:{value:e,label:ml(e)}),c=(i||n)===`image/png`,l={type:`text`,value:a,onChange:t(`quality`),size:`num`,...c||a?{}:{placeholder:hl.quality}};return[{key:`px`,label:`Resolution`,control:{type:`select`,value:r===hl.px?``:r,options:o,onChange:t(`px`)}},{key:`format`,label:`Format`,control:{type:`select`,value:i===n?``:i,options:s,onChange:t(`format`)}},{key:`quality`,label:`Quality`,...c?{hint:`Unused for PNG`}:{},control:l}]}function _l(e){let{px:t,format:n,quality:r}=J().connectionImage(e),i=n===`image/png`?``:` q${r??hl.quality}`;return`${J().budgetLabel(t??Number(hl.px))}, ${ml(n)}${i}`}function vl({offer:e}){let n=Pe(),r=qe(),i=ft(),a=St(),[s,c]=(0,Q.useState)(null),[l,u]=(0,Q.useState)(null),[d,f]=(0,Q.useState)(null),[p,m]=(0,Q.useState)(!1),h=(0,Q.useRef)(null),g=e=>u({text:e instanceof Error?e.message:String(e),bad:!0}),v=(0,Q.useCallback)(()=>{f(null),n.packs().then(e=>c(e.packs),e=>f(e instanceof Error?e.message:String(e)))},[n]);(0,Q.useEffect)(v,[v]);let y=async()=>{await Promise.all([r.refresh(),i.refresh(),a.refresh()]),v()},b=async e=>{u({text:`Installing ${e.name}…`,bad:!1}),m(!0);try{let t=await n.installPack(e);await y();let r=(await n.packs()).packs.find(e=>e.id===t.pack),i=r?`${r.name} ${r.version}`:t.pack;u({text:t.installed?`Installed ${i}.`:`${i} is up to date.`,bad:!1})}catch(e){g(e)}finally{m(!1)}},x=async t=>{let r=[];try{for(let e of t)r.push((await n.removePack(e.id)).trash)}catch(e){g(e)}r.length&&(await y(),e({label:t.length===1?`Removed ${t[0].name}`:`Removed ${r.length} packs`,restore:()=>{(async()=>{for(let e of r)await n.restorePack(e);await y()})()}}))};return(0,$.jsxs)(o,{id:`setup-packs`,title:`Packs`,note:s?yl(s.length,`pack`):``,actions:[{label:`Install pack…`,icon:S,busy:p,onSelect:()=>h.current?.click()}],children:[s===null&&(0,$.jsx)(t,{label:`Packs`,error:d,onRetry:v}),s&&!s.length&&(0,$.jsx)(`p`,{className:`note`,children:`No packs installed.`}),s&&s.length>0&&(0,$.jsx)(Te,{className:`setup-table`,cards:!0,label:`Packs`,rows:s,rowKey:e=>e.id,select:{noun:`pack`,actions:e=>[{label:`Remove`,icon:_.remove,destructive:!0,onSelect:()=>void x(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=>bl(e)},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(se,{label:`${e.name} actions`,actions:[{label:`Remove`,icon:_.remove,destructive:!0,onSelect:()=>void x([e])}]})}]}),l&&(0,$.jsx)(`p`,{className:`note${l.bad?` bad`:``}`,role:l.bad?`alert`:`status`,children:l.text}),(0,$.jsx)(`input`,{ref:h,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&&b(t)}})]})}var yl=(e,t)=>`${e} ${t}${e===1?``:`s`}`,bl=e=>[yl(e.datasets.length,`dataset`),yl(e.pipelines.length,`pipeline`),yl(e.sources.length,`source`),yl(e.presets,`preset`)].join(`, `);function xl({offer:e}){let n=Pe(),[r,i]=(0,Q.useState)(null),[a,s]=(0,Q.useState)(null),[c,l]=(0,Q.useState)(null),[u,d]=(0,Q.useState)(!1),f=(0,Q.useRef)(null),p=(0,Q.useCallback)(()=>{l(null),n.plugins().then(e=>i(e.plugins),e=>l(e instanceof Error?e.message:String(e)))},[n]);(0,Q.useEffect)(p,[p]);let m=async e=>{s(null),d(!0);try{let t=await n.installPlugin(e),r=(await n.plugins()).plugins;i(r);let a=r.find(e=>e.id===t.plugin);a&&t.installed&&await He(a),s({text:t.installed?ze[t.plugin]?`Installed ${t.plugin}, and it did not load: ${ze[t.plugin]}`:`Installed ${t.plugin}.`:`${t.plugin} is up to date.`,bad:!!ze[t.plugin]})}catch(e){s({text:e instanceof Error?e.message:String(e),bad:!0})}finally{d(!1)}},h=async t=>{let r=[];try{for(let e of t)r.push((await n.removePlugin(e.id)).trash)}catch(e){s({text:e instanceof Error?e.message:String(e),bad:!0})}p(),r.length&&e({label:t.length===1?`Removed ${t[0].id}`:`Removed ${r.length} plugins`,restore:()=>{Promise.all(r.map(e=>n.restorePlugin(e))).then(p)}})};return(0,$.jsxs)(o,{id:`setup-plugins`,title:`Plugins`,note:r?`${r.length} ${r.length===1?`plugin`:`plugins`}`:``,actions:[{label:`Install plugin…`,icon:S,busy:u,onSelect:()=>f.current?.click()}],children:[r===null&&(0,$.jsx)(t,{label:`Plugins`,error:c,onRetry:p}),r&&!r.length&&(0,$.jsx)(`p`,{className:`note`,children:`No plugins installed.`}),r&&r.length>0&&(0,$.jsx)(Te,{className:`setup-table`,cards:!0,label:`Plugins`,rows:r,rowKey:e=>e.id,select:{noun:`plugin`,actions:e=>[{label:`Remove`,icon:_.remove,destructive:!0,onSelect:()=>void h(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=>Sl(e),cell:e=>Sl(e)||`—`},{key:`state`,header:`State`,cell:e=>Cl(e)},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(se,{label:`${e.id} actions`,actions:[{label:`Remove`,icon:_.remove,destructive:!0,onSelect:()=>void h([e])}]})}]}),a&&(0,$.jsx)(`p`,{className:`note${a.bad?` bad`:``}`,role:a.bad?`alert`:`status`,children:a.text}),(0,$.jsx)(`input`,{ref:f,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&&m(t)}})]})}var Sl=e=>[...e.registers.outputKinds??[],...e.registers.modifiers??[],...e.registers.evalTypes??[],...(e.registers.connectionTypes??[]).map(e=>e.id)].join(`, `),Cl=e=>ze[e.id]?`Failed: ${ze[e.id]}`:Be.has(e.id)?`Loaded`:`Not Loaded`,wl={env:`Deployment`,lab:`Own`,default:`Default`};function Tl({cfg:e,editable:t,onClose:n}){let r=Pe(),i=e?.from===`lab`?e:null,[a,o]=(0,Q.useState)(i?.clientId??``),[s,c]=(0,Q.useState)(i?.tenant??``),[l,u]=(0,Q.useState)(null),[d,f]=(0,Q.useState)(!1),p=a!==(i?.clientId??``)||s!==(i?.tenant??``),m=async()=>{if(!p){n();return}f(!0);try{await r.setMicrosoft(a,s),Fa(),n()}catch(e){u(e instanceof Error?e.message:String(e)),f(!1)}},h=e=>t=>{u(null),e(t)},g=!t,_=new URL(`/`,ka()??window.location.href).href,v=[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),size:`wide`,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),size:`wide`,placeholder:`00000000-0000-0000-0000-000000000000`}},{key:`redirect`,label:`Redirect URI`,control:{type:`code`,text:_}},{key:`app`,label:`App`,control:{type:`static`,text:e?.from?wl[e.from]:`None`}}];return(0,$.jsx)(T,{title:`Microsoft 365`,status:l??void 0,statusBad:!!l,focusRow:g?void 0:`client`,sections:[{key:`app`,rows:v}],...g?{}:{onSave:()=>void m(),saving:d,dirty:p},onClose:n})}var El={env:`Deployment`,lab:`Own`,default:`Default`},Dl=`https://console.cloud.google.com/apis/credentials`,Ol=[{value:`installed`,label:`Desktop app`},{value:`web`,label:`Web application`}],kl={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.`},Al=`/api/connections/google/callback`,jl=()=>/^(localhost|127\.|\[::1\])/.test(window.location.hostname);function Ml(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 Nl({onClose:e,onSaved:t}){let n=Pe(),[r,i]=(0,Q.useState)(void 0),[a,o]=(0,Q.useState)(!0),[s,c]=(0,Q.useState)(``),[l,u]=(0,Q.useState)(``),[d,f]=(0,Q.useState)(``),[p,m]=(0,Q.useState)(jl()?`installed`:`web`),[h,g]=(0,Q.useState)({clientId:``,apiKey:``,kind:``}),[_,v]=(0,Q.useState)(null),[y,b]=(0,Q.useState)(null),[x,S]=(0,Q.useState)(!1);(0,Q.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??(jl()?`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)}},E=e=>t=>{v(null),b(null),e(t)},D=()=>{let e=document.createElement(`input`);e.type=`file`,e.accept=`.json,application/json`,e.onchange=()=>{let t=e.files?.[0];t&&O(t)},e.click()},O=async e=>{let t=Ml(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 k=!a,A=!!r?.hasSecret&&r.from!=="default",j=k?r?.clientType??`web`:p,M=k?[{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:Ol.find(e=>e.value===j).label}}]:[{key:`client`,label:`Client ID`,control:{type:`text`,value:s,onChange:E(c),size:`wide`,placeholder:r?.from==="default"?r.clientId:`000000000000-….apps.googleusercontent.com`}},{key:`secret`,label:`Client secret`,control:{type:`secret`,value:l,onChange:E(e=>u(e??``)),...A?{placeholder:`Saved`}:{}}},{key:`key`,label:`API key`,control:{type:`text`,value:d,onChange:E(f),size:`wide`,placeholder:`AIza…`}},{key:`type`,label:`Type`,hint:kl[p],control:{type:`select`,value:p,options:Ol,onChange:e=>E(m)(e)}}];return M.push({key:`redirect`,label:`Redirect URI`,control:j===`web`?{type:`code`,text:new URL(Al,window.location.href).href}:{type:`static`,text:`Not Needed`}},{key:`app`,label:`App`,control:{type:`static`,text:r?.from?El[r.from]:`None`}}),(0,$.jsx)(T,{title:`Google Drive`,status:_??y??void 0,statusBad:!!_,focusRow:k?void 0:`client`,sections:[{key:`app`,rows:M}],actions:[{label:`Google Cloud`,icon:At,onSelect:()=>{window.open(Dl,`_blank`,`noopener`)}},...k?[]:[{label:`Load client file…`,icon:Mt,onSelect:D}]],...k?{}:{onSave:()=>void w(),saving:x,dirty:C},onClose:e})}var Pl=`microsoft`,Fl=`google`;function Il(){let e=Pe(),{cfg:n,editable:r}=Ia(),[i,a]=(0,Q.useState)(null),[s,c]=(0,Q.useState)(null),[l,u]=(0,Q.useState)(void 0),[d,f]=(0,Q.useState)(null),p=(0,Q.useCallback)(()=>{e.connections().then(e=>c(e.connections),()=>c([]))},[e]);(0,Q.useEffect)(p,[p]),(0,Q.useEffect)(()=>{if(!n){u(null);return}Da(n).then(u,()=>u(null))},[n]);let m=[...s??[],...n||r?[{id:Pl,label:`Microsoft 365`,configured:!!n,signedIn:!!l,account:l??null,problem:null}]:[]],h=async t=>{f(null);try{t.id===Pl&&n?await ja(n):window.location.assign((await e.signIn(t.id)).url)}catch(e){f(e instanceof Error?e.message:String(e))}},g=async t=>{f(null);try{t.id===Pl&&n?(await Ma(n),u(null)):c((await e.signOut(t.id)).connections)}catch(e){f(e instanceof Error?e.message:String(e))}};if(s===null)return(0,$.jsx)(o,{id:`setup-connections`,title:`Connections`,children:(0,$.jsx)(t,{label:`Connections`})});if(!m.length)return null;let _=m.filter(e=>e.problem);return(0,$.jsxs)(o,{id:`setup-connections`,title:`Connections`,note:`${m.filter(e=>e.signedIn).length} of ${m.length}`,children:[(0,$.jsx)(Te,{className:`setup-table`,cards:!0,label:`Connections`,rows:m,rowKey:e=>e.id,columns:[{key:`label`,header:`Connection`,role:`title`,cell:e=>e.label},{key:`status`,header:`Status`,cell:e=>e.id===Pl&&n&&l===void 0?(0,$.jsxs)(`span`,{className:`loading-status`,children:[(0,$.jsx)(oe,{}),`Checking`]}):Ll(e)},{key:`account`,header:`Account`,cell:e=>e.account||`—`},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(se,{label:`${e.label} actions`,actions:[e.signedIn?{label:`Sign out`,icon:Vt,onSelect:()=>void g(e)}:{label:`Sign in`,icon:Bt,disabled:!e.configured,onSelect:()=>void h(e)},...e.id===Pl||e.id===Fl?[{label:`Configure…`,icon:Xt,onSelect:()=>a(e.id)}]:[]]})}]}),_.map(e=>(0,$.jsxs)(`p`,{className:`note bad`,role:`alert`,children:[e.label,`: `,e.problem]},e.id)),d&&(0,$.jsx)(`p`,{className:`note bad`,role:`alert`,children:d}),i===Pl&&n!==void 0&&(0,$.jsx)(Tl,{cfg:n,editable:r,onClose:()=>a(null)}),i===Fl&&(0,$.jsx)(Nl,{onClose:()=>a(null),onSaved:p})]})}var Ll=e=>e.configured?e.signedIn?`Signed In`:`Signed Out`:`Not Configured`;function Rl(){let e=qe(),t=Pe(),n=te(),[r,i]=Je(`promptlab.profiles`),[a]=Je(`promptlab.versions`),[s,c]=(0,Q.useState)(null),[l,u]=(0,Q.useState)(null),d=(0,Q.useRef)(l);d.current=l;let[f,p]=(0,Q.useState)(null),[m,h]=(0,Q.useState)(null),[g,v]=(0,Q.useState)({}),[y,b]=(0,Q.useState)(``),[x,S]=(0,Q.useState)(``),[C,w]=(0,Q.useState)(``),[T,E]=(0,Q.useState)({key:`name`,dir:`asc`}),[D,O]=(0,Q.useState)([]),[k,j]=(0,Q.useState)({});(0,Q.useEffect)(()=>{let e=!0;return t.presets().then(t=>{e&&O(t)}).catch(()=>{}),()=>{e=!1}},[t]);let M=(0,Q.useRef)(r);M.current=r;let N=(0,Q.useCallback)(e=>{let t=d.current;return t?.p.id===e?t.p:M.current.list.find(t=>t.id===e)},[]),P=(0,Q.useCallback)(e=>{let t=d.current;if(t?.p.id!==e.id)return;let n={...t,p:e};d.current=n,u(n)},[]),F=(0,Q.useCallback)(()=>{let t=d.current;if(!t)return;let n=M.current,r=t.was?{...n,list:n.list.map(e=>e.id===t.p.id?t.p:e)}:{...n,list:[...n.list,t.p],at:t.p.id};M.current=r,i(r),st(e,`profile`,t.p.id,t.p,`idle`),u(null),c(null)},[i,e]),I=(0,Q.useCallback)(()=>{u(null),c(null)},[]),ee=(0,Q.useCallback)(()=>{let e=ru(M.current.list);u({p:e,was:null,start:e}),c({id:``,focus:`name`})},[]),L=(0,Q.useCallback)(e=>{let t=M.current.list.find(t=>t.id===e);if(!t)return;let n=`${t.name||`Profile`} copy`,r={...structuredClone(t),id:tu(),name:n,slug:nu(n,M.current.list),key:t.key},a={...M.current,list:[...M.current.list,r]};M.current=a,i(a)},[i]),R=(0,Q.useCallback)(e=>{let t=M.current,r=new Set(e),a=t.list.filter(e=>!r.has(e.id));if(!a.length||a.length===t.list.length)return;let o=r.has(t.at)?a[0].id:t.at,s={...t,list:a,at:o,...t.grader&&r.has(t.grader)?{grader:``}:{}};M.current=s,i(s),c(null),u(null);let l=t.list.filter(e=>r.has(e.id));n.offer({label:l.length===1?`Deleted ${l[0].name||`the profile`}`:`Removed ${l.length} profiles`,restore:()=>{M.current=t,i(t)}})},[i,n]),z=(0,Q.useCallback)(e=>R([e]),[R]),B=(0,Q.useCallback)(t=>{let n=t.doc.id,r=M.current.list.find(e=>e.id===n);r&&st(e,`profile`,n,r,`restore`);let a=M.current,o={...a,list:a.list.map(e=>e.id===n?t.doc:e)};M.current=o,i(o),V()},[e,i]),V=(0,Q.useCallback)(()=>{p(e=>(e?.back&&K(e.id),null))},[]),ne=(0,Q.useCallback)(async e=>{let n=N(e);if(!n)return;let r=J().CONNECTION_TYPES[n.type];if(r?.local){v(t=>({...t,[e]:{phase:`connected`,ms:0,lines:[`${r.label} answers each text item with its own text, and sends nothing anywhere.`]}}));return}let i=r?.keyless?``:n.key,a=n.url.trim()||r?.url||`the lab's Ollama`,o=performance.now(),s=()=>Math.round(performance.now()-o),c=[];v(t=>({...t,[e]:{phase:`checking`,lines:[`Checking…`]}}));try{let o=Object.fromEntries((r?.settings??[]).map(e=>[e.key,String(n[e.key]??``)]));if(`testPath`in o&&!o.testPath.trim()){let e=r?.templates?.find(e=>Yl(e.settings.url,n.url));e?.settings.testPath&&(o.testPath=e.settings.testPath)}let l=((await t.models({url:n.url,key:i,type:n.type,settings:o})).data||[]).map(e=>e.id).sort();if(j(t=>({...t,[e]:l})),c.push(`Reached ${a}.`,`${l.length} ${l.length===1?`model`:`models`}: ${l.join(`, `)||`none`}.`),(r?.answers??[`prompt`]).includes(`prompt`)){if(n.model.trim()){let e=J().apiBase(n.url||r?.url||``),a=J().connectionRequest(n,`hi`,null,e,i),o=await t.modelsAsk({url:n.url,key:i,type:n.type,body:a.body}),{raw:s}=J().connectionReply(n,o);c.push(``,`Asked ${n.model} “hi”; it replied:`,s||`(an empty reply)`)}else c.push(``,`No model is picked, so nothing was asked.`)}v(t=>({...t,[e]:{phase:`connected`,lines:c,ms:s()}}))}catch(t){c.push(...c.length?[``]:[],t instanceof Error?t.message:String(t)),v(t=>({...t,[e]:{phase:`error`,lines:c,ms:s()}}))}},[t,N]),H=s?l?.p:void 0,re=H?JSON.stringify([H.id,H.url,H.type,H.key]):``;(0,Q.useEffect)(()=>{if(!H)return;let e=H;if(J().CONNECTION_TYPES[e.type]?.local||J().CONNECTION_TYPES[e.type]?.lists===!1)return;let n=J().CONNECTION_TYPES[e.type]?.keyless,r=!0,i=setTimeout(()=>{t.models({url:e.url,key:n?``:e.key,type:e.type,quiet:!0}).then(t=>{r&&j(n=>({...n,[e.id]:(t.data||[]).map(e=>e.id).sort()}))}).catch(()=>{r&&j(t=>({...t,[e.id]:[]}))})},400);return()=>{r=!1,clearTimeout(i)}},[t,re]);let U=(0,Q.useCallback)((e,t)=>{let n=N(e);if(!n)return;let r={...n};for(let e of Ql(n.type))r[e]=``;for(let[e,n]of Object.entries(t.opts))r[e]=n;P(r)},[N,P]),G=(0,Q.useCallback)(e=>{v(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return r})},[]),ie=(0,Q.useCallback)((e,t,n)=>{let r=N(e);if(r){if([`url`,`key`,`model`].includes(t)&&G(e),t===`name`){let t=M.current.list.filter(t=>t.id!==e);if(!r.slug||r.slug===nu(r.name,t)){P({...r,name:n,slug:nu(n,t)});return}}t===`slug`&&(n=n.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+/,``).slice(0,J().SLUG_MAX)),P({...r,[t]:n})}},[N,P,G]),ae=(0,Q.useCallback)((e,t)=>{let n=N(e);if(!n)return;let r={...n,type:t};G(e),j(t=>({...t,[e]:[]}));let i=J().CONNECTION_TYPES[t];i?.keyless&&(r.key=``),i?.url&&!r.url.trim()&&(r.url=i.url);for(let e of Object.keys(r))[`id`,`name`,`slug`,`url`,`model`,`key`,`temperature`,`type`,...dl].includes(e)||$l(t).includes(e)||delete r[e];P(r)},[N,P,G]),K=(0,Q.useCallback)((e,t)=>{let n=M.current.list.find(t=>t.id===e);n&&(u({p:structuredClone(n),was:n,start:n}),c(t?{id:e,focus:t}:{id:e}))},[]),oe=(0,Q.useCallback)(e=>a.profile?.[e]??[],[a]),q=s?l?.p??null:null,se=l?l.was?r.list.map(e=>e.id===l.p.id?l.p:e):[...r.list,l.p]:r.list,ce=[...new Set(r.list.map(e=>e.type))],ue=y.trim().toLowerCase(),Y=r.list.filter(e=>(!x||e.type===x)&&(!C||C===`set`==!!e.key)&&(!ue||[e.name,e.url,e.model].some(e=>String(e??``).toLowerCase().includes(ue))));return(0,$.jsxs)(`div`,{className:`setup`,children:[(0,$.jsxs)(o,{id:`setup-profiles`,title:`Target profiles`,note:eu(r.list.length),children:[(0,$.jsx)(`p`,{className:`note`,children:`A profile is how the lab reaches a model or an API: its type, address, key and settings. A target picks one.`}),r.list.length>0&&(0,$.jsx)(W,{noun:`profiles`,search:{label:`Search profiles`,placeholder:`Name, address or model`,value:y,onChange:b},filters:[{key:`type`,label:`Type`,value:x,onChange:S,options:[{value:``,label:`All`},...ce.map(e=>({value:e,label:J().CONNECTION_TYPES[e]?.label??e}))]},{key:`key`,label:`Key`,value:C,onChange:w,options:[{value:``,label:`All`},{value:`set`,label:`Set`},{value:`unset`,label:`Not set`}]},{key:`sort`,label:`Sort`,value:T?.key??``,neutral:`name`,onChange:e=>E(e?{key:e,dir:`asc`}:null),options:[{value:``,label:`As added`},{value:`name`,label:`Name`},{value:`type`,label:`Type`},{value:`url`,label:`Address`},{value:`model`,label:`Model`}]}],count:{shown:Y.length,total:r.list.length}}),r.list.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No profiles yet.`}):Y.length===0?(0,$.jsx)(`p`,{className:`note`,children:`No profiles match these filters.`}):(0,$.jsx)(Te,{className:`setup-table`,cards:!0,label:`Target profiles`,sort:T,onSort:E,rows:Y,rowKey:e=>e.id,select:{noun:`profile`,label:e=>e.name||`Unnamed profile`,actions:e=>[{label:`Remove`,icon:_.remove,destructive:!0,disabled:e.length>=r.list.length,onSelect:()=>R(e.map(e=>e.id))}]},rowProps:e=>({className:`setup-row`,onClick:t=>{t.target.closest(`button, a, .menu`)||K(e.id)}}),columns:zl({tests:g,only:r.list.length===1,grader:r.grader??null,onGrader:e=>{let t=M.current,n={...t,grader:t.grader===e?``:e};M.current=n,i(n)},onOpen:K,onClone:L,onRemove:z,onTest:ne,onResult:e=>h({id:e,back:!1})})}),(0,$.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:ee,children:[(0,$.jsx)(A,{size:14,"aria-hidden":`true`}),`Add profile`]})]}),(0,$.jsx)(Il,{}),(0,$.jsx)(xl,{offer:n.offer}),(0,$.jsx)(vl,{offer:n.offer}),(0,$.jsx)(le,{undo:n.undo,onUndo:n.undoNow,onDismiss:n.dismiss}),q&&(0,$.jsx)(Bl,{profile:q,slug:J().withSlugs(se).find(e=>e.id===q.id)?.slug??``,...s?.focus?{focus:s.focus}:{},test:g[q.id],models:k[q.id]??[],presets:D.filter(e=>(e.type??`llama.cpp`)===q.type),canRestore:!!l?.was&&!!oe(q.id).length,dirty:!!l&&JSON.stringify(l.p)!==JSON.stringify(l.start),onSave:F,onClose:I,onSetting:ie,onType:ae,onTest:ne,onResult:()=>{c(null),h({id:q.id,back:!0})},onRestore:()=>{I(),p({id:q.id,back:!0})},onApplyPreset:e=>U(q.id,e)}),m&&g[m.id]&&(0,$.jsx)(Jl,{test:g[m.id],onClose:()=>{m.back&&d.current?.p.id===m.id&&c({id:m.id}),h(null)}}),f&&(0,$.jsx)(Kl,{versions:oe(f.id),onClose:V,onRestore:B})]})}function zl({tests:e,only:t,grader:n,onGrader:r,onOpen:i,onClone:a,onRemove:o,onTest:s,onResult:c}){let l=e=>e.name||`Unnamed profile`,u=c=>[{label:`Edit…`,icon:_.edit,onSelect:()=>i(c.id)},{label:`Rename…`,icon:_.rename,onSelect:()=>i(c.id,`name`)},{label:`Clone`,icon:_.clone,onSelect:()=>a(c.id)},{label:`Test connection`,icon:f,busy:e[c.id]?.phase===`checking`,onSelect:()=>void s(c.id)},...(J().CONNECTION_TYPES[c.type]?.answers??[`prompt`]).includes(`prompt`)&&!J().CONNECTION_TYPES[c.type]?.local?[{label:n===c.id?`Stop grading`:`Make grader`,icon:zt,onSelect:()=>r(c.id)}]:[],...t?[]:[{label:`Remove`,icon:_.remove,destructive:!0,onSelect:()=>o(c.id)}]];return[{key:`name`,header:`Profile`,role:`title`,sort:l,cell:t=>{let r=e[t.id];return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`button`,{type:`button`,className:`setup-open`,onClick:()=>i(t.id),children:l(t)}),n===t.id&&(0,$.jsx)(`span`,{className:`setup-note`,children:`Grader`}),r&&(0,$.jsx)(`button`,{type:`button`,className:`edit-outcome setup-note${r.phase===`error`?` bad`:``}`,"aria-label":`Test connection: ${ql[r.phase]}`,onClick:()=>c(t.id),children:ql[r.phase]})]})}},{key:`type`,header:`Type`,label:``,sort:e=>J().CONNECTION_TYPES[e.type]?.label??e.type,cell:e=>J().CONNECTION_TYPES[e.type]?.label??e.type},{key:`url`,header:`Address`,sort:e=>e.url.trim(),cell:e=>J().CONNECTION_TYPES[e.type]?.local?(0,$.jsx)(`span`,{className:`setup-unset`,children:`—`}):e.url.trim()||(0,$.jsx)(`span`,{className:`setup-unset`,children:`Default`})},{key:`model`,header:`Model`,sort:e=>e.model.trim(),cell:e=>J().CONNECTION_TYPES[e.type]?.local?(0,$.jsx)(`span`,{className:`setup-unset`,children:`—`}):e.model.trim()||(0,$.jsx)(`span`,{className:`setup-unset`,children:`Not set`})},{key:`key`,header:`Key`,sort:e=>e.key?`Set`:``,cell:e=>J().CONNECTION_TYPES[e.type]?.keyless?(0,$.jsx)(`span`,{className:`setup-unset`,children:`—`}):e.key?`Set`:(0,$.jsx)(`span`,{className:`setup-unset`,children:`Not set`})},{key:`menu`,header:``,label:``,className:`setup-menu`,role:`menu`,sort:null,cell:e=>(0,$.jsx)(se,{actions:u(e),label:`${l(e)} actions`})}]}function Bl({profile:e,slug:t,focus:n,test:r,models:i,presets:a,canRestore:o,dirty:s,onSave:c,onClose:l,onSetting:u,onType:d,onTest:p,onResult:h,onRestore:g,onApplyPreset:v}){let y=J().CONNECTION_TYPES[e.type],b=(y?.answers??[`prompt`]).includes(`prompt`),x=(0,Q.useMemo)(()=>Gl(e),[e]),S=t=>n=>u(e.id,t,n),C=[{key:`name`,label:`Name`,required:!0,control:{type:`text`,value:e.name,onChange:S(`name`)}},{key:`slug`,label:`Slug`,required:!0,...e.slug&&J().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=>d(e.id,t),options:Object.entries(J().CONNECTION_TYPES).filter(([t,n])=>n.picker!==!1||t===e.type).map(([e,t])=>({value:e,label:t.label}))}},...y?.local?[]:[{key:`url`,label:`Address`,control:{type:`text`,value:e.url,placeholder:y?.url??`the lab's Ollama`,onChange:S(`url`)}},...y?.keyless?[]:[{key:`key`,label:`Key`,control:{type:`secret`,value:sl(e.key)?``:e.key,held:sl(e.key),onChange:S(`key`)}}],...b?[{key:`model`,label:`Model`,control:Zl(e.model,i,S(`model`))}]:[]]],w=(y?.settings??[]).map(t=>Vl(e,t,S(t.key))),E=[{key:`identity`,rows:C},...w.length?[{key:`settings`,title:`Settings`,rows:w}]:[],...y?.local||!b?[]:[{key:`image`,title:`Image`,rows:gl(e,S)},{key:`debug`,title:`Debug`,rows:x,folded:!0}]],D=[{label:`Restore…`,icon:m,disabled:!o,onSelect:g},...a.map(e=>({label:`Apply preset: ${e.label}`,icon:_.preset,onSelect:()=>v(e)})),...(y?.templates??[]).map(t=>({label:`Apply template: ${t.label}`,icon:_.preset,onSelect:()=>v({id:t.id,label:t.label,type:e.type,opts:t.settings})}))];return(0,$.jsx)(T,{title:e.name||`Unnamed profile`,...n?{focusRow:n}:{},sections:E,menu:D,actions:y?.tests===!1?[]:[{label:`Test connection`,icon:f,busy:r?.phase===`checking`,onSelect:()=>p(e.id),outcome:r?{label:ql[r.phase],bad:r.phase===`error`,onOpen:h}:void 0}],dirty:s,onSave:c,onClose:l})}function Vl(e,t,n){let r=e[t.key]??t.default??``;if(t.control===`select`&&t.choices)return{key:t.key,label:t.label,control:{type:`select`,value:r,options:t.choices,onChange:n}};if(t.key===`grammar`)return{key:t.key,label:t.label,control:{type:`textarea`,value:r,onChange:n}};let i=r?null:Ul(e,t.key),a={type:`text`,value:r,onChange:n,...i?.placeholder?{placeholder:i.placeholder}:{},...i?.numeric?{size:`num`}:{}};return{key:t.key,label:t.label,control:a}}var Hl=`424242`;function Ul(e,t){let n=J().apiBase(e.url),r,i;try{r=Wl(J().connectionRequest({...e,[t]:``},`(prompt)`,null,n).body),i=Wl(J().connectionRequest({...e,[t]:Hl},`(prompt)`,null,n).body)}catch{return null}let a=Object.keys(i).find(e=>i[e]===Hl||i[e]===JSON.stringify(Hl));if(a===void 0)return null;let o=i[a]===Hl,s=a in r?JSON.parse(r[a]):null;return s===null?{numeric:o}:{placeholder:String(s),numeric:o}}function Wl(e,t=``,n={}){if(e&&typeof e==`object`&&!Array.isArray(e))for(let[r,i]of Object.entries(e))Wl(i,t?`${t}.${r}`:r,n);else n[t]=JSON.stringify(e)??`null`;return n}function Gl(e){let t=J().apiBase(e.url),n=[];try{let{url:r,body:i}=J().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:_l(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 Kl({versions:e,onClose:t,onRestore:n}){return(0,$.jsx)(Z,{title:`Restore profile`,onClose:t,children:(0,$.jsxs)(`div`,{className:`version-list`,children:[e.length===0&&(0,$.jsx)(`p`,{className:`note`,children:`No versions of this profile yet.`}),e.map((e,t)=>(0,$.jsxs)(`div`,{className:`version-row`,children:[(0,$.jsxs)(`span`,{className:`version-when`,children:[au(e.at),`, `,iu(e.reason)]}),(0,$.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>n(e),children:`Restore`})]},`${e.at}-${t}`))]})})}var ql={checking:`Checking…`,connected:`Connected`,error:`Error`};function Jl({test:e,onClose:t}){return(0,$.jsx)(T,{title:`Test connection`,sections:[{key:`result`,rows:[{key:`time`,label:`Time`,required:!0,control:{type:`static`,text:e.ms==null?`—`:Xl(e.ms)}},{key:`result`,label:`Result`,required:!0,control:{type:`textarea`,value:e.lines.join(`
|
|
13
|
+
`)}}]}],onClose:t})}function Yl(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 Xl=e=>e<1e3?`${e} ms`:`${(e/1e3).toFixed(1)}s`;function Zl(e,t,n){if(!t.length)return{type:`text`,value:e,placeholder:`model name`,onChange:n};let r=e&&!t.includes(e)?[e,...t]:[...t];return{type:`select`,value:e,onChange:n,options:[...e?[]:[{value:``,label:`Pick a model`}],...r.map(e=>({value:e,label:e}))]}}function Ql(e){return J().CONNECTION_TYPES[e]?.settings.map(e=>e.key).filter(e=>e!==`temperature`)??[]}function $l(e){return J().CONNECTION_TYPES[e]?.settings.map(e=>e.key)??[]}var eu=e=>e===1?`1 profile`:`${e} profiles`,tu=()=>`p${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,nu=(e,t)=>J().uniqueSlug(J().slugOf(e),new Set(J().withSlugs(t).map(e=>e.slug))),ru=e=>({id:tu(),name:`New profile`,slug:nu(`New profile`,e),url:``,model:``,key:``,temperature:``,nPredict:``,maxTokens:``,type:`ollama`}),iu=e=>e===`run`?`before a run`:e===`restore`?`before a restore`:`after editing`,au=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()},ou=[];function su(e,t){let n=Pe(),[r,i]=(0,Q.useState)(null);(0,Q.useEffect)(()=>{if(t===null)return;let r=!0,a=Xe(n);return a.runDataset(e).then(n=>{if(n){r&&i({run:e,cases:J().upgradeDatasetBody(n).cases,current:!1});return}return a.dataset(t).then(t=>{r&&i({run:e,cases:J().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:ou,current:a?.current??!1}}var cu=(e,t)=>`${J().targetLetter(t)} ${e.scenarios[t]?.name??``}`.trim(),lu=e=>e?`${e.passed}/${e.ran}`:(0,$.jsx)(`span`,{className:`note`,children:`n/a`});function uu({id:e,view:t}){let n=xr(t),r=t.evals.flatMap((e,r)=>{let i=n.rows[r];return[{kind:`group`,key:e.id,name:i?.name??``,verdict:(i?.cells??[]).map(e=>e.pass)},...Dr(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)(Te,{className:`egtable recorded`,label:`Evals by target`,rows:r,rowKey:e=>e.key,defaultSort:null,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:cu(t,n),label:cu(t,n),sort:null,className:`num`,cell:e=>e.kind===`group`?e.verdict[n]==null?(0,$.jsx)(`span`,{className:`eg-none`,children:`—`}):(0,$.jsx)(Bn,{pass:e.verdict[n]}):lu(e.cells[n])}))]})})}function du({view:e,x:t,evalId:n,onClose:r}){let i=e.items[t]??e.results[t]?.name??`Call`;return(0,$.jsx)(Z,{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=wr(e.results[t]?.scenarios?.[i]?.res),o=n?Tr(e,t,i,n):[];return(0,$.jsxs)(`div`,{className:`rec-side`,children:[(0,$.jsx)(`h3`,{className:`rec-side-title`,children:cu(e,i)}),(0,$.jsx)(`pre`,{className:`raw`,children:a??`(no reply)`}),o.length>0&&(0,$.jsx)(`ul`,{className:`rec-checks`,"aria-label":`${cu(e,i)} checks`,children:o.map((e,t)=>(0,$.jsxs)(`li`,{children:[(0,$.jsx)(`span`,{className:`eval-name`,children:e.label}),(0,$.jsx)(Bn,{pass:e.pass})]},t))})]},r.id)})})})}function fu(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=>J().metricLines(e.values)),forbidden:t.filter(e=>e.not&&e.type===`contains`).map(e=>({value:String(e.value??``),except:J().metricLines(e.except)}))}}var pu=e=>e==null?`—`:Xn(e);function mu(e){return e?.transcript||[]}function hu(e,t){return t.flatMap((n,r)=>{let i=mu(e?.scenarios?.[r]?.res);return t.length>1?i.map(e=>({...e,scenario:n.name})):i})}function gu({stages:e}){if(!e.length)return null;let t=!e.some(e=>e.scenario)&&e.length>1?`, ${e.map(e=>pu(e.ms)).join(` + `)}`:``;return(0,$.jsxs)(`div`,{className:`transcript`,children:[(0,$.jsxs)(`div`,{className:`meta`,children:[`Transcript`,t]}),e.map((e,t)=>(0,$.jsxs)(`pre`,{children:[(0,$.jsxs)(`b`,{children:[e.scenario?`${e.scenario}, `:``,`job `,e.n,` `,e.withImage?`(with image)`:`(text only)`,e.kind?`, ${e.kind}`:``,e.conn?`, ${e.conn}`:``,`, `,pu(e.ms),` — sent`]}),`
|
|
14
|
+
`,e.sent,`
|
|
15
|
+
`,(0,$.jsx)(`b`,{children:`— returned`}),`
|
|
16
|
+
`,e.got||(e.error?`(nothing)`:``),e.error?`\n<b className="fault">Error - ${e.error}</b>`:``]},t))]})}function _u({text:e,kind:t}){return(0,$.jsx)(`span`,{className:`term${t?` ${t}`:``}`,children:e})}function vu({res:e,kase:t}){let n=e?.dropped||[];if(!n.length)return null;let r=e=>t?fu(t).wanted.some(t=>J().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)(_u,{text:e.item,kind:`no`}),(0,$.jsxs)(`span`,{className:`note`,children:[e.by,r(e.item)&&(0,$.jsx)(`b`,{className:`fault`,children:`, wanted`})]})]},t))]})}function yu({kase:e}){return(0,$.jsx)($.Fragment,{children:(e.metrics??[]).map((e,t)=>(0,$.jsx)(`div`,{className:`wants${e.weight===0?` watched`:``}`,children:Kr(e)},t))})}var bu=e=>e?.transcript?.at(-1)?.kind===`text`;function xu({res:e}){return e?.error?(0,$.jsx)(`span`,{className:`err`,children:e.error}):bu(e)?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`pre`,{children:e?.transcript?.at(-1)?.got||`(empty)`}),(0,$.jsx)(`div`,{className:`meta`,children:pu(e?.ms)})]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`div`,{className:`chips`,children:(e?.terms||[]).map((e,t)=>(0,$.jsx)(_u,{text:String(e)},t))}),(0,$.jsx)(vu,{res:e,kase:null}),(0,$.jsxs)(`div`,{className:`meta`,children:[(e?.terms||[]).length,` items, `,pu(e?.ms)]})]})}function Su({res:e}){if(e?.error)return(0,$.jsx)(`span`,{className:`err`,children:e.error});let t=e?.transcript?.at(-1)?.got??e?.raw??``;return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`pre`,{children:t||`(empty)`}),(0,$.jsxs)(`div`,{className:`meta`,children:[pu(e?.ms),`, `,bu(e)?`answered as text`:`read as ${(e?.terms||[]).length} items`]})]})}function Cu({tab:e,undo:n}){let r=Pe(),i=te(),a=n??i,{setShow:s,openRun:c,closeRun:l}=Tn(),{openCaseEditor:u}=Ai(),[d,f]=(0,Q.useState)(null),[p,m]=(0,Q.useState)(!1),[h,v]=(0,Q.useState)(null),[y,b]=(0,Q.useState)(new Set),[x,S]=(0,Q.useState)(!1),[C,w]=(0,Q.useState)(null),[T,E]=(0,Q.useState)(null),[D,O]=(0,Q.useState)(0),[A,j]=(0,Q.useState)(null),[M,N]=(0,Q.useState)(new Set),[F,I]=(0,Q.useState)(null),ee=ft();(0,Q.useEffect)(()=>{let t=!0,n=!1,i,a=async()=>{try{let o=await r.run(e.id);if(!t)return;n=!0,f(o),E(null),sr(o.status)||(i=setTimeout(()=>void a(),1e3))}catch(e){if(!t)return;n?i=setTimeout(()=>void a(),1e3):E(e instanceof We?e.message:`Run not loaded: server unreachable.`)}};return a(),()=>{t=!1,i&&clearTimeout(i)}},[r,e.id,D]);let L=(0,Q.useMemo)(()=>d?Or(d):null,[d]),R=L?J().evalsDataset(L.snapshot)?.id??null:null,z=L?Sr(L):[],B=z.some(Boolean),V=Cr(z),ne=mt(B?R:null),H=su(e.id,R),re=(0,Q.useMemo)(()=>new Map(H.cases.map(e=>[J().caseItem(e),e])),[H.cases]),U=(0,Q.useCallback)(async()=>{j(null);try{let{run:t}=await r.rerunRun(e.id);c(t.id,{at:t.submittedAt,from:e.from}),a.offer({label:Yc(t),restore:()=>{Xc(r,t.id),l(t.id)}})}catch(e){j(`Not re-run: ${e instanceof Error?e.message:`server unreachable`}.`)}},[r,e.id,e.from,c,l,a]),G=(0,Q.useCallback)(async()=>{m(!0);try{await r.cancel(e.id)}catch{}m(!1)},[r,e.id]);if(!L)return(0,$.jsx)(o,{id:`run-${e.id}`,title:Vn(e.at)||`Run`,children:(0,$.jsx)(t,{label:`Run`,error:T,onRetry:()=>{E(null),O(e=>e+1)}})});let ie=L.progress,ae=ie.n??ie.total??0,q=!sr(L.status),ce=ie.total&&ae!=null&&q?Math.round(ae/ie.total*100):null,le=Xr(L,H.cases),ue=L.scenarios.map((e,t)=>Qr(L,H.cases,t)),Y=Rr(L),de=(e,t,n)=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t),n(r)},fe=async(e,t,n)=>{let r=Math.max(0,L.scenarios.findIndex((t,n)=>mr(L,e,n))),i=(t.scenarios??[])[r]?.res;i&&await ac(qr(L.snapshot,n,i,r))&&(S(!0),setTimeout(()=>S(!1),1600))},pe=async()=>{await ac(le.map(e=>qr(L.snapshot,e.kase,e.res,e.scenarioIndex)).join(`
|
|
17
|
+
|
|
18
|
+
`+`-`.repeat(60)+`
|
|
19
|
+
|
|
20
|
+
`))&&(S(!0),setTimeout(()=>S(!1),1600))},me=[...le.length?[{label:`Copy all failures`,icon:Se,onSelect:()=>void pe()}]:[],...d&&Jc(d)?[{label:`Re-run`,icon:Jt,onSelect:()=>void U()}]:[]],he={key:`show`,label:`Show`,value:e.show,onChange:t=>s(e.id,t),options:[{value:`all`,label:`All`},{value:`failed`,label:`Failed`}]},ge=!!R,_e=L.evals.find(e=>J().casesRef(e))?.id??null,ve=!!(L.content&&J().CONTENT_TYPES[L.content.type]?.inline),ye=()=>{let e=ne?.doc?.body;if(!R||!e||V<0)return;let t={};for(let e of M){let n=L.results.findIndex(t=>t?.name===e);t[e]=n>=0?wr(L.results[n]?.scenarios?.[V]?.res):null}let{body:n,taken:r,missing:i}=J().takeAsExpected(e,t);if(N(new Set),!r.length){j(`Not taken: ${i.length?`the selected calls have no Target B reply to take`:`nothing selected`}.`);return}j(null),ee.edit(R,()=>n),a.offer({label:`Took ${Hn(r.length,`call`)} as expected${i.length?`, ${i.length} without a reply`:``}`,restore:()=>ee.edit(R,()=>e)})},be=e=>{let t=L.results[e]?.name;return t?re.get(t):void 0},X=t=>{let n=L.results[t],i=be(t),a=!!n&&!n.unrun&&sr(L.status),o=(n?.scenarios??[]).some(e=>e?.res?.transcript?.length),s=[];return o&&s.push({label:`Show details`,icon:P,onSelect:()=>de(y,t,b)}),a&&n?.name&&i&&s.push({label:`Edit case`,icon:_.edit,onSelect:()=>R&&u(n.name,{dataset:R,resultFor:e=>L.results[t]?.scenarios?.[e]?.res??null,scenarioCount:L.scenarios.length,files:L.results.filter(e=>e.kind!==`text`).map(e=>e.name??``)})}),a&&L.id&&s.push({label:`Re-run row`,icon:k,onSelect:()=>void r.rerun(e.id,t).then(e=>f(e.run)).catch(()=>{})}),a&&i&&wu(L,t)&&s.push({label:`Copy as AI prompt`,icon:Se,onSelect:()=>void fe(t,n,i)}),s};return(0,$.jsxs)(`div`,{className:`runview`,children:[(0,$.jsxs)(o,{id:`run-${e.id}`,title:L.name||Vn(e.at),actions:me,children:[(0,$.jsxs)(`div`,{className:`runhead`,children:[Y&&(0,$.jsxs)(`span`,{className:`note run-queue`,children:[(0,$.jsx)(`span`,{className:`run-state`,children:Y.state}),Y.detail&&(0,$.jsx)(`span`,{className:`run-item`,children:Y.detail})]}),q&&(0,$.jsxs)(`button`,{type:`button`,className:`ghost stop-btn`,disabled:p,onClick:()=>void G(),children:[p?(0,$.jsx)(oe,{}):(0,$.jsx)(g,{size:14,"aria-hidden":`true`}),`Stop`]})]}),q&&(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,`%`]})]})}),d?.rerunOf&&(0,$.jsxs)(`p`,{className:`note rrorigin`,children:[`Re-run of`,` `,d.rerunOfAt?(0,$.jsx)(`a`,{href:`#`,onClick:t=>{t.preventDefault(),c(d.rerunOf,{at:d.rerunOfAt,from:e.from})},children:Vn(d.rerunOfAt)}):`a cleared run`]}),L.error&&(0,$.jsx)(`p`,{className:`note bad rrstatus`,role:`status`,children:L.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)(An,{label:`Run Statistics`,...Nr(L)})}),x&&(0,$.jsx)(`p`,{className:`note`,role:`status`,children:`Copied to clipboard.`})]}),L.evals.length>0&&(B?(0,$.jsx)(o,{id:`run-${e.id}-evals`,title:`Evals`,children:(0,$.jsx)(uu,{id:`run-${e.id}-evals-t`,view:L})}):(0,$.jsx)(Eu,{id:`run-${e.id}-evals`,summary:xr(L),scenarios:L.scenarios,onScenario:w})),(0,$.jsxs)(o,{id:`run-${e.id}-results`,title:`Results`,actions:B&&V>=0?[{label:`Take B as expected`,icon:K,disabled:M.size===0,onSelect:()=>ye()}]:[],children:[(0,$.jsx)(W,{noun:`results`,filters:[he],lead:(0,$.jsx)(`p`,{className:`note`,children:Hn(L.items.length,`item`)}),count:{total:L.items.length,shown:e.show===`failed`?L.items.filter((e,t)=>wu(L,t)).length:L.items.length}}),H.current&&(0,$.jsx)(`p`,{className:`note`,children:`Graded before the lab kept a copy of its dataset: the expectations are the dataset as it is now.`}),(0,$.jsx)(`div`,{className:`scrollx`,style:{"--scenarios":L.scenarios.length},children:(0,$.jsx)(Te,{className:[ge&&!B?`graded`:``,B?`recorded`:``,`rrtable`].filter(Boolean).join(` `),defaultSort:null,label:`Results`,rows:L.items.map((e,t)=>t),rowKey:e=>B?L.items[e]??`row-${e}`:`${L.items[e]}-${e}`,...B?{select:{noun:`call`,label:e=>L.items[e]??`row ${e+1}`,selected:M,onChange:N}}:{},pinned:(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`tr`,{className:`scenstats`,children:[B&&(0,$.jsx)(`td`,{className:`dt-select`}),(0,$.jsx)(`td`,{className:`scenstats-label`,children:`Statistics`}),ge&&!B&&(0,$.jsx)(`td`,{className:`scenstats-blank`}),L.scenarios.map((e,t)=>(0,$.jsx)(`td`,{className:`scenstat`,"data-label":B?cu(L,t):e.name,children:(0,$.jsx)(An,{dense:!0,label:`${e.name} statistics`,...Fr(L,t)})},e.id))]}),ue.some(e=>e.length>0)&&R&&(0,$.jsx)(Tu,{from:Vn(e.at)||L.name,datasetId:R,failing:ue,scenarios:L.scenarios,items:L.items.length,graded:ge&&!B,selectCol:B})]}),rowProps:t=>({"data-item":t,className:y.has(t)?`hasdetail`:void 0,hidden:e.show===`failed`&&!wu(L,t)}),after:t=>y.has(t)&&(0,$.jsx)(`tr`,{className:`rrdetail`,"data-detail":t,hidden:e.show===`failed`&&!wu(L,t),children:(0,$.jsx)(`td`,{colSpan:+!!B+1+(ge&&!B?1:0)+L.scenarios.length,children:(0,$.jsx)(gu,{stages:hu(L.results[t],L.scenarios)})})}),columns:[{key:`item`,header:ve?`Text`:`Item`,label:``,className:`col-item`,sort:e=>L.items[e]||``,cell:e=>{let t=L.results[e],n=L.items[e];return(0,$.jsxs)($.Fragment,{children:[t?.name&&!ve&&yi(t.name)?(0,$.jsx)(`button`,{type:`button`,className:`thumb`,"aria-label":`Open ${t.name}`,onClick:()=>v(t.name),children:(0,$.jsx)(`img`,{src:Br(L,t.name),alt:``,loading:`lazy`,"data-name":t.name})}):null,(0,$.jsxs)(`div`,{className:`rritem`,children:[B&&t?.name?(0,$.jsx)(`button`,{type:`button`,className:`rrcall`,onClick:()=>I(e),children:n||``}):(0,$.jsx)(`div`,{className:`meta`,children:n||``}),(0,$.jsx)(se,{actions:X(e),label:`${n||`row`} actions`})]})]})}},...ge&&!B?[{key:`expected`,header:`Expected`,className:`col-expected`,sort:e=>{let t=be(e);return t&&!t.todo?t.metrics?.length??0:null},cell:e=>{let t=be(e);return L.results[e]?t&&!t.todo?(0,$.jsx)(yu,{kase:t}):(0,$.jsx)(`span`,{className:`note`,children:`n/a`}):``}}]:[],...L.scenarios.map((e,t)=>({key:`scenario-${t}`,header:B?cu(L,t):e.name,label:B?cu(L,t):e.name,onHeader:()=>w(t),cell:e=>(0,$.jsx)(Du,{item:L.results[e],i:t,readings:(L.outcomes[t]??[]).filter(e=>!e.whole).map(t=>({label:t.label,dataset:t.id===_e,score:t.items[e]??null}))})}))]})})]}),C!=null&&(0,$.jsx)(bc,{run:L.snapshot,i:C,onClose:()=>w(null)}),F!=null&&(0,$.jsx)(du,{view:L,x:F,evalId:_e,onClose:()=>I(null)}),h&&(0,$.jsx)(ju,{src:Vr(L,h),name:h,onClose:()=>v(null)})]})}var wu=(e,t)=>{let n=e.results[t];return!!n&&(!!n.unrun||(n.scenarios??[]).some((n,r)=>mr(e,t,r)||!!n?.res?.error))};function Tu({from:e,datasetId:t,failing:n,scenarios:r,items:i,graded:a,selectCol:o=!1}){let{showCases:s}=Sn(),{list:c}=pt(),l=c!==null&&!c.some(e=>e.id===t),u=r.length>1;return(0,$.jsxs)(`tr`,{className:`reasons`,children:[o&&(0,$.jsx)(`td`,{className:`dt-select`}),(0,$.jsx)(`td`,{className:`scenstats-label`,children:`Reasons`}),a&&(0,$.jsx)(`td`,{className:`scenstats-blank`}),r.map((r,a)=>{let o=r.name,c=n[a]??[];return(0,$.jsx)(`td`,{className:`reasons-cell`,"data-label":o,children:c.length===0?(0,$.jsx)(`span`,{className:`reasons-none`,children:`No failures`}):(0,$.jsx)(`ul`,{className:`reasons-list`,"aria-label":`${o} reasons`,children:c.map(n=>{let r=n.files.length,a=(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(i,1)*100)}%`},children:l?(0,$.jsx)(`span`,{className:`reason`,children:a}):(0,$.jsx)(`a`,{className:`reason`,href:`#/library/datasets`,title:`${n.label}${n.note?` (${n.note})`:``}: open ${Hn(r,`case`)} in the Library`,"aria-label":`${n.label}: open ${Hn(r,`case`)} in the Library`,onClick:r=>{r.preventDefault(),s(t,n.files,`${e}${u?`, ${o}`:``}, ${n.label}`)},children:a})},n.key)})})},r.id)})]})}function Eu({id:e,summary:t,scenarios:n,onScenario:r}){let i=[...t.rows.map(e=>({kind:`group`,group:e})),...t.overall?[{kind:`overall`,...t.overall}]:[]],a=(e,t)=>e==null&&t==null?(0,$.jsx)(`span`,{className:`eg-none`,children:`—`}):(0,$.jsxs)(`span`,{className:`eg-cell`,children:[e!=null&&(0,$.jsx)(Bn,{pass:e}),t!=null&&(0,$.jsxs)(`span`,{className:`eg-pct`,children:[t,`%`]})]}),s=t.rows.some(e=>e.version!=null);return(0,$.jsx)(o,{id:e,title:`Evals`,children:(0,$.jsx)(`div`,{className:`scrollx`,style:{"--scenarios":n.length},children:(0,$.jsx)(Te,{className:s?`egtable`:`egtable unversioned`,label:`Evals`,rows:i,rowKey:e=>e.kind===`group`?e.group.key:`overall`,defaultSort:null,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,$.jsx)(`span`,{className:`eg-name`,children:e.group.name}):(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})]})},...s?[{key:`version`,header:`Version`,label:`Version`,sort:null,className:`col-egver`,cell:e=>e.kind===`group`?e.group.version??``:``}]:[],...n.map((e,t)=>({key:`scenario-${t}`,header:e.name,label:e.name,onHeader:()=>r(t),cell:e=>{if(e.kind===`overall`)return a(e.pass[t]??null);let n=e.group.cells[t];return n?a(n.pass,n.pct):null}}))]})})})}function Du({item:e,i:t,readings:n}){let r=e?.scenarios?.[t]?.res;if(e?.unrun)return(0,$.jsx)(`span`,{className:`err`,children:e.unrun});if(!r)return(0,$.jsx)(`span`,{className:`spin`,"aria-hidden":`true`});let i=n.some(e=>e.score&&!J().isSkipped(e.score)&&e.score.metrics?.length),a=n.length===1&&J().isSkipped(n[0].score),o=(0,$.jsxs)($.Fragment,{children:[(n.length>1||!i&&n.some(e=>e.score))&&(0,$.jsx)(Au,{readings:n}),a&&n.length===1&&(0,$.jsx)(`span`,{className:`verdict skipped`,children:`Skipped`}),(0,$.jsx)(Ou,{readings:n})]});return(0,$.jsxs)($.Fragment,{children:[o,e?.kind===`text`?(0,$.jsx)(Su,{res:r}):(0,$.jsx)(xu,{res:r})]})}function Ou({readings:e}){let t=e.flatMap(e=>e.score&&!J().isSkipped(e.score)&&e.score.metrics?.length?[{...e,score:e.score}]:[]);return t.length?(0,$.jsx)($.Fragment,{children:t.map((e,t)=>{let n=e.score.metrics.filter(e=>e.weight!==0),r=e.score.metrics.filter(e=>e.weight===0);return(0,$.jsxs)(`div`,{className:`metric-readings`,children:[(0,$.jsx)(`span`,{className:`verdict ${e.score.pass?`pass`:`fail`}`,children:e.score.pass?`Pass`:`Fail`}),e.score.score!=null&&(0,$.jsx)(`span`,{className:`metric-score`,children:ku(e.score.score,!!e.score.points)}),n.length>0&&(0,$.jsx)(`ul`,{children:n.map((e,t)=>(0,$.jsxs)(`li`,{className:e.pass?`pass`:`fail`,children:[(0,$.jsx)(`span`,{className:`eval-name`,children:e.label}),!e.pass&&(0,$.jsxs)($.Fragment,{children:[` `,(0,$.jsx)(`span`,{className:`metric-reason`,children:e.reason})]})]},t))}),r.length>0&&(0,$.jsxs)(`div`,{className:`watched`,children:[(0,$.jsx)(`b`,{children:`Watch`}),(0,$.jsx)(`ul`,{children:r.map((e,t)=>(0,$.jsxs)(`li`,{className:e.pass?`met`:`unmet`,children:[(0,$.jsx)(`span`,{className:`eval-name`,children:e.label}),` `,(0,$.jsx)(`span`,{className:`metric-reason`,children:e.reason})]},t))})]})]},t)})}):null}var ku=(e,t)=>t?`${Math.round(e*100)/100} points`:`${Math.round(e*100)}%`;function Au({readings:e}){return(0,$.jsx)(`ul`,{className:`eval-verdicts`,children:e.map((e,t)=>{let n=e.score?J().isSkipped(e.score)?`Skipped`:e.score.pass?`Pass`:`Fail`:null;return n&&(0,$.jsxs)(`li`,{children:[(0,$.jsx)(`span`,{className:`eval-name`,children:e.label}),(0,$.jsx)(`span`,{className:`verdict ${n.toLowerCase()}`,children:n})]},t)})})}function ju({src:e,name:t,onClose:n}){return(0,$.jsx)(Z,{title:t||`Image`,onClose:n,children:(0,$.jsx)(`img`,{className:`lightbox-img`,src:e,alt:t})})}function Mu(){let{tabs:e,focusedId:t,closeRun:n,focusRun:r,goBack:i}=Tn(),a=te(),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)(ye,{size:18,"aria-hidden":`true`})}),(0,$.jsx)(`code`,{className:`rrcode`,children:Vn(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:Vn(e.at)||`run`,onClick:()=>r(e.id),children:Vn(e.at)||`…`}),(0,$.jsx)(`button`,{type:`button`,className:`rx`,"aria-label":`Close`,onClick:()=>n(e.id),children:(0,$.jsx)(y,{size:14,"aria-hidden":`true`})})]},e.id))})]}),(0,$.jsx)(Cu,{tab:o,undo:a}),(0,$.jsx)(le,{undo:a.undo,onUndo:a.undoNow,onDismiss:a.dismiss})]}):null}function Nu(){let e=ft(),t=(0,Q.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 Pu=`promptlab.theme`,Fu=typeof matchMedia==`function`?matchMedia(`(prefers-color-scheme: light)`):null;function Iu(){try{let e=JSON.parse(localStorage.getItem(Pu)||`null`)?.choice;return e===`light`||e===`dark`?e:null}catch{return null}}var Lu=()=>Iu()??(Fu?.matches?`light`:`dark`),Ru=()=>{let e=Lu();return document.documentElement.setAttribute(`data-theme`,e),e};Ru();function zu(){let[e,t]=(0,Q.useState)(Lu);(0,Q.useEffect)(()=>{let e=()=>t(Ru());return Fu?.addEventListener?.(`change`,e),()=>Fu?.removeEventListener?.(`change`,e)},[]);let n=e===`light`?`dark`:`light`,r=n===`light`?`Light mode`:`Dark mode`;return(0,$.jsx)(`button`,{type:`button`,className:`icon-btn`,title:r,"aria-label":r,onClick:()=>{try{localStorage.setItem(Pu,JSON.stringify({choice:n}))}catch{}document.documentElement.setAttribute(`data-theme`,n),t(n)},children:(0,$.jsx)(n===`light`?en:Ut,{size:16,"aria-hidden":`true`})})}var Bu=()=>{let e=decodeURIComponent(location.hash.replace(/^#\/?/,``)),t=e.match(/^(evals|datasets|sources)(\/.*)?$/);t&&(e=`library/${t[1]===`sources`?`sources`:`datasets`}${t[2]??``}`,history.replaceState(null,``,`#/${e.split(`/`).map(encodeURIComponent).join(`/`)}`));let n=e.match(/^library(?:\/(datasets|prompts|sources))?(?:\/(.+))?$/);if(n){let e=n[1]??`datasets`,t=n[2]??null;return{tab:`library`,section:e,src:e===`sources`?t:null,groupId:e===`datasets`?t:null}}return{tab:$r.find(t=>t.id===e)?.id??`home`,section:`datasets`,src:null,groupId:null}};function Vu(){return(0,$.jsx)(Ce,{children:(0,$.jsx)(dt,{children:(0,$.jsx)(xt,{children:(0,$.jsx)(wn,{children:(0,$.jsx)(xn,{children:(0,$.jsx)(ki,{children:(0,$.jsx)(Hu,{})})})})})})})}function Hu(){let[e,t]=(0,Q.useState)(Bu),{hide:n}=Tn();(0,Q.useEffect)(()=>{let e=()=>{t(Bu()),n()};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[n]);let r=$r.find(t=>t.id===e.tab);return(0,$.jsxs)(`div`,{className:`app`,children:[(0,$.jsxs)(`header`,{className:`app-head`,children:[(0,$.jsx)(`h1`,{children:`Evals Lab`}),(0,$.jsx)(Wu,{}),(0,$.jsx)(Nu,{}),(0,$.jsx)(be,{}),(0,$.jsx)(zu,{})]}),(0,$.jsx)(B,{}),(0,$.jsx)(c,{label:`Lab`,className:`app-tabs`,tablist:!0,current:e.tab,items:$r.map(e=>({key:e.id,label:e.label,href:`#/${e.id}`,icon:e.icon,id:`tab-${e.id}`,controls:`panel-${e.id}`}))}),(0,$.jsx)(Uu,{tab:r,section:e.section,src:e.src,groupId:e.groupId})]})}function Uu({tab:e,section:t,src:n,groupId:r}){let{focusedId:i}=Tn(),a=i?(0,$.jsx)(Mu,{}):e.id===`home`?(0,$.jsx)(Zo,{}):e.id===`runs`?(0,$.jsx)(Hc,{}):e.id===`history`?(0,$.jsx)(tl,{}):e.id===`library`?(0,$.jsx)(Wo,{section:t,sourceId:n,groupId:r}):(0,$.jsx)(Rl,{});return(0,$.jsx)(`main`,{role:`tabpanel`,id:`panel-${e.id}`,"aria-labelledby":`tab-${e.id}`,"data-tab":e.id,children:a})}function Wu(){let{sync:e,resolve:t}=Ye();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 Gu=`promptlab.sync`,Ku=e=>typeof e==`object`&&!!e&&!Array.isArray(e),qu=(e,t)=>{let n=cl[e];return Ku(n)&&Ku(t)?{...n,...t}:t};function Ju({api:e,storage:t,server:n,pause:r=800}){let i=e=>{try{return t.getItem(e)}catch{return null}},a=new Map,o=(e,n)=>{a.delete(e);try{n==null?t.removeItem(e):t.setItem(e,JSON.stringify(n))}catch{}a.set(e,n??null)},s=e=>{try{return JSON.parse(i(e)??`null`)}catch{return null}},c=(e,t)=>i(e)===(t==null?null:JSON.stringify(t)),l=n!==null,u=s(Gu)??{},d={},f=new Set,p=()=>o(Gu,{versions:d,dirty:[...f]}),m=new Set,h=()=>m.forEach(e=>e()),g=l?{state:`saved`}:{state:`local`},_=null,v=null,y=e=>{g=e,h()};if(n){for(let e of ul){let t=n[e];t&&c(e,t.body)?d[e]=t.version:u.dirty?.includes(e)?(d[e]=u.versions?.[e]??0,f.add(e)):t?(d[e]=t.version,o(e,t.body)):(d[e]=0,i(e)!=null&&f.add(e))}p()}async function b(t=!1){if(!l||g.state===`conflict`)return;if(!f.size){g.state===`saving`&&y({state:`saved`});return}let n=[...f],r=Object.fromEntries(n.map(e=>[e,{version:d[e]??0,body:s(e)}]));y({state:`saving`});try{let{versions:i}=await e.writeState(r,t);Object.assign(d,i);for(let e of n)c(e,r[e].body)&&f.delete(e);if(p(),y({state:`saved`}),f.size)return b(t)}catch(e){if(e instanceof We&&e.status===409){let t=e.body?.stale??{};for(let[e,n]of Object.entries(t))d[e]=n.version;let n=Object.keys(t).filter(e=>!c(e,t[e].body));for(let e of Object.keys(t))n.includes(e)||f.delete(e);return p(),n.length?(x=t,y({state:`conflict`,keys:n})):b()}y({state:`offline`,message:e instanceof Error?e.message:String(e)})}}let x={};function S(e=!1){return _&&=(clearTimeout(_),null),v??=b(e).finally(()=>{v=null}),v}return f.size&&(_=setTimeout(()=>{S()},0)),{get(e){return a.has(e)||a.set(e,qu(e,s(e))),a.get(e)??cl[e]},set(e,t){o(e,t),l&&ul.includes(e)&&(f.add(e),p(),_&&clearTimeout(_),_=setTimeout(()=>{S()},r)),h()},subscribe(e){return m.add(e),()=>{m.delete(e)}},sync:()=>g,async resolve(e){if(g.state!==`conflict`)return;let t=g.keys;if(e===`theirs`){for(let e of t)o(e,x[e]?.body??null),f.delete(e);p()}x={},y({state:`saved`}),await S()},flush:S,async refresh(){if(!l)return;await S();let{docs:t}=await e.state(),n=!1;for(let e of ul){let r=t[e];!r||f.has(e)||r.version<=(d[e]??0)||(d[e]=r.version,o(e,r.body),n=!0)}n&&(p(),h())}}}var Yu=e=>[1,2,3,4,5,6,7,8,9,10].includes(e?.version)||J().fatProfileRef(e),Xu=e=>e?.version===1||e?.version===2;function Zu(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(Xu).map(e=>e?.tests?.type===`graded`?e.tests.dataset?.id:void 0);return[...new Set(t.filter(e=>!!e))]}function Qu(e,t={}){let n=new Map(e.get(`promptlab.profiles`).list.map(e=>[e.id,e.type])),r={rulesFor:e=>t[e]??null,profileType:e=>n.get(e)},i=e=>J().upgradePipeline(e,r),a=e=>Yu(e)||i(e)!==e,o=e.get(`promptlab.workflows`);o.list.some(e=>a(e.work))&&e.set(`promptlab.workflows`,{...o,list:o.list.map(e=>({...e,work:i(e.work)}))});let s=e.get(`promptlab.versions`),c=s.pipeline??{};Object.values(c).some(e=>e.some(e=>a(e.doc)))&&e.set(`promptlab.versions`,{...s,pipeline:Object.fromEntries(Object.entries(c).map(([e,t])=>[e,t.map(e=>({...e,doc:i(e.doc)}))]))})}async function $u(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}}async function ed(){J();let e=Ge(),t=()=>{},n=new Promise(e=>{t=e});if(/^#\/?history\/?$/.test(location.hash)&&e.askQueue({limit:25},n),Ta())try{let t=(await e.config()).microsoft;t&&await Ea(t)}catch{}if(Aa())try{let t=(await e.config()).microsoft;if(t){await ja(t);return}}catch{}await Ue(e),t();let r=Ju({api:e,storage:localStorage,server:await $u(e)}),i=r.get(`promptlab.profiles`);i.list.some(e=>`profile`in e)&&r.set(`promptlab.profiles`,{...i,list:i.list.map(e=>J().convertProfile(e))});let a=r.get(`promptlab.profiles`),o=e=>J().pinReplyTokens(J().splitOllama(e));a.list.some(e=>o(e)!==e)&&r.set(`promptlab.profiles`,{...a,list:a.list.map(e=>o(e))});let s=r.get(`promptlab.profiles`),c=J().withSlugs(s.list);c!==s.list&&r.set(`promptlab.profiles`,{...s,list:c});let l={};if(Zu(r).length)try{l=(await e.archivedRules()).rules}catch{}Qu(r,l),addEventListener(`pagehide`,()=>{r.flush(!0)}),(0,Me.createRoot)(document.getElementById(`root`)).render((0,$.jsx)(Q.StrictMode,{children:(0,$.jsx)(Ke.Provider,{value:r,children:(0,$.jsx)(Ne.Provider,{value:e,children:(0,$.jsx)(Vu,{})})})}))}ed();
|