evals-lab 0.4.1 → 0.5.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 +44 -0
- package/README.md +125 -28
- package/bin/evals-lab.js +9 -1
- package/bin/run.js +531 -0
- package/lab/VERSION +1 -1
- package/lab/demo/pipelines/demo-1.json +8 -9
- package/lab/demo/pipelines/demo-2.json +8 -9
- package/lab/evals-core.mjs +672 -61
- package/lab/run-evals.js +195 -57
- package/lab/server.py +681 -127
- package/lab/web/dist/assets/gallery-BFf9vis6.js +3 -0
- package/lab/web/dist/assets/{gallery-DFeJkfUw.css → gallery-B_-TH0F-.css} +1 -1
- package/lab/web/dist/assets/main-DeeRLWnO.css +1 -0
- package/lab/web/dist/assets/main-LT0U2TYF.js +21 -0
- package/lab/web/dist/assets/tokens-CCEtCZtQ.js +59 -0
- package/lab/web/dist/assets/tokens-lq45aAPS.css +1 -0
- package/lab/web/dist/gallery.html +4 -4
- package/lab/web/dist/index.html +4 -4
- package/package.json +1 -1
- package/lab/web/dist/assets/gallery-B-7oyY37.js +0 -3
- package/lab/web/dist/assets/main-BkZTEix2.js +0 -21
- package/lab/web/dist/assets/main-C_b7QoTv.css +0 -1
- package/lab/web/dist/assets/tokens-BEn6_hVz.css +0 -1
- package/lab/web/dist/assets/tokens-DLRdTFGY.js +0 -55
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,M as p,N as m,O as h,P as g,Q as _,R as v,S as y,T as b,U as x,V as S,W as C,X as w,Y as T,Z as E,_ as D,a as O,b as k,c as A,d as j,et as M,f as N,g as P,h as F,i as I,j as L,k as ee,l as R,m as z,nt as B,o as te,p as V,q as ne,r as H,s as re,t as ie,tt as U,u as ae,v as oe,w as W,x as se,y as G,z as K}from"./tokens-CCEtCZtQ.js";var ce=U(),q=B(),J=(0,q.createContext)(null);function Y(){let e=(0,q.useContext)(J);if(!e)throw Error(`useApi outside an ApiContext: main.tsx mounts one at the root`);return e}var le=`modulepreload`,ue=function(e){return`/`+e},X={},de=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=ue(t,n),t=s(t),t in X)return;X[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`:le,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)})},Z={},fe=new Set,pe=e=>`/plugins/${encodeURIComponent(e.id)}/${encodeURIComponent(e.version)}/${e.entry.split(`/`).map(encodeURIComponent).join(`/`)}`;async function me(e){if(!fe.has(e.id))try{let t=await de(()=>import(pe(e)),[]);if(typeof t.default!=`function`)throw Error(`its entry exports no register function`);await t.default(s().pluginHost(e.id)),fe.add(e.id),delete Z[e.id]}catch(t){Z[e.id]=t instanceof Error?t.message:String(t)}}async function he(e){let t=[];try{t=(await e.plugins()).plugins}catch{return}for(let e of t)await me(e)}var ge=class extends Error{status;body;constructor(e,t,n=null){super(t),this.name=`ApiError`,this.status=e,this.body=n}};function _e(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 ge(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:s().upgradePipeline(e.snapshot),results:s().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=>d(r(e))))}),c=async e=>{let t=await e;return{...t,run:r(t.run)}},l=new Map,u=e=>s().evalsOf(e.snapshot).some(e=>s().isWholeRun(s().EVAL_TYPES[e.type],e)),d=e=>{if(!e.brief||!u(e))return Promise.resolve(e);let t=`${e.status} ${e.progress?.n??0} ${e.finishedAt??``}`,i=l.get(e.id);if(i?.at===t)return i.row;let a=n(`/api/queue/${encodeURIComponent(e.id)}`).then(r,()=>(l.delete(e.id),e));return l.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=>c(n(`/api/queue`,{body:e})),cancel:e=>c(n(`/api/queue/${encodeURIComponent(e)}/cancel`,{body:{}})),resume:e=>c(n(`/api/queue/${encodeURIComponent(e)}/resume`,{body:{}})),rerunRun:e=>c(n(`/api/queue/${encodeURIComponent(e)}/rerun`,{body:{}})),rerun:(e,t)=>c(n(`/api/queue/${encodeURIComponent(e)}/items/${t}`,{body:{}})),rescore:(e,t)=>c(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 ve=(0,q.createContext)(null);function ye(){let e=(0,q.useContext)(ve);if(!e)throw Error(`useStore outside a StoreContext: the app mounts one at its root`);return e}function be(e){let t=ye();return[(0,q.useSyncExternalStore)(t.subscribe,()=>t.get(e)),(0,q.useCallback)(n=>t.set(e,n),[t,e])]}function xe(){let e=ye();return{sync:(0,q.useSyncExternalStore)(e.subscribe,e.sync),resolve:e.resolve}}var Se=e=>e,Ce=()=>({version:7,source:null,scoring:{mode:`all`,threshold:null},grader:null,every:[],run:[],cases:[]}),we=e=>e?.state===`conflict`?`Not saved: changed in another browser.`:e?.state===`offline`?`Not saved: ${e.message}`:null,Te=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Ee=e=>e instanceof Error?e.message:String(e),De=({body:e,...t})=>t;function Oe({api:e,pause:t=800,idle:n}){let r=Se(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(De(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(De(c)),o.has(e))return v(e)}catch(t){let n=a.get(e);if(!n?.doc)return;let r=t instanceof ge&&t.status===409?t.body?.current??null:null;if(r){if(Te(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:Ee(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:Ee(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:Ee(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({...De(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 ke=3e4,Ae=(e,t)=>e.get(`promptlab.versions`)[t]??{};function je(e,t){return(e.get(`promptlab.versions`).dataset?.[t]??[]).map(e=>({...e,doc:s().upgradeDatasetBody(e?.doc)})).filter(e=>Me(e.doc))}var Me=e=>!!e&&typeof e==`object`&&Array.isArray(e.cases);function Ne(e,t,n,r,i){let a=e.get(`promptlab.versions`),o=Ae(e,t),s=(o[n]??[]).slice(),c=structuredClone(r);s[0]&&Fe(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 Pe(e,t,n,r){let i=e.get(`promptlab.versions`),a=(i.dataset?.[t]??[]).slice(),o=structuredClone(n);a[0]&&Fe(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 Fe=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Q=C(),Ie=(0,q.createContext)(null);function Le({children:e,pause:t}){let n=Y(),r=ye(),i=(0,q.useMemo)(()=>Oe({api:n,...t==null?{}:{pause:t},idle:{ms:ke,cut:(e,t)=>Pe(r,e,t,`idle`)}}),[n,r,t]);return(0,q.useEffect)(()=>{let e=()=>{i.flush()};return addEventListener(`pagehide`,e),()=>removeEventListener(`pagehide`,e)},[i]),(0,Q.jsx)(Ie.Provider,{value:i,children:e})}function Re(){let e=(0,q.useContext)(Ie);if(!e)throw Error(`useDatasets outside a DatasetsProvider: the app mounts one at its root`);return e}function ze(){let e=Re(),t=(0,q.useSyncExternalStore)(e.subscribe,e.list);return(0,q.useEffect)(()=>{e.list().list===null&&e.refresh()},[e]),t}function Be(e){let t=Re(),n=(0,q.useSyncExternalStore)(t.subscribe,()=>e?t.entry(e):void 0);return(0,q.useEffect)(()=>{e&&t.load(e)},[t,e]),n}var Ve=e=>e.name.trim()||e.text.trim().split(`
|
|
2
|
+
`)[0].trim()||`Untitled prompt`,He=e=>e?.state===`conflict`?`Not saved: changed in another browser.`:e?.state===`offline`?`Not saved: ${e.message}`:null,Ue=e=>e instanceof Error?e.message:String(e),We=({versions:e,uses:t,...n})=>n;function Ge({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(We(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(We(f)),u)return p(t)}catch(e){let n=r.get(t);if(!n?.doc)return;let a=e instanceof ge&&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:Ue(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:Ue(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:Ue(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(We(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 Ke=(0,q.createContext)(null);function qe({children:e,pause:t}){let n=Y(),r=(0,q.useMemo)(()=>Ge({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,Q.jsx)(Ke.Provider,{value:r,children:e})}function Je(){let e=(0,q.useContext)(Ke);if(!e)throw Error(`usePrompts outside a PromptsProvider: the app mounts one at its root`);return e}function Ye(){let e=Je(),t=(0,q.useSyncExternalStore)(e.subscribe,e.list);return(0,q.useEffect)(()=>{e.refresh()},[e]),t}function Xe(e){let t=Je(),n=(0,q.useSyncExternalStore)(t.subscribe,()=>e?t.entry(e):void 0);return(0,q.useEffect)(()=>{e&&t.load(e)},[t,e]),n}var Ze=x(`ban`,[[`path`,{d:`M4.929 4.929 19.07 19.071`,key:`196cmz`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),Qe=x(`check-check`,[[`path`,{d:`M18 6 7 17l-5-5`,key:`116fxf`}],[`path`,{d:`m22 10-7.5 7.5L13 16`,key:`ke71qq`}]]),$e=x(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),et=x(`circle-stop`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`rect`,{x:`9`,y:`9`,width:`6`,height:`6`,rx:`1`,key:`1ssd4o`}]]),tt=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`}]]),nt=x(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]),rt=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`}]]),it=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`}]]),at=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`}]]),ot=x(`flask-conical`,[[`path`,{d:`M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2`,key:`18mbvz`}],[`path`,{d:`M6.453 15h11.094`,key:`3shlmq`}],[`path`,{d:`M8.5 2h7`,key:`csnxdl`}]]),st=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`}]]),ct=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`}]]),lt=x(`folder-open`,[[`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`,key:`usdka0`}]]),ut=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`}]]),dt=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`}]]),ft=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`}]]),pt=x(`house`,[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]]),mt=x(`library`,[[`path`,{d:`m16 6 4 14`,key:`ji33uf`}],[`path`,{d:`M12 6v14`,key:`1n7gus`}],[`path`,{d:`M8 8v12`,key:`1gg7y9`}],[`path`,{d:`M4 4v16`,key:`6qkkli`}]]),ht=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`}]]),gt=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`}]]),_t=x(`message-square-text`,[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}],[`path`,{d:`M7 11h10`,key:`1twpyw`}],[`path`,{d:`M7 15h6`,key:`d9of3u`}],[`path`,{d:`M7 7h8`,key:`af5zfr`}]]),vt=x(`minus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}]]),yt=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`}]]),bt=x(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]),xt=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`}]]),St=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`}]]),Ct=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`}]]),wt=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`}]]),Tt=x(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),Et=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`}]]),Dt=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`}]]),Ot=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`}]]),kt=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`}]]),At=e=>(typeof e.id==`string`?e.id.trim():``)||`item:${s().caseItem(e)}`,jt=(e,t)=>e.trim().toLowerCase()===t.trim().toLowerCase(),Mt=e=>Array.isArray(e.metrics)?e.metrics:[],Nt=e=>!e.not&&e.weight!==0,Pt=e=>e.type===`contains`&&e.not===!0&&e.weight!==0,Ft=e=>s().metricLines(e);function It(e,t){let n=Mt(e);switch(t.type){case`bounds`:{let r=n.findIndex(e=>e.type===`item-count`&&Nt(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=>Pt(e)&&jt(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`&&Nt(e));return i>=0&&Ft(n[i].values).some(e=>jt(e,r))?e:{...e,metrics:i>=0?n.map((e,t)=>t===i?{...e,values:[...Ft(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(Pt(e)&&jt(String(e.value??``),r))return i=!0,[];if((e.type===`contains-all`||e.type===`contains-any`)&&Nt(e)&&Ft(e.values).some(e=>jt(e,r))){i=!0;let t=Ft(e.values).filter(e=>!jt(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 Lt(e,t,n){let r=[];return n.type===`delete`?{next:e.filter(e=>{let n=t.has(At(e));return n&&r.push(At(e)),!n}),changed:r}:{next:e.map(e=>{if(!t.has(At(e)))return e;let i=It(e,n);return i!==e&&r.push(At(e)),i}),changed:r}}function Rt(e,t,n){let r=new Map(e.map(e=>[At(e),e])),i=new Map(t.map(e=>[At(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(s().validateEvals({cases:[t]})),c=`${n.id}: `,l=s().validateEvals({cases:[n]}).filter(e=>!o.has(e)).map(e=>e.startsWith(c)?e.slice(c.length):e);l.length&&a.push({key:e,file:s().caseItem(n),reasons:l})}return{cases:a}}var zt={expect:`Expect`,forbid:`Forbid`},Bt=e=>zt[e],Vt=e=>`${e} ${e===1?`case`:`cases`}`;function Ht(e,t){let n=Vt(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 ${zt[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 Ut={graded:`Graded`,todo:`To do`,missing:`Missing`};function Wt(e,t){return t&&!t.includes(s().caseItem(e))?`missing`:e.todo?`todo`:`graded`}var Gt={file:``,status:`all`,show:`all`};function Kt(e,t,n,r=null){let i=t.file.trim().toLowerCase();return e.filter(e=>(!i||s().caseItem(e).toLowerCase().includes(i))&&(t.status===`all`||Wt(e,r)===t.status)&&(t.show===`all`||n.has(At(e))))}var qt=(0,q.createContext)(null);function Jt({children:e}){let[t,n]=(0,q.useState)(null),[r,i]=(0,q.useState)(new Set),[a,o]=(0,q.useState)(Gt),[c,l]=(0,q.useState)(null),[u,d]=(0,q.useState)(null),f=Be(u?.dataset??null),p=(0,q.useRef)(null),m=(0,q.useCallback)(e=>{e!==p.current&&(p.current=e,n(e),i(new Set),o(Gt),l(null))},[]),h=(0,q.useCallback)(e=>{i(e)},[]),g=(0,q.useCallback)(e=>{o(t=>({...t,...e}))},[]),_=(0,q.useCallback)((e,t,r)=>{p.current=e,n(e),i(new Set),o({...Gt,show:`selected`}),l(null),d({dataset:e,files:t,from:r}),location.hash===`#/library/datasets`?window.dispatchEvent(new HashChangeEvent(`hashchange`)):location.hash=`#/library/datasets`},[]),v=f?.doc?.body??null,y=f?.sync.state===`missing`;(0,q.useEffect)(()=>{if(!u||!v&&!y)return;let e=new Set(u.files),t=(v?.cases??[]).filter(t=>e.has(s().caseItem(t))).map(At);i(new Set(t)),l({from:u.from,wanted:e.size,found:t.length}),d(null)},[u,v,y]);let b=(0,q.useMemo)(()=>({datasetId:t,pickDataset:m,selected:r,setSelected:h,filters:a,setFilters:g,handedOver:c,showCases:_}),[t,m,r,h,a,g,c,_]);return(0,Q.jsx)(qt.Provider,{value:b,children:e})}function Yt(){let e=(0,q.useContext)(qt);if(!e)throw Error(`useCases outside an CasesProvider: the app mounts one at its root`);return e}var Xt=(0,q.createContext)(null);function Zt({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,Q.jsx)(Xt.Provider,{value:h,children:e})}function Qt(){let e=(0,q.useContext)(Xt);if(!e)throw Error(`useResults outside a ResultsProvider: the app mounts one at its root`);return e}function $t({n:e,of:t}){return(0,Q.jsxs)(`span`,{className:`fig-part`,children:[e,(0,Q.jsxs)(`span`,{className:`fig-of`,children:[`/`,t]})]})}var en=e=>e===`good`?` fig-good`:e===`bad`?` fig-bad`:``;function tn({fig:e}){return(0,Q.jsx)(`span`,{className:`fig-value${en(e.tone)}`,children:e.value??(e.of?(0,Q.jsx)($t,{n:e.of[0],of:e.of[1]}):`—`)})}function nn({fig:e}){return(0,Q.jsxs)(`div`,{className:`fig`,children:[(0,Q.jsx)(`span`,{className:`fig-label`,children:e.label}),(0,Q.jsx)(tn,{fig:e})]},e.key)}function rn({label:e,lead:t,rest:n,dense:r}){return(0,Q.jsxs)(`div`,{className:`figures${r?` dense`:``}`,role:`group`,"aria-label":e,children:[(0,Q.jsxs)(`div`,{className:`fig fig-lead`,children:[(0,Q.jsx)(`span`,{className:`fig-label`,children:t.label}),(0,Q.jsxs)(`div`,{className:`fig-headline`,children:[(0,Q.jsx)(tn,{fig:t}),t.under&&(0,Q.jsx)(`span`,{className:`fig-under`,children:(0,Q.jsx)($t,{n:t.under[0],of:t.under[1]})})]})]}),!!n.length&&(0,Q.jsx)(`div`,{className:`fig-rest`,children:n.map(e=>(0,Q.jsx)(nn,{fig:e},e.key))})]})}var an={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`},on={format:`image/jpeg`,quality:`0.92`,seed:``,nPredict:``,repeatPenalty:``,frequencyPenalty:``,presencePenalty:``,dryMultiplier:``,dryBase:``,dryAllowedLength:``,grammar:``,px:`921600`},sn=[`type`,`profile`,`px`,`format`,`quality`,`seed`,`nPredict`,`repeatPenalty`,`frequencyPenalty`,`presencePenalty`,`dryMultiplier`,`dryBase`,`dryAllowedLength`,`grammar`,`imagePosition`,`cachePrompt`,`thinking`,`rejectLoops`,`url`,`model`,`temperature`];function cn(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 ln=(e,t)=>({...on,...t?.setupProfile?.settings||{}});function un(e){return an[e]??e}function dn(e,t){return e===`type`?fn(String(t)):e===`profile`?t===`speed`?`Speed`:`Quality`:e===`px`?s().budgetLabel(t):e===`format`?String(t).replace(`image/`,``).toUpperCase():String(t)}function fn(e){return s().CONNECTION_TYPES[e]?.label??e}var pn=e=>e.content?e.content!==`text`:null,mn=e=>Number(new Date(e)).toString(36).slice(-6).toUpperCase(),hn=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`,gn=e=>{let t=e?e.timed??e.ran:0;return t?e.ms/t:null};function _n(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 vn=e=>new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}),yn={queued:`Queued`,running:`Running`,done:`Done`,incomplete:`Incomplete`,cancelled:`Cancelled`,failed:`Failed`,interrupted:`Interrupted`},bn=e=>yn[e]??e;function xn(e){return yn[e]?(0,Q.jsx)(`span`,{className:`rchip ${e}`,children:yn[e]}):null}var Sn=e=>e.length?e.reduce((e,t)=>e+t,0)/e.length:null;function Cn(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 wn(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 Tn=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(gn).filter(e=>e!=null);return{pct:r?Math.round(100*n/r):null,avgScore:i.length?Math.round(Sn(i)):null,avgTime:a.length?Sn(a):null}},En=e=>{let t=Tn(e);return{pct:t.pct==null?`—`:`${t.pct}%`,avgScore:t.avgScore==null?`—`:`${t.avgScore}%`,avgTime:t.avgTime==null?`—`:Cn(t.avgTime)}},Dn=e=>!!e.run&&(e.status===`cancelled`||e.status===`interrupted`),On=e=>e.rerunOf?(0,Q.jsxs)(`span`,{className:`hrerun note`,children:[`Re-run of `,e.rerunOfAt?mn(e.rerunOfAt):`a cleared run`]}):null,kn=[{key:`runid`,label:`Run ID`,on:!0,sort:e=>e.at,get:e=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`code`,{className:`runlink`,"data-openrun":e.run??void 0,children:mn(e.at)}),On(e)]})},{key:`date`,label:`Date`,on:!0,sort:e=>e.at,get:e=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`time`,{dateTime:e.at,title:new Date(e.at).toLocaleString(),children:vn(e.at)}),e.cancelled&&(0,Q.jsx)(`span`,{className:`err`,children:` cancelled`})]})},{key:`state`,label:`State`,on:!0,sort:e=>bn(e.status),get:e=>xn(e.status)},{key:`content`,label:`Content`,on:!0,get:e=>e.content||`—`},{key:`pct`,label:`% Passed Items`,on:!0,numeric:!0,sort:e=>Tn(e).pct,get:e=>En(e).pct},{key:`avgscore`,label:`Avg Score`,on:!0,numeric:!0,sort:e=>Tn(e).avgScore,get:e=>En(e).avgScore},{key:`avgtime`,label:`Avg Time`,on:!0,numeric:!0,sort:e=>Tn(e).avgTime,get:e=>En(e).avgTime},{key:`duration`,label:`Duration`,on:!1,numeric:!0,sort:e=>wn(e.startedAt,e.finishedAt),get:e=>{let t=wn(e.startedAt,e.finishedAt);return t==null?`—`:Cn(t)}},{key:`ran`,label:`Ran`,on:!1,numeric:!0,sort:e=>e.done,get:e=>(0,Q.jsx)($t,{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,Q.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,Q.jsx)(`span`,{className:`hcomment`,title:e.comment,children:e.comment}):(0,Q.jsx)(`span`,{className:`hcomment empty`,children:`——`})})}],An=[{key:`name`,label:`Name`,on:!0,sort:(e,t)=>e?.name||`Target ${t+1}`,get:(e,t,n)=>(0,Q.jsx)(`button`,{type:`button`,className:`ghost linkish`,"data-scenario":n,children:t?.name||`Target ${n+1}`})},{key:`outcome`,label:`Outcome`,on:!0,sort:e=>e.pass,get:(e,t)=>t.pass==null?(0,Q.jsx)(`span`,{className:`note`,children:`—`}):(0,Q.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.evals||`—`},{key:`profile`,label:`Target Profile`,on:!0,sort:e=>e?.setupProfile?.name,get:(e,t,n)=>t?.setupProfile?.name?(0,Q.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,Q.jsx)($t,{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=>gn(e),get:(e,t)=>{let n=gn(t);return n==null?`—`:Cn(n)}},{key:`total`,label:`Total`,on:!1,numeric:!0,sort:e=>e.ms||null,get:(e,t)=>t.ms?Cn(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(s().budgetLabel(ln(e,t).px))},{key:`format`,label:`Format`,on:!1,image:!0,get:(e,t)=>String(ln(e,t).format).replace(`image/`,``).toUpperCase()},{key:`quality`,label:`Quality`,on:!1,image:!0,get:(e,t)=>ln(e,t).format===`image/png`?`—`:String(ln(e,t).quality)},{key:`seed`,label:`Seed`,on:!1,get:(e,t)=>String(ln(e,t).seed||`1234`)},{key:`predict`,label:`Reply tokens`,on:!1,get:(e,t)=>String(ln(e,t).nPredict||ln(e,t).maxTokens||`—`)},{key:`penalty`,label:`Repeat penalty`,on:!1,get:(e,t)=>String(ln(e,t).repeatPenalty||`—`)},{key:`decoding`,label:`Decoding`,on:!1,get:(e,t)=>cn(ln(e,t))||`—`},...Object.entries(s().MODIFIERS).map(([e,t])=>({key:`modifier-${e}`,label:t.label||e,on:!1,get:(t,n)=>n.modifiers?.[e]||`—`}))],jn={"Run Scenarios":`Run Targets`},Mn={tests:`evals`},Nn=[[`Runs`,kn],[`Run Scenarios`,An]],Pn=e=>![`queued`,`running`].includes(e),Fn=()=>({ran:0,passed:0,found:0,of:0,ms:0,timed:0,share:0,shared:0});function In(e){return e.of?Math.round(100*e.found/e.of):e.shared?Math.round(100*e.share/e.shared):null}var Ln=(e,t)=>e.filter(e=>!e.whole).map(e=>e.items[t]).filter(e=>!!e&&!s().isSkipped(e)),Rn=e=>Array.isArray(e)?e.length:typeof e==`number`?e:0;function zn(e,t){let n=t.map(Fn);return(e||[]).forEach((e,r)=>{e&&!e.unrun&&(e.scenarios||[]).forEach((e,i)=>{let a=n[i];if(!a||!e)return;let o=Ln(t[i],r);if(o.length){a.ran++,o.every(e=>e.pass)&&a.passed++;for(let e of o)a.found+=Rn(e.found),a.of+=Rn(e.found)+Rn(e.missed)+Rn(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 Bn=(e,t,n)=>s().targetsOf(e).map((r,i)=>s().scenarioEvals(e,i,t,Pn(n))),Vn=(e,t,n)=>(e.outcomes[n]??[]).some(e=>!e.whole&&s().failedScore(e.items[t]));function Hn(e){return e.skipped?`Skipped`:e.whole?e.verdict?.ran?e.verdict.pass?`✓`:`✗`:`—`:e.ran?`${e.passed}/${e.ran}`:e.skippedItems?`Skipped`:`—`}var Un=e=>e.map(e=>`${e.label} ${Hn(e)}`).join(`, `),Wn={state:`pending`,value:`—`},Gn={state:`skipped`,value:`Skipped`,note:`an earlier eval failed`};function Kn(e){let t=[];return e.evals.forEach((n,r)=>{let i=e.scenarios.map((t,n)=>e.outcomes[n]?.[r]),a=i.find(Boolean);if(!a)return;let o=s().EVAL_TYPES[n.type]?.label??n.type,c=s().casesRef(n)?.name,l=c?`${o}, ${c}`:o,u=[],d=(e,t,r,o)=>u.push({key:`${n.id}-${e}`,eval:a.label,type:l,first:!u.length,rule:t,want:r,cells:i.map(e=>e?e.skipped?Gn:o(e):Wn)}),f=s().EVAL_TYPES[n.type]?.ruleOf;if(a.rules.length)for(let e of a.rules)d(e.key,e.label,e.want||null,t=>{if(!t.whole&&f){let r=t.items.flatMap(t=>t&&!s().isSkipped(t)?[f(t,e.key,n)]:[]).filter(e=>e!=null);if(!r.length)return Wn;let i=r.filter(Boolean).length;return{state:i===r.length?`met`:`not`,value:`${i} of ${r.length}`}}let r=t.verdict?.ran?t.verdict.checks?.find(t=>t.key===e.key):void 0;return r?r.pass?{state:`met`,value:`Met`}:{state:`not`,value:`Not Met`,note:r.note}:Wn});a.rules.length&&a.whole||(a.whole?d(`verdict`,`Verdict`,null,e=>e.verdict?.ran?e.verdict.pass?{state:`met`,value:`Pass`}:{state:`not`,value:`Fail`,note:e.verdict.detail}:Wn):d(`items`,`Items passed`,null,e=>{if(!e.ran)return e.skippedItems?Gn:Wn;let t=e.skippedItems?`${e.skippedItems} skipped`:void 0;return{state:e.passed===e.ran?`met`:`not`,value:`${e.passed} of ${e.ran}`,note:t}})),t.push(...u)}),t}function qn(e){let t=e.snapshot||{},n=s().contentOf(t),r=!!(n&&s().CONTENT_TYPES[n.type]?.inline),i=s().lastKind(t),a=e.results||[],o=Bn(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:s().targetsOf(t).map((e,n)=>({id:e?.id||`scenario-${n}`,name:s().targetLabel(t,n),kind:i,plain:!(i&&s().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:s().evalsOf(t),snapshot:t,results:a,outcomes:o,tallies:zn(a,o),startedAt:e.startedAt,finishedAt:e.finishedAt}}function Jn(e){let t=e.snapshot||{},n=s().contentOf(t),r=e.results||[],i=s().targetsOf(t),a=t.jobs||[],o=Bn(t,r,e.status),c=zn(r,o),l=i.map((e,n)=>{let r=c[n]??Fn(),i=(a.length?s().stagesFor(t,n).connections:[]).map(e=>String(e.model||``)),l=i[0]?new Set(i).size===1?i[0]:i.join(` → `):``,u=In(r),d=s().scenarioPasses(o[n]??[]);return{name:s().targetLabel(t,n),id:e?.id,model:l,setupProfile:s().scenarioProfile(t,n),modifiers:Object.fromEntries((s().outOf(t.jobs?.at(-1))?.modifiers||[]).map(e=>[e.type,s().modifierSummary(e)])),percent:u,passed:r.passed,cases:r.ran,pass:d,detail:d==null?`not graded`:Un(o[n]??[]),evals:Un(o[n]??[]),ms:r.ms,ran:r.ran}}),u=e.progress||{},d=u.n??u.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:d,total:u.total??d,content:n&&s().CONTENT_TYPES[n.type]?.inline?`text`:n?.type===`source`&&(n.ref?.name||n.ref?.id)||``,scenarios:l,rerunOf:e.rerunOf??null,rerunOfAt:e.rerunOfAt??null}}var Yn=e=>({key:`state`,label:`State`,value:bn(e),tone:e===`done`?`good`:[`failed`,`incomplete`,`cancelled`,`interrupted`].includes(e)?`bad`:null}),Xn=e=>e.length?e.reduce((e,t)=>e+t,0)/e.length:null;function Zn(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&&!s().isSkipped(r))for(let e of r.metrics||[])typeof e.asked==`number`&&(t++,n+=e.asked);return{calls:t,ms:n}}function Qn(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(In).filter(e=>e!=null),a=i.length?`${Math.round(Xn(i))}%`:`—`,o=wn(e.startedAt,e.finishedAt),s=Zn(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,mn(e.at)):`—`},Yn(e.status),{key:`score`,label:`Avg Score`,value:a},{key:`duration`,label:`Duration`,value:o==null?`—`:Cn(o)},...s.calls?[{key:`grader`,label:`Grader`,value:`${s.calls} ${s.calls===1?`call`:`calls`}, ${Cn(s.ms)}`}]:[],...r?[c]:[],{key:`start`,label:`Start Date`,value:e.at?nr(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 $n=e=>e.evals.length&&Pn(e.status)?`No assertions`:`—`;function er(e,t){let n=e.tallies[t],r=ir(e,t),i={key:`state`,label:`State`,value:r==null?$n(e):r?`Pass`:`Fail`,tone:r==null?null:r?`good`:`bad`},a={key:`time`,label:`Avg Time`,value:tr(n)??`—`},o=e.outcomes[t]??[],s=o.length>1?o.map(e=>({key:`eval-${e.id}`,label:e.label,value:Hn(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:In(n)==null?`—`:`${In(n)}%`},a]}:{lead:i,rest:[...s,a]}}function tr(e){return e?.timed?Cn(e.ms/e.timed):null}function nr(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=bn(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 ir(e,t){return s().scenarioPasses(e.outcomes[t]??[])}function ar(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 or(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 $=(e,t)=>t==null||t===``?null:`${e}: ${t}`,sr=e=>(e||[]).map(String).join(`, `),cr=e=>e.length?e.every(t=>t===e[0])?String(e[0]):e.join(` → `):``,lr=e=>{let t=s().OUTPUT_KINDS[s().lastKind(e)??s().defaultKind()];return t?!t.terms:!1},ur=e=>{let t=e.metric&&String(e.metric)||s().METRICS[e.type]?.label||e.type,n=s().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 dr(e,t,n,r){let i=s().readCase(t,n,lr(e)),{stages:a,connections:o}=s().stagesFor(e,r),c=o.map(e=>s().connectionSettings(e)),l=e=>cr(c.map(e)),u=s().evalsDataset(e);return[`An eval case is failing.`,``,`## The case`,$(`item`,s().caseItem(t)),$(`case id`,t.id),$(`note`,t.note),...(t.metrics||[]).map((e,t)=>$(`metric ${t+1}`,ur(e))),``,`## What came back`,$(`verdict`,i.pass?`pass`:`fail`),$(`score`,i.score==null?`—`:`${Math.round(i.score*100)}%`),$(`items`,sr(n?.terms)||`(none)`),$(`missed`,sr((i.missed??[]).map(e=>Array.isArray(e)?e.join(` / `):e))),$(`invented`,sr(i.invented)),$(`dropped`,sr((n?.dropped||[]).map(e=>`${e.item} (${e.by})`))),$(`reasons`,sr(i.reasons)),$(`error`,n?.error),$(`took`,n?.ms==null?null:`${n.ms} ms`),``,`## How it was asked`,$(`scenario`,`${r+1} of ${s().targetsOf(e).length}`),$(`model`,l(e=>e.model)),$(`endpoint`,l(e=>e.url||`(the lab's own Ollama)`)),$(`connection type`,l(e=>fn(String(e.type??``)))),$(`image`,a[0]?.withImage?fr(c[0]):`no image`),$(`seed`,l(e=>e.seed||`1234`)),$(`reply tokens`,l(e=>e.nPredict||e.maxTokens||`not set`)),$(`repeat penalty`,l(e=>e.repeatPenalty||`(profile default)`)),$(`other decoding`,pr(c.at(-1))),$(`modifiers`,(s().outOf(e.jobs.at(-1))?.modifiers||[]).map(e=>`${s().MODIFIERS[e.type]?.label??e.type}: ${s().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`,u?`the graded set: ${u.name||u.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 fr(e){let{px:t,format:n}=s().connectionImage(e);return`${t==null?`default budget`:s().budgetLabel(t)}, ${n.replace(`image/`,``).toUpperCase()}`}function pr(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 mr(e,t){let n=[];return!Pn(e.status)||!s().evalsDataset(e.snapshot)||(e.results||[]).forEach((r,i)=>{r&&!r.unrun&&(r.scenarios||[]).forEach((a,o)=>{let c=t.find(e=>s().caseItem(e)===r.name);Vn(e,i,o)&&c&&a.res&&n.push({kase:c,res:a.res,scenarioIndex:o,item:r.name??``})})}),n}var hr=e=>{let t=Math.min(...e),n=Math.max(...e);return t===n?String(t):`${t}–${n}`};function gr(e,t,n){let r=s().evalsDataset(e.snapshot);if(!Pn(e.status)||!r)return[];let i=e.outcomes[n]?.find(t=>e.evals.find(e=>e.id===t.id&&s().casesRef(e))),a=new Map(t.map(e=>[s().caseItem(e),e])),o=new Map,c=(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,l=i?.items[t];if(!r||r.todo||!o||!l||s().isSkipped(l)||l.pass)return;let u=e.name;if(o.error){c(`error`,6,`Error`,u);return}let d=(o.terms||[]).length,f=(r.metrics||[]).filter(e=>e.type===`item-count`&&e.weight!==0),p=(l.metrics??[]).filter(e=>e.type===`item-count`&&e.weight!==0);f.forEach((e,t)=>{let n=p[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&&d>r?c(`over`,0,`Too many items`,u,d,r):i!=null&&c(`under`,1,`Too few items`,u,d,i)});for(let e of l.missed??[])Array.isArray(e)?c(`none:${e.join(`/`)}`,3,`None of ${e.join(` / `)}`,u):c(`missed:${e}`,2,`Missed ${e}`,u);for(let e of l.invented??[])c(`invented:${e}`,4,`Invented ${e}`,u)}),[...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?`${hr(r)}, ${e===`over`?`max`:`min`} ${hr(i)}`:null}))}var _r=[{id:`home`,label:`Home`,icon:pt,built:!0},{id:`runs`,label:`Runs`,icon:ot,built:!0},{id:`history`,label:`History`,icon:m,built:!0},{id:`library`,label:`Library`,icon:mt,built:!0},{id:`setup`,label:`Setup`,icon:Tt,built:!0}],vr=e=>e.replace(/[^A-Za-z0-9._-]+/g,`-`).replace(/^[-.]+|[-.]+$/g,``);function yr(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 br(e,t,n,r,i=new Date){return`${e}-${vr(t)||e}-v${n}-${yr(i)}.${r}`}function xr(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)}function Sr({name:e,body:t,onSave:n,onClose:r}){let[i,a]=(0,q.useState)(()=>JSON.stringify(t,null,2)),[o,s]=(0,q.useState)(()=>wr(i));(0,q.useEffect)(()=>{let e=setTimeout(()=>s(wr(i)),400);return()=>clearTimeout(e)},[i]);let c=o.problems;return(0,Q.jsxs)(G,{title:`Edit raw… ${e}`,onClose:r,wide:!0,children:[(0,Q.jsx)(`textarea`,{className:`raw-content`,"aria-label":`Dataset JSON`,spellCheck:!1,value:i,onChange:e=>a(e.target.value)}),(0,Q.jsxs)(`div`,{className:`raw-foot`,children:[(0,Q.jsx)(`span`,{className:`note ${c.length?` bad`:``}`,role:c.length?`alert`:void 0,children:c.length?`${c.length} to fix — ${c.join(`, `)}`:`Validated before it is accepted.`}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:r,children:`Cancel`}),(0,Q.jsx)(`button`,{type:`button`,className:`run`,onClick:()=>{let e=wr(i);e.body?n(e.body):s(e)},disabled:c.length>0,children:`Save`})]})]})}var Cr=[`version`,`source`,`scoring`,`grader`,`every`,`run`,`cases`];function wr(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))Cr.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=s().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=Ce(),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(...s().validateEvals(o)),r.length?{body:null,problems:r}:{body:o,problems:[]}}function Tr(e){return[e.every&&`Every reply`,e.not&&`Not`,e.of===`said`&&`API text`,e.weight!=null&&`Weight ${e.weight}`,e.metric&&`Group ${e.metric}`].filter(Boolean).join(`, `)}var Er=(e,t)=>({type:e,...s().METRICS[e].defaults(),...t?.weight==null?{}:{weight:t.weight},...t?.not?{not:!0}:{},...t?.metric?{metric:t.metric}:{}});function Dr({label:e,metrics:t,set:n,undoable:r,over:i=`item`}){let a=s(),[o,c]=(0,q.useState)(null),l=(e,r)=>n(t.map((t,n)=>n===e?r:t)),u=e=>{o===`new`?n([...t,Er(e)]):typeof o==`number`&&l(o,Er(e,t[o])),c(null)};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(P,{noun:`metric`,items:[...t],empty:(0,Q.jsx)(`p`,{className:`note`,children:`No metrics.`}),onAdd:()=>c(`new`),onRemove:e=>r(t.filter((t,n)=>n!==e),`Removed a metric`),extra:(e,t)=>[{label:`Change type…`,icon:Et,onSelect:()=>c(t)}],renderItem:(t,n,r)=>{let o=a.METRICS[t.type],s=(t.metric||o?.label||t.type)+(t.not?` (not)`:``)+(t.weight===0?` (watch)`:``),c=`${e.replace(/\W+/g,`-`).toLowerCase()}-metric-${n}`,u=!!(t.every||t.not||t.of||t.weight!=null||t.metric),d=(o?.options??[]).map(e=>I(e,t,e=>l(n,e)));return(0,Q.jsxs)(k,{id:c,title:s,level:3,actions:r,about:o?.description,children:[d.length>0&&(0,Q.jsx)(z,{label:`${e}, metric ${n+1}`,rows:d}),(0,Q.jsx)(k,{id:`${c}-counts`,title:`How it counts`,level:3,open:u,note:u?Tr(t):`Defaults`,children:(0,Q.jsx)(z,{label:`${e}, metric ${n+1}, how it counts`,rows:[...i===`run`?[{key:`every`,label:`Every reply`,control:{type:`checkbox`,checked:!!t.every,onChange:e=>{let{every:r,...i}=t;l(n,e?{...i,every:!0}:i)}}}]:[],{key:`not`,label:`Not`,control:{type:`checkbox`,checked:!!t.not,onChange:e=>{let{not:r,...i}=t;l(n,e?{...i,not:!0}:i)}}},{key:`of`,label:`Grades`,control:{type:`select`,value:t.of??`reply`,options:[{value:`reply`,label:`Reply`},{value:`said`,label:`API text`}],onChange:e=>{let{of:r,...i}=t;l(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;l(n,e.trim()?{...i,weight:/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e}:i)}}},{key:`metric`,label:`Group`,control:{type:`text`,value:t.metric??``,onChange:e=>{let{metric:r,...i}=t;l(n,e.trim()?{...i,metric:e}:i)}}}]})})]},n)}}),o!==null&&(0,Q.jsx)(Or,{title:o===`new`?`Add metric`:`Change type`,current:typeof o==`number`?t[o]?.type??null:null,over:i,onPick:u,onClose:()=>c(null)})]})}function Or({title:e,current:t,over:n,onPick:r,onClose:i}){let[a,o]=(0,q.useState)(``),c=(0,q.useMemo)(()=>{let e=new Map;for(let[t,r]of Object.entries(s().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,Q.jsxs)(G,{title:e,onClose:i,className:`metric-picker`,children:[(0,Q.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`}),c.length===0&&(0,Q.jsx)(`p`,{className:`note`,children:`No metric matches.`}),c.map(([e,n])=>(0,Q.jsxs)(`fieldset`,{className:`mp-family`,children:[(0,Q.jsx)(`legend`,{children:e}),(0,Q.jsx)(`div`,{className:`mp-grid`,children:n.map(e=>(0,Q.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 kr(e,t){return`/api/sources/${encodeURIComponent(e)}/thumbs/${encodeURIComponent(t)}`}function Ar(e){return/\.(?:jpe?g|png|gif|webp|bmp|heic|heif|dng|tiff?)$/i.test(e)}function jr({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,Q.jsxs)(G,{title:e,onClose:o,className:`item-picker`,footer:(0,Q.jsxs)(`div`,{className:`edit-actions`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:o,children:`Cancel`}),(0,Q.jsx)(`button`,{type:`button`,className:`edit-done`,disabled:!u||!s.includes(u),onClick:()=>{u&&a(u)},children:t})]}),children:[(0,Q.jsxs)(`div`,{className:`prop ip-source`,children:[(0,Q.jsx)(`span`,{className:`prop-name`,children:`Source`}),(0,Q.jsx)(`span`,{className:`prop-value`,children:n.name})]}),(0,Q.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,Q.jsxs)(`fieldset`,{className:`ip-items`,children:[(0,Q.jsxs)(`legend`,{className:`note`,children:[s.length,` `,s.length===1?`item`:`items`,` without a case`]}),s.length?f.length?f.map(e=>(0,Q.jsxs)(`label`,{className:`ip-item${e===u?` on`:``}`,children:[(0,Q.jsx)(`input`,{type:`radio`,name:`item`,checked:e===u,onChange:()=>d(e)}),Ar(e)?(0,Q.jsx)(`img`,{src:kr(n.id,e),alt:``,loading:`lazy`}):(0,Q.jsx)(`span`,{className:`ip-thumb`,"aria-hidden":`true`}),(0,Q.jsx)(`span`,{className:`ip-name`,children:e})]},e)):(0,Q.jsx)(`p`,{className:`note`,children:`No item matches.`}):(0,Q.jsxs)(`p`,{className:`note`,children:[`Every item of `,n.name,` has a case.`]})]})]})}var Mr=600,Nr=2e3,Pr=e=>({id:``,item:e,todo:!0,note:``,metrics:[]}),Fr=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 Ir({item:e,cases:t,onWrite:n,problem:r,resultFor:a,scenarioCount:o,plain:c=!1,files:l,onFile:u,onClose:d,run:f,source:p=null,sourceFiles:m=null,onRemove:h}){let g=t.find(t=>s().caseItem(t)===e),[_,y]=(0,q.useState)(()=>structuredClone(g??Pr(e))),[b,x]=(0,q.useState)(0),[S,C]=(0,q.useState)(null),[w,T]=(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=(0,q.useRef)(null),I=t=>N.current.filter(n=>!(t.id&&n.id===t.id)&&!(!t.id&&s().caseItem(n)===e)).some(e=>s().caseItem(e)===s().caseItem(t))?`${s().caseItem(t)} has a case already`:s().validateEvals({cases:[{...t,id:t.id||`new`}]})[0]?.replace(/^[^:]*: /,``)??null,L=I(_),ee=(0,q.useCallback)(()=>{let e=M.current;if(I(e))return!1;e.id||(e={...e,id:Fr(N.current)},M.current=e,y(e));let t=e;return n(e=>Rr({cases:e},t)),!0},[n,e]),R=(0,q.useCallback)(()=>{P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{P.current=null,ee()&&(k(!0),F.current&&clearTimeout(F.current),F.current=setTimeout(()=>k(!1),Nr))},Mr)},[ee]);(0,q.useEffect)(()=>()=>{P.current&&clearTimeout(P.current),F.current&&clearTimeout(F.current)},[]);let[z,B]=(0,q.useState)(!1),te=e=>{y(e),B(!0),R()},ne=e=>{let t=M.current;te({...t,metrics:e,...t.todo&&!(t.metrics??[]).length&&e.length?{todo:!1}:{}})},H=w&&w[b]?w[b]:a(b),re=!H||_.todo||!(_.metrics??[]).length?null:s().readCase(_,H,c),ie=async()=>{if(f&&!E){D(!0),C(null);try{let e=await f(s().caseItem(M.current));T(e),C(e.length?null:`No reply to grade.`)}catch(e){C(e instanceof Error?e.message:String(e))}finally{D(!1)}}},U=l.indexOf(e),ae=e=>{let t=U<0?null:l[U+e];t&&u(t)};(0,q.useEffect)(()=>{let e=e=>{(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.target?.closest?.(`input, textarea, select, [contenteditable]`)||(e.preventDefault(),ae(e.key===`ArrowRight`?1:-1)))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)});let oe=()=>{P.current&&(clearTimeout(P.current),P.current=null,ee()),d()},W=s().caseItem(_),se=new Set(t.filter(t=>!(_.id&&t.id===_.id)&&s().caseItem(t)!==e).map(e=>s().caseItem(e))),G=!!m&&!m.includes(W),ce=[{key:`item`,label:`Item`,control:p?{type:`static`,text:G?`${W||`None`} (missing)`:W}:{type:`text`,value:W,onChange:e=>te({...M.current,item:e.trim()})}},{key:`todo`,label:`To do`,control:{type:`checkbox`,checked:!!_.todo,label:`Not graded yet`,onChange:e=>te({...M.current,todo:e})}},{key:`note`,label:`Note`,control:{type:`textarea`,value:_.note??``,onChange:e=>te({...M.current,note:e})}}],J=[];o>1&&J.push({key:`scenario`,label:`Show result of`,control:{type:`select`,value:String(b),options:Array.from({length:o},(e,t)=>({value:String(t),label:`Target ${t+1}`})),onChange:e=>x(Number(e))}}),re&&(J.push({key:`verdict`,label:`Result`,control:{type:`static`,text:re.pass?`Pass`:`Fail`}}),re.watch.length&&J.push({key:`watch`,label:`Watch`,control:{type:`static`,text:`${re.watch.filter(e=>e.pass).length} of ${re.watch.length}`}}));let Y=p&&W&&Ar(W)&&m?.includes(W)?{src:kr(p.id,W),file:W,source:p.name}:null,le=[...Y?[{key:`preview`,title:`Preview`,children:(0,Q.jsxs)(`div`,{className:`cf-preview`,children:[(0,Q.jsx)(`img`,{src:Y.src,alt:Y.file,loading:`lazy`}),(0,Q.jsxs)(`p`,{className:`note`,children:[Y.file,` in `,Y.source]})]})}]:[],{key:`case`,title:`Case`,rows:ce},{key:`metrics`,title:`Metrics`,children:(0,Q.jsx)(Dr,{label:`${W||`Case`} metrics`,metrics:_.metrics??[],set:ne,undoable:ne})},...J.length?[{key:`result`,title:`Result`,rows:J}]:[]],ue=[{label:`Previous`,icon:K,disabled:U<=0,onSelect:()=>ae(-1)},{label:`Next`,icon:v,disabled:U<0||U>=l.length-1,onSelect:()=>ae(1)},...f?[{label:`Run`,icon:xt,disabled:E,onSelect:()=>void ie()}]:[]],X=[...p?[{label:`Change item…`,icon:St,disabled:!m,onSelect:()=>j(!0)}]:[],...h?[{label:`Remove`,icon:i,destructive:!0,onSelect:()=>{h(s().caseItem(M.current)),d()}}]:[]],de=S??r??(L?`Not saved: ${L}`:null);return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(V,{title:W||`Case`,status:de??(E?`Running…`:O?`Saved.`:Lr),...de?{statusBad:!0}:{},sections:le,...X.length?{menu:X}:{},actions:ue,edited:z,onClose:oe}),A&&p&&m&&(0,Q.jsx)(jr,{title:`Change item`,action:`Change`,source:p,files:m,taken:new Set([...se,W]),onPick:e=>{j(!1),te({...M.current,item:e})},onClose:()=>j(!1)})]})}var Lr=`Saved to the dataset as you edit.`;function Rr(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 zr(e,t){return structuredClone(e.cases).filter(e=>s().caseItem(e)!==t)}function Br(e){let t=Y(),[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 Vr=(0,q.createContext)(null);function Hr({children:e}){let t=Re(),[n,r]=(0,q.useState)(null),i=Be(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=Br(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,Q.jsxs)(Vr.Provider,{value:d,children:[e,n&&f&&(0,Q.jsx)(Ir,{item:n.item,cases:f.body.cases,onWrite:u,problem:we(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 Ur(){let e=(0,q.useContext)(Vr);if(!e)throw Error(`useCaseEditor outside a CaseEditorProvider: the app mounts one at its root`);return e}function Wr({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(At),b=v.filter(e=>a.has(e)).length,x=b>0&&b===v.length,S=[{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,Q.jsxs)(`div`,{className:`ds-casebody`,children:[_,(0,Q.jsx)(y,{label:`Cases`,error:h,onRetry:g})]}):(0,Q.jsxs)(`div`,{className:`ds-casebody`,children:[e.length>0&&(0,Q.jsx)(F,{noun:`cases`,search:{label:`Item`,placeholder:`Search items`,value:r.file,onChange:e=>i({file:e})},filters:S,count:{shown:n.length,total:e.length},lead:(0,Q.jsx)(`label`,{className:`ev-check ev-all`,children:(0,Q.jsx)(Gr,{all:x,some:b>0,disabled:!n.length,onChange:()=>o(e=>{let t=new Set(e);for(let e of v)x?t.delete(e):t.add(e);return t})})})}),_,e.length===0?(0,Q.jsx)(`p`,{className:`ds-none`,children:l?`No cases.`:`No Source yet.`}):(0,Q.jsx)(Q.Fragment,{children:n.length===0?(0,Q.jsxs)(Q.Fragment,{children:[a.size>0&&(0,Q.jsx)(A,{count:a.size,noun:`case`,hidden:a.size,actions:s,onClear:()=>o(()=>new Set)}),(0,Q.jsx)(`p`,{className:`note`,children:`No cases match these filters.`})]}):(0,Q.jsx)(`div`,{className:`ds-cases`,children:(0,Q.jsx)(R,{className:`dstable`,cards:!0,label:`Cases`,rows:n,pageSize:u,defaultSort:null,rowKey:e=>At(e),select:{noun:`case`,selected:a,onChange:e=>o(()=>e),actions:()=>s},columns:Kr(c,d,p)})})}),(0,Q.jsxs)(`button`,{type:`button`,className:`ghost ds-add`,onClick:f,disabled:!l||!c,children:[(0,Q.jsx)(t,{size:14,"aria-hidden":`true`}),`Add case`]})]})}function Gr({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,Q.jsx)(`input`,{ref:i,type:`checkbox`,"aria-label":`Select all shown`,checked:e,disabled:n,onChange:r})}function Kr(e,t,n){let r=t=>Wt(t,e);return[{key:`item`,header:`Item`,role:`title`,sort:e=>e.item,cell:e=>(0,Q.jsx)(`button`,{type:`button`,className:`ds-file`,onClick:()=>t(e.item),children:e.item})},{key:`status`,header:`Status`,sort:e=>Ut[r(e)],tdProps:e=>({"data-state":r(e)}),cell:e=>(0,Q.jsx)(`span`,{className:`ds-status ds-${r(e)}`,children:Ut[r(e)]})},{key:`metrics`,header:`Metrics`,className:`num`,sort:e=>qr(e).length,cell:e=>qr(e).length},{key:`note`,header:`Note`,sort:e=>e.note??``,tdProps:e=>({"data-state":e.note?.trim()?void 0:`none`}),cell:e=>(0,Q.jsx)(`span`,{className:`ds-note`,children:e.note})},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{label:`${e.item} actions`,actions:[{label:`Edit…`,icon:W.edit,onSelect:()=>t(e.item)},{label:`Remove`,icon:W.remove,destructive:!0,onSelect:()=>n(e.item)}]})}]}var qr=e=>(e.metrics??[]).filter(e=>e.weight!==0),Jr={bounds:`Set count`,addTerm:`Add term`,removeTerm:`Remove term`,todo:`Mark To do`,graded:`Mark graded`},Yr=[{value:`keep`,label:`Keep`},{value:`set`,label:`Set`},{value:`clear`,label:`Clear`}],Xr=e=>/^\s*\d+\s*$/.test(e)?Number(e):null;function Zr({kind:e,cases:t,keys:n,onApply:r,onClose:i}){let[a,o]=(0,q.useState)(`keep`),[s,c]=(0,q.useState)(`keep`),[l,u]=(0,q.useState)(``),[d,f]=(0,q.useState)(``),[p,m]=(0,q.useState)(`expect`),[h,g]=(0,q.useState)(``),[_,v]=(0,q.useState)(null),y=(0,q.useMemo)(()=>{switch(e){case`bounds`:{let e=a===`set`?Xr(l):null,t=s===`set`?Xr(d):null;return a===`set`&&e==null?`Min items needs a whole number.`:s===`set`&&t==null?`Max items needs a whole number.`:{type:`bounds`,min:a===`set`?{kind:`set`,n:e}:{kind:a},max:s===`set`?{kind:`set`,n:t}:{kind:s}}}case`addTerm`:return h.trim()?{type:`addTerm`,list:p,term:h}:`Name the term.`;case`removeTerm`:return h.trim()?{type:`removeTerm`,term:h}:`Name the term.`;case`todo`:return{type:`status`,todo:!0};case`graded`:return{type:`status`,todo:!1}}},[e,a,s,l,d,p,h]),b=(0,q.useMemo)(()=>{if(typeof y==`string`)return null;let{next:e,changed:r}=Lt(t,n,y);return{changed:r,problems:Rt(t,e,r)}},[y,t,n]),x=_??b?.problems??null,S=!!x&&x.cases.length>0,C=b?.changed.length??0,w=(0,q.useCallback)(()=>{if(typeof y==`string`)return;let e=r(y);e&&v(e)},[y,r]),T=e=>t=>{v(null),e(t)},E=[];return e===`bounds`&&(E.push({key:`min`,label:`Min items`,required:!0,control:{type:`select`,value:a,options:Yr,onChange:T(e=>o(e))}}),a===`set`&&E.push({key:`minN`,label:`Min`,required:!0,control:{type:`text`,value:l,size:`num`,onChange:T(u)}}),E.push({key:`max`,label:`Max items`,required:!0,control:{type:`select`,value:s,options:Yr,onChange:T(e=>c(e))}}),s===`set`&&E.push({key:`maxN`,label:`Max`,required:!0,control:{type:`text`,value:d,size:`num`,onChange:T(f)}})),e===`addTerm`&&E.push({key:`list`,label:`List`,required:!0,control:{type:`select`,value:p,onChange:T(e=>m(e)),options:[`expect`,`forbid`].map(e=>({value:e,label:Bt(e)}))}}),(e===`addTerm`||e===`removeTerm`)&&E.push({key:`term`,label:`Term`,required:!0,control:{type:`text`,value:h,onChange:T(g)}}),(0,Q.jsxs)(G,{title:Jr[e],onClose:i,className:`ev-bulk`,footer:(0,Q.jsxs)(`div`,{className:`edit-actions`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:i,children:`Cancel`}),(0,Q.jsx)(`button`,{type:`button`,className:`edit-done`,disabled:!C||S,onClick:w,children:`Apply`})]}),children:[E.length>0&&(0,Q.jsx)(z,{label:Jr[e],rows:E}),(0,Q.jsx)(`p`,{className:`note ev-changes`,role:`status`,children:typeof y==`string`?y:`Changes ${C} of ${n.size}`}),S&&x&&(0,Q.jsx)(`div`,{className:`ev-refusal`,role:`alert`,children:x.cases.length>0&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`p`,{className:`ev-refusal-head`,children:[x.cases.length,` of `,n.size,` would break`]}),(0,Q.jsx)(`ul`,{children:x.cases.map(e=>(0,Q.jsxs)(`li`,{children:[(0,Q.jsx)(`b`,{children:e.file}),` `,e.reasons.join(`; `)]},e.key))})]})})]})}function Qr({pageSize:e=20}){let t=ye(),n=Re(),r=te(),{openCaseEditor:i}=Ur(),{list:a}=ze(),{datasetId:o,selected:c,setSelected:l,filters:u,setFilters:d,handedOver:f}=Yt(),[p,m]=(0,q.useState)(null),[g,_]=(0,q.useState)(!1),v=(0,q.useCallback)(()=>m(null),[]),y=a?.find(e=>e.id===o)??a?.[0]??null,b=y?.id??``,x=Be(b||null),S=x?.doc?.body??null,C=S?.cases,w=(0,q.useMemo)(()=>C?s().gradedSetFrom({cases:C}):[],[C]),T=Br(S?.source?.id),E=(0,q.useMemo)(()=>new Set(w.map(At)),[w]),D=(0,q.useMemo)(()=>new Set([...c].filter(e=>E.has(e))),[c,E]),k=(0,q.useMemo)(()=>Kt(w,u,D,T),[w,u,D,T]),A=!!S&&!S.source;(0,q.useEffect)(()=>{A&&u.status===`missing`&&d({status:`all`})},[A,u.status,d]);let j=(0,q.useCallback)(()=>n.entry(b)?.doc?.body??null,[n,b]),M=(0,q.useCallback)(e=>{b&&n.edit(b,t=>({...t,cases:e}))},[n,b]),N=e=>{i(e,{dataset:b,files:k.map(e=>e.item),onRemove:F})},P=e=>{_(!1);let t=j()?.cases??[];M([...t,{id:Fr(t),item:e,todo:!0,note:``,metrics:[]}]),i(e,{dataset:b,files:[...w.map(e=>e.item),e],onRemove:F})};function F(e){let t=j()?.cases??[];M(zr({cases:t},e)),r.offer({label:`Removed ${e}`,restore:()=>M(t)})}let I=e=>{let i=j();if(!b||!i)return null;let{next:a,changed:o}=Lt(i.cases,D,e);if(!o.length)return m(null),null;if(e.type!==`delete`){let e=Rt(i.cases,a,o);if(e.cases.length)return e}Pe(t,b,i,`bulk`);let s=i.cases;if(n.edit(b,e=>({...e,cases:a})),e.type===`delete`){let e=new Set(o);l(t=>new Set([...t].filter(t=>!e.has(t))))}return r.offer({label:Ht(e,o.length),restore:()=>n.edit(b,e=>({...e,cases:s}))}),m(null),null},L=D.size===0,ee=[{label:`Set count…`,icon:h,disabled:L,onSelect:()=>m(`bounds`)},{label:`Add term…`,icon:W.add,disabled:L,onSelect:()=>m(`addTerm`)},{label:`Remove term…`,icon:vt,disabled:L,onSelect:()=>m(`removeTerm`)},{label:`Mark To do…`,icon:Ze,disabled:L,onSelect:()=>m(`todo`)},{label:`Mark graded…`,icon:$e,disabled:L,onSelect:()=>m(`graded`)},{label:`Delete`,icon:W.remove,destructive:!0,disabled:L,onSelect:()=>void I({type:`delete`})}];return(0,Q.jsxs)(`div`,{className:`cases`,children:[a?.length?(0,Q.jsx)(Wr,{rows:w,shown:k,filters:u,onFilters:d,selected:D,onSelect:l,selectionActions:ee,sourceFiles:T,hasSource:!!S?.source,loading:!S,loadError:x?.sync.state===`missing`?x.sync.message:null,onRetry:()=>{b&&n.load(b)},pageSize:e,onEdit:N,onAdd:()=>_(!0),onRemove:F,children:f&&y&&(0,Q.jsxs)(`p`,{className:`note ev-from`,role:`status`,children:[(0,Q.jsxs)(`span`,{children:[`From `,f.from]}),f.found<f.wanted&&(0,Q.jsxs)(`span`,{children:[f.found,` of `,f.wanted,` are in `,y.name,` now`]})]})}):null,g&&S?.source&&T&&(0,Q.jsx)(jr,{title:`Add case`,action:`Add case`,source:S.source,files:T,taken:new Set(w.map(e=>e.item)),onPick:P,onClose:()=>_(!1)}),p&&S&&(0,Q.jsx)(Zr,{kind:p,cases:S.cases,keys:D,onApply:I,onClose:v}),(0,Q.jsx)(O,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss})]})}function $r(){let e=Y(),n=ye(),r=Re(),a=te(),{list:o,error:s}=ze(),{datasetId:c,pickDataset:u}=Yt(),[d,f]=(0,q.useState)(!1),[h,g]=(0,q.useState)(!1),[_,v]=(0,q.useState)(null),[x,S]=(0,q.useState)(!1),[C,w]=(0,q.useState)(!1),[T,E]=N(`dataset-cases`,20),[A,j]=(0,q.useState)(!1),[M,P]=(0,q.useState)(null),F=(0,q.useRef)(null),[I]=be(`promptlab.versions`),[L,ee]=(0,q.useState)(null);(0,q.useEffect)(()=>{let t=!0;return e.sources().then(e=>{t&&ee(e.sources)}).catch(()=>{t&&ee([])}),()=>{t=!1}},[e]);let R=o?.find(e=>e.id===c)??o?.[0]??null,z=R?.id??``,B=Be(z||null)?.doc??null,V=B?.body??null,ne=(0,q.useMemo)(()=>z?je(n,z):[],[n,z,I]),H=e=>v({text:e instanceof Error?e.message:String(e),bad:!0}),ie=(0,q.useCallback)(()=>r.entry(z)?.doc?.body??null,[r,z]),U=(0,q.useCallback)(e=>{z&&r.edit(z,e)},[r,z]),se=()=>new Set((r.list().list??[]).map(e=>e.name)),K=async()=>{v(null);try{let e=await r.create(ti(`Untitled dataset`,se()));u(e.id),f(!0)}catch(e){H(e)}},ce=e=>{let t=e.trim();B&&t&&t!==B.name&&(v(null),r.rename(z,t).catch(e=>{e instanceof ge&&e.status===409?v({text:`A dataset is already called ${t}.`,bad:!0}):H(e)}))},J=async()=>{if(B){v(null);try{await r.flush(z);let e=await r.create(ti(`${B.name} copy`,se()),structuredClone(B.body));u(e.id)}catch(e){H(e)}}},le=async()=>{if(!B)return;v(null);let{name:e}=B,t=o?.findIndex(e=>e.id===z)??-1;try{await r.flush(z);let n=await r.remove(z),i=r.list().list??[];u(i[Math.min(Math.max(t,0),i.length-1)]?.id??null),a.offer({label:`Deleted ${e}`,restore:()=>{r.restore(n).then(t=>{u(t.id),t.name!==e&&v({text:`Restored as ${t.name}.`,bad:!1})}).catch(H)}})}catch(e){H(e)}},ue=async e=>{v(null);let t;try{t=await ei(e)}catch(e){H(e);return}let n;try{n=JSON.parse(t)}catch(e){v({text:`Not JSON: ${e instanceof Error?e.message:String(e)}`,bad:!0});return}P(`import`);try{let e=await r.importFile(n);e[0]&&u(e[0].id),v({text:`Imported ${e.map(e=>e.name).join(`, `)}.`,bad:!1})}catch(e){H(e)}finally{P(null)}},X=async()=>{z&&(P(`export`),await r.flush(z).catch(()=>{}),await de(r.exportUrl(z),e=>br(`dataset`,e.dataset?.name??``,e.version,`json`)),P(null))},de=async(e,t)=>{try{let n=await fetch(e);if(!n.ok)throw Error(`the export answered ${n.status}`);let r=await n.json();xr(new Blob([JSON.stringify(r,null,2)+`
|
|
6
|
+
`],{type:`application/json`}),t(r))}catch(e){H(e)}},Z=e=>{let t=ie();t&&(Pe(n,z,t,`restore`),U(()=>structuredClone(e.doc)),w(!1),a.offer({label:`Restored the dataset`,restore:()=>U(()=>t)}))},fe=!R,pe=[{label:`Rename…`,icon:p,disabled:!B,onSelect:()=>f(!0)},{label:`Clone`,icon:W.clone,disabled:!B,onSelect:()=>void J()},{label:`Import JSON…`,icon:b,busy:M===`import`,onSelect:()=>F.current?.click()},{label:`Export JSON`,icon:l,disabled:fe,busy:M===`export`,onSelect:()=>void X()},{label:`Export all`,icon:st,disabled:!o?.length,busy:M===`exportAll`,onSelect:()=>{P(`exportAll`),de(r.exportAllUrl(),e=>br(`datasets`,`all`,e.version,`json`)).finally(()=>P(null))}},{label:`Restore…`,icon:m,disabled:!ne.length||!B,onSelect:()=>w(!0)},{label:`Edit raw…`,icon:it,disabled:!B,onSelect:()=>S(!0)},{label:`Delete`,icon:i,destructive:!0,disabled:!B,onSelect:()=>void le()}],me=V?V.cases.filter(e=>!e.todo).length:0,he=(0,Q.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&&ue(t)}}),_e=V?.source?.name,ve=V?`${V.cases.length} cases, ${me} graded${_e?`. Source: ${_e}`:``}`:void 0;return(0,Q.jsxs)(`div`,{className:`datasets`,children:[(0,Q.jsx)(D,{kind:`Dataset`,name:B?.name??R?.name??(o===null?`Loading…`:`None`),onPick:o?.length?()=>g(!0):void 0,meta:ve,primary:{label:`New dataset`,icon:t,onSelect:()=>void K()},actions:pe}),_&&(0,Q.jsx)(`p`,{className:`note${_.bad?` bad`:``}`,role:_.bad?`alert`:`status`,children:_.text}),he,o===null||o.length===0?o===null?(0,Q.jsx)(y,{label:`Datasets`,error:s,onRetry:()=>void r.refresh()}):(0,Q.jsx)(`p`,{className:`note`,children:`No datasets yet.`}):(0,Q.jsxs)(k,{id:`dataset`,title:`Cases`,note:V?String(V.cases.length):void 0,actions:[{label:`Page size…`,icon:W.pageSize,onSelect:()=>j(!0)}],children:[V&&(0,Q.jsxs)(`div`,{className:`prop`,"data-control":`select`,children:[(0,Q.jsx)(`span`,{className:`prop-name`,children:`Source`}),(0,Q.jsx)(`span`,{className:`prop-value`,children:(0,Q.jsxs)(`select`,{"aria-label":`Source`,value:V.source?.id??``,onChange:e=>{let t=L?.find(t=>t.id===e.target.value);U(e=>({...e,source:t?{id:t.id,name:t.name}:null}))},children:[(0,Q.jsx)(`option`,{value:``,children:`None`}),V.source&&!L?.some(e=>e.id===V.source.id)&&(0,Q.jsxs)(`option`,{value:V.source.id,children:[V.source.name,` (missing)`]}),(L??[]).map(e=>(0,Q.jsx)(`option`,{value:e.id,children:e.name},e.id))]})})]}),(0,Q.jsx)(Qr,{pageSize:T})]}),h&&o&&(0,Q.jsx)(oe,{kind:`Dataset`,value:z,onClose:()=>g(!1),options:o.map(e=>({id:e.id,label:e.name})),onPick:e=>{u(e),v(null)}}),d&&B&&(0,Q.jsx)(re,{title:`Rename dataset`,value:B.name,onCommit:ce,onClose:()=>f(!1)}),A&&(0,Q.jsx)(ae,{value:T,onChange:E,onClose:()=>j(!1)}),C&&B&&(0,Q.jsx)(G,{title:`Restore dataset`,onClose:()=>w(!1),children:(0,Q.jsxs)(`div`,{className:`version-list`,children:[ne.length===0&&(0,Q.jsx)(`p`,{className:`note`,children:`No versions of this dataset yet.`}),ne.map((e,t)=>(0,Q.jsxs)(`div`,{className:`version-row`,children:[(0,Q.jsxs)(`span`,{className:`version-when`,children:[ri(e.at),`, `,ni(e.reason)]}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>Z(e),children:`Restore`})]},`${e.at}-${t}`))]})}),x&&B&&(0,Q.jsx)(Sr,{name:B.name,body:B.body,onSave:e=>{U(()=>e),S(!1)},onClose:()=>S(!1)}),(0,Q.jsx)(O,{undo:a.undo,onUndo:a.undoNow,onDismiss:a.dismiss})]})}function ei(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 ti=(e,t)=>{if(!t.has(e))return e;for(let n=2;;n++)if(!t.has(`${e} ${n}`))return`${e} ${n}`},ni=e=>e===`idle`?`after editing`:e===`restore`?`before a restore`:e===`bulk`?`before a bulk edit`:e===`pack`?`before a pack update`:e,ri=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()},ii=[{value:`all`,label:`All`},{value:`used`,label:`Used`},{value:`unused`,label:`Unused`}],ai=[{value:`all`,label:`All`},{value:`scenario`,label:`Used by this target`},{value:`scenarios`,label:`Used by all targets`}];function oi(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 si(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 ci=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()};function li({id:e,onClose:t,onDuplicate:n,onDelete:r}){let i=Je(),o=Xe(e),{openRun:s}=Qt(),[c,l]=(0,q.useState)(new Set),[u,d]=(0,q.useState)(new Set),[f,p]=(0,q.useState)(null),m=o?.doc;if(!m)return(0,Q.jsx)(V,{title:`Prompt`,sections:[{key:`loading`,children:(0,Q.jsx)(y,{label:`Prompt`,error:o?.sync.state===`missing`?o.sync.message:null,onRetry:()=>i.load(e)})}],onClose:t});let h=(e,t,n)=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t),n(r)},_=e=>p(e instanceof Error?e.message:String(e)),v=e=>m.versions.find(t=>t.version===e)?.text??``,b=m.uses.some(e=>e.job>0),x=[{key:`version`,header:`Version`,sort:e=>e.version,cell:e=>`v${e.version}${e.version===m.version?` (newest)`:``}`},{key:`created`,header:`Made`,sort:e=>e.created,cell:e=>ci(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,Q.jsx)(se,{label:`v${t.version} actions`,actions:[{label:c.has(t.version)?`Hide words`:`Show words`,icon:g,onSelect:()=>h(c,t.version,l)},{label:`Restore`,icon:a,disabled:t.version===m.version,onSelect:()=>{p(null),i.restoreVersion(e,t.version).catch(_)}}]})}],S=e=>`${e.runId}:${e.scenarioId}:${e.job}`,C=[{key:`run`,header:`Run`,sort:e=>e.submittedAt,cell:e=>(0,Q.jsx)(`a`,{className:`pl-run`,href:`#/history`,onClick:n=>{n.preventDefault(),t(),s(e.runId,{at:e.submittedAt,from:`history`})},children:mn(e.submittedAt)})},{key:`scenario`,header:`Scenario`,sort:e=>e.scenarioName,cell:e=>e.scenarioName},...b?[{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=>ci(e.submittedAt)},{key:`menu`,header:``,label:``,className:`pl-menu`,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{label:`${mn(e.submittedAt)} ${e.scenarioName} actions`,actions:[{label:u.has(S(e))?`Hide words`:`Show words`,icon:g,onSelect:()=>h(u,S(e),d)}]})}],w=[{label:`Set as default`,icon:Ot,disabled:m.default,onSelect:()=>{p(null),i.setDefault(e).catch(_)}},{label:`Duplicate`,icon:W.clone,onSelect:()=>n(m)},{label:`Delete`,icon:W.remove,destructive:!0,disabled:m.default,onSelect:()=>r(m)}],T=f??He(o.sync),E=o.sync.state===`conflict`;return(0,Q.jsx)(V,{title:Ve(m),status:T??void 0,statusBad:!!T,menu:w,wide:!0,actions:E?[{label:`Take theirs`,onSelect:()=>void i.resolve(e,`theirs`)},{label:`Keep mine`,onSelect:()=>void i.resolve(e,`mine`)}]:[],onClose:()=>{i.flush(e),t()},sections:[{key:`prompt`,rows:[{key:`name`,label:`Name`,control:{type:`text`,value:m.name,placeholder:`First line`,onChange:t=>i.edit(e,{name:t})}},{key:`version`,label:`Version`,required:!0,control:{type:`static`,text:`v${m.version}${m.default?` (Default)`:``}`}},{key:`text`,label:`Prompt`,required:!0,control:{type:`textarea`,value:m.text,placeholder:`None`,onChange:t=>i.edit(e,{text:t})}}]},{key:`versions`,title:`Versions`,children:(0,Q.jsx)(R,{className:`pltable pl-versions`,label:`Versions`,rows:m.versions,rowKey:e=>String(e.version),defaultSort:{key:`version`,dir:`desc`},columns:x,after:e=>c.has(e.version)&&(0,Q.jsx)(`tr`,{className:`pl-words-row`,children:(0,Q.jsx)(`td`,{colSpan:x.length,children:(0,Q.jsx)(`pre`,{className:`pl-words`,children:e.text})})})})},{key:`uses`,title:`Uses`,children:m.uses.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No uses yet.`}):(0,Q.jsx)(R,{className:`pltable pl-uses`,label:`Uses`,rows:m.uses,rowKey:S,pageSize:10,defaultSort:{key:`when`,dir:`desc`},columns:C,after:e=>u.has(S(e))&&(0,Q.jsx)(`tr`,{className:`pl-words-row`,children:(0,Q.jsx)(`td`,{colSpan:C.length,children:(0,Q.jsx)(`pre`,{className:`pl-words`,children:v(e.version)})})})})}]})}function ui(){let e=Je(),{list:n,error:r}=Ye(),i=te(),[a,o]=N(`prompts`,20),[s,c]=(0,q.useState)(!1),[l,u]=(0,q.useState)(``),[d,f]=(0,q.useState)(`all`),[p,m]=(0,q.useState)(null),[h,g]=(0,q.useState)(null),_=n??[],v=_.filter(e=>oi(e,l,d)),b=e=>g(e instanceof Error?e.message:String(e)),x=async()=>{g(null);try{m((await e.create({name:``,text:``})).id)}catch(e){b(e)}},S=async t=>{g(null);try{await e.flush(t.id);let n=await e.create({name:`${Ve(t)} copy`,text:e.entry(t.id)?.doc?.text??t.text});m(n.id)}catch(e){b(e)}},C=async t=>{g(null);let n=[];try{for(let r of t)n.push(await e.remove(r.id)),p===r.id&&m(null)}catch(e){b(e)}n.length&&i.offer({label:t.length===1?`Deleted ${Ve(t[0])}`:`Deleted ${n.length} prompts`,restore:()=>{for(let t of n)e.restore(t).catch(b)}})},w=e=>C([e]),T=t=>{g(null),e.setDefault(t.id).catch(b)},E=e=>[{label:`Edit…`,icon:W.edit,onSelect:()=>m(e.id)},{label:`Set as default`,icon:Ot,disabled:e.default,onSelect:()=>T(e)},{label:`Duplicate`,icon:W.clone,onSelect:()=>void S(e)},{label:`Delete`,icon:W.remove,destructive:!0,disabled:e.default,onSelect:()=>void w(e)}];return(0,Q.jsxs)(k,{id:`prompts`,title:`Prompt library`,note:n?`${_.length} ${_.length===1?`prompt`:`prompts`}`:void 0,actions:[{label:`Page size…`,icon:W.pageSize,onSelect:()=>c(!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,Q.jsx)(y,{label:`Prompts`,error:r,onRetry:()=>void e.refresh()}):_.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No prompts yet.`}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(F,{noun:`prompts`,search:{label:`Search prompts`,placeholder:`Search prompts`,value:l,onChange:u},filters:[{key:`show`,label:`Show`,value:d,onChange:e=>f(e),options:ii}],count:{shown:v.length,total:_.length}}),v.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No prompts match these filters.`}):(0,Q.jsx)(R,{className:`pl-prompts`,cards:!0,label:`Prompts`,rows:v,rowKey:e=>e.id,pageSize:a,rowProps:e=>({"data-default":e.default||void 0}),columns:[{key:`prompt`,header:`Prompt`,role:`title`,sort:e=>Ve(e).toLowerCase(),cell:e=>(0,Q.jsxs)(`button`,{type:`button`,className:`pl-open`,onClick:()=>m(e.id),children:[(0,Q.jsxs)(`span`,{className:`pl-title`,children:[Ve(e),e.default&&(0,Q.jsx)(`span`,{className:`pl-default`,children:`Default`})]}),e.name.trim()&&e.text.trim()&&(0,Q.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?ci(e.lastUsed):`—`},{key:`menu`,header:``,label:``,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{label:`${Ve(e)} actions`,actions:E(e)})}],select:{noun:`prompt`,label:Ve,actions:e=>[{label:`Delete`,icon:W.remove,destructive:!0,disabled:e.every(e=>e.default),onSelect:()=>void C(e.filter(e=>!e.default))}]}})]}),h&&(0,Q.jsx)(`p`,{className:`note bad`,role:`alert`,children:h}),(0,Q.jsxs)(`button`,{type:`button`,className:`ghost pl-add`,onClick:()=>void x(),children:[(0,Q.jsx)(t,{size:14,"aria-hidden":`true`}),`Add prompt`]}),p&&(0,Q.jsx)(li,{id:p,onClose:()=>m(null),onDuplicate:e=>void S(e),onDelete:e=>void w(e)}),s&&(0,Q.jsx)(ae,{value:a,onChange:o,onClose:()=>c(!1)}),(0,Q.jsx)(O,{undo:i.undo,onUndo:i.undoNow,onDismiss:i.dismiss})]})}var di=`evals-lab.sources`,fi={view:`thumbs`,sort:`name`,dir:1};function pi(){try{let e=window.localStorage.getItem(di);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 fi}function mi(e){try{window.localStorage.setItem(di,JSON.stringify(e))}catch{}}var hi=e=>{let t=e.lastIndexOf(`.`);return t<0?``:e.slice(t).toLowerCase()},gi=[`.heic`,`.heif`,`.dng`,`.tif`,`.tiff`],_i=[`.jpg`,`.jpeg`,`.png`],vi=e=>_i.includes(hi(e))||gi.includes(hi(e)),yi=(e,t)=>`/api/sources/${encodeURIComponent(e)}/thumbs/${encodeURIComponent(t.name)}${t.v?`?v=${t.v}`:``}`,bi=(e,t)=>gi.includes(hi(t.name))?`/api/sources/${encodeURIComponent(e)}/zoom/${encodeURIComponent(t.name)}`:`/api/sources/${encodeURIComponent(e)}/files/${encodeURIComponent(t.name)}`;function xi(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 Si(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>e.name.toLowerCase().includes(n)):[...e]}function Ci(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 wi(e){return new Date(e*1e3).toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`})}function Ti(e){return{id:e.id,name:e.name,system:e.system,type:e.type,files:e.files.length,bytes:e.bytes}}var Ei=`[redacted]`,Di=/^(?:api[-_]?key|x-api-key|authorization|ocp-apim-subscription-key|password|secret|client[-_]?secret|token|access[-_]?token|refresh[-_]?token|sig)$/i,Oi=/^(?:headers|authentication)$/,ki=[[/sk-ant-[A-Za-z0-9_-]+/g,Ei],[/sk-[A-Za-z0-9_-]{20,}/g,Ei],[/Bearer\s+[A-Za-z0-9._~+/=-]+/g,`Bearer ${Ei}`],[/eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,Ei],[/([?&](?:sig|code)=)[^&"\s]+/g,`$1${Ei}`]];function Ai(e){let t=0,n=e=>{let n=e;for(let[e,r]of ki)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))Oi.test(i)&&a&&typeof a==`object`&&!Array.isArray(a)?n[i]=Object.fromEntries(Object.keys(a).map(e=>(t++,[e,Ei]))):Oi.test(i)&&typeof a==`string`||Di.test(i)&&a!=null&&typeof a!=`object`?(t++,n[i]=Ei):n[i]=r(a);return n}return typeof e==`string`?n(e):e};return{value:r(e),count:t}}var ji=`https://api.flow.microsoft.com/providers/Microsoft.ProcessSimple`,Mi=`api-version=2016-11-01`,Ni=/\.powerplatformusercontent\.com$/,Pi=4,Fi=4;function Ii(e,t=(e,t)=>fetch(e,t)){let n=async n=>{let r=`${ji}${n}${n.includes(`?`)?`&`:`?`}${Mi}`;if(!r.startsWith(`https://api.flow.microsoft.com/providers/Microsoft.ProcessSimple/`))throw Error(`the Flow API is the only address a Microsoft token goes to`);let i=await t(r,{headers:{Authorization:`Bearer ${await e()}`}}),a=await i.text(),o=null;try{o=JSON.parse(a)}catch{}if(!i.ok){let e=o?.error?.code;throw Error(`Power Automate answered ${i.status}${e?` (${e})`:``}`)}return o},r=encodeURIComponent,i=e=>({status:e?.status??``,startTime:e?.startTime??null,error:e?.error??null,inputsLink:e?.inputsLink?.uri??null,outputsLink:e?.outputsLink?.uri??null,at:Object.fromEntries((e?.repetitionIndexes??[]).filter(e=>e.scopeName&&typeof e.itemIndex==`number`).map(e=>[e.scopeName,e.itemIndex]))}),a=e=>{let t=new URL(e);return t.searchParams.delete(`api-version`),`${t.pathname.slice(new URL(ji).pathname.length)}${t.search}`},o=(e,t)=>`/environments/${r(e)}/flows/${r(t)}/runs`,s=0,c=[],l=async()=>{if(s<Pi){s++;return}await new Promise(e=>c.push(e))},u=()=>{let e=c.shift();e?e():s--};return{environments:async()=>((await n(`/environments`)).value??[]).map(e=>({id:e.name,name:e.properties?.displayName||e.name,isDefault:!!e.properties?.isDefault})),flows:async e=>((await n(`/environments/${r(e)}/flows`)).value??[]).map(e=>({id:e.name,name:e.properties?.displayName||e.name,state:e.properties?.state??``})),flow:async(e,t)=>{let i=await n(`/environments/${r(e)}/flows/${r(t)}`);return{id:i.name,name:i.properties?.displayName||i.name,definition:i.properties?.definition??{}}},runs:async(e,t,r=250)=>{let i=[],s=o(e,t);for(;s&&i.length<r;){let e=await n(s);for(let t of e.value??[])i.push({id:t.name,status:t.properties?.status??``,startTime:t.properties?.startTime??null,error:t.properties?.error??null});s=e.nextLink?.startsWith(`https://api.flow.microsoft.com/providers/Microsoft.ProcessSimple/`)?a(e.nextLink):null}return i.slice(0,r)},run:async(e,t,a)=>{let s=await n(`${o(e,t)}/${r(a)}?$expand=properties/actions`),c=s.properties??{};return{run:{id:s.name,status:c.status??``,startTime:c.startTime??null,error:c.error??null},trigger:c.trigger?i(c.trigger):null,actions:Object.fromEntries(Object.entries(c.actions??{}).map(([e,t])=>[e,i(t)]))}},repetitions:async(e,t,a,s)=>((await n(`${o(e,t)}/${r(a)}/actions/${r(s)}/repetitions`)).value??[]).map(e=>i(e.properties)),content:async e=>{let n=new URL(e);if(n.protocol!==`https:`||!Ni.test(n.hostname))throw Error(`that is not run history's content`);await l();try{for(let n=1;;n++){let r=await t(e,{});if(r.status===429&&n<Fi){let e=Number(r.headers.get(`Retry-After`));await new Promise(t=>setTimeout(t,(e>0?e:n)*1e3));continue}if(!r.ok)throw Error(`run history answered ${r.status}`);let i=await r.text();try{return JSON.parse(i)}catch{return i}}}finally{u()}}}}var Li=[`https://service.flow.microsoft.com//.default`],Ri=null;function zi(e){let t=`${e.clientId}/${e.tenant}`;return Ri?.key!==t&&(Ri={key:t,pca:de(()=>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}),[])}),Ri.pca}var Bi=()=>{let e=new URLSearchParams(window.location.search);return e.has(`state`)&&(e.has(`code`)||e.has(`error`))};async function Vi(e){await zi(e)}async function Hi(e){let t=await zi(e);return(t.getActiveAccount()??t.getAllAccounts()[0]??null)?.username??null}var Ui=`signin`;function Wi(e=window.location.href){let t=new URL(e);return t.hostname===`127.0.0.1`?(t.hostname=`localhost`,t.searchParams.set(Ui,`microsoft`),t.href):null}function Gi(){let e=new URL(window.location.href);return e.searchParams.get(`signin`)===`microsoft`&&(e.searchParams.delete(Ui),window.history.replaceState(window.history.state,``,e.href),!0)}async function Ki(e,t=window.location.href){let n=Wi();if(n){window.location.assign(n);return}await(await zi(e)).loginRedirect({scopes:Li,prompt:`select_account`,redirectStartPage:t})}async function qi(e){let t=await zi(e),n=t.getActiveAccount()??t.getAllAccounts()[0];n&&await t.clearCache({account:n})}async function Ji(e){let t=await zi(e),n=t.getActiveAccount()??t.getAllAccounts()[0];if(!n)throw Error(`sign in to Microsoft first`);try{return(await t.acquireTokenSilent({scopes:Li,account:n})).accessToken}catch(e){let{InteractionRequiredAuthError:r}=await de(async()=>{let{InteractionRequiredAuthError:e}=await import(`./dist-DI3ewZYj.js`);return{InteractionRequiredAuthError:e}},[]);throw e instanceof r&&await t.acquireTokenRedirect({scopes:Li,account:n,redirectStartPage:window.location.href}),e}}var Yi=new EventTarget,Xi=()=>Yi.dispatchEvent(new Event(`change`));function Zi(){let e=Y(),[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(),Yi.addEventListener(`change`,r),()=>{t=!1,Yi.removeEventListener(`change`,r)}},[e]),t}var Qi=()=>Zi().cfg,$i=e=>Ii(()=>Ji(e));async function ea(e,t,n){let r=await e.flow(t,n);return{name:r.name,definition:Ai(r.definition).value}}function ta({onMade:e}){let t=Y(),n=Qi(),r=(0,q.useMemo)(()=>n?$i(n):null,[n]),[i,a]=(0,q.useState)(void 0),[o,s]=(0,q.useState)(null),[c,l]=(0,q.useState)(``),[u,d]=(0,q.useState)(null),[f,p]=(0,q.useState)(``),[m,h]=(0,q.useState)(``),[g,_]=(0,q.useState)(!1),[v,b]=(0,q.useState)(null),x=e=>b(e instanceof Error?e.message:String(e));if((0,q.useEffect)(()=>{n&&Hi(n).then(a,()=>a(null))},[n]),(0,q.useEffect)(()=>{r&&i&&r.environments().then(e=>{s(e),l((e.find(e=>e.isDefault)??e[0])?.id??``)},x)},[r,i]),(0,q.useEffect)(()=>{r&&c&&(d(null),p(``),r.flows(c).then(e=>{d(e),p(e[0]?.id??``),h(e[0]?.name??``)},x))},[r,c]),n===void 0||n&&i===void 0)return(0,Q.jsx)(y,{label:`Account`});if(n===null)return(0,Q.jsx)(`p`,{className:`note`,children:`Microsoft: Not Configured`});if(!i)return(0,Q.jsxs)(`div`,{className:`sacts`,children:[(0,Q.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>void Ki(n).catch(x),children:[(0,Q.jsx)(ht,{size:14,"aria-hidden":`true`}),` Sign in with Microsoft`]}),v&&(0,Q.jsx)(`p`,{className:`note bad`,role:`alert`,children:v})]});let S=async()=>{if(!r||!f||!m.trim())return;_(!0),b(null);let n=null;try{let i=u?.find(e=>e.id===f),a=await t.createSource(m.trim(),`power-automate`,{environment:c,flow:f,displayName:i?.name??f});n=a.id;let o=await ea(r,c,f);await t.saveDefinition(a.id,0,o.definition),await e()}catch(e){n&&await t.removeSource(n).catch(()=>{}),x(e instanceof ge?Error(e.message):e)}finally{_(!1)}};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(z,{label:`Flow`,rows:[{key:`account`,label:`Account`,control:{type:`static`,text:i}},{key:`env`,label:`Environment`,control:o?{type:`select`,value:c,options:o.map(e=>({value:e.id,label:e.name})),onChange:l}:{type:`static`,text:`Loading…`}},{key:`flow`,label:`Flow`,control:u?{type:`select`,value:f,options:u.map(e=>({value:e.id,label:e.name})),onChange:e=>{p(e),h(u.find(t=>t.id===e)?.name??``)}}:{type:`static`,text:c?`Loading…`:`—`}},{key:`name`,label:`Name`,control:{type:`text`,value:m,onChange:h}}]}),u&&!u.length&&(0,Q.jsx)(`p`,{className:`note`,children:`No flows in this environment.`}),v&&(0,Q.jsx)(`p`,{className:`note bad`,role:`alert`,children:v}),(0,Q.jsx)(`div`,{className:`sacts`,children:(0,Q.jsx)(`button`,{type:`button`,disabled:g||!f||!m.trim(),onClick:()=>void S(),children:`Add`})})]})}var na=`evals-lab/record`,ra=e=>typeof e==`object`&&!!e&&!Array.isArray(e),ia=/\b(triggerBody|triggerOutputs|body|outputs|actions|variables|items|item|parameters)\(\s*(?:'((?:[^']|'')*)')?\s*\)/g;function aa(e,t=[]){if(typeof e==`string`){e.startsWith(`@`)&&!e.startsWith(`@@`)&&!e.startsWith(`@{`)&&t.push(e.slice(1));for(let n of e.matchAll(/@\{([^}]*)\}/g))t.push(n[1])}else if(Array.isArray(e))for(let n of e)aa(n,t);else if(ra(e))for(let n of Object.values(e))aa(n,t);return t}function oa(e,t=null){let n=new Map;for(let r of aa(e))for(let e of r.matchAll(ia)){let r=e[1],i=(e[2]??``).replace(/''/g,`'`),a=r===`triggerBody`||r===`triggerOutputs`?{from:`trigger`}:r===`body`||r===`outputs`||r===`actions`?i?{from:`action`,name:i}:null:r===`variables`?i?{from:`variable`,name:i}:null:r===`items`?i?{from:`item`,name:i}:null:r===`item`?t?{from:`item`,name:t}:null:i?{from:`parameter`,name:i}:null;a&&n.set(JSON.stringify(a),a)}return[...n.values()]}function sa(e,t){let n={};for(let e of t)e.from===`trigger`?n.trigger={body:null}:e.from===`action`?(n.actions??={})[e.name]={body:null}:e.from===`variable`?(n.variables??={})[e.name]=null:e.from===`item`&&((n.items??={})[e.name]=null);return{format:na,version:1,step:e,at:null,scope:n,request:null,result:null,origin:{kind:`hand`}}}function ca(e){if(e.origin?.kind===`run`&&e.origin.run)return JSON.stringify({step:e.step,run:e.origin.run,iteration:e.origin.iteration??``});let t=e=>Array.isArray(e)?e.map(t):ra(e)?Object.fromEntries(Object.keys(e).sort().map(n=>[n,t(e[n])])):e;return JSON.stringify(t({step:e.step,scope:e.scope,request:e.request}))}var la=Object.create(null);la.Http={label:`HTTP`,template:({headers:e,authentication:t,...n})=>n};var ua=Object.create(null);ua.Foreach={loops:!0},ua.Until={loops:!0},ua.InitializeVariable={declares:e=>(Array.isArray(e.variables)?e.variables:[]).flatMap(e=>ra(e)&&typeof e.name==`string`?[e.name]:[])};var da=e=>!!(e&&ua[e]?.loops);function fa(e){let t=[],n=(e,r)=>{for(let[i,a]of Object.entries(e??{})){let e=a.type?la[a.type]:void 0;if(e&&ra(a.inputs)){let n=e.template(a.inputs);t.push({name:i,kind:a.type,loops:r,template:n,reads:oa(n,r.at(-1)??null)})}let o=da(a.type)?[...r,i]:r;n(a.actions,o),n(a.else?.actions,o);for(let e of Object.values(a.cases??{}))n(e.actions,o);n(a.default?.actions,o)}};return n(ra(e)?e.actions:void 0,[]),t}function pa(e){let t={},n=(e,r)=>{for(let[i,a]of Object.entries(e??{})){t[i]={...a,loops:r};let e=da(a.type)?[...r,i]:r;n(a.actions,e),n(a.else?.actions,e);for(let t of Object.values(a.cases??{}))n(t.actions,e);n(a.default?.actions,e)}};return n(ra(e)?e.actions:void 0,[]),t}async function ma(e,t,n,r){let i=pa(r),a={};for(let r of e.reads)if(r.from===`trigger`){let e=await n.triggerOutputs();a.trigger={body:ra(e)?e.body:e}}else if(r.from===`action`){let e=await n.actionOutputs(r.name,t.at);(a.actions??={})[r.name]=ra(e)?{body:e.body,...typeof e.statusCode==`number`?{statusCode:e.statusCode}:{}}:{body:e}}else if(r.from===`variable`){let e=e=>{let t=e.type?ua[e.type]:void 0;return!!t?.declares&&ra(e.inputs)&&t.declares(e.inputs).includes(r.name)},o=Object.entries(i).find(([,t])=>e(t)),s=o?await n.actionInputs(o[0],t.at):null,c=(ra(s)&&Array.isArray(s.variables)?s.variables:[]).find(e=>ra(e)&&e.name===r.name);(a.variables??={})[r.name]=c?c.value:null}else if(r.from===`item`){let e=await n.actionInputs(r.name,t.at),i=ra(e)&&Array.isArray(e.foreachItems)?e.foreachItems:[];(a.items??={})[r.name]=i[t.at[r.name]??0]??null}let o=ra(t.inputs)?t.inputs:null,s=ra(t.outputs)?t.outputs:null;return{format:na,version:1,step:e.name,at:t.startTime,scope:a,request:o?{method:String(o.method??``),uri:String(o.uri??``),body:o.body??null}:null,result:t.error&&!s?{error:t.error}:s?{status:typeof s.statusCode==`number`?s.statusCode:0,body:s.body??null}:null,origin:{kind:`run`,run:t.run,...Object.keys(t.at).length?{iteration:Object.entries(t.at).map(([e,t])=>`${e}[${t}]`).join(`,`)}:{}}}}function ha(e){let t=e.origin.kind===`run`?`${(e.origin.run??``).slice(-8)}${e.origin.iteration?`-${e.origin.iteration.replace(/.*\[(\d+)\]$/,`$1`)}`:``}`:new Date().toISOString().replace(/\D/g,``).slice(0,14);return`${e.step}-${t}.json`.replace(/[^A-Za-z0-9._-]/g,`_`)}var ga=e=>e.from===`trigger`?`trigger`:e.from===`parameter`?``:e.name,_a=e=>{if(typeof e!=`string`)return e;try{return JSON.parse(e)}catch{return e}};function va(e,t){let n=[...new Set(t.flatMap(e=>Object.keys(e)))],r=new Set(e.reads.map(ga).filter(Boolean)),i=n.filter(e=>!r.has(e)&&!(r.has(`trigger`)&&e.startsWith(`trigger.`)));return{records:t.map(t=>{let n=sa(e.name,e.reads);n.origin={kind:`upload`};for(let r of e.reads){let e=ga(r);if(r.from===`trigger`){let r=Object.keys(t).filter(e=>e.startsWith(`trigger.`)),i=e in t?_a(t[e]):r.length?Object.fromEntries(r.map(e=>[e.slice(8),_a(t[e])])):null;n.scope.trigger={body:i}}else if(e in t){let i=_a(t[e]);r.from===`action`?n.scope.actions[r.name]={body:i}:r.from===`variable`?n.scope.variables[r.name]=i:r.from===`item`&&(n.scope.items[r.name]=i)}}return n}),unmatched:i}}function ya(e){let t=[],n=[],r=``,i=!1,a=e.replace(/^/,``);for(let e=0;e<a.length;e++){let o=a[e];i?o===`"`&&a[e+1]===`"`?(r+=`"`,e++):o===`"`?i=!1:r+=o:o===`"`?i=!0:o===`,`?(n.push(r),r=``):o===`
|
|
7
|
+
`||o===`\r`?(o===`\r`&&a[e+1]===`
|
|
8
|
+
`&&e++,n.push(r),t.push(n),n=[],r=``):r+=o}(r||n.length)&&(n.push(r),t.push(n));let[o,...s]=t.filter(e=>e.some(e=>e!==``));return o?s.map(e=>Object.fromEntries(o.map((t,n)=>[t.trim(),e[n]??``]))):[]}function ba(e,t,n){if(!t.request)return{match:null};let r=ra(n)&&ra(n.parameters)?Object.fromEntries(Object.entries(n.parameters).map(([e,t])=>[e,ra(t)?t.defaultValue:void 0])):{},i;try{let n={scope:t.scope,loop:e.loops.at(-1)??null,now:t.at,parameters:r},a=e.template;i={method:M(a.method,n),uri:M(a.uri,n),body:M(a.body??null,n)}}catch(e){return{match:!1,where:e instanceof Error?e.message:String(e)}}let a=xa(i,t.request,`request`);return a?{match:!1,where:a}:{match:!0}}function xa(e,t,n){if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return`${n} has ${e.length} entries, production ${t.length}`;for(let r=0;r<e.length;r++){let i=xa(e[r],t[r],`${n}[${r}]`);if(i)return i}return null}if(ra(e)&&ra(t)){let r=Object.keys(e),i=Object.keys(t);if(r.join()!==i.join())return`${n} has keys ${r.join(`, `)}, production ${i.join(`, `)}`;for(let i of r){let r=xa(e[i],t[i],`${n}.${i}`);if(r)return r}return null}return JSON.stringify(e)===JSON.stringify(t)?null:`${n}`}var Sa=Object.create(null);Sa.ParseJson={reads:e=>typeof e.content==`string`?e.content:null,schema:e=>e.schema??null};function Ca(e,t){for(let[n,r]of Object.entries(pa(e))){let e=r.type?Sa[r.type]:void 0,i=e&&ra(r.inputs)?e.reads(r.inputs):null;if(i&&oa(i).some(e=>e.from===`action`&&e.name===t))return{name:n,expression:i,schema:e.schema&&ra(r.inputs)?e.schema(r.inputs)??null:null}}return null}function wa(e,t){let n=JSON.stringify(ra(e)?e.actions??{}:{}),r=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`).replace(/'/g,`''`),i=new Set;for(let e of n.matchAll(RegExp(`body\\('${r}'\\)\\??\\['((?:[^']|'')*)'\\]`,`g`)))i.add(e[1].replace(/''/g,`'`));return[...i]}function Ta(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 Ea(e,t){let n=s(),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 Da(e,t,n,r){let i=s(),a=n.template,o=String(a.uri??``),c=i.httpApiFor(o),l={type:`httpRequest`,api:c,method:String(a.method??`POST`).toUpperCase(),...Ta(o),body:a.body??null,...i.HTTP_APIS[c].cellOf(a.body??null)},u=Ca(t,n.name),d=u?wa(t,u.name):[],f=[...u?[{type:`is-json`,schema:u.schema?JSON.stringify(u.schema,null,2):``}]:[],...d.length?[{type:`fields-equal-production`,fields:d.join(`
|
|
9
|
+
`)}]:[]],p=Ea(o,r),m=i.withOut({type:`job`,id:i.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`,...i.OUTPUT_KINDS.text?.settingDefaults?.()??{},modifiers:i.OUTPUT_KINDS.text?.modifiers?.()??[]});return{version:i.PIPELINE_VERSION,id:i.newId(),name:`${e.name} · ${n.name}`,jobs:[m],targets:[{id:i.newId(),name:`Production`,profile:p,steps:[structuredClone(l)]},{id:i.newId(),name:`Edited`,profile:p,steps:[structuredClone(l)]}],evals:f.length?[i.newEval(`group`,``,{own:{...i.EVAL_TYPES.group.defaults().own,every:f}})]:[],pass:{mode:`all`}}}function Oa(e,t){let n=e.result;if(!n||!(`status`in n))return null;let r=fa(t).find(t=>t.name===e.step);if(!r)return null;let i=String(r.template.uri??``),a={step:r.name,loop:r.loops.at(-1)??null,api:s().httpApiFor(i),readAs:Ca(t,r.name)?.expression??null};try{return s().httpReplyOf(a,{prompt:``},n.body,n.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}]}function Aa(e,t){let n=[],r=0;for(let{name:i,record:a}of e){let e=Oa(a,t);if(e==null){r++;continue}let o=Ca(t,a.step),s=o?wa(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}}async function ja(e,t,n,r,i){let a=await e.run(t,n,r),o=pa(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 Ma(e,t,n,r,i,a,o,s){let c=new Set(o),l=[],u=0,d=0;for(let o of r){let r=await ja(e,t,n,o,a);for(let e of await r.callsOf(i)){let t=Ai(await ma(i,e,r,a)).value,n=ca(t);if(c.has(n)){u++;continue}c.add(n),l.push(t)}s?.(++d)}return{records:l,skipped:u}}var Na=e=>e.name.toLowerCase().endsWith(`.json`),Pa=e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(r.error),r.readAsText(e)}),Fa=`evals-lab.flow.importing`;function Ia(e){try{return sessionStorage.getItem(e)}catch{return null}}function La(e,t){try{t?sessionStorage.setItem(e,t):sessionStorage.removeItem(e)}catch{}}var Ra=e=>e instanceof Error?e.message:String(e);function za({source:e,definition:n,cfg:r}){let a=Y(),o=Re(),s=te(),[c,u]=(0,q.useState)(e.files.filter(Na)),[d,f]=(0,q.useState)({}),[p,h]=(0,q.useState)(null),[_,v]=(0,q.useState)(()=>{let t=Ia(Fa)===e.id;return t&&La(Fa,null),t?`import`:null}),[x,S]=(0,q.useState)(null),C=(0,q.useMemo)(()=>fa(n),[n]),[w,T]=(0,q.useState)(!1),[E,D]=(0,q.useState)(null),A=(0,q.useCallback)(async()=>{let t=(await a.source(e.id)).files.filter(Na);u(t);let n=await Promise.all(t.map(async t=>{try{return[t.name,JSON.parse(await Pa(await a.file(e.id,t.name)))]}catch{return[t.name,null]}}));f(Object.fromEntries(n))},[a,e.id]),j=(0,q.useCallback)(()=>{D(null),A().then(()=>T(!0),e=>D(Ra(e)))},[A]);(0,q.useEffect)(j,[j]);let M=e=>{let t=d[e],r=t?C.find(e=>e.name===t.step):void 0;return t&&r?ba(r,t,n):null},N=(0,q.useMemo)(()=>new Set(c.flatMap(e=>d[e.name]?[ca(d[e.name])]:[])),[c,d]),P=async(t,n=0)=>{let r=0,i=[];for(let n of t)try{await a.upload(e.id,ha(n),new Blob([JSON.stringify(n,null,2)],{type:`application/json`})),r++}catch(e){i.push(e instanceof ge?e.message:Ra(e))}await A(),h([`Added ${r}`,n?`Skipped ${n}`:``,i.length?`Refused ${i.length}: ${i[0]}`:``].filter(Boolean).join(`, `))},F=async()=>{let{cases:t,skipped:r}=Aa(c.flatMap(e=>d[e.name]?[{name:e.name,record:d[e.name]}]:[]),n);if(!t.length)return h(`No record holds a production reply.`);try{let n=await o.create(`${e.name} · production`,{...Ce(),source:{id:e.id,name:e.name},cases:t});h([`Made ${n.name}: ${t.length} ${t.length===1?`case`:`cases`}`,r?`Skipped ${r}`:``].filter(Boolean).join(`, `))}catch(e){h(Ra(e))}},I=async t=>{try{let{trash:n}=await a.removeFiles(e.id,t);u(e=>e.filter(e=>!t.includes(e.name))),s.offer({label:t.length===1?`Removed ${t[0]}`:`Removed ${t.length} records`,restore:()=>void a.restoreTrash(n).then(A,e=>h(Ra(e)))})}catch(e){h(Ra(e))}},L=async t=>{let n=URL.createObjectURL(await a.file(e.id,t)),r=document.createElement(`a`);r.href=n,r.download=t,document.body.append(r),r.click(),r.remove(),URL.revokeObjectURL(n)},ee=e=>[{label:`View…`,icon:g,onSelect:()=>S(e.name)},{label:`Download`,icon:l,onSelect:()=>void L(e.name).catch(e=>h(Ra(e)))},{label:`Remove`,icon:i,destructive:!0,onSelect:()=>void I([e.name])}],z=(0,q.useCallback)(()=>v(null),[]),B=(0,q.useCallback)(()=>S(null),[]),V=x?d[x]:null;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(k,{id:`flow-records`,title:`Records`,note:String(c.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:!C.length||!r,onSelect:()=>v(`import`)},{label:`Upload…`,icon:b,disabled:!C.length,onSelect:()=>v(`upload`)},{label:`New dataset`,icon:nt,disabled:!c.length,onSelect:()=>void F()}],children:[p&&(0,Q.jsx)(`p`,{className:`note`,role:`status`,children:p}),w?c.length?(0,Q.jsx)(`div`,{className:`sflow`,children:(0,Q.jsx)(R,{className:`slist`,label:`Records`,rows:c,rowKey:e=>e.name,select:{noun:`record`,actions:e=>[{label:`Download`,icon:l,onSelect:()=>void(async()=>{for(let t of e)await L(t.name)})().catch(e=>h(Ra(e)))},{label:`Remove`,icon:i,destructive:!0,onSelect:()=>void I(e.map(e=>e.name))}]},columns:[{key:`name`,header:`Name`,role:`title`,sort:e=>e.name,cell:e=>(0,Q.jsxs)(Q.Fragment,{children:[e.name,(0,Q.jsx)(`span`,{className:`sflow-in`,children:Ha(d[e.name])})]})},{key:`result`,header:`Result`,sort:e=>Ua(d[e.name]),cell:e=>Ua(d[e.name])},{key:`request`,header:`Request`,sort:e=>Ba(M(e.name)),tdProps:e=>{let t=M(e.name);return t&&t.match===!1?{title:t.where}:{}},cell:e=>Ba(M(e.name))},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{label:`${e.name} actions`,actions:ee(e)})}]})}):(0,Q.jsx)(`p`,{className:`note`,children:`No records yet. Import runs, in this group's menu, reads them from the flow's run history.`}):(0,Q.jsx)(y,{label:`Records`,error:E,onRetry:j}),(0,Q.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,disabled:!C.length,onClick:()=>v(`hand`),children:[(0,Q.jsx)(t,{size:14,"aria-hidden":`true`}),` Add record`]})]}),_===`import`&&r&&(0,Q.jsx)(Ka,{cfg:r,source:e,steps:C,definition:n,held:N,onClose:z,onRead:async(e,t)=>{v(null),await P(e,t)}}),_===`hand`&&(0,Q.jsx)(qa,{steps:C,onClose:z,onAdd:async e=>{v(null),await P([e])}}),_===`upload`&&(0,Q.jsx)(Ya,{steps:C,onClose:z,onRead:async e=>{v(null),await P(e)}}),x&&(0,Q.jsx)(G,{title:x,onClose:B,wide:!0,children:(0,Q.jsx)(`pre`,{className:`pl-words`,children:V?JSON.stringify(V,null,2):`Unreadable.`})}),(0,Q.jsx)(O,{undo:s.undo,onUndo:s.undoNow,onDismiss:s.dismiss})]})}var Ba=e=>!e||e.match===null?`—`:e.match?`Match`:`Differs`,Va={run:`Run`,hand:`Hand`,upload:`Upload`},Ha=e=>e?[e.step,Va[e.origin.kind]??e.origin.kind,e.at?wi(Date.parse(e.at)/1e3):``].filter(Boolean).join(`, `):`Unreadable`;function Ua(e){let t=e?.result;return t?`error`in t?t.error.code||`Error`:String(t.status):`—`}var Wa=e=>e.map(e=>({value:e.name,label:e.name})),Ga=e=>e.from===`trigger`?`Trigger body`:ga(e);function Ka({cfg:e,source:t,steps:n,definition:i,held:a,onClose:o,onRead:s}){let c=(0,q.useMemo)(()=>$i(e),[e]),l=t.config??{},[u,d]=(0,q.useState)(void 0),[f,p]=(0,q.useState)(n[0]?.name??``),[m,h]=(0,q.useState)(null),[g,_]=(0,q.useState)(``),[v,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)(()=>{Hi(e).then(d,()=>d(null))},[e]),(0,q.useEffect)(()=>{u&&l.environment&&l.flow&&(O(null),c.runs(l.environment,l.flow).then(h,e=>O(Ra(e))))},[u,c,l.environment,l.flow,k]);let j=(0,q.useMemo)(()=>[...new Set((m??[]).map(e=>e.status))].sort(),[m]),M=(0,q.useMemo)(()=>(m??[]).filter(e=>!g||e.status===g),[m,g]),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=>v.has(e.id)),I=M.filter(e=>v.has(e.id)).map(e=>e.id),L=async()=>{let e=n.find(e=>e.name===f);if(!e||!l.environment||!l.flow)return;let t=I;E(null),w(`Reading 0 of ${t.length}`);try{let{records:n,skipped:r}=await Ma(c,l.environment,l.flow,t,e,i,a,e=>w(`Reading ${e} of ${t.length}`));await s(n,r)}catch(e){E(Ra(e)),w(null)}};return(0,Q.jsxs)(G,{title:`Import runs`,onClose:o,wide:!0,footer:(0,Q.jsxs)(`div`,{className:`sacts`,children:[C&&(0,Q.jsx)(`span`,{className:`note`,role:`status`,children:C}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:o,children:`Cancel`}),(0,Q.jsxs)(`button`,{type:`button`,disabled:!!C||!I.length||!f,"aria-busy":!!C||void 0,onClick:()=>void L(),children:[C&&(0,Q.jsx)(r,{}),`Import `,I.length||``]})]}),children:[u===void 0?(0,Q.jsx)(y,{label:`Account`}):u?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(z,{label:`Import`,rows:[{key:`step`,label:`Step`,control:{type:`select`,value:f,options:Wa(n),onChange:p}},{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)))}}}]}),m?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(F,{noun:`runs`,count:{shown:M.length,total:m.length},lead:(0,Q.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:g,onChange:_,options:[{value:``,label:`All`},...j.map(e=>({value:e,label:e}))]}]}),M.length?(0,Q.jsx)(`div`,{className:`sflow`,children:(0,Q.jsx)(R,{className:`slist`,label:`Runs`,rows:M,rowKey:e=>e.id,pageSize:20,rowProps:e=>({onClick:()=>N(e.id),"data-selected":v.has(e.id)||void 0}),columns:[{key:`pick`,header:``,sort:null,cell:e=>(0,Q.jsx)(`input`,{type:`checkbox`,"aria-label":`Run ${e.id}`,checked:v.has(e.id),onChange:()=>N(e.id),onClick:e=>e.stopPropagation()})},{key:`start`,header:`Started`,sort:e=>e.startTime??``,cell:e=>e.startTime?wi(Date.parse(e.startTime)/1e3):`—`},{key:`status`,header:`Status`,sort:e=>e.status,cell:e=>e.status}]})}):(0,Q.jsx)(`p`,{className:`note`,children:`No runs.`})]}):(0,Q.jsx)(y,{label:`Runs`,error:D,onRetry:()=>A(e=>e+1)})]}):(0,Q.jsx)(`div`,{className:`sacts`,children:(0,Q.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>{La(Fa,t.id),Ki(e).catch(e=>{La(Fa,null),E(Ra(e))})},children:[(0,Q.jsx)(ht,{size:14,"aria-hidden":`true`}),` Sign in with Microsoft`]})}),T&&(0,Q.jsx)(`p`,{className:`note bad`,role:`alert`,children:T})]})}function qa({steps:e,onClose:t,onAdd:n}){let[r,i]=(0,q.useState)(e[0]?.name??``),[a,o]=(0,q.useState)({}),s=e.find(e=>e.name===r),c=(s?.reads??[]).filter(e=>ga(e));return(0,Q.jsxs)(G,{title:`Add record`,onClose:t,wide:!0,footer:(0,Q.jsxs)(`div`,{className:`sacts`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:t,children:`Cancel`}),(0,Q.jsx)(`button`,{type:`button`,disabled:!s,onClick:()=>{if(!s)return;let e=Object.fromEntries(Object.entries(a).filter(([e,t])=>t!==``&&c.some(t=>ga(t)===e))),[t]=va(s,[e]).records;n({...t,origin:{kind:`hand`}})},children:`Add`})]}),children:[(0,Q.jsx)(z,{label:`Record`,rows:[{key:`step`,label:`Step`,control:{type:`select`,value:r,options:Wa(e),onChange:e=>{i(e),o({})}}},...c.map(e=>({key:`read-${ga(e)}`,label:Ga(e),control:{type:`textarea`,value:a[ga(e)]??``,onChange:t=>o(n=>({...n,[ga(e)]:t}))}}))]}),s&&!c.length&&(0,Q.jsx)(`p`,{className:`note`,children:`Reads nothing.`})]})}function Ja(e,t){if(e.toLowerCase().endsWith(`.csv`))return{rows:ya(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 Ya({steps:e,onClose:t,onRead:n}){let r=(0,q.useRef)(null),[i,a]=(0,q.useState)(e[0]?.name??``),[o,s]=(0,q.useState)(null),[c,l]=(0,q.useState)(null),u=e.find(e=>e.name===i),d=o&&u&&`rows`in o.parsed?va(u,o.parsed.rows):null,f=o?`records`in o.parsed?o.parsed.records:d?.records??[]:[],p=async e=>{if(e){l(null);try{s({name:e.name,parsed:Ja(e.name,await Pa(e))})}catch(t){s(null),l(`${e.name}: ${Ra(t)}`)}}};return(0,Q.jsxs)(G,{title:`Upload`,onClose:t,wide:!0,footer:(0,Q.jsxs)(`div`,{className:`sacts`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:t,children:`Cancel`}),(0,Q.jsxs)(`button`,{type:`button`,disabled:!f.length,onClick:()=>void n(f),children:[`Add `,f.length||``]})]}),children:[(0,Q.jsx)(z,{label:`Upload`,rows:[...o&&`records`in o.parsed?[]:[{key:`step`,label:`Step`,control:{type:`select`,value:i,options:Wa(e),onChange:a}}],{key:`file`,label:`File`,control:{type:`static`,text:o?.name??`—`}},...o?[{key:`count`,label:`records`in o.parsed?`Records`:`Rows`,control:{type:`static`,text:String(f.length)}}]:[],...d?.unmatched.length?[{key:`unmatched`,label:`Unmatched`,control:{type:`static`,text:d.unmatched.join(`, `)}}]:[]]}),(0,Q.jsxs)(`div`,{className:`sacts`,children:[(0,Q.jsxs)(`button`,{type:`button`,className:`ghost`,onClick:()=>r.current?.click(),children:[(0,Q.jsx)(b,{size:14,"aria-hidden":`true`}),` Choose file`]}),(0,Q.jsx)(`input`,{ref:r,type:`file`,accept:`.json,.csv`,hidden:!0,"aria-hidden":`true`,onChange:e=>{p(e.target.files?.[0]),e.target.value=``}})]}),c&&(0,Q.jsx)(`p`,{className:`note bad`,role:`alert`,children:c})]})}function Xa({source:e}){let t=Y(),n=Qi(),[r,i]=(0,q.useState)(null),[a,o]=(0,q.useState)(null),[s,c]=(0,q.useState)(!1),[l,u]=(0,q.useState)(null),d=e.config??{},f=(0,q.useCallback)(()=>{u(null),t.definition(e.id).then(i,e=>{i(null),u(e instanceof Error?e.message:String(e))})},[t,e.id]);(0,q.useEffect)(f,[f]);let p=async()=>{if(n&&r&&d.environment&&d.flow){c(!0),o(null);try{if(!await Hi(n)){await Ki(n);return}let a=await ea($i(n),d.environment,d.flow);i(await t.saveDefinition(e.id,r.version,a.definition)),o(`Synced.`)}catch(e){e instanceof ge&&e.status===409?(f(),o(`It changed since: reloaded.`)):o(e instanceof Error?e.message:String(e))}finally{c(!1)}}},m=(0,q.useMemo)(()=>Za(r?.body),[r]),h=(0,q.useMemo)(()=>fa(r?.body),[r]),[g,_]=be(`promptlab.workflows`),[v]=be(`promptlab.profiles`),b=t=>{let n=h.find(e=>e.name===t);if(!n||!r)return;let i=Da({id:e.id,name:e.name},r.body,n,v.list),a={id:i.id,name:i.name,work:i};_({...g,list:[...g.list,a],at:a.id}),location.hash=`#/runs`};return(0,Q.jsxs)(`div`,{className:`sources`,"data-level":`flow`,children:[a&&(0,Q.jsx)(`p`,{className:`note`,role:`status`,children:a}),(0,Q.jsxs)(k,{id:`flow-source`,title:`Flow`,note:d.displayName,actions:[{label:`Re-sync`,icon:xt,busy:s,disabled:!n||!r,onSelect:()=>void p()}],children:[(0,Q.jsx)(z,{label:`Flow`,rows:[{key:`flow`,label:`Flow`,control:{type:`static`,text:d.displayName||d.flow||`—`}},{key:`env`,label:`Environment`,control:{type:`static`,text:d.environment||`—`}},...r?[{key:`version`,label:`Definition`,control:{type:`static`,text:r.version?`Version ${r.version}${r.at?`, ${wi(Date.parse(r.at)/1e3)}`:``}`:`None`}}]:[]]}),!r&&(0,Q.jsx)(y,{label:`Definition`,error:l,onRetry:f})]}),(0,Q.jsx)(za,{source:e,definition:r?.body??null,cfg:n}),(0,Q.jsx)(k,{id:`flow-actions`,title:`Actions`,note:r?String(m.length):void 0,children:r?m.length?(0,Q.jsx)(`div`,{className:`sflow`,children:(0,Q.jsx)(R,{className:`slist`,label:`Actions`,rows:m,rowKey:e=>e.name,defaultSort:null,columns:[{key:`name`,header:`Name`,role:`title`,sort:e=>e.name,cell:e=>(0,Q.jsxs)(Q.Fragment,{children:[e.name,e.in&&(0,Q.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=>h.some(t=>t.name===e.name)?(0,Q.jsx)(se,{label:`${e.name} actions`,actions:[{label:`New pipeline`,icon:bt,onSelect:()=>b(e.name)}]}):null}]})}):(0,Q.jsx)(`p`,{className:`note`,children:`No actions.`}):(0,Q.jsx)(y,{label:`Actions`,error:l,onRetry:f})})]})}function Za(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 Qa={"power-automate":{Create:ta,Level:Xa}};function $a({sourceId:e=null,onOpen:r,mode:a=`browse`,onPick:o,disabled:c}){let u=Y(),d=te(),[m,h]=(0,q.useState)(null),[_,v]=(0,q.useState)(0),[x,S]=(0,q.useState)(0),[C,w]=(0,q.useState)(null),[T,E]=(0,q.useState)(pi),[k,j]=(0,q.useState)(``),[M,N]=(0,q.useState)(new Set),[P,I]=(0,q.useState)(null),[L,B]=(0,q.useState)(!1),[V,ne]=(0,q.useState)(!1),[H,ie]=(0,q.useState)(()=>a===`browse`&&to()!==null),[U,ae]=(0,q.useState)(null),[W,K]=(0,q.useState)(null),[ce,J]=(0,q.useState)(!1),[le,ue]=(0,q.useState)(``),[X,de]=(0,q.useState)(()=>a===`browse`&&to()||s().DEFAULT_SOURCE_TYPE),[Z,fe]=(0,q.useState)(``),[pe,me]=(0,q.useState)(``),[he,_e]=(0,q.useState)(null),[ve,ye]=(0,q.useState)([]),[be,xe]=(0,q.useState)(!1),[Se,Ce]=(0,q.useState)(!1),[we,Te]=(0,q.useState)(null),[Ee,De]=(0,q.useState)(null),[Oe,ke]=(0,q.useState)(0),[Ae,je]=(0,q.useState)(0),Me=(0,q.useRef)(null),Ne=(0,q.useRef)(1),{view:Pe,sort:Fe,dir:Ie}=T,Le=(0,q.useCallback)(()=>ae(null),[]),Re=(0,q.useCallback)(()=>ie(!1),[]),ze=(0,q.useCallback)(()=>K(null),[]),Be=(0,q.useCallback)(()=>J(!1),[]);(0,q.useEffect)(()=>mi(T),[T]),(0,q.useEffect)(()=>{a===`browse`&&no(H?X:null)},[a,H,X]);let Ve=async()=>{try{let e=await u.sources();h(e.sources),v(e.cap),S(e.used)}catch{}};(0,q.useEffect)(()=>{let e=!0;return u.sources().then(t=>{e&&(h(t.sources),v(t.cap),S(t.used))}).catch(t=>{e&&Te(We(t))}),()=>{e=!1}},[u,Oe]),(0,q.useEffect)(()=>{N(new Set),ye([]);let t=!0;return De(null),e?u.source(e).then(e=>{t&&w(e)}).catch(e=>{t&&(w(null),De(We(e)))}):w(null),()=>{t=!1}},[e,Ae]);let He=async()=>{if(!e){w(null);return}try{w(await u.source(e))}catch{w(null)}},Ue=e=>{_e(e),e&&window.setTimeout(()=>_e(null),6e3)},We=e=>e instanceof ge?e.message:`the request failed`,Ge=Si(xi(C?.files??[],Fe,Ie),k),Ke=e=>{N(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},qe=()=>N(new Set(Ge.map(e=>e.name))),Je=()=>N(new Set),Ye=async e=>{let t=[];try{for(let n of e)t.push((await u.removeSource(n.id)).trash),h(e=>(e??[]).filter(e=>e.id!==n.id))}catch(e){Ue(We(e))}t.length&&d.offer({label:e.length===1?`Deleted ${e[0].name}`:`Deleted ${t.length} Sources`,restore:()=>void(async()=>{try{for(let e of t)await u.restoreTrash(e);await Ve()}catch(e){Ue(We(e))}})()})},Xe=e=>Ye([e]),Ze=async e=>{if(C)try{let{trash:t}=await u.removeFiles(C.id,e),n=new Set(e);w(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)}),N(e=>new Set([...e].filter(e=>!n.has(e)))),d.offer({label:e.length===1?`Removed ${e[0]}`:`Removed ${e.length} files`,restore:()=>void(async()=>{try{let e=await u.restoreTrash(t);w(e.source)}catch(e){Ue(We(e))}})()})}catch(e){Ue(We(e))}},$e=(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)},et=async e=>{if(!C)return;let t=e.length===1?e[0]:null;Ce(!0);try{let n=t?await u.file(C.id,t):await u.zip(C.id,e);$e(n,t??`${C.name}.zip`)}catch(e){Ue(We(e))}finally{Ce(!1)}},tt=async e=>{if(!C||C.system)return;let t=[...e];if(!t.length)return;let n=t.map(e=>({id:Ne.current++,file:e,state:`uploading`}));ye(e=>[...e,...n]);for(let e of n)try{await u.upload(C.id,e.file.name,e.file),ye(t=>t.map(t=>t.id===e.id?{...t,state:`done`}:t))}catch(t){ye(n=>n.map(n=>n.id===e.id?{...n,state:`error`,error:We(t)}:n))}await He()},nt=e=>void tt([e.file]),rt=async(e,t)=>{if(C&&W)try{await u.copyFiles(t.id,C.id,W.names,e===`move`),K(null),N(new Set),await He(),Ue(e===`move`?`Moved to ${t.name}.`:`Copied to ${t.name}.`)}catch(e){Ue(We(e)),K(null)}},it=async()=>{if(C&&le.trim())try{let e=await u.createSource(le.trim(),C.type);try{await u.copyFiles(e.id,C.id,[...M],!1)}catch(t){throw await u.removeSource(e.id).catch(()=>{}),t}J(!1),ue(``),N(new Set),await Ve(),Ue(`Made a new Source.`)}catch(e){Ue(We(e))}},at=async()=>{if(le.trim())try{await u.createSource(le.trim(),X),ie(!1),ue(``),de(s().DEFAULT_SOURCE_TYPE),await Ve()}catch(e){Ue(We(e))}},ot=async(e,t)=>{try{let n=await u.renameSource(e.id,t);h(t=>(t??[]).map(t=>t.id===e.id?Ti(n):t)),w(e=>e?.id===n.id?{...e,name:n.name}:e)}catch(e){Ue(We(e))}},st=(e,t=()=>I(e.id),n)=>e.system?[]:[{label:`Rename…`,icon:p,onSelect:t},{label:`Delete`,icon:i,destructive:!0,onSelect:()=>void Xe(e).then(n)}],lt=e=>[{label:`Preview`,icon:g,disabled:!vi(e.name),onSelect:()=>ae(e)},{label:`Download`,icon:l,onSelect:()=>void et([e.name])},...C?.system?[]:[{label:`Remove`,icon:i,destructive:!0,onSelect:()=>void Ze([e.name])}]],dt=[...C?.system?[]:[{label:`Remove`,icon:i,destructive:!0,onSelect:()=>void Ze([...M])}],{label:`Download`,icon:l,busy:Se,onSelect:()=>void et([...M])},...C?.system?[]:[{label:`Move to…`,icon:ct,onSelect:()=>K({kind:`move`,names:[...M]})}],{label:`Copy to…`,icon:f,onSelect:()=>K({kind:`copy`,names:[...M]})},...C?.system?[]:[{label:`New Source from selection…`,icon:ut,onSelect:()=>J(!0)}]],ft=e=>{e.preventDefault(),xe(!1),C&&!C.system&&tt(e.dataTransfer.files)},pt=(m??[]).filter(e=>(!pe||e.type===pe)&&e.name.toLowerCase().includes(Z.trim().toLowerCase())),mt=(0,Q.jsx)(F,{noun:`Sources`,search:{label:`Find a Source`,value:Z,placeholder:`Name`,onChange:fe},filters:[{key:`type`,label:`Type`,value:pe,onChange:me,options:[{value:``,label:`All`},...fo()]}],count:{shown:pt.length,total:(m??[]).length}}),ht=()=>(0,Q.jsxs)(`div`,{className:`sources`,"data-level":`sources`,children:[he&&(0,Q.jsx)(`p`,{className:`note`,role:`status`,children:he}),(0,Q.jsxs)(`header`,{className:`shead`,children:[(0,Q.jsx)(`h2`,{className:`shead-title`,children:`Sources`}),(0,Q.jsx)(io,{view:Pe,onChange:e=>E(t=>({...t,view:e}))})]}),m!==null&&m.length>0&&mt,m===null?(0,Q.jsx)(y,{label:`Sources`,error:we,onRetry:()=>{Te(null),ke(e=>e+1)}}):m.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No Sources on the server yet.`}):Pe===`thumbs`?(0,Q.jsx)(`ul`,{className:`sfolders`,children:pt.map(e=>(0,Q.jsx)(`li`,{className:`sfolder`,children:(0,Q.jsxs)(`button`,{type:`button`,className:`sfolder-open${c?.(e)?` off`:``}`,disabled:c?.(e),onClick:()=>o?.(e),children:[(0,Q.jsx)(so,{}),(0,Q.jsx)(`span`,{className:`sfolder-name`,children:e.name}),(0,Q.jsxs)(`span`,{className:`sfolder-meta`,children:[po(e),`. `,mo(e)]})]})},e.id))}):(0,Q.jsx)(R,{className:`slist slist-folders`,label:`Sources`,rows:pt,rowKey:e=>e.id,columns:[{key:`name`,header:`Name`,className:`sfile-name`,role:`title`,sort:e=>e.name,cell:e=>(0,Q.jsxs)(`button`,{type:`button`,className:`srow-pick${c?.(e)?` off`:``}`,disabled:c?.(e),onClick:()=>o?.(e),children:[(0,Q.jsx)(so,{}),` `,e.name]})},{key:`type`,header:`Type`,sort:e=>po(e),cell:e=>po(e)},{key:`files`,header:`Items`,className:`num`,cell:e=>e.files},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>Ci(e.bytes)}]})]});if(a===`pick`)return ht();if(e){if(!C)return(0,Q.jsx)(`div`,{className:`sources`,children:(0,Q.jsx)(y,{label:`Files`,error:Ee,onRetry:()=>je(e=>e+1)})});let e=Qa[C.type]?.Level,t=!e&&!C.system,i=()=>r?.(null),a=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(D,{kind:`Source`,name:C.name,crumb:{label:`Sources`,onClick:i},onPick:m?.length?()=>ne(!0):void 0,meta:`${po(Ti(C))}. ${[mo(Ti(C)),Ci(C.bytes)].join(`, `)}`,primary:t?{label:`Upload…`,icon:b,onSelect:()=>Me.current?.click()}:void 0,actions:st(Ti(C),()=>B(!0),i)}),V&&m&&(0,Q.jsx)(oe,{kind:`Source`,value:C.id,onPick:e=>r?.(e),onClose:()=>ne(!1),options:m.map(e=>({id:e.id,label:e.name}))}),L&&(0,Q.jsx)(re,{title:`Rename Source`,value:C.name,onCommit:e=>{e&&e!==C.name&&ot(C,e)},onClose:()=>B(!1)})]});return e?(0,Q.jsxs)(`div`,{className:`sources`,children:[a,(0,Q.jsx)(e,{source:C,onBack:i}),(0,Q.jsx)(O,{undo:d.undo,onUndo:d.undoNow,onDismiss:d.dismiss})]}):(0,Q.jsxs)(`div`,{className:`sources`,"data-level":`files`,children:[a,he&&(0,Q.jsx)(`p`,{className:`note`,role:`status`,children:he}),(0,Q.jsxs)(`header`,{className:`shead`,children:[(0,Q.jsx)(io,{view:Pe,onChange:e=>E(t=>({...t,view:e}))}),(0,Q.jsx)(ao,{sort:Fe,dir:Ie,onChange:(e,t)=>E(n=>({...n,sort:e,dir:t}))}),(0,Q.jsxs)(`label`,{className:`sfilter`,children:[(0,Q.jsx)(ee,{size:14,"aria-hidden":`true`}),(0,Q.jsx)(`input`,{type:`search`,"aria-label":`Filter by name`,placeholder:`Filter`,value:k,onChange:e=>j(e.target.value)})]})]}),M.size>0&&(0,Q.jsx)(A,{count:M.size,noun:`file`,onClear:Je,actions:Pe===`thumbs`?[{label:`Select all`,icon:Qe,disabled:M.size===Ge.length,onSelect:qe},...dt]:dt}),(0,Q.jsx)(`div`,{className:`sfiles${be?` drag`:``}`,onDragOver:e=>{e.preventDefault(),xe(!0)},onDragLeave:()=>xe(!1),onDrop:ft,children:Ge.length===0?(0,Q.jsx)(`p`,{className:`note`,children:k?`No files match that name.`:`No files in this Source yet.`}):Pe===`thumbs`?(0,Q.jsx)(`ul`,{className:`stiles`,children:Ge.map(e=>(0,Q.jsx)(`li`,{children:(0,Q.jsxs)(`button`,{type:`button`,className:`stile${M.has(e.name)?` sel`:``}`,"aria-pressed":M.has(e.name),"aria-label":e.name,onClick:()=>Ke(e.name),children:[(0,Q.jsx)(ro,{id:C.id,file:e}),(0,Q.jsx)(`span`,{className:`stile-name`,children:e.name}),M.has(e.name)&&(0,Q.jsx)(`span`,{className:`stile-check`,children:(0,Q.jsx)(n,{size:12,"aria-hidden":`true`})})]})},e.name))}):(0,Q.jsx)(R,{className:`slist`,label:`${C.name} files`,rows:Ge,rowKey:e=>e.name,defaultSort:null,select:{noun:`file`,selected:M,onChange:N},rowProps:e=>({onClick:()=>Ke(e.name)}),columns:[{key:`name`,header:`Name`,className:`sfile-name`,role:`title`,cell:e=>e.name},{key:`type`,header:`Type`,className:`stype`,cell:e=>oo(e.name)},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>Ci(e.bytes)},{key:`added`,header:`Added`,sort:e=>e.added,cell:e=>e.added?wi(e.added):`—`},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,tdProps:()=>({onClick:e=>e.stopPropagation()}),cell:e=>(0,Q.jsx)(se,{label:`${e.name} actions`,actions:lt(e)})}]})}),t&&(0,Q.jsxs)(`div`,{className:`supload`,children:[(0,Q.jsx)(`input`,{ref:Me,type:`file`,multiple:!0,hidden:!0,"aria-hidden":`true`,accept:s().sourceTypeOf(C)?.uploads?.join(`,`),onChange:e=>{e.target.files&&tt(e.target.files),e.target.value=``}}),ve.length>0&&(0,Q.jsx)(`ul`,{className:`suploads`,children:ve.map(e=>(0,Q.jsxs)(`li`,{className:`supload ${e.state}`,children:[(0,Q.jsx)(`span`,{className:`supload-name`,children:e.file.name}),e.state===`uploading`&&(0,Q.jsx)(`span`,{className:`supload-bar`,role:`status`,children:`Uploading…`}),e.state===`done`&&(0,Q.jsx)(`span`,{className:`note`,children:`Uploaded`}),e.state===`error`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`note bad`,children:e.error}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>nt(e),children:`Retry`})]})]},e.id))})]}),U&&(0,Q.jsxs)(G,{title:U.name,onClose:Le,children:[vi(U.name)?(0,Q.jsx)(`img`,{className:`spreview-img`,src:bi(C.id,U),alt:U.name}):null,(0,Q.jsx)(`p`,{className:`note`,children:Ci(U.bytes)})]}),W&&(0,Q.jsx)(G,{title:W.kind===`move`?`Move to…`:`Copy to…`,onClose:ze,children:(0,Q.jsx)($a,{mode:`pick`,disabled:e=>e.id===C.id||e.system||e.type!==C.type,onPick:e=>void rt(W.kind,e)})}),ce&&(0,Q.jsxs)(G,{title:`New Source from selection`,onClose:Be,children:[(0,Q.jsxs)(`label`,{className:`prompt`,children:[(0,Q.jsx)(`span`,{className:`prop-name`,children:`Name`}),(0,Q.jsx)(`input`,{"aria-label":`New Source name`,value:le,autoFocus:!0,onChange:e=>ue(e.target.value),onKeyDown:e=>{e.key===`Enter`&&it()}})]}),(0,Q.jsxs)(`div`,{className:`sacts`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>J(!1),children:`Cancel`}),(0,Q.jsx)(`button`,{type:`button`,disabled:!le.trim(),onClick:()=>void it(),children:`Make`})]})]}),(0,Q.jsx)(O,{undo:d.undo,onUndo:d.undoNow,onDismiss:d.dismiss})]})}return(0,Q.jsxs)(`div`,{className:`sources`,"data-level":`sources`,children:[he&&(0,Q.jsx)(`p`,{className:`note`,role:`status`,children:he}),(0,Q.jsxs)(`header`,{className:`shead`,children:[(0,Q.jsx)(`h2`,{className:`shead-title`,children:`Sources`}),(0,Q.jsxs)(`p`,{className:`note suste`,children:[`Used `,Ci(x),` of `,Ci(_)]}),(0,Q.jsx)(io,{view:Pe,onChange:e=>E(t=>({...t,view:e}))})]}),m!==null&&m.length>0&&mt,m===null?(0,Q.jsx)(y,{label:`Sources`,error:we,onRetry:()=>{Te(null),ke(e=>e+1)}}):m.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No Sources yet — Add source below.`}):Pe===`thumbs`?(0,Q.jsx)(`ul`,{className:`sfolders`,children:pt.map(e=>(0,Q.jsxs)(`li`,{className:`sfolder`,children:[(0,Q.jsxs)(`button`,{type:`button`,className:`sfolder-open`,onClick:()=>r?.(e.id),children:[(0,Q.jsx)(so,{}),(0,Q.jsx)(`span`,{className:`sfolder-name`,children:e.name}),(0,Q.jsxs)(`span`,{className:`sfolder-meta`,children:[po(e),`. `,mo(e)]}),(0,Q.jsx)(uo,{source:e,cap:_,children:e.system?(0,Q.jsx)(`span`,{className:`squota-none`,children:`—`}):(0,Q.jsx)(`span`,{className:`squota-bar`,children:(0,Q.jsx)(`span`,{className:`squota-fill`,style:{width:`${co(e.bytes,_)}%`}})})})]}),(0,Q.jsx)(`span`,{className:`sfolder-menu`,children:(0,Q.jsx)(se,{label:`${e.name} actions`,actions:st(e)})})]},e.id))}):(0,Q.jsx)(`div`,{className:`sfiles`,children:(0,Q.jsx)(R,{className:`slist slist-folders`,label:`Sources`,rows:pt,rowKey:e=>e.id,rowProps:e=>({"data-open":e.id,onClick:()=>r?.(e.id)}),select:{noun:`Source`,actions:e=>[{label:`Delete`,icon:i,destructive:!0,disabled:e.every(e=>e.system),onSelect:()=>void Ye(e.filter(e=>!e.system))}]},columns:[{key:`name`,header:`Name`,className:`sfile-name`,role:`title`,sort:e=>e.name,cell:e=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(so,{}),` `,e.name]})},{key:`type`,header:`Type`,sort:e=>po(e),cell:e=>po(e)},{key:`files`,header:`Items`,className:`num`,cell:e=>e.files},{key:`size`,header:`Size`,className:`num`,sort:e=>e.bytes,cell:e=>Ci(e.bytes)},{key:`used`,header:`Used`,className:`num`,sort:e=>e.system?null:e.bytes,cell:e=>(0,Q.jsx)(uo,{source:e,cap:_,children:e.system?`—`:`${co(e.bytes,_)}%`})},{key:`menu`,header:``,className:`s-actions`,role:`menu`,sort:null,tdProps:()=>({onClick:e=>e.stopPropagation()}),cell:e=>(0,Q.jsx)(se,{label:`${e.name} actions`,actions:st(e)})}]})}),P&&m&&(()=>{let e=m.find(e=>e.id===P);return e?(0,Q.jsxs)(`label`,{className:`srename`,children:[(0,Q.jsxs)(`span`,{className:`prop-name`,children:[`Rename `,e.name]}),(0,Q.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&&ot(e,n),I(null)}t.key===`Escape`&&I(null)},onBlur:t=>{let n=t.target.value.trim();n&&n!==e.name&&ot(e,n),I(null)}})]}):null})(),(0,Q.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:()=>ie(!0),children:[(0,Q.jsx)(t,{size:14,"aria-hidden":`true`}),` Add source`]}),H&&(0,Q.jsxs)(G,{title:`Add source`,onClose:Re,children:[(0,Q.jsx)(z,{label:`New Source`,rows:[{key:`type`,label:`Type`,hint:s().SOURCE_TYPES[X]?.description,control:{type:`select`,value:X,options:fo(),onChange:de}}]}),(()=>{let e=Qa[X]?.Create,t=(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>ie(!1),children:`Cancel`});return e?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(e,{onMade:async()=>{ie(!1),de(s().DEFAULT_SOURCE_TYPE),await Ve()}}),(0,Q.jsx)(`div`,{className:`sacts`,children:t})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`label`,{className:`prompt`,children:[(0,Q.jsx)(`span`,{className:`prop-name`,children:`Name`}),(0,Q.jsx)(`input`,{"aria-label":`Source name`,value:le,autoFocus:!0,onChange:e=>ue(e.target.value),onKeyDown:e=>{e.key===`Enter`&&at()}})]}),(0,Q.jsxs)(`div`,{className:`sacts`,children:[t,(0,Q.jsx)(`button`,{type:`button`,disabled:!le.trim(),onClick:()=>void at(),children:`Add`})]})]})})()]}),(0,Q.jsx)(O,{undo:d.undo,onUndo:d.undoNow,onDismiss:d.dismiss})]})}var eo=`evals-lab.sources.adding`;function to(){try{return sessionStorage.getItem(eo)}catch{return null}}function no(e){try{e?sessionStorage.setItem(eo,e):sessionStorage.removeItem(eo)}catch{}}function ro({id:e,file:t}){let[n,r]=(0,q.useState)(!1);return!t.thumb||n?(0,Q.jsx)(`span`,{className:`stile-type`,children:oo(t.name)||`FILE`}):(0,Q.jsx)(`img`,{className:`stile-img`,src:yi(e,t),alt:``,loading:`lazy`,onError:()=>r(!0)})}function io({view:e,onChange:t}){return(0,Q.jsxs)(`div`,{className:`sview`,role:`group`,"aria-label":`View`,children:[(0,Q.jsx)(`button`,{type:`button`,className:e===`thumbs`?`on`:void 0,"aria-pressed":e===`thumbs`,onClick:()=>t(`thumbs`),children:`Thumbnails`}),(0,Q.jsx)(`button`,{type:`button`,className:e===`list`?`on`:void 0,"aria-pressed":e===`list`,onClick:()=>t(`list`),children:`List`})]})}function ao({sort:e,dir:t,onChange:n}){return(0,Q.jsxs)(`div`,{className:`ssort`,role:`group`,"aria-label":`Sort`,children:[(0,Q.jsxs)(`select`,{"aria-label":`Sort by`,value:e,onChange:e=>n(e.target.value,t),children:[(0,Q.jsx)(`option`,{value:`name`,children:`Name`}),(0,Q.jsx)(`option`,{value:`added`,children:`Date added`}),(0,Q.jsx)(`option`,{value:`size`,children:`Size`})]}),(0,Q.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":`Sort ${t===1?`ascending`:`descending`}`,onClick:()=>n(e,t===1?-1:1),children:(0,Q.jsx)(t===1?S:c,{size:14,"aria-hidden":`true`})})]})}function oo(e){let t=e.lastIndexOf(`.`);return t<0?``:e.slice(t+1).toUpperCase()}function so(){return(0,Q.jsx)(dt,{size:16,"aria-hidden":`true`})}function co(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}function lo(e,t){return e.system?`Quota: not counted`:`Quota: ${Ci(e.bytes)} of ${Ci(t)}`}function uo({source:e,cap:t,children:n}){let r=lo(e,t);return(0,Q.jsxs)(`span`,{className:`squota`,role:`img`,"aria-label":r,children:[n,(0,Q.jsx)(`span`,{className:`squota-pop`,"aria-hidden":`true`,children:r})]})}var fo=()=>Object.entries(s().SOURCE_TYPES).map(([e,t])=>({value:e,label:t.label})),po=e=>s().SOURCE_TYPES[e.type]?.label??e.type,mo=e=>{let t=s().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,Q.jsx)($a,{sourceId:t,onOpen:e=>{n(e),e?location.hash=`/library/sources/${encodeURIComponent(e)}`:location.hash=`#/library/sources`}})}var go=[{id:`datasets`,label:`Datasets`,icon:nt},{id:`prompts`,label:`Prompts`,icon:_t},{id:`sources`,label:`Sources`,icon:lt}];function _o({section:e,sourceId:t}){return(0,Q.jsxs)(`div`,{className:`library`,children:[(0,Q.jsx)(`nav`,{className:`lib-sections`,"aria-label":`Library`,children:go.map(({id:t,label:n,icon:r})=>(0,Q.jsxs)(`a`,{href:`#/library/${t}`,...t===e?{"aria-current":`page`}:{},className:t===e?`on`:void 0,children:[(0,Q.jsx)(r,{size:16,"aria-hidden":`true`}),(0,Q.jsx)(`span`,{children:n})]},t))}),(0,Q.jsx)(`section`,{className:`lib-section`,"data-section":e,children:e===`datasets`?(0,Q.jsx)($r,{}):e===`prompts`?(0,Q.jsx)(ui,{}):(0,Q.jsx)(ho,{sourceId:t})})]})}var vo=`0.5.0 (2026.10.04-397)`,yo=3,bo=3,xo=e=>_r.find(t=>t.id===e),So=e=>go.find(t=>t.id===e),Co=e=>new Date(e).toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`});function wo(){let e=Y(),[t]=be(`promptlab.profiles`),[n,r]=be(`promptlab.workflows`),i=ze(),a=Ye(),{pickDataset:o}=Yt(),{openRun:s}=Qt(),c=Re(),l=Je(),[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:bo}).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=xo(`library`),A=k.icon;return(0,Q.jsxs)(`div`,{className:`home`,children:[(0,Q.jsxs)(`ol`,{className:`home-line`,"aria-label":`Lab`,children:[(0,Q.jsx)(To,{id:`runs`,icon:xo(`runs`).icon,name:xo(`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,Q.jsx)(To,{id:`history`,icon:xo(`history`).icon,name:xo(`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=Jn(e).scenarios.map(e=>e.percent==null?`–`:`${e.percent}%`).join(`, `);return{key:e.id,label:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`code`,{children:mn(e.submittedAt)}),e.status!==`done`&&xn(e.status)]}),sub:O(Co(e.submittedAt),!!t&&t),href:`#/history`,onOpen:()=>s(e.id,{at:e.submittedAt,from:`home`})}})}),(0,Q.jsxs)(`li`,{className:`home-stop home-fork`,"data-stop":`library`,children:[(0,Q.jsxs)(`a`,{className:`home-name`,href:`#/library`,children:[(0,Q.jsx)(`span`,{className:`home-mark`,"aria-hidden":`true`,children:(0,Q.jsx)(A,{size:18})}),k.label]}),(0,Q.jsxs)(`ol`,{className:`home-branch`,"aria-label":k.label,children:[(0,Q.jsx)(To,{id:`datasets`,to:`library/datasets`,branch:!0,icon:So(`datasets`).icon,name:So(`datasets`).label,start:D===`datasets`,fact:i.list?O(hn(w.length,`dataset`),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`,onPick:()=>o(e.id)}))}),(0,Q.jsx)(To,{id:`prompts`,to:`library/prompts`,branch:!0,icon:So(`prompts`).icon,name:So(`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(`
|
|
10
|
+
`)[0]||`Untitled`,sub:e.default?`Default`:void 0,href:`#/library/prompts`}))}),(0,Q.jsx)(To,{id:`sources`,to:`library/sources`,branch:!0,icon:So(`sources`).icon,name:So(`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,Q.jsx)(To,{id:`setup`,icon:xo(`setup`).icon,name:xo(`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,Q.jsxs)(`p`,{className:`home-version`,children:[`Evals Lab `,vo]})]})}function To({id:e,icon:t,name:n,to:r,fact:i,items:a,total:o=a.length,hub:s,start:c,branch:l,wait:u}){let d=o-Math.min(a.length,yo);return(0,Q.jsxs)(`li`,{className:[`home-stop`,s&&`hub`,c&&`start`,l&&`branch`].filter(Boolean).join(` `),"data-stop":e,children:[(0,Q.jsxs)(`a`,{className:`home-name`,href:`#/${r??e}`,children:[(0,Q.jsx)(`span`,{className:`home-mark`,"aria-hidden":`true`,children:(0,Q.jsx)(t,{size:l?15:18})}),n]}),c&&(0,Q.jsx)(`span`,{className:`home-start`,children:`Start Here`}),u&&(0,Q.jsx)(y,{label:n,error:u.error,onRetry:u.onRetry}),!u&&i&&(0,Q.jsx)(`span`,{className:`home-fact`,children:i}),!u&&a.length>0&&(0,Q.jsxs)(`ul`,{className:`home-items`,children:[a.slice(0,yo).map(e=>(0,Q.jsx)(`li`,{children:(0,Q.jsxs)(`a`,{href:e.href,onClick:t=>{e.onOpen?(t.preventDefault(),e.onOpen()):e.onPick?.()},children:[(0,Q.jsx)(`span`,{className:`home-item`,children:e.label}),e.sub&&(0,Q.jsx)(`span`,{className:`home-sub`,children:e.sub})]})},e.key)),d>0&&(0,Q.jsx)(`li`,{children:(0,Q.jsxs)(`a`,{className:`home-more`,href:`#/${r??e}`,children:[d,` more`]})})]})]})}function Eo({list:e,at:n,canRestore:r,onSelect:a,onNew:o,onClone:s,onRename:c,onDelete:u,onRestore:d,onExport:h,onExportCi:g,onImport:_}){let[v,y]=(0,q.useState)(!1),[x,S]=(0,q.useState)(!1),C=e.find(e=>e.id===n),w=[{label:`Rename…`,icon:p,onSelect:()=>y(!0)},{label:`Clone`,icon:f,onSelect:s},{label:`Export YAML`,icon:l,onSelect:h},{label:`Export for CI…`,icon:l,onSelect:g},{label:`Import YAML…`,icon:b,onSelect:_},{label:`Restore…`,icon:m,disabled:!r,onSelect:d},{label:`Delete`,icon:i,destructive:!0,onSelect:u}],T=C?.work.jobs?.length??0,E=C?.work.targets?.length??0;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(D,{kind:`Pipeline`,name:C?.name?.trim()||`Untitled`,onPick:()=>S(!0),meta:`${Do(T,`job`)}, ${Do(E,`target`)}`,primary:{label:`New pipeline`,icon:t,onSelect:o},actions:w}),x&&(0,Q.jsx)(oe,{kind:`Pipeline`,value:n,onPick:a,onClose:()=>S(!1),options:e.map(e=>({id:e.id,label:e.name||`Untitled`}))}),v&&(0,Q.jsx)(re,{title:`Rename pipeline`,value:C?.name??``,onCommit:c,onClose:()=>y(!1)})]})}var Do=(e,t)=>`${e} ${e===1?t:`${t}s`}`;function Oo({hasItems:e,onExport:t,onClose:n}){let[r,i]=(0,q.useState)(!1),[a,o]=(0,q.useState)(!1),[s,c]=(0,q.useState)(null),u=async()=>{o(!0),c(null);try{await t(e&&r),n()}catch(e){c(e instanceof Error?e.message:String(e))}finally{o(!1)}};return(0,Q.jsx)(V,{title:`Export for CI`,status:s??void 0,statusBad:!!s,onClose:n,sections:[{key:`bundle`,rows:[{key:`items`,label:`Items`,control:e?{type:`checkbox`,checked:r,label:`Include`,onChange:i}:{type:`static`,text:`None`}}]}],actions:[{label:`Export`,icon:l,busy:a,primary:!0,onSelect:()=>void u()}]})}function ko({problems:e,error:t,run:n,submitting:i,onRun:a,onStop:o,onOpen:s}){let c=!!n&&!Pn(n.status),l=n?.progress?.total??0,u=n?.progress?.n??0,d=c&&l?Math.round(u/l*100):null,f=n&&(0,Q.jsxs)(`button`,{type:`button`,className:`runbar-open`,title:`Open this run`,onClick:s,children:[(0,Q.jsx)(`span`,{className:`runbar-word`,children:bn(n.status)}),Ao(n)&&(0,Q.jsx)(`span`,{className:`runbar-detail`,children:Ao(n)})]}),p=c?f:e.length?(0,Q.jsxs)(`span`,{className:`runbar-why`,children:[No(e[0]),Mo(e[0])]}):t?(0,Q.jsx)(`span`,{className:`runbar-why bad`,children:No(t)}):f??(0,Q.jsx)(`span`,{className:`runbar-why`,children:`Ready to run.`});return(0,Q.jsxs)(`div`,{className:`runbar`,children:[(0,Q.jsxs)(`div`,{className:`runbar-row`,children:[(0,Q.jsxs)(`button`,{type:`button`,className:`run`,disabled:e.length>0||i,"aria-busy":i||void 0,onClick:a,children:[i?(0,Q.jsx)(r,{size:16}):(0,Q.jsx)(bt,{size:16,"aria-hidden":`true`}),`Run`]}),(0,Q.jsx)(`span`,{className:`runbar-line`,role:`status`,children:p}),c&&(0,Q.jsxs)(`button`,{type:`button`,className:`ghost runbar-stop`,onClick:o,children:[(0,Q.jsx)(et,{size:14,"aria-hidden":`true`}),`Stop`]})]}),d!=null&&(0,Q.jsx)(`div`,{className:`runbar-meter`,role:`progressbar`,"aria-label":`Run progress`,"aria-valuenow":d,"aria-valuemin":0,"aria-valuemax":100,children:(0,Q.jsx)(`div`,{className:`runbar-fill`,style:{width:`${d}%`}})})]})}function Ao(e){return e.status===`queued`?e.behind?`behind ${e.behind}`:`next in line`:e.status===`running`&&e.progress?.total?`${e.progress.n} of ${e.progress.total}`:``}var jo=[[/^Target profile .* not found$/,`#/setup`,`Open Setup`],[/^Source .* not found$/,`#/library/sources`,`Open Sources`],[/^Dataset .* not found$/,`#/library/datasets`,`Open Datasets`]];function Mo(e){let t=jo.find(([t])=>t.test(e.trim()));return t?(0,Q.jsxs)(Q.Fragment,{children:[` `,(0,Q.jsx)(`a`,{className:`runbar-fix`,href:t[1],children:t[2]})]}):null}var No=e=>{let t=e.trim();if(!t)return t;let n=t[0].toUpperCase()+t.slice(1);return/[.!?]$/.test(n)?n:`${n}.`},Po=10;function Fo({onPick:e,onClose:t,used:n}){let{list:r,error:i}=Ye(),a=Je(),[o,s]=(0,q.useState)(``),[c,l]=(0,q.useState)(`all`),[u,d]=(0,q.useState)(0),f=r??[],p=f.filter(e=>si(e,o,c,n??{byScenario:new Set,byAll:new Set})).sort((e,t)=>Number(t.default)-Number(e.default)),m=Math.ceil(p.length/Po),h=Math.min(u,Math.max(0,m-1)),g=p.slice(h*Po,(h+1)*Po);return(0,Q.jsxs)(G,{title:`Select prompt`,onClose:t,className:`sp`,initialFocus:`.sp input[type=search]`,children:[(0,Q.jsx)(F,{noun:`prompts`,search:{label:`Search prompts`,placeholder:`Search prompts`,value:o,onChange:e=>{s(e),d(0)}},filters:[{key:`show`,label:`Show`,value:c,onChange:e=>{l(e),d(0)},options:ai}],count:{shown:p.length,total:f.length}}),r===null?(0,Q.jsx)(y,{label:`Prompts`,error:i,onRetry:()=>void a.refresh()}):f.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No prompts yet.`}):p.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No prompts match these filters.`}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`ul`,{className:`sp-list`,"aria-label":`Prompts`,children:g.map(t=>(0,Q.jsx)(`li`,{children:(0,Q.jsxs)(`button`,{type:`button`,className:`sp-pick`,onClick:()=>e(t),children:[(0,Q.jsxs)(`span`,{className:`sp-head`,children:[(0,Q.jsx)(`span`,{className:`sp-title`,children:Ve(t)}),t.default&&(0,Q.jsx)(`span`,{className:`pl-default`,children:`Default`})]}),(0,Q.jsx)(`span`,{className:`sp-text`,children:t.text.trim()||`—`}),(0,Q.jsxs)(`span`,{className:`sp-meta`,children:[(0,Q.jsx)(`span`,{children:t.useCount===1?`1 use`:`${t.useCount} uses`}),t.lastUsed&&(0,Q.jsxs)(`span`,{children:[`last `,ci(t.lastUsed)]}),(0,Q.jsxs)(`span`,{children:[`v`,t.version]})]})]})},t.id))}),m>1&&(0,Q.jsxs)(`div`,{className:`sp-pager`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,disabled:h===0,onClick:()=>d(h-1),children:`Back`}),(0,Q.jsxs)(`span`,{className:`sp-page`,children:[h+1,` of `,m]}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,disabled:h>=m-1,onClick:()=>d(h+1),children:`Forward`})]})]})]})}function Io(e){let t=s(),n=e.jobs.at(-1),r=ne(t.defaultKind()),i=t.outOf(n),a=t.outOf(r),o=e=>!T(e.type)||T(e.type).includes(a.kind),c=i.modifiers.filter(o);return c.length&&(r=t.withOut(r,{...a,modifiers:c})),ps(e,[...e.jobs.slice(0,-1),t.withOut(n,{...i,modifiers:i.modifiers.filter(e=>!o(e))}),r],()=>({type:`prompt`,prompt:``}))}function Lo(e,t){if(e.jobs.length<2)return e;let n=e.jobs.slice();if(t===n.length-1){let e=s(),r=e.outOf(n[t]),i=e.outOf(n[t-1]),a=r.modifiers.filter(e=>!T(e.type)||T(e.type).includes(i.kind)),o=[...i.modifiers,...a];n[t-1]=e.withOut(n[t-1],{...i,modifiers:o.length?o:d(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 Ro(e,t){let n={...structuredClone(e.jobs[t]),id:s().newId()};n.name=`${s().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 zo(e,t,n){let r=e.jobs.map((e,r)=>r===t?{...e,name:n.trim()}:e);return{...e,jobs:r}}function Bo(e,t,n){let r=s().outOf(e.jobs[t]);if(r.kind===n||!n)return e;let i=t===e.jobs.length-1,a=r.modifiers.filter(e=>!T(e.type)||T(e.type).includes(n));return{...e,jobs:e.jobs.map((e,r)=>r===t?s().withOut(e,{kind:n,...u(n),modifiers:i?a.length?a:d(n):[]}):e)}}var Vo=(e,t)=>({...e,evals:[...e.evals,t]}),Ho=(e,t)=>({...e,evals:e.evals.filter((e,n)=>n!==t)});function Uo(e,t,n){let r=t+n;if(r<0||r>=e.evals.length)return e;let i=e.evals.slice();return[i[t],i[r]]=[i[r],i[t]],{...e,evals:i}}var Wo=(e,t,n)=>({...e,evals:e.evals.map((e,r)=>r===t?{...e,name:n.trim()}:e)}),Go=(e,t,n)=>({...e,evals:e.evals.map((e,r)=>r===t?n:e)}),Ko=e=>e[0]?{id:e[0].id,name:e[0].name}:{id:``,name:``};function qo(e,t,n=``){let r=s(),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 Jo(e){let t=new Set(e.map(e=>e.trim().toLowerCase())),n=1;for(;t.has(`pipeline ${n}`);)n+=1;return`Pipeline ${n}`}var Yo={id:`samples`,name:`Sample library`};function Xo(e,t,n=``){let r=s().withContent({...s().blankPipeline({name:Jo([])}),evals:t?[s().newLink(t)]:[]},{type:`source`,ref:{...Yo},first:null,loops:1});if(t){let e=s();r={...r,jobs:[e.withTokens(e.withOut(r.jobs[0],{kind:`list`,...u(`list`),modifiers:[{type:`tidy`},{type:`dedupe`}]}),e.mappingsFor(n))]}}return r=qo(r,e,n),qo(r,e,n)}function Zo(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 Qo(e,t){let n={...structuredClone(e.targets[t]),id:s().newId(),name:`${s().targetLabel(e,t)} copy`};return{...e,targets:[...e.targets.slice(0,t+1),n,...e.targets.slice(t+1)]}}function $o(e,t){return{...e,targets:e.targets.filter((e,n)=>n!==t)}}function es(e,t,n){return{...e,targets:e.targets.map((e,r)=>r===t?{...e,name:n.trim()}:e)}}function ts(e,t,n,r){return n===0?{...e,targets:e.targets.map((e,n)=>n===t?{...e,profile:r??e.profile}:e)}:s().withTarget(e,t,n,e=>{if(r)return{...e,profile:r};let{profile:t,...n}=e;return n})}function ns(e,t,n,r){return s().withTarget(e,t,n,{prompt:r})}function rs(e,t,n,r,i){return s().withTarget(e,t,n,{prompt:r,from:{...i}})}function is(e,t){return new Set(e.jobs.flatMap((n,r)=>s().targetStepOf(e,t,r)?.from?.id??[]))}function as(e){let t=s().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 os(e,t,n,r){return fs(e,t,e=>e.map(e=>e.name===n?{...e,...r}:e))}function ss(e,t,n,r){let i=n.trim();return i?fs(e,t,e=>e.some(e=>e.name===i)?e:[...e,s().tokenMapping(i,r)]):e}function cs(e,t,n,r){let i=r.name.trim();return i?fs(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}:s().tokenMapping(i,r.type):e)):e}function ls(e,t,n){return fs(e,t,e=>e.filter(e=>e.name!==n))}var us=/^(?:text|reply|stage[1-9]\d*(?:\..*)?)$/;function ds(e,t,n,r){let i=n.trim();return i?/[{}\s]/.test(i)?`A name has no braces or spaces.`:us.test(i)?`{${i}} is filled in by the lab.`:i!==r&&s().tokensOf(e.jobs[t]).some(e=>e.name===i)?`{${i}} is already mapped.`:null:`A mapping needs a name.`}function fs(e,t,n){let r=s();return{...e,jobs:e.jobs.map((e,i)=>i===t?r.withTokens(e,n(r.tokensOf(e))):e)}}function ps(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 ms=(e,t)=>(s().targetsOf(e)[t]?.name||``).trim()||`Target ${t+1}`;function hs(e,t){let n=s().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 gs(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=s();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 _s(e,t,n,r,i){let a=ts(e,t,n,r),o=s();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=hs(c.type,s);l!==c.type&&(a=o.withTarget(a,t,n,e=>gs(a,n,e,l)))}),a}var vs=(e,t,n)=>({...e,jobs:e.jobs.map((e,r)=>r===t?s().withImage(e,n):e)});function ys(e,t,n){let r=s();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 bs(e,t){let n=s(),r=n.defaultKind(),i=n.outOf(e.jobs[t]).modifiers.filter(e=>!T(e.type)||T(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 xs(e,t){let n=s().outOf(e.jobs[t]).modifiers.filter(e=>!T(e.type)||T(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 Ss(e,t){let n=s().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 Cs({k:t,pipeline:n,sources:r,edit:i,offer:a}){let[o,c]=(0,q.useState)(!1),[l,u]=(0,q.useState)(null),d=s(),f=n.jobs[t],p=t===0?d.contentOf(n):null,m=d.flowStepOf(f),h=d.sendsImage(f),g=d.tokensOf(f),v=d.CONTENT_TYPES,y=d.targetsOf(n).some((e,r)=>d.STEP_TYPES[d.targetStepOf(n,r,t)?.type??``]?.asks===`request`)||t===0&&!!v[p?.type??``]?.inline,b=[...t>0?[{kind:`reply`}]:[],...p?[{kind:`attach`}]:[],...m?[{kind:`flow`}]:[],...h?[{kind:`image`}]:[],...g.map(e=>({kind:`mapping`,name:e.name}))],x=(e,t)=>{let r=n;i(t),a({label:e,restore:()=>i(r)})},S=(e,t)=>i(vs(d.withContent(n,e),0,t)),C=[...t===0&&!p?[{label:`Source…`,icon:W.add,onSelect:()=>c(!0)},{label:v.text?.label??`Text`,icon:W.add,onSelect:()=>S({type:`text`,text:``},!1)},{label:v.prompt?.label??`Prompt only`,icon:W.add,onSelect:()=>S({type:`prompt`},!1)}]:[],...!h&&!y?[{label:d.STEP_TYPES.attachImage?.label??`Image`,icon:W.add,onSelect:()=>i(vs(n,t,!0))}]:[],{label:`Token mapping`,icon:W.add,onSelect:()=>u({mode:`add`})}],w=e=>{e.kind===`attach`?x(`Removed the content`,d.withContent(n,null)):e.kind===`image`?x(`Stopped sending the image`,vs(n,t,!1)):e.kind===`mapping`&&x(`Removed {${e.name}}`,ls(n,t,e.name))},T=l?.mode===`edit`?g.find(e=>e.name===l.name):void 0,E=e=>{let r=n;l?.mode===`add`?i(ss(r,t,e.name,e.type)):T&&(i(cs(r,t,T.name,e)),e.type!==T.type&&T.value&&a({label:`Changed {${T.name}} to ${d.TOKEN_TYPES[e.type]?.label.toLowerCase()??e.type}`,restore:()=>i(r)})),u(null)},D=(e,a)=>{switch(e.kind){case`reply`:return[{key:`reply`,label:`${d.jobLabel(n,t-1)} reply`,locked:!0,control:{type:`static`,text:`Each target's ${_(d.outOf(n.jobs[t-1]).kind)}`}}];case`attach`:return[p?.type===`text`?{key:`attach`,label:d.STEP_TYPES.attachContent?.label??`Attach Content`,required:!0,actions:a,control:{type:`textarea`,value:p.text,placeholder:`The item every target is sent`,onChange:e=>i(d.withContent(n,{...p,text:e}))}}:{key:`attach`,label:d.STEP_TYPES.attachContent?.label??`Attach Content`,required:!0,actions:a,hint:v[p?.type??``]?.description,control:{type:`static`,text:Es(p,r)}}];case`flow`:return[{key:`flow`,label:d.STEP_TYPES.flowStep?.label??`Flow step`,required:!0,actions:a,control:{type:`static`,text:m?.step??``}},{key:`api`,label:`API`,required:!0,control:{type:`select`,value:m?.api??``,onChange:e=>i({...n,jobs:n.jobs.map((n,r)=>r===t?{...n,steps:n.steps.map(t=>t.type===`flowStep`?{...t,api:e}:t)}:n)}),options:Object.entries(d.HTTP_APIS).map(([e,t])=>({value:e,label:t.label}))}}];case`image`:return[{key:`image`,label:d.STEP_TYPES.attachImage?.label??`Attach Image`,required:!0,actions:a,control:{type:`static`,text:`Each item`}}];case`mapping`:{let r=g.find(t=>t.name===e.name),o=d.TOKEN_TYPES[r.type],s=o?.fields??[];return[{key:`mapping-${r.name}`,label:o?o.notation(r.name):`{${r.name}}`,code:!0,required:!0,control:s.includes(`value`)?{type:`text`,value:r.value??``,onChange:e=>i(os(n,t,r.name,{value:e}))}:{type:`static`,text:o?.label??r.type},...s.includes(`enabled`)?{enabled:{checked:!!r.enabled,onChange:e=>i(os(n,t,r.name,{enabled:e}))}}:{},actions:[{label:`Edit…`,icon:W.edit,onSelect:()=>u({mode:`edit`,name:r.name})},...a]}]}}},O=e=>e.kind===`reply`?`Job ${t+1} reply`:e.kind===`flow`?`Job ${t+1} flow step`:e.kind===`mapping`?`{${e.name}}`:e.kind===`attach`?`Content`:`Image`,A=b.map(e=>ws[e.kind](n,t,r)).join(`, `)||`none`;return(0,Q.jsxs)(k,{id:`job-${t}-content`,title:`Content`,level:3,note:A,children:[(0,Q.jsx)(P,{noun:`content`,items:b,onAdd:C,onRemove:e=>w(b[e]),locked:e=>e.kind===`reply`||e.kind===`flow`,extra:e=>e.kind===`attach`?[{label:`Change content`,icon:W.rename,onSelect:()=>c(!0)}]:[],empty:(0,Q.jsx)(`p`,{className:`note`,children:`No content`}),renderItem:(e,n,r)=>(0,Q.jsx)(`div`,{className:`stage-row`,id:e.kind===`mapping`?void 0:`job-${t}-${e.kind}`,children:(0,Q.jsx)(z,{label:O(e),rows:D(e,r)})},e.kind===`mapping`?`m-${e.name}`:e.kind)}),l&&(l.mode===`add`||T)&&(0,Q.jsx)(ie,{title:T?d.TOKEN_TYPES[T.type]?.notation(T.name)??`{${T.name}}`:`New mapping`,initial:T?{name:T.name,type:T.type}:{name:``,type:`value`},problem:e=>ds(n,t,e,T?.name),onSave:E,onClose:()=>u(null)},l.mode===`edit`?l.name:`add`),o&&(0,Q.jsxs)(G,{title:p?`Change content`:`Add content`,onClose:()=>c(!1),children:[(0,Q.jsx)($a,{mode:`pick`,onPick:t=>{S({type:`source`,ref:e(t.id,t.name),first:null,loops:1},d.sourceTypeOf(t)?.sendsImage??!1),c(!1)}}),(0,Q.jsxs)(`div`,{className:`pick-others`,children:[(0,Q.jsx)(`h2`,{className:`shead-title`,children:`Without a Source`}),(0,Q.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,onClick:()=>{S({type:`text`,text:``},!1),c(!1)},children:[(0,Q.jsx)(`span`,{children:v.text?.label??`Text`}),v.text?.description&&(0,Q.jsx)(`span`,{className:`pick-about`,children:v.text.description})]}),(0,Q.jsxs)(`button`,{type:`button`,className:`ghost pick-item`,onClick:()=>{S({type:`prompt`},!1),c(!1)},children:[(0,Q.jsx)(`span`,{children:v.prompt?.label??`Prompt only`}),v.prompt?.description&&(0,Q.jsx)(`span`,{className:`pick-about`,children:v.prompt.description})]})]})]})]})}var ws={reply:(e,t)=>`${s().jobLabel(e,t-1)}, ${_(s().outOf(e.jobs[t-1]).kind)}`,attach:(e,t,n)=>Es(s().contentOf(e),n),flow:(e,t)=>s().flowStepOf(e.jobs[t])?.step??``,image:()=>`image`,mapping:()=>`token mapping`},Ts=(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}`},Es=(e,t)=>e?e.type===`source`?Ts(e,t):s().CONTENT_TYPES[e.type]?.label??e.type:`none`;async function Ds(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 Os={prompt:{actions:js,summary:As},echo:{actions:js,summary:()=>`Each item`},httpRequest:{summary:e=>`${e.method} ${e.path}`,promptLabel:e=>Ms(e)?.fields.length?`Prompt`:`Body`,rows:Ps,actions:Ls}},ks=e=>Os[e??``]??Os.prompt;function As(e){return e.from?.name||e.prompt.split(`
|
|
11
|
+
`).find(e=>e.trim())?.trim()||`No prompt`}function js({pipeline:e,i:t,k:n,onSelectPrompt:r,onClearPrompt:i,defaultPrompt:a,onRevert:o}){let c=s().targetStepOf(e,t,n)?.prompt??``;return[{label:`Select prompt…`,icon:mt,onSelect:r},{label:`Clear prompt`,icon:W.clear,disabled:!c,onSelect:i},...o&&a!=null?[{label:`Revert to default`,icon:W.revert,disabled:c===a,onSelect:o}]:[]]}var Ms=e=>s().HTTP_APIS[e?.api??``],Ns=e=>{let t=Object.entries(e??{}).map(([e,t])=>`${e}=${t}`).join(`&`);return t?`?${t}`:``};function Ps(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(s().HTTP_APIS).map(([e,t])=>({value:e,label:t.label}))}:{type:`static`,text:Ms(e)?.label??n.api}},{key:`request`,label:`Request`,control:{type:`code`,text:`${n.method} ${n.path}${Ns(n.query)}`}},{key:`body`,label:`Template`,control:{type:`code`,text:JSON.stringify(n.body,null,2)}}],i=Ms(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 Fs(e){return JSON.stringify((Ms(e)??s().HTTP_APIS.raw).place(e.body,e),null,2)}function Is(e,t,n){let r=s().targetStepOf(e,t,n);if(!r)return``;let i=Ms(r),a=e.jobs[n],o=s().flowStepOf(a),c=s().readAsOf(a),l=s().contentOf(e),u=l?.type===`source`?l.ref.name:null,d=i?.cellOf(r.body),f=d?[`prompt`,`system`,`model`,`prefill`].filter(e=>(r[e]??``)!==(d[e]??``)).concat(Object.keys({...d.settings,...r.settings}).filter(e=>(r.settings?.[e]??``)!==(d.settings?.[e]??``))):[],p=[`In the Power Automate flow${u?` "${u}"`:``}, 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 f.length&&p.push(`What changes from the flow as it is: ${f.join(`, `)} (the lab's target "${ms(e,t)}").`),r.prefill&&p.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`+(c?` (${c})`:``)+` put ${JSON.stringify(r.prefill)} back in front of the text, for example with concat('${r.prefill.replace(/'/g,`''`)}', …).`),p.push(``,`Body:`,"```json",Fs(r),"```"),p.join(`
|
|
12
|
+
`)}function Ls({pipeline:e,i:t,k:n,say:r}){let i=s().targetStepOf(e,t,n);if(!i)return[];let a=async(e,t)=>r(await Ds(e)?`Copied ${t}.`:`Could not copy.`);return[{label:`Copy`,icon:f,onSelect:()=>void a(Fs(i),`the body`)},{label:`Copy as AI prompt`,icon:Dt,onSelect:()=>void a(Is(e,t,n),`the AI prompt`)}]}function Rs({label:e,profile:t,prompt:n,onPrompt:r,rows:i=[],promptLabel:a=`Prompt`}){return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(z,{label:`${e} setup`,rows:[{key:`profile`,label:`Target profile`,control:t},...i]}),(0,Q.jsxs)(`label`,{className:`prompt`,children:[(0,Q.jsx)(`span`,{className:`prop-name`,children:a}),(0,Q.jsx)(`textarea`,{value:n,"aria-label":`${e}, prompt`,rows:8,readOnly:!r,onChange:e=>r?.(e.target.value)})]})]})}function zs({run:e,i:t,onClose:n}){let r=s(),i=r.targetLabel(e,t),a=r.targetsOf(e)[t],o=t=>t&&(e.profiles?.[t.id]?.name||t.name)||`—`,c=e.jobs.length;return(0,Q.jsx)(V,{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}`,...c>1?{title:r.jobLabel(e,n)}:{},children:(0,Q.jsx)(Rs,{label:c>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:ks(t.type).rows?.(t)??[],promptLabel:ks(t.type).promptLabel?.(t)??`Prompt`})})),onClose:n})}function Bs({index:e}){return(0,Q.jsx)(`span`,{className:`target-badge`,"aria-hidden":`true`,children:String.fromCharCode(65+e)})}function Vs({k:e,pipeline:t,profiles:n,targetCap:r,onRequestRename:i,onAdd:a,onClone:o,onRemove:c,onProfile:l,onEcho:u,onPrompt:d,onStep:f,onSelectPrompt:p,onClearPrompt:m,defaultPrompt:h,onRevert:g,say:_=()=>{}}){let v=s(),y=v.targetsOf(t),b=y.length;return(0,Q.jsx)(k,{id:`job-${e}-targets`,title:`Targets`,level:3,note:`${b} ${b===1?`target`:`targets`}`,children:(0,Q.jsx)(P,{noun:`target`,items:y,min:1,max:r,onAdd:a,onClone:o,onRemove:c,onRename:i,extra:(n,r)=>ks(v.targetStepOf(t,r,e)?.type).actions?.({pipeline:t,i:r,k:e,say:_,onSelectPrompt:()=>p(r),onClearPrompt:()=>m(r),defaultPrompt:h,onRevert:g&&(()=>g(r))})??[],empty:(0,Q.jsx)(`p`,{className:`note`,children:`No targets`}),renderItem:(r,i,a)=>{let o=ms(t,i),s=v.targetStepOf(t,i,e)??{type:`prompt`,prompt:``},c=ks(s.type),p=v.STEP_TYPES[s.type],m=e>0&&!!p?.firstJobOnly,h=p?.local?null:s.profile??r.profile,g=h?n.find(e=>e.id===h.id)?.name||h.name||`—`:`No profile`;return(0,Q.jsxs)(`div`,{className:`target`,id:`job-${e}-target-${i}`,children:[(0,Q.jsxs)(`div`,{className:`target-head`,children:[(0,Q.jsx)(Bs,{index:i}),(0,Q.jsxs)(`span`,{className:`target-who`,children:[(0,Q.jsx)(`h4`,{className:`target-name`,children:o}),(0,Q.jsx)(`span`,{className:`target-profile`,children:g})]}),(0,Q.jsxs)(`span`,{className:`target-what`,children:[(0,Q.jsx)(`span`,{className:`target-type`,children:p?.label??s.type}),(0,Q.jsx)(`span`,{className:m?`target-value idle`:`target-value`,children:m?`Job 1 only`:c.summary?.(s)??s.prompt})]}),(0,Q.jsx)(se,{actions:a,label:`${o} actions`})]}),!m&&(0,Q.jsx)(Rs,{label:o,profile:e===0?{type:`select`,value:Us(s)?Hs:r.profile?.id??``,options:[...Ws(),...Gs(n,r.profile)],onChange:e=>e===Hs?u(i):l(i,Ks(n,e))}:{type:`select`,value:s.profile?.id??``,options:[{value:``,label:`Same as ${v.jobLabel(t,0)}`},...Gs(n,s.profile)],onChange:e=>l(i,e?Ks(n,e):null)},prompt:s.prompt,onPrompt:e=>d(i,e),rows:c.rows?.(s,e=>f(i,e))??[],promptLabel:c.promptLabel?.(s)??`Prompt`})]},`${i}-${e}`)}})})}var Hs=`#echo`,Us=e=>!!s().STEP_TYPES[e.type]?.local,Ws=()=>Object.entries(s().STEP_TYPES).filter(([,e])=>e.slot===`target`&&e.local).map(([,e])=>({value:Hs,label:e.label??`Echo`})),Gs=(e,t)=>[...t?.id&&!e.some(e=>e.id===t.id)?[{value:t.id,label:`${t.name||t.id} (missing)`}]:[],...e.map(e=>({value:e.id,label:e.name}))],Ks=(e,t)=>{let n=e.find(e=>e.id===t);return n?{id:n.id,name:n.name}:null};function qs({pipeline:e,profiles:t,sources:n,targetCap:r,prompt:i=``,defaultPrompt:a,protectedTerms:o,edit:l,offer:u}){let[d,f]=(0,q.useState)(null),[p,m]=(0,q.useState)(null),[h,g]=(0,q.useState)(null),_=(t,n)=>{let r=e;l(n),u({label:t,restore:()=>l(r)})},v=e=>{let n=t.find(t=>t.id===e);return n?s().CONNECTION_TYPES[s().typeOf(n)]?.answers??[`prompt`]:void 0},y=!s().targetsOf(e).length;return(0,Q.jsxs)(`div`,{className:`jobs`,children:[h&&(0,Q.jsx)(`p`,{className:`note`,role:`status`,children:h}),(0,Q.jsx)(P,{noun:`job`,items:e.jobs,min:1,addDisabled:y,onAdd:()=>l(Io(e)),onClone:t=>l(Ro(e,t)),onRemove:t=>_(`Removed ${s().jobLabel(e,t)}`,Lo(e,t)),onRename:e=>f({job:e}),renderItem:(d,p,h)=>{let y=`Job ${p+1}${d.name?.trim()?` - ${d.name.trim()}`:``}`,b=s().flowStepOf(d)?s().readAsOf(d):void 0;return(0,Q.jsxs)(q.Fragment,{children:[p>0&&(0,Q.jsxs)(`div`,{className:`job-reply`,"aria-hidden":`true`,children:[(0,Q.jsx)(c,{size:16}),(0,Q.jsx)(`span`,{children:`Reply`})]}),(0,Q.jsx)(k,{id:`job-${p}`,title:y,level:2,actions:h,note:Js(e,p),children:(0,Q.jsxs)(`div`,{className:`stages`,children:[(0,Q.jsx)(Cs,{k:p,pipeline:e,sources:n,edit:l,offer:u}),(0,Q.jsx)(Vs,{k:p,pipeline:e,profiles:t,targetCap:r,onRequestRename:e=>f({job:p,scenario:e}),onAdd:()=>l(qo(e,Ko(t),i)),onClone:t=>l(Qo(e,t)),onRemove:t=>_(`Removed ${ms(e,t)}`,$o(e,t)),onProfile:(t,n)=>l(_s(e,t,p,n,v)),onEcho:t=>l(Ss(e,t)),onPrompt:(t,n)=>l(ns(e,t,p,n)),onStep:(t,n)=>l(Ys(e,t,p,n)),say:g,onSelectPrompt:e=>m({i:e,k:p}),onClearPrompt:t=>_(`Cleared ${ms(e,t)}'s prompt`,ns(e,t,p,``)),...p===0&&a?{defaultPrompt:a.text,onRevert:t=>_(`Reverted ${ms(e,t)} to the default`,rs(e,t,0,a.text,{id:a.id,name:Ve(a)}))}:{}}),(0,Q.jsx)(H,{id:`job-${p}-responses`,out:s().outOf(d),format:!!s().replyOf(d),readAs:b,outputKinds:E(),modifiers:w(),onKind:t=>l(Bo(e,p,t)),onSetting:(t,n)=>l(Xs(e,p,e=>({...e,[t]:n}))),onAddFormat:()=>l(bs(e,p)),onRemoveFormat:()=>_(`Removed the format validation`,xs(e,p)),onReadAs:t=>t==null?_(`Removed Read as`,ys(e,p,null)):l(ys(e,p,t)),...o?{protectedTerms:o}:{},offer:u,onModifier:(t,n)=>l(Zs(e,p,t,n)),onAddModifier:t=>l(Xs(e,p,e=>({...e,modifiers:[...e.modifiers,t]}))),onRemoveModifier:t=>_(`Removed a modifier`,Xs(e,p,e=>({...e,modifiers:e.modifiers.filter((e,n)=>n!==t)})))})]})})]},d.id||p)}}),y&&(0,Q.jsx)(`p`,{className:`note add-why`,children:`Add a target first.`}),d&&`scenario`in d?(0,Q.jsx)(re,{title:`Rename ${ms(e,d.scenario)}`,value:s().targetsOf(e)[d.scenario]?.name??``,onCommit:t=>l(es(e,d.scenario,t)),onClose:()=>f(null)}):d?(0,Q.jsx)(re,{title:`Rename ${s().jobLabel(e,d.job)}`,value:e.jobs[d.job]?.name??``,onCommit:t=>l(zo(e,d.job,t)),onClose:()=>f(null)}):null,p&&(0,Q.jsx)(Fo,{onClose:()=>m(null),used:{byScenario:is(e,p.i),byAll:as(e)},onPick:t=>{let n=e;l(rs(n,p.i,p.k,t.text,{id:t.id,name:Ve(t)})),m(null),u({label:`Picked ${Ve(t)}`,restore:()=>l(n)})}})]})}function Js(e,t){let n=s(),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 Ys=(e,t,n,r)=>s().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}),Xs=(e,t,n)=>({...e,jobs:e.jobs.map((e,r)=>r===t?s().withOut(e,n(s().outOf(e))):e)}),Zs=(e,t,n,r)=>Xs(e,t,e=>({...e,modifiers:e.modifiers.map((e,t)=>t===n?r:e)})),Qs={group:{Editor:e=>(0,Q.jsx)(rc,{...e}),actions:(e,t,n)=>s().casesRef(e)&&n.length?[{label:`Edit…`,icon:W.edit,onSelect:()=>t(n[0].item)}]:[]}};function $s({pipeline:e,datasets:t,graded:n,edit:r,offer:i,openCaseEditor:a,children:o,profiles:c=[],labGrader:l=null}){let[u,d]=(0,q.useState)(!1),[f,p]=(0,q.useState)(null),m=e.evals,h=m.findIndex(e=>s().casesRef(e)),g=(t,n)=>{let a=e;r(t),i({label:n,restore:()=>r(a)})};return(0,Q.jsxs)(k,{id:`evals`,title:`Evals`,level:2,note:m.length?String(m.length):`None`,children:[(0,Q.jsx)(P,{noun:`eval`,items:m,empty:(0,Q.jsx)(`p`,{className:`note`,children:`No evals — the run is unscored.`}),onAdd:()=>d(!0),onRename:e=>p(e),onRemove:t=>g(Ho(e,t),`Removed ${s().evalLabel(e,t)}`),extra:(t,r)=>[...Qs[t.type]?.actions?.(t,a,n)??[],{label:`Move up`,icon:W.moveUp,disabled:r===0,onSelect:()=>g(Uo(e,r,-1),`Moved ${s().evalLabel(e,r)} up`)},{label:`Move down`,icon:W.moveDown,disabled:r===m.length-1,onSelect:()=>g(Uo(e,r,1),`Moved ${s().evalLabel(e,r)} down`)}],renderItem:(n,i,a)=>{let u=s().evalLabel(e,i),d=t=>r(Go(e,i,t));return(0,Q.jsxs)(k,{id:`eval-${i}`,title:u,level:3,note:s().EVAL_TYPES[n.type]?.label??n.type,about:s().EVAL_TYPES[n.type]?.description,actions:a,...f===i?{rename:{value:n.name||u,onCommit:t=>{r(Wo(e,i,t)),p(null)},onCancel:()=>p(null)}}:{},children:[(()=>{let r=Qs[n.type]?.Editor;return r?(0,Q.jsx)(r,{ev:n,label:u,set:d,datasets:t,profiles:c,labGrader:l,undoable:(t,n)=>g(Go(e,i,t),n)}):null})(),(0,Q.jsx)(z,{label:`${u} on failure`,rows:[{key:`continue`,label:`Continue on failure`,control:{type:`checkbox`,checked:n.continueOnFailure,onChange:e=>d({...n,continueOnFailure:e})}}]}),i===h&&o]},n.id)}}),u&&(0,Q.jsx)(nc,{pipeline:e,datasets:t,onClose:()=>d(!1),onAdd:t=>{r(Vo(e,t)),d(!1)}})]})}function ec(e,t,n,r=!1,i=`Dataset`,a=`—`){let o=e&&!t.some(t=>t.id===e.id)?[...t,e]:t;return{key:`dataset`,label:i,control:{type:`select`,value:e?.id??``,options:[...r?[{value:``,label:a}]:[],...o.map(e=>({value:e.id,label:e.name||e.id}))],onChange:e=>{let r=t.find(t=>t.id===e);n(r?{id:r.id,name:r.name}:null)}}}}function tc(e){let t=s().outOf(e.jobs.at(-1)).kind;return Object.entries(s().EVAL_TYPES).flatMap(([e,n])=>{let r=typeof n.accepts==`function`?n.accepts({type:e}):n.accepts,i=n.fields.includes(`group`);return r&&!r.includes(t)?[]:[{id:e,label:n.label,dataset:i}]})}function nc({pipeline:e,datasets:t,onAdd:n,onClose:r}){let i=tc(e),[a,o]=(0,q.useState)(i[0]?.id??``),[c,l]=(0,q.useState)(``),u=s().evalsDataset(e),[d,f]=(0,q.useState)(u??null),p=i.find(e=>e.id===a),m=[{key:`type`,label:`Type`,hint:s().EVAL_TYPES[a]?.description,control:{type:`select`,value:a,options:i.map(e=>({value:e.id,label:e.label})),onChange:o}},{key:`name`,label:`Name`,control:{type:`text`,value:c,placeholder:`Eval ${e.evals.length+1}`,onChange:l}},...p?.dataset&&t.length?[ec(d,t,f,!0,`Eval group`,`Own`)]:[]];return(0,Q.jsx)(V,{title:`Add eval`,...i.length?{}:{status:`No eval type reads what the last job answers with.`,statusBad:!0},sections:[{key:`eval`,rows:m}],focusRow:`type`,actions:[{label:`Add`,icon:W.add,disabled:!p,primary:!0,onSelect:()=>p&&n(p.dataset&&d?s().newLink(d,c.trim()):s().newEval(p.id,c.trim()))}],onClose:r})}function rc({ev:e,label:t,set:n,undoable:r,profiles:i,datasets:a,labGrader:o}){let c=s();if(!e.own)return(0,Q.jsx)(z,{label:t,rows:[ec(e.group,a,t=>t&&n({...e,group:t}),!1,`Eval group`)]});let l=e.own,u=c.isWholeRun(c.EVAL_TYPES.group,e),d=u?l.run:l.every,f=t=>n({...e,own:{...l,...t}}),p=t=>({...e,own:{...l,...u?{run:t}:{every:t}}}),m=d.some(e=>c.METRICS[e.type]?.graded),h=i.filter(e=>(c.CONNECTION_TYPES[e.type??``]?.answers??[`prompt`]).includes(`prompt`)),{mode:g,threshold:_}=l.scoring,v=[{key:`mode`,label:`Scored`,control:{type:`select`,value:g,options:[{value:`all`,label:`All must pass`},{value:`weighted`,label:`Weighted points`}],onChange:e=>f({scoring:{mode:e===`weighted`?`weighted`:`all`,threshold:e===`weighted`?_??1:_}})}},...g===`weighted`?[{key:`threshold`,label:`Pass at`,control:{type:`text`,size:`num`,value:_==null?``:String(_),onChange:e=>f({scoring:{mode:g,threshold:e.trim()?/^-?\d+(\.\d+)?$/.test(e.trim())?Number(e):e:null}})}}]:[],...l.casesFrom?[]:[{key:`over`,label:`Reads`,control:{type:`select`,value:u?`run`:`item`,options:[{value:`item`,label:`Each item`},{value:`run`,label:`Whole run`}],onChange:e=>f(e===`run`?{every:[],run:[...l.every,...l.run]}:{every:[...l.every,...l.run],run:[]})}}],...l.casesFrom?[ec(l.casesFrom,a,e=>f({casesFrom:e}),!0,`Cases from`)]:[],...m||l.grader?[{key:`grader`,label:`Grader`,control:{type:`select`,value:l.grader?.id??``,options:[{value:``,label:o?`Lab (${o.name})`:`—`},...h.map(e=>({value:e.id,label:e.name}))],onChange:e=>{let t=i.find(t=>t.id===e);f({grader:t?{id:t.id,name:t.name}:null})}}}]:[]];return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(z,{label:t,rows:v}),(0,Q.jsx)(Dr,{label:t,metrics:d,over:u?`run`:`item`,set:e=>n(p(e)),undoable:(e,t)=>r(p(e),t)})]})}function ic({pipeline:e,sourceFiles:t,graded:n,openCaseEditor:r}){let[i,a]=(0,q.useState)({graded:!1,todo:!0,missing:!0});if((s().evalsDataset(e)?.id??null)===null)return null;let o=t??[],c=new Set(n.map(e=>e.item)),l=new Set(o),u=[{key:`graded`,label:`Graded`,tone:`ok`,files:o.filter(e=>c.has(e))},{key:`todo`,label:`To do`,tone:`todo`,files:o.filter(e=>!c.has(e))},{key:`missing`,label:`Missing`,tone:`missing`,files:n.filter(e=>!l.has(e.item)).map(e=>e.item)}],d=u[0].files.length,f=u[1].files.length+u[2].files.length,p=u.filter(e=>i[e.key]).flatMap(e=>e.files.map(t=>({file:t,tone:e.tone})));return(0,Q.jsx)(k,{id:`mapping`,title:`Mapping`,level:3,note:m(),about:`Which of the content's items the dataset has a case for, and so which are graded.`,children:o.length?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`p`,{className:`note`,children:[hn(n.length,`case`),`. `,d,` of `,o.length,` content items matched.`]}),(0,Q.jsx)(`div`,{className:`mkey`,children:u.filter(e=>e.files.length).map(e=>(0,Q.jsxs)(`button`,{type:`button`,className:`ghost chip-key${i[e.key]?` on`:``}`,"aria-pressed":i[e.key],onClick:()=>a({...i,[e.key]:!i[e.key]}),children:[e.label,` `,e.files.length]},e.key))}),p.length?(0,Q.jsx)(`div`,{className:`mchips`,children:p.map(({file:e,tone:t})=>(0,Q.jsx)(`button`,{type:`button`,className:`mchip ${t}`,onClick:()=>r(e),children:e},`${t}-${e}`))}):(0,Q.jsx)(`p`,{className:`note`,children:f?`Nothing shown.`:`Every content item is graded.`})]}):(0,Q.jsx)(`p`,{className:`note`,children:`No items in the content to map against.`})});function m(){let r=s().contentOf(e),i=r?s().CONTENT_TYPES[r.type]:void 0;if(i?.inline)return i.label;let a=t??[],o=new Set(n.map(e=>e.item)),c=a.filter(e=>o.has(e)).length;return`${hn(n.length,`case`)}, ${c} of ${a.length} matched`}}function ac({pipeline:e,edit:t,comment:n,setComment:r,onClear:i,onCopyFailures:a}){let c=[{label:`Clear comment`,icon:o,destructive:!0,onSelect:i},{label:`Copy last run's failures`,icon:f,onSelect:a}],l=s().contentOf(e),u=l?.type===`source`?[{key:`first`,label:`Run first`,control:{type:`text`,value:l.first==null?``:String(l.first),placeholder:`all`,onChange:n=>t(s().withContent(e,{...l,first:n.trim()?oc(n):null}))}},{key:`loops`,label:`Loop`,control:{type:`text`,value:String(l.loops),placeholder:`1`,onChange:n=>t(s().withContent(e,{...l,loops:Math.max(1,oc(n)??1)}))}}]:[];return(0,Q.jsx)(k,{id:`control`,title:`Run settings`,level:2,actions:c,children:(0,Q.jsx)(z,{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 oc=e=>{let t=Number.parseInt(e,10);return Number.isNaN(t)?null:t};function sc(){let t=ye(),n=Y(),r=te(),{openRun:i}=Qt(),{openCaseEditor:a}=Ur(),[o,c]=be(`promptlab.workflows`),[l]=be(`promptlab.profiles`),[u,d]=be(`promptlab.comment`),[f]=be(`promptlab.versions`),[p,m]=(0,q.useState)([]),{list:h,error:g}=ze(),{list:_,error:v}=Ye(),b=_?.find(e=>e.default)??null,x=Re(),S=(0,q.useMemo)(()=>(h??[]).map(t=>e(t.id,t.name)),[h]),[C,w]=(0,q.useState)(4),[T,E]=(0,q.useState)(void 0),[D,k]=(0,q.useState)(null),[A,j]=(0,q.useState)(!1),[M,N]=(0,q.useState)(!1),[P,F]=(0,q.useState)(null),I=(0,q.useRef)(null),[L,ee]=(0,q.useState)(null),[R,z]=(0,q.useState)(!1),B=(0,q.useRef)(null);(0,q.useEffect)(()=>{let e=!0;return n.sources().then(t=>{e&&m(t.sources)}).catch(()=>{}),n.config().then(t=>{e&&w(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;!I.current&&t&&!Pn(t.status)&&(I.current=t.id),t&&t.id===I.current&&(F(t),Pn(t.status)||(i=1e3))}catch{}e&&(t=setTimeout(()=>void r(),i))};return r(),()=>{e=!1,t&&clearTimeout(t)}},[n]);let V=(0,q.useMemo)(()=>o.list.filter(e=>e.work?.version===13),[o.list]),ne=V.find(e=>e.id===o.at)??V[0],H=ne?.work,re=ne?.id??``,ie=H?s().evalsDataset(H)?.id??null:null,U=Be(ie),ae=U?.doc?.body.cases,oe=(0,q.useMemo)(()=>(ae??[]).map(e=>({id:e.id??``,item:s().caseItem(e)})),[ae]),W=U?.doc?.body.cases,se=(0,q.useMemo)(()=>[...new Set((W??[]).flatMap(e=>(e.metrics??[]).filter(e=>!e.not&&e.weight!==0&&(e.type===`contains-all`||e.type===`contains-any`)).flatMap(e=>s().metricLines(e.values))))],[W]),K=b?.text||H&&s().targetStepOf(H,s().targetsOf(H).length-1,0)?.prompt||``,ce=(0,q.useRef)(l.list);ce.current=l.list;let J=V.length?null:h?.[0]??null,le=h!==null||g!==null,ue=_!==null||v!==null,X=b?.text??``;(0,q.useEffect)(()=>{if(V.length||!le||!ue)return;let e=lc(ce.current,J?{id:J.id,name:J.name}:void 0,X);c({list:[e],at:e.id})},[V.length,c,le,ue,J,X]);let de=()=>{let e=x.list().list?.[0];return e?{id:e.id,name:e.name}:void 0},Z=(0,q.useRef)(o);Z.current=o;let fe=(0,q.useRef)(ne);fe.current=ne;let pe=(0,q.useRef)(H);pe.current=H;let me=(0,q.useRef)(null),he=(0,q.useRef)(null),ge=(0,q.useCallback)(()=>{he.current&&clearTimeout(he.current);let e=fe.current?.id,n=pe.current;e&&n&&(me.current={id:e,doc:n},he.current=setTimeout(()=>{let e=me.current;e&&Ne(t,`pipeline`,e.id,e.doc,`idle`)},ke))},[t]);(0,q.useEffect)(()=>()=>{he.current&&clearTimeout(he.current)},[]);let _e=(0,q.useCallback)(e=>{let t=Z.current,n=fe.current.id,r={...t,at:n,list:t.list.filter(e=>e.work?.version===13).map(t=>t.id===n?{...t,work:e}:t)};Z.current=r,c(r),ge(),k(null)},[c,ge]),ve=l.list[0]?.id??``;(0,q.useEffect)(()=>{let e=pe.current,t=fe.current?.id;if(!e||!t||!ve)return;let n=Zo(e,Ko(ce.current));if(n===e)return;let r=Z.current,i={...r,list:r.list.map(e=>e.id===t?{...e,work:n}:e)};Z.current=i,c(i)},[ve,re,c]),(0,q.useEffect)(()=>{let e=me.current;e&&e.id!==re&&(Ne(t,`pipeline`,e.id,e.doc,`idle`),me.current=null,he.current&&=(clearTimeout(he.current),null))},[re,t]);let xe=H?s().contentOf(H):null,Se=xe?.type===`source`?xe.ref.id:null;(0,q.useEffect)(()=>{if(Se===null){E(void 0);return}let e=!0;return n.source(Se).then(t=>{e&&E(t.files.map(e=>e.name))}).catch(()=>{}),()=>{e=!1}},[Se,n]);let Ce=(0,q.useCallback)(e=>{let t=p.find(t=>t.id===e);return t?{name:t.name,type:t.type,files:e===Se&&T?T:[]}:null},[p,Se,T]),we=(0,q.useMemo)(()=>{let e=l.list.find(e=>e.id===l.grader);return e?{id:e.id,name:e.name}:null},[l]),Te=(0,q.useMemo)(()=>{if(!H)return[];if(!l.list.length&&s().targetsOf(H).length)return[`add a Target profile first`];let e={profiles:e=>l.list.find(t=>t.id===e)??null,sources:Ce,grader:we,...h?{groups:h}:{}};return s().validatePipeline(H,e)},[H,l.list,Ce,h,we]),Ee=re?f.pipeline?.[re]??[]:[],De=(0,q.useCallback)(async()=>{let e=pe.current,r=fe.current.id;Ne(t,`pipeline`,r,e,`run`);let a=s().resolvePipeline(e,{profiles:e=>s().withSlugs(l.list).find(t=>t.id===e)??null,grader:we,...Se!==null&&T!==void 0?{files:T}:{},comment:u?.text??``});j(!0),k(null);try{let e=await n.submit(a);I.current=e.run.id,F(e.run),i(e.run.id,{at:e.run.submittedAt,from:`runs`})}catch(e){k(e instanceof Error?e.message:String(e)),I.current=null,F(null)}finally{j(!1)}},[n,u,Se,i,l.list,T,t,we]),Oe=(0,q.useCallback)(async()=>{let e=I.current;if(e)try{F((await n.cancel(e)).run)}catch{}},[n]),Ae=(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(s().failedScore))).map(e=>e.name??`an item`);t.length&&await navigator.clipboard?.writeText(t.join(`
|
|
13
|
+
`))}catch{}},[n]),je=(0,q.useCallback)(async e=>{let r=pe.current,i=fe.current.id;Ne(t,`pipeline`,i,r,`run`);let a=s().resolvePipeline(r,{profiles:e=>s().withSlugs(l.list).find(t=>t.id===e)??null,grader:we,files:[e],comment:u?.text??``}),o=await n.submit(a),c=o.run;for(;c.status===`queued`||c.status===`running`;)await new Promise(e=>setTimeout(e,500)),c=await n.run(o.run.id);return((c.results??[]).find(t=>t.name===e)?.scenarios??[]).map(e=>e.res??null)},[n,u,l.list,t]),Me=(0,q.useCallback)(e=>{ie&&a(e,{dataset:ie,files:T??[],run:je})},[a,T,je,ie]),Pe=(0,q.useCallback)(()=>{let e=u?.text??``;d({text:``}),r.offer({label:`Cleared the comment`,restore:()=>d({text:e})})},[u,d,r]),Fe=(0,q.useCallback)(()=>{let e=s().pipelineToYaml(pe.current,{profiles:ce.current});xr(new Blob([e],{type:`text/yaml`}),br(`pipeline`,pe.current.name||`pipeline`,13,`yml`))},[]),Ie=(0,q.useCallback)(async e=>{let t=pe.current,r={};for(let e of s().evalsOf(t)){let t=s().casesRef(e)?.id??null;if(t&&!r[t]){let e=await n.dataset(t);r[t]={name:e.name,body:e.body}}}let i=s().exportBundle(t,{profiles:ce.current,grader:we,datasets:r});if(`error`in i)throw Error(i.error);xr(await n.bundle({files:i.files,source:Se,items:e}),br(`ci`,t.name||`pipeline`,13,`zip`))},[n,Se,we]),Le=(0,q.useCallback)(async e=>{let t=await n.archivedRules().then(e=>e.rules,()=>({})),r=s().yamlToPipeline(e,{profiles:ce.current,profileType:e=>ce.current.find(t=>t.id===e)?.type,sources:p,groups:S,rulesFor:e=>t[e]??null});if(`error`in r){ee(r);return}let{doc:i,missing:a}=r,o={id:uc(),name:i.name||`Imported`,work:i},l={...Z.current,at:o.id,list:[...V,o]};Z.current=l,c(l),ee({doc:i,missing:a})},[n,V,c,p,S]);if(!ne||!H)return(0,Q.jsx)(`div`,{className:`runs`,children:(0,Q.jsx)(y,{label:`Pipelines`})});let Ve=e=>{let n=fe.current.id;Ne(t,`pipeline`,n,pe.current,`restore`),_e(e.doc),N(!1)};return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(Eo,{list:V,at:re,canRestore:Ee.length>0,onSelect:e=>c({...Z.current,at:e}),onNew:()=>{let e=cc(V.map(e=>e.name));if(c({...Z.current,list:[...V,e],at:e.id}),u?.text){let e=u.text;d({text:``}),r.offer({label:`Cleared the comment`,restore:()=>d({text:e})})}},onClone:()=>{let e={id:uc(),name:`${ne.name} copy`,work:structuredClone(H)};c({...Z.current,list:[...V,e],at:e.id})},onRename:e=>{let t=e.trim(),n=Z.current,r=fe.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)};Z.current=i,c(i),ge()},onDelete:()=>{let e=Z.current,t=V.filter(e=>e.id!==re),n=t.length?t:[lc(l.list,de(),X)],i=t.length?t[0].id:n[0].id;c({...Z.current,list:n,at:i}),r.offer({label:`Deleted ${ne.name||`the pipeline`}`,restore:()=>{Z.current=e,c(e)}})},onRestore:()=>N(!0),onExport:Fe,onExportCi:()=>z(!0),onImport:()=>B.current?.click()}),(0,Q.jsx)(ko,{problems:Te,error:D,run:P,submitting:A,onRun:()=>void De(),onStop:()=>void Oe(),onOpen:()=>{P&&i(P.id,{at:P.submittedAt,from:`runs`})}}),(0,Q.jsxs)(`div`,{className:`runs`,children:[(0,Q.jsx)(`input`,{ref:B,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(Le).catch(()=>ee({error:`the file could not be read`}))}}),(0,Q.jsx)(ac,{pipeline:H,edit:_e,comment:u?.text??``,setComment:e=>d({text:e}),onClear:Pe,onCopyFailures:()=>void Ae()}),(0,Q.jsx)(qs,{pipeline:H,profiles:l.list,sources:p,targetCap:C,prompt:K,...b?{defaultPrompt:b}:{},protectedTerms:se,edit:_e,offer:r.offer}),(0,Q.jsx)($s,{profiles:l.list,labGrader:we,pipeline:H,datasets:S,graded:oe,edit:_e,offer:r.offer,openCaseEditor:Me,children:(0,Q.jsx)(ic,{pipeline:H,sourceFiles:T,graded:oe,openCaseEditor:Me})}),(0,Q.jsx)(O,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss}),M&&(0,Q.jsx)(G,{title:`Restore pipeline`,onClose:()=>N(!1),children:(0,Q.jsxs)(`div`,{className:`version-list`,children:[Ee.length===0&&(0,Q.jsx)(`p`,{className:`note`,children:`No versions of this pipeline yet.`}),Ee.map((e,t)=>(0,Q.jsxs)(`div`,{className:`version-row`,children:[(0,Q.jsxs)(`span`,{className:`version-when`,children:[fc(e.at),`, `,dc(e.reason)]}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>Ve(e),children:`Restore`})]},`${e.at}-${t}`))]})}),R&&(0,Q.jsx)(Oo,{hasItems:Se!==null,onExport:Ie,onClose:()=>z(!1)}),L&&(`doc`in L?(0,Q.jsx)(G,{title:`Imported ${L.doc.name||`Untitled`}`,onClose:()=>ee(null),children:L.missing.length>0?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.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,Q.jsx)(`ul`,{className:`import-missing`,children:L.missing.map(e=>(0,Q.jsx)(`li`,{children:e},e))})]}):(0,Q.jsx)(`p`,{className:`note`,children:`Ready to run.`})}):(0,Q.jsx)(G,{title:`Nothing imported`,onClose:()=>ee(null),children:(0,Q.jsx)(`p`,{className:`note`,children:L.error})}))]})]})}var cc=e=>{let t=Jo(e),n=s().blankPipeline({name:t});return{id:uc(),name:t,work:{...n,jobs:n.jobs.map(e=>({...e,steps:[]}))}}},lc=(e,t,n)=>({id:uc(),name:Jo([]),work:Xo(Ko(e),t,n)}),uc=()=>`w${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`,dc=e=>e===`run`?`before a run`:e===`restore`?`before a restore`:e===`pack`?`before a pack update`:`after editing`,fc=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()},pc=e=>!!e.id&&Pn(e.status),mc=e=>`Queued ${mn(e.submittedAt)}`;async function hc(e,t){try{(await e.run(t)).status===`queued`&&await e.cancel(t)}catch{}}var gc=[``,`queued`,`running`,`done`,`cancelled`,`failed`,`incomplete`,`interrupted`],_c=e=>e.numeric?`hnum num`:void 0,vc=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)),yc=e=>e&&{before:e.submittedAt,beforeId:e.id};function bc(){let e=Y(),t=te(),{openRun:n}=Qt(),[i,a]=be(`promptlab.history.columns`),[c,u]=(0,q.useState)([]),[d,f]=(0,q.useState)(!1),[p,m]=(0,q.useState)(``),[h,g]=(0,q.useState)(new Set),[_,b]=(0,q.useState)(!1),[x,S]=(0,q.useState)(null),[C,w]=(0,q.useState)(null),[T,E]=(0,q.useState)(null),[D,A]=(0,q.useState)(null),[M,N]=(0,q.useState)(!1),[P,I]=(0,q.useState)(!1),[L,ee]=(0,q.useState)(!1),[z,B]=(0,q.useState)(!1),[V,ne]=(0,q.useState)(null),[H,re]=(0,q.useState)(0),ie=(0,q.useRef)(z);ie.current=z;let[U,ae]=(0,q.useState)(null),[oe,W]=(0,q.useState)(0),K=(0,q.useRef)(c);K.current=c;let ce=(0,q.useMemo)(()=>c.map(e=>_n(Jn(e),e)),[c]),J=(0,q.useMemo)(()=>Cc(i),[i]),le=(0,q.useCallback)(async(t,n=!1)=>{try{return await e.queue({limit:25,...t,...n?{full:n}:{}})}catch{return null}},[e]),ue=(0,q.useCallback)(e=>{let t=new Set(e.runs.map(e=>e.id));u(n=>vc([...n.filter(e=>!t.has(e.id)),...e.runs])),f(e.more)},[]);(0,q.useEffect)(()=>{let e=!0,t,n=async()=>{let r=await le();e&&(r?(ue(r),B(!0),ne(null)):ie.current||ne(`Runs not loaded: server unreachable.`),K.current.some(e=>[`queued`,`running`].includes(e.status))&&(t=setTimeout(()=>void n(),3e3)))};return n(),()=>{e=!1,t&&clearTimeout(t)}},[le,ue,H,oe]);let X=(0,q.useMemo)(()=>ce.filter(e=>!p||(e.status||`done`)===p),[ce,p]),de=(e=>({Runs:kn.filter(t=>e.Runs.has(t.key)),"Run Scenarios":An.filter(t=>e[`Run Scenarios`].has(t.key))}))(J),Z=(0,q.useCallback)(e=>{g(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),fe=(0,q.useCallback)((e,t)=>{n(e,{at:t,from:`history`})},[n]),pe=(0,q.useCallback)(async t=>{try{let n=await e.resume(t),r={runs:[n.run],more:K.current.length>25};ue(r),fe(t,n.run.submittedAt)}catch{}},[e,ue,fe]),me=(0,q.useCallback)(async n=>{A(null);try{let{run:r}=await e.rerunRun(n);ue({runs:[r],more:K.current.length>25}),ae(r.id),W(e=>e+1),t.offer({label:mc(r),restore:()=>void hc(e,r.id).then(()=>W(e=>e+1))})}catch(e){A(`Not re-run: ${e instanceof Error?e.message:`server unreachable`}.`)}},[e,ue,t]),he=e=>{let t=e.run?K.current.find(t=>t.id===e.run):void 0,n=[];return Dn(e)&&n.push({label:`Resume`,icon:bt,onSelect:()=>void pe(e.run)}),t&&pc(t)&&n.push({label:`Re-run`,icon:Ct,onSelect:()=>void me(t.id)}),n},ge=(0,q.useCallback)(async()=>{let n=K.current;ee(!0);try{await e.clear()}catch{A(`Not cleared: server unreachable.`);return}finally{ee(!1)}u([]),f(!1),t.offer({label:`Cleared ${hn(n.length,`run`)}`,restore:()=>{for(let t of n)e.submit(s().upgradePipeline(t.snapshot)).catch(()=>{})}})},[e,t]),_e=(0,q.useCallback)(async()=>{I(!0);let e=[],t=!1,n;for(let r=0;;r++){let i=await le(n,!0);if(!i){t=!0;break}if(e=vc([...e,...i.runs]),n=yc(i.runs.at(-1)),!i.more||!n||r>100)break}if(t){let t=new Set(e.map(e=>e.id));e=vc([...e,...K.current.filter(e=>!t.has(e.id))])}if(I(!1),!e.length){A(`Nothing to export yet.`);return}xr(new Blob([JSON.stringify({exported:new Date().toISOString(),runs:e},null,2)],{type:`application/json`}),br(`runs`,`all`,13,`json`)),A(t?`Exported ${hn(e.length,`run`)}. Server unreachable, so only those this browser had.`:`Exported ${hn(e.length,`run`)}.`)},[e,le]),ve=[{label:`Select Columns`,icon:tt,onSelect:()=>b(!0)},{label:`Export JSON`,icon:l,busy:P,onSelect:()=>void _e()},{label:`Clear`,icon:o,destructive:!0,busy:L,disabled:!z,onSelect:()=>void ge()}],ye=(0,q.useCallback)(e=>{let t=e.target.closest(`[data-openrun]`);if(t){e.stopPropagation();let n=t.closest(`tr[data-run]`),r=n?X[Number(n.getAttribute(`data-run`))]:null;r?.run&&fe(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?X[Number(t.getAttribute(`data-run`))]:null;r?.run&&w({id:r.run,comment:r.comment});return}let r=e.target.closest(`[data-scenario]`);if(r){e.stopPropagation();let t=r.closest(`tr[data-scen]`)?.previousElementSibling,n=t?X[Number(t.getAttribute(`data-run`))]:null,i=n?.run?K.current.find(e=>e.id===n.run):null;i?.snapshot&&E({run:i.snapshot,i:Number(r.getAttribute(`data-scenario`))});return}let i=e.target.closest(`[data-prof]`);if(i){e.stopPropagation();let t=i.closest(`tr[data-scen]`)?.previousElementSibling,n=t?X[Number(t.getAttribute(`data-run`))]:null,r=i.getAttribute(`data-prof`);if(n&&r!=null){let e=n.scenarios[Number(r)];S({name:e?.setupProfile?.name??``,settings:ln(n,e??{})})}}},[X,fe]),xe=(0,q.useCallback)((e,t)=>{u(n=>n.map(n=>n.id===e?{...n,snapshot:{...n.snapshot,comment:t}}:n)),w(null)},[]),Se=(e,t)=>e.image&&pn(t)!==!0?(0,Q.jsx)(`span`,{className:`note`,children:`—`}):e.get(t),Ce=(e,t,n,r)=>n?e.image&&pn(t)!==!0?(0,Q.jsx)(`span`,{className:`note`,children:`—`}):e.get(t,n,r):`—`;return(0,Q.jsxs)(`div`,{className:`history`,children:[(0,Q.jsxs)(k,{id:`history`,title:`History`,actions:ve,children:[!z&&(0,Q.jsx)(y,{label:`Runs`,error:V,onRetry:()=>{ne(null),re(e=>e+1)}}),z&&(ce.length>0||p)&&(0,Q.jsx)(F,{noun:`runs`,lead:X.length>0&&(0,Q.jsx)(`p`,{className:`note hstatus`,role:`status`,children:hn(X.length,`run`)}),filters:[{key:`show`,label:`Show`,value:p,onChange:m,options:gc.map(e=>({value:e,label:e?bn(e):`All`}))}]}),D&&(0,Q.jsx)(`p`,{className:`note hstatus`,role:`status`,children:D}),z?X.length?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`scrollx`,onClick:ye,children:(0,Q.jsx)(R,{className:`htable`,label:`Runs`,defaultSort:null,rows:X,rowKey:e=>e.at,rowProps:(e,t)=>({className:`runrow${h.has(e.at)?` open`:``}${e.run&&e.run===U?` fresh`:``}`,"data-run":t}),columns:[{key:`expand`,header:(0,Q.jsx)(`span`,{className:`hvh`,children:`Targets`}),label:``,className:`hexpand`,sort:null,cell:(e,t)=>{let n=h.has(e.at);return(0,Q.jsx)(`button`,{type:`button`,className:`icon-btn`,"aria-label":n?`Collapse`:`Expand`,"aria-expanded":n,"aria-controls":n?`hscen-${t}`:void 0,onClick:()=>Z(e.at),children:(0,Q.jsx)(v,{size:16,"aria-hidden":`true`})})}},...de.Runs.map(e=>({key:e.key,header:e.label,className:_c(e),sort:e.sort??(t=>j(e.get(t))),cell:t=>(0,Q.jsx)(`span`,{className:`hval`,children:Se(e,t)})})),{key:`actions`,header:(0,Q.jsx)(`span`,{className:`hvh`,children:`Actions`}),label:``,className:`hactions`,sort:null,cell:e=>{let t=he(e);return t.length?(0,Q.jsx)(se,{actions:t,label:`${mn(e.at)} actions`}):null}}],after:(e,t)=>h.has(e.at)&&(0,Q.jsx)(`tr`,{className:`scenrows`,id:`hscen-${t}`,"data-run":t,"data-scen":e.at,children:(0,Q.jsx)(`td`,{colSpan:de.Runs.length+2,children:(0,Q.jsx)(R,{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:de[`Run Scenarios`].map(t=>({key:t.key,header:t.label,className:_c(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 j(i)},cell:({sc:n,n:r})=>(0,Q.jsx)(`span`,{className:`hval`,children:Ce(t,e,n,r)})}))})})})})}),d&&(0,Q.jsxs)(`button`,{type:`button`,className:`ghost older-btn`,disabled:M,"aria-busy":M||void 0,onClick:async()=>{N(!0);let e=await le(yc(K.current.at(-1)));if(N(!1),!e){A(`Server unreachable.`);return}ue(e)},children:[M&&(0,Q.jsx)(r,{}),`Older`]})]}):(0,Q.jsx)(`p`,{className:`note`,children:D??(ce.length?`No runs match this filter.`:(0,Q.jsxs)(Q.Fragment,{children:[`No runs yet. `,(0,Q.jsx)(`a`,{href:`#/runs`,children:`Start one in Runs`})]}))}):null]}),(0,Q.jsx)(O,{undo:t.undo,onUndo:t.undoNow,onDismiss:t.dismiss}),_&&(0,Q.jsx)(Tc,{cols:J,onSave:e=>{a(wc(e)),b(!1)},onClose:()=>b(!1)}),T&&(0,Q.jsx)(zs,{run:T.run,i:T.i,onClose:()=>E(null)}),x&&(0,Q.jsx)(G,{title:x.name||`Settings`,onClose:()=>S(null),children:(0,Q.jsx)(xc,{settings:x.settings})}),C&&(0,Q.jsx)(Sc,{runId:C.id,comment:C.comment,onSaved:e=>xe(C.id,e),onClose:()=>w(null)})]})}function xc({settings:e}){let t=sn.filter(t=>String(e[t]??``)!==``).map(t=>({key:t,label:un(t),control:{type:`static`,text:dn(t,e[t])}}));return t.length?(0,Q.jsx)(z,{label:`Target profile`,rows:t}):(0,Q.jsx)(`p`,{className:`note`,children:`No settings recorded.`})}function Sc({runId:e,comment:t,onSaved:r,onClose:i}){let a=Y(),[o,s]=(0,q.useState)(t),[c,l]=(0,q.useState)(null),[u,d]=(0,q.useState)(!1);return(0,Q.jsx)(V,{title:`Run comment`,...c?{status:c,statusBad:!0}:{},sections:[{key:`comment`,rows:[{key:`comment`,label:`Comment`,control:{type:`text`,value:o,onChange:s,placeholder:`optional`}}]}],actions:[{label:`Save`,icon:n,busy:u,primary:!0,onSelect:async()=>{d(!0),l(null);try{await a.setComment(e,o),r(o)}catch{l(`Not saved: the server is unreachable.`),d(!1)}}}],focusRow:`comment`,onClose:i})}function Cc(e){let t=()=>({Runs:new Set(kn.filter(e=>e.on).map(e=>e.key)),"Run Scenarios":new Set(An.filter(e=>e.on).map(e=>e.key))});if(!e)return t();let n=t();for(let t of Nn){let r=t[0],i=e[r],a=new Set(t[1].map(e=>e.key)),o=e=>Mn[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 wc(e){return{Runs:{on:[...e.Runs],seen:kn.map(e=>e.key)},"Run Scenarios":{on:[...e[`Run Scenarios`]],seen:An.map(e=>e.key)}}}function Tc({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);return(0,Q.jsx)(G,{title:`Select Columns`,onClose:n,children:(0,Q.jsxs)(`div`,{className:`hcols`,children:[Nn.map(([e,t])=>(0,Q.jsxs)(`div`,{className:`groups`,children:[(0,Q.jsx)(`h3`,{children:jn[e]??e}),t.map(t=>(0,Q.jsxs)(`label`,{children:[(0,Q.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,Q.jsx)(`p`,{className:`note bad`,children:a}),(0,Q.jsxs)(`div`,{className:`hcols-actions`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:n,children:`Cancel`}),(0,Q.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`})]})]})})}var Ec=e=>!!e&&e.startsWith(`•held:`),Dc={"promptlab.workflows":{list:[],at:``},"promptlab.profiles":{list:[],at:``},"promptlab.comment":null,"promptlab.versions":Oc(),"promptlab.history.columns":null,"promptlab.tokens":null};function Oc(){return{pipeline:{},profile:{},dataset:{}}}var kc=[`promptlab.workflows`,`promptlab.profiles`,`promptlab.versions`,`promptlab.tokens`],Ac=[`px`,`format`,`quality`],jc=[{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`}],Mc={"image/jpeg":`JPEG`,"image/webp":`WebP`,"image/png":`PNG`},Nc=e=>Mc[e]??e.replace(`image/`,``).toUpperCase(),Pc={px:`921600`,quality:`0.92`};function Fc(e,t){let n=s().connectionImage({}).format,r=String(e.px??``),i=String(e.format??``),a=String(e.quality??``),o=(jc.some(e=>e.value===r)||!r?jc:[...jc,{value:r,label:s().budgetLabel(r)}]).map(e=>e.value===Pc.px?{value:``,label:e.label}:e),c=s().IMAGE_FORMATS.map(e=>e===n?{value:``,label:Nc(e)}:{value:e,label:Nc(e)}),l=(i||n)===`image/png`,u={type:`text`,value:a,onChange:t(`quality`),size:`num`,...l||a?{}:{placeholder:Pc.quality}};return[{key:`px`,label:`Resolution`,control:{type:`select`,value:r===Pc.px?``:r,options:o,onChange:t(`px`)}},{key:`format`,label:`Format`,control:{type:`select`,value:i===n?``:i,options:c,onChange:t(`format`)}},{key:`quality`,label:`Quality`,...l?{hint:`Unused for PNG`}:{},control:u}]}function Ic(e){let{px:t,format:n,quality:r}=s().connectionImage(e),i=n===`image/png`?``:` q${r??Pc.quality}`;return`${s().budgetLabel(t??Number(Pc.px))}, ${Nc(n)}${i}`}function Lc({offer:e}){let t=Y(),n=ye(),r=Re(),i=Je(),[a,o]=(0,q.useState)(null),[s,c]=(0,q.useState)(null),[l,u]=(0,q.useState)(null),[d,f]=(0,q.useState)(!1),p=(0,q.useRef)(null),m=e=>c({text:e instanceof Error?e.message:String(e),bad:!0}),h=(0,q.useCallback)(()=>{u(null),t.packs().then(e=>o(e.packs),e=>u(e instanceof Error?e.message:String(e)))},[t]);(0,q.useEffect)(h,[h]);let g=async()=>{await Promise.all([n.refresh(),r.refresh(),i.refresh()]),h()},_=async e=>{c({text:`Installing ${e.name}…`,bad:!1}),f(!0);try{let n=await t.installPack(e);await g();let r=(await t.packs()).packs.find(e=>e.id===n.pack),i=r?`${r.name} ${r.version}`:n.pack;c({text:n.installed?`Installed ${i}.`:`${i} is up to date.`,bad:!1})}catch(e){m(e)}finally{f(!1)}},v=async n=>{let r=[];try{for(let e of n)r.push((await t.removePack(e.id)).trash)}catch(e){m(e)}r.length&&(await g(),e({label:n.length===1?`Removed ${n[0].name}`:`Removed ${r.length} packs`,restore:()=>{(async()=>{for(let e of r)await t.restorePack(e);await g()})()}}))};return(0,Q.jsxs)(k,{id:`setup-packs`,title:`Packs`,note:a?Rc(a.length,`pack`):``,actions:[{label:`Install pack…`,icon:b,busy:d,onSelect:()=>p.current?.click()}],children:[a===null&&(0,Q.jsx)(y,{label:`Packs`,error:l,onRetry:h}),a&&!a.length&&(0,Q.jsx)(`p`,{className:`note`,children:`No packs installed.`}),a&&a.length>0&&(0,Q.jsx)(R,{className:`setup-table`,cards:!0,label:`Packs`,rows:a,rowKey:e=>e.id,select:{noun:`pack`,actions:e=>[{label:`Remove`,icon:W.remove,destructive:!0,onSelect:()=>void v(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=>zc(e)},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{label:`${e.name} actions`,actions:[{label:`Remove`,icon:W.remove,destructive:!0,onSelect:()=>void v([e])}]})}]}),s&&(0,Q.jsx)(`p`,{className:`note${s.bad?` bad`:``}`,role:s.bad?`alert`:`status`,children:s.text}),(0,Q.jsx)(`input`,{ref:p,type:`file`,accept:`.labpack,.zip,application/zip`,hidden:!0,"aria-label":`Install pack file`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&_(t)}})]})}var Rc=(e,t)=>`${e} ${t}${e===1?``:`s`}`,zc=e=>[Rc(e.datasets.length,`dataset`),Rc(e.pipelines.length,`pipeline`),Rc(e.sources.length,`source`),Rc(e.presets,`preset`)].join(`, `);function Bc({offer:e}){let t=Y(),[n,r]=(0,q.useState)(null),[i,a]=(0,q.useState)(null),[o,s]=(0,q.useState)(null),[c,l]=(0,q.useState)(!1),u=(0,q.useRef)(null),d=(0,q.useCallback)(()=>{s(null),t.plugins().then(e=>r(e.plugins),e=>s(e instanceof Error?e.message:String(e)))},[t]);(0,q.useEffect)(d,[d]);let f=async e=>{a(null),l(!0);try{let n=await t.installPlugin(e),i=(await t.plugins()).plugins;r(i);let o=i.find(e=>e.id===n.plugin);o&&n.installed&&await me(o),a({text:n.installed?Z[n.plugin]?`Installed ${n.plugin}, and it did not load: ${Z[n.plugin]}`:`Installed ${n.plugin}.`:`${n.plugin} is up to date.`,bad:!!Z[n.plugin]})}catch(e){a({text:e instanceof Error?e.message:String(e),bad:!0})}finally{l(!1)}},p=async n=>{let r=[];try{for(let e of n)r.push((await t.removePlugin(e.id)).trash)}catch(e){a({text:e instanceof Error?e.message:String(e),bad:!0})}d(),r.length&&e({label:n.length===1?`Removed ${n[0].id}`:`Removed ${r.length} plugins`,restore:()=>{Promise.all(r.map(e=>t.restorePlugin(e))).then(d)}})};return(0,Q.jsxs)(k,{id:`setup-plugins`,title:`Plugins`,note:n?`${n.length} ${n.length===1?`plugin`:`plugins`}`:``,actions:[{label:`Install plugin…`,icon:b,busy:c,onSelect:()=>u.current?.click()}],children:[n===null&&(0,Q.jsx)(y,{label:`Plugins`,error:o,onRetry:d}),n&&!n.length&&(0,Q.jsx)(`p`,{className:`note`,children:`No plugins installed.`}),n&&n.length>0&&(0,Q.jsx)(R,{className:`setup-table`,cards:!0,label:`Plugins`,rows:n,rowKey:e=>e.id,select:{noun:`plugin`,actions:e=>[{label:`Remove`,icon:W.remove,destructive:!0,onSelect:()=>void p(e)}]},columns:[{key:`id`,header:`Plugin`,role:`title`,cell:e=>e.id},{key:`version`,header:`Version`,cell:e=>e.version},{key:`sha`,header:`SHA-256`,sort:e=>e.sha256,cell:e=>(0,Q.jsx)(`code`,{title:e.sha256,children:e.sha256.slice(0,12)})},{key:`registers`,header:`Registers`,sort:e=>Vc(e),cell:e=>Vc(e)||`—`},{key:`state`,header:`State`,cell:e=>Hc(e)},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{label:`${e.id} actions`,actions:[{label:`Remove`,icon:W.remove,destructive:!0,onSelect:()=>void p([e])}]})}]}),i&&(0,Q.jsx)(`p`,{className:`note${i.bad?` bad`:``}`,role:i.bad?`alert`:`status`,children:i.text}),(0,Q.jsx)(`input`,{ref:u,type:`file`,accept:`.labplugin,.zip,application/zip`,hidden:!0,"aria-label":`Install plugin file`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&f(t)}})]})}var Vc=e=>[...e.registers.outputKinds??[],...e.registers.modifiers??[],...e.registers.evalTypes??[],...(e.registers.connectionTypes??[]).map(e=>e.id)].join(`, `),Hc=e=>Z[e.id]?`Failed: ${Z[e.id]}`:fe.has(e.id)?`Loaded`:`Not Loaded`,Uc={env:`Deployment`,lab:`Own`,default:`Default`};function Wc({cfg:e,editable:t,onClose:n,onProblem:r}){let i=Y(),a=e?.from===`lab`?e:null,[o,s]=(0,q.useState)(a?.clientId??``),[c,l]=(0,q.useState)(a?.tenant??``),[u,d]=(0,q.useState)(null),f=(0,q.useRef)(null),p=(0,q.useRef)(Promise.resolve()),m=(0,q.useRef)(!0),h=(0,q.useRef)(r);h.current=r;let g=(0,q.useCallback)(e=>{f.current=null,p.current=p.current.then(()=>i.setMicrosoft(e.clientId,e.tenant)).then(()=>{m.current&&d(null),Xi()}).catch(e=>{let t=e instanceof Error?e.message:String(e);m.current?d(t):h.current(`Microsoft 365: ${t}`)})},[i]);(0,q.useEffect)(()=>{if(!f.current)return;let e=setTimeout(()=>{f.current&&g(f.current)},600);return()=>clearTimeout(e)},[g,o,c]),(0,q.useEffect)(()=>(m.current=!0,()=>{m.current=!1,f.current&&g(f.current)}),[g]);let _=(e,t)=>n=>{f.current={clientId:o,tenant:c,...f.current,[e]:n},t(n)},v=!t,y=new URL(`/`,Wi()??window.location.href).href,b=[v?{key:`client`,label:`Client ID`,control:{type:`code`,text:e?.clientId??`—`}}:{key:`client`,label:`Client ID`,control:{type:`text`,value:o,onChange:_(`clientId`,s),size:`wide`,placeholder:e?.from==="default"?e.clientId:`00000000-0000-0000-0000-000000000000`}},v?{key:`tenant`,label:`Tenant`,control:{type:`code`,text:e?.tenant??`—`}}:{key:`tenant`,label:`Tenant`,control:{type:`text`,value:c,onChange:_(`tenant`,l),size:`wide`,placeholder:`00000000-0000-0000-0000-000000000000`}},{key:`redirect`,label:`Redirect URI`,control:{type:`code`,text:y}},{key:`app`,label:`App`,control:{type:`static`,text:e?.from?Uc[e.from]:`None`}}];return(0,Q.jsx)(V,{title:`Microsoft 365`,status:u??void 0,statusBad:!!u,focusRow:v?void 0:`client`,sections:[{key:`app`,rows:b}],onClose:n})}var Gc={env:`Deployment`,lab:`Own`,default:`Default`},Kc=`https://console.cloud.google.com/apis/credentials`,qc=[{value:`installed`,label:`Desktop app`},{value:`web`,label:`Web application`}],Jc={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.`},Yc=`/api/connections/google/callback`,Xc=()=>/^(localhost|127\.|\[::1\])/.test(window.location.hostname);function Zc(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 Qc({onClose:e,onProblem:t,onSaved:n}){let r=Y(),[i,a]=(0,q.useState)(void 0),[o,s]=(0,q.useState)(!0),[c,l]=(0,q.useState)(``),[u,d]=(0,q.useState)(``),[f,p]=(0,q.useState)(``),[m,h]=(0,q.useState)(Xc()?`installed`:`web`),[g,_]=(0,q.useState)(null),[v,y]=(0,q.useState)(null);(0,q.useEffect)(()=>{r.google().then(e=>{a(e.google),s(e.editable);let t=e.google?.from===`lab`?e.google:null;t&&(l(t.clientId),p(t.apiKey??``),h(t.clientType))},e=>{a(null),_(e instanceof Error?e.message:String(e))})},[r]);let b=(0,q.useRef)(null),x=(0,q.useRef)(Promise.resolve()),S=(0,q.useRef)(!0),C=(0,q.useRef)({onProblem:t,onSaved:n});C.current={onProblem:t,onSaved:n};let w=(0,q.useCallback)(e=>{b.current=null,x.current=x.current.then(()=>r.setGoogle(e)).then(e=>{S.current&&(_(null),a(e.google)),C.current.onSaved()}).catch(e=>{let t=e instanceof Error?e.message:String(e);S.current?_(t):C.current.onProblem(`Google Drive: ${t}`)})},[r]);(0,q.useEffect)(()=>{if(!b.current)return;let e=setTimeout(()=>{b.current&&w(b.current)},600);return()=>clearTimeout(e)},[w,c,u,f,m]),(0,q.useEffect)(()=>(S.current=!0,()=>{S.current=!1,b.current&&w(b.current)}),[w]);let T=(e,t)=>n=>{b.current={clientId:c,apiKey:f,clientType:m,...u?{clientSecret:u}:{},...b.current,[e]:n},t(n)},E=()=>{let e=document.createElement(`input`);e.type=`file`,e.accept=`.json,application/json`,e.onchange=()=>{let t=e.files?.[0];t&&D(t)},e.click()},D=async e=>{let t=Zc(await e.text());if(typeof t==`string`){_(t);return}let n={...t,apiKey:f};l(n.clientId),h(n.clientType),d(``),y(`Loaded the client file`),w(n)};if(i===void 0)return null;let O=!o,k=!!i?.hasSecret&&i.from!=="default",A=O?i?.clientType??`web`:m,j=O?[{key:`client`,label:`Client ID`,control:{type:`code`,text:i?.clientId??`—`}},{key:`secret`,label:`Client secret`,control:{type:`static`,text:i?.hasSecret?`Held`:`None`}},{key:`key`,label:`API key`,control:{type:`code`,text:i?.apiKey??`—`}},{key:`type`,label:`Type`,control:{type:`static`,text:qc.find(e=>e.value===A).label}}]:[{key:`client`,label:`Client ID`,control:{type:`text`,value:c,onChange:T(`clientId`,l),size:`wide`,placeholder:i?.from==="default"?i.clientId:`000000000000-….apps.googleusercontent.com`}},{key:`secret`,label:`Client secret`,control:{type:`secret`,value:u,onChange:T(`clientSecret`,e=>d(e??``)),...k?{placeholder:`Saved`}:{}}},{key:`key`,label:`API key`,control:{type:`text`,value:f,onChange:T(`apiKey`,p),size:`wide`,placeholder:`AIza…`}},{key:`type`,label:`Type`,hint:Jc[m],control:{type:`select`,value:m,options:qc,onChange:e=>T(`clientType`,h)(e)}}];return j.push({key:`redirect`,label:`Redirect URI`,control:A===`web`?{type:`code`,text:new URL(Yc,window.location.href).href}:{type:`static`,text:`Not Needed`}},{key:`app`,label:`App`,control:{type:`static`,text:i?.from?Gc[i.from]:`None`}}),(0,Q.jsx)(V,{title:`Google Drive`,status:g??v??void 0,statusBad:!!g,focusRow:O?void 0:`client`,sections:[{key:`app`,rows:j}],actions:[{label:`Google Cloud`,icon:rt,onSelect:()=>{window.open(Kc,`_blank`,`noopener`)}},...O?[]:[{label:`Load client file…`,icon:at,onSelect:E}]],onClose:e})}var $c=`microsoft`,el=`google`;function tl(){let e=Y(),{cfg:t,editable:n}=Zi(),[i,a]=(0,q.useState)(null),[o,s]=(0,q.useState)(null),[c,l]=(0,q.useState)(void 0),[u,d]=(0,q.useState)(null),f=(0,q.useCallback)(()=>{e.connections().then(e=>s(e.connections),()=>s([]))},[e]);(0,q.useEffect)(f,[f]),(0,q.useEffect)(()=>{if(!t){l(null);return}Hi(t).then(l,()=>l(null))},[t]);let p=[...o??[],...t||n?[{id:$c,label:`Microsoft 365`,configured:!!t,signedIn:!!c,account:c??null,problem:null}]:[]],m=async n=>{d(null);try{n.id===$c&&t?await Ki(t):window.location.assign((await e.signIn(n.id)).url)}catch(e){d(e instanceof Error?e.message:String(e))}},h=async n=>{d(null);try{n.id===$c&&t?(await qi(t),l(null)):s((await e.signOut(n.id)).connections)}catch(e){d(e instanceof Error?e.message:String(e))}};if(o===null)return(0,Q.jsx)(k,{id:`setup-connections`,title:`Connections`,children:(0,Q.jsx)(y,{label:`Connections`})});if(!p.length)return null;let g=p.filter(e=>e.problem);return(0,Q.jsxs)(k,{id:`setup-connections`,title:`Connections`,note:`${p.filter(e=>e.signedIn).length} of ${p.length}`,children:[(0,Q.jsx)(R,{className:`setup-table`,cards:!0,label:`Connections`,rows:p,rowKey:e=>e.id,columns:[{key:`label`,header:`Connection`,role:`title`,cell:e=>e.label},{key:`status`,header:`Status`,cell:e=>e.id===$c&&t&&c===void 0?(0,Q.jsxs)(`span`,{className:`loading-status`,children:[(0,Q.jsx)(r,{}),`Checking`]}):nl(e)},{key:`account`,header:`Account`,cell:e=>e.account||`—`},{key:`menu`,header:``,className:`ds-menu`,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{label:`${e.label} actions`,actions:[e.signedIn?{label:`Sign out`,icon:gt,onSelect:()=>void h(e)}:{label:`Sign in`,icon:ht,disabled:!e.configured,onSelect:()=>void m(e)},...e.id===$c||e.id===el?[{label:`Configure…`,icon:wt,onSelect:()=>a(e.id)}]:[]]})}]}),g.map(e=>(0,Q.jsxs)(`p`,{className:`note bad`,role:`alert`,children:[e.label,`: `,e.problem]},e.id)),u&&(0,Q.jsx)(`p`,{className:`note bad`,role:`alert`,children:u}),i===$c&&t!==void 0&&(0,Q.jsx)(Wc,{cfg:t,editable:n,onClose:()=>a(null),onProblem:d}),i===el&&(0,Q.jsx)(Qc,{onClose:()=>a(null),onProblem:d,onSaved:f})]})}var nl=e=>e.configured?e.signedIn?`Signed In`:`Signed Out`:`Not Configured`;function rl(){let e=ye(),n=Y(),r=te(),[i,a]=be(`promptlab.profiles`),[o]=be(`promptlab.versions`),[c,l]=(0,q.useState)(null),[u,d]=(0,q.useState)(null),[f,p]=(0,q.useState)(null),[m,h]=(0,q.useState)({}),[g,_]=(0,q.useState)(``),[v,y]=(0,q.useState)(``),[b,x]=(0,q.useState)(``),[S,C]=(0,q.useState)({key:`name`,dir:`asc`}),[w,T]=(0,q.useState)([]),[E,D]=(0,q.useState)({});(0,q.useEffect)(()=>{let e=!0;return n.presets().then(t=>{e&&T(t)}).catch(()=>{}),()=>{e=!1}},[n]);let A=(0,q.useRef)(i);A.current=i;let j=(0,q.useCallback)(e=>{let t=A.current,n={...t,list:t.list.map(t=>t.id===e.id?e:t)};A.current=n,a(n),P(e)},[a]),M=(0,q.useRef)(null),N=(0,q.useRef)(null),P=(0,q.useCallback)(t=>{N.current&&clearTimeout(N.current),M.current={p:t},N.current=setTimeout(()=>{let t=M.current;t&&Ne(e,`profile`,t.p.id,t.p,`idle`)},ke)},[e]);(0,q.useEffect)(()=>()=>{N.current&&clearTimeout(N.current)},[]);let I=(0,q.useCallback)(()=>{let e=A.current,t=Sl(e.list),n={...e,list:[...e.list,t],at:t.id};A.current=n,a(n),l({id:t.id,focus:`name`})},[a]),L=(0,q.useCallback)(e=>{let t=A.current.list.find(t=>t.id===e);if(!t)return;let n=`${t.name||`Profile`} copy`,r={...structuredClone(t),id:bl(),name:n,slug:xl(n,A.current.list),key:t.key},i={...A.current,list:[...A.current.list,r]};A.current=i,a(i)},[a]),ee=(0,q.useCallback)(e=>{let t=A.current,n=new Set(e),i=t.list.filter(e=>!n.has(e.id));if(!i.length||i.length===t.list.length)return;let o=n.has(t.at)?i[0].id:t.at,s={...t,list:i,at:o,...t.grader&&n.has(t.grader)?{grader:``}:{}};A.current=s,a(s),l(null);let c=t.list.filter(e=>n.has(e.id));r.offer({label:c.length===1?`Deleted ${c[0].name||`the profile`}`:`Removed ${c.length} profiles`,restore:()=>{A.current=t,a(t)}})},[a,r]),z=(0,q.useCallback)(e=>ee([e]),[ee]),B=(0,q.useCallback)(t=>{let n=t.doc.id,r=A.current.list.find(e=>e.id===n);r&&Ne(e,`profile`,n,r,`restore`);let i=A.current,o={...i,list:i.list.map(e=>e.id===n?t.doc:e)};A.current=o,a(o),V()},[e,a]),V=(0,q.useCallback)(()=>{d(e=>(e?.back&&l({id:e.id}),null))},[]),ne=(0,q.useCallback)(async e=>{let t=A.current.list.find(t=>t.id===e);if(!t)return;let r=s().CONNECTION_TYPES[t.type];if(r?.local){h(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?``:t.key,a=t.url.trim()||r?.url||`the lab's Ollama`,o=performance.now(),c=()=>Math.round(performance.now()-o),l=[];h(t=>({...t,[e]:{phase:`checking`,lines:[`Checking…`]}}));try{let o=Object.fromEntries((r?.settings??[]).map(e=>[e.key,String(t[e.key]??``)]));if(`testPath`in o&&!o.testPath.trim()){let e=r?.templates?.find(e=>ml(e.settings.url,t.url));e?.settings.testPath&&(o.testPath=e.settings.testPath)}let u=((await n.models({url:t.url,key:i,type:t.type,settings:o})).data||[]).map(e=>e.id).sort();if(D(t=>({...t,[e]:u})),l.push(`Reached ${a}.`,`${u.length} ${u.length===1?`model`:`models`}: ${u.join(`, `)||`none`}.`),(r?.answers??[`prompt`]).includes(`prompt`)){if(t.model.trim()){let e=s().apiBase(t.url||r?.url||``),a=s().connectionRequest(t,`hi`,null,e,i),o=await n.modelsAsk({url:t.url,key:i,type:t.type,body:a.body}),{raw:c}=s().connectionReply(t,o);l.push(``,`Asked ${t.model} “hi”; it replied:`,c||`(an empty reply)`)}else l.push(``,`No model is picked, so nothing was asked.`)}h(t=>({...t,[e]:{phase:`connected`,lines:l,ms:c()}}))}catch(t){l.push(...l.length?[``]:[],t instanceof Error?t.message:String(t)),h(t=>({...t,[e]:{phase:`error`,lines:l,ms:c()}}))}},[n]),H=c?i.list.find(e=>e.id===c.id):void 0,re=H?JSON.stringify([H.id,H.url,H.type,H.key]):``;(0,q.useEffect)(()=>{if(!H)return;let e=H;if(s().CONNECTION_TYPES[e.type]?.local||s().CONNECTION_TYPES[e.type]?.lists===!1)return;let t=s().CONNECTION_TYPES[e.type]?.keyless,r=!0,i=setTimeout(()=>{n.models({url:e.url,key:t?``:e.key,type:e.type,quiet:!0}).then(t=>{r&&D(n=>({...n,[e.id]:(t.data||[]).map(e=>e.id).sort()}))}).catch(()=>{r&&D(t=>({...t,[e.id]:[]}))})},400);return()=>{r=!1,clearTimeout(i)}},[n,re]);let ie=(0,q.useCallback)((e,t)=>{let n=A.current.list.find(t=>t.id===e);if(!n)return;let r={...n};for(let e of _l(n.type))r[e]=``;for(let[e,n]of Object.entries(t.opts))r[e]=n;A.current={...A.current,list:A.current.list.map(t=>t.id===e?r:t)},a(A.current),P(r)},[a,P]),U=(0,q.useCallback)(e=>{h(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return r})},[]),ae=(0,q.useCallback)((e,t,n)=>{let r=A.current.list.find(t=>t.id===e);if(r){if([`url`,`key`,`model`].includes(t)&&U(e),t===`name`){let t=A.current.list.filter(t=>t.id!==e);if(!r.slug||r.slug===xl(r.name,t)){j({...r,name:n,slug:xl(n,t)});return}}t===`slug`&&(n=n.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+/,``).slice(0,s().SLUG_MAX)),j({...r,[t]:n})}},[j,U]),oe=(0,q.useCallback)((e,t)=>{let n=A.current.list.find(t=>t.id===e);if(!n)return;let r={...n,type:t};U(e),D(t=>({...t,[e]:[]}));let i=s().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`,...Ac].includes(e)||vl(t).includes(e)||delete r[e];j(r)},[j,U]),se=(0,q.useCallback)((e,t)=>{l(t?{id:e,focus:t}:{id:e})},[]),G=(0,q.useCallback)(e=>o.profile?.[e]??[],[o]),K=c?i.list.find(e=>e.id===c.id)??null:null,ce=[...new Set(i.list.map(e=>e.type))],J=g.trim().toLowerCase(),le=i.list.filter(e=>(!v||e.type===v)&&(!b||b===`set`==!!e.key)&&(!J||[e.name,e.url,e.model].some(e=>String(e??``).toLowerCase().includes(J))));return(0,Q.jsxs)(`div`,{className:`setup`,children:[(0,Q.jsxs)(k,{id:`setup-profiles`,title:`Target profiles`,note:yl(i.list.length),children:[(0,Q.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.`}),i.list.length>0&&(0,Q.jsx)(F,{noun:`profiles`,search:{label:`Search profiles`,placeholder:`Name, address or model`,value:g,onChange:_},filters:[{key:`type`,label:`Type`,value:v,onChange:y,options:[{value:``,label:`All`},...ce.map(e=>({value:e,label:s().CONNECTION_TYPES[e]?.label??e}))]},{key:`key`,label:`Key`,value:b,onChange:x,options:[{value:``,label:`All`},{value:`set`,label:`Set`},{value:`unset`,label:`Not set`}]},{key:`sort`,label:`Sort`,value:S?.key??``,neutral:`name`,onChange:e=>C(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:le.length,total:i.list.length}}),i.list.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No profiles yet.`}):le.length===0?(0,Q.jsx)(`p`,{className:`note`,children:`No profiles match these filters.`}):(0,Q.jsx)(R,{className:`setup-table`,cards:!0,label:`Target profiles`,sort:S,onSort:C,rows:le,rowKey:e=>e.id,select:{noun:`profile`,label:e=>e.name||`Unnamed profile`,actions:e=>[{label:`Remove`,icon:W.remove,destructive:!0,disabled:e.length>=i.list.length,onSelect:()=>ee(e.map(e=>e.id))}]},rowProps:e=>({className:`setup-row`,onClick:t=>{t.target.closest(`button, a, .menu`)||se(e.id)}}),columns:il({tests:m,only:i.list.length===1,grader:i.grader??null,onGrader:e=>{let t=A.current,n={...t,grader:t.grader===e?``:e};A.current=n,a(n)},onOpen:se,onClone:L,onRemove:z,onTest:ne,onResult:e=>p({id:e,back:!1})})}),(0,Q.jsxs)(`button`,{type:`button`,className:`ghost add-btn`,onClick:I,children:[(0,Q.jsx)(t,{size:14,"aria-hidden":`true`}),`Add profile`]})]}),(0,Q.jsx)(tl,{}),(0,Q.jsx)(Bc,{offer:r.offer}),(0,Q.jsx)(Lc,{offer:r.offer}),(0,Q.jsx)(O,{undo:r.undo,onUndo:r.undoNow,onDismiss:r.dismiss}),K&&(0,Q.jsx)(al,{profile:K,slug:s().withSlugs(i.list).find(e=>e.id===K.id)?.slug??``,...c?.focus?{focus:c.focus}:{},test:m[K.id],models:E[K.id]??[],presets:w.filter(e=>(e.type??`llama.cpp`)===K.type),canRestore:!!G(K.id).length,onClose:()=>l(null),onSetting:ae,onType:oe,onTest:ne,onResult:()=>{l(null),p({id:K.id,back:!0})},onRestore:()=>{l(null),d({id:K.id,back:!0})},onApplyPreset:e=>ie(K.id,e)}),f&&m[f.id]&&(0,Q.jsx)(pl,{test:m[f.id],onClose:()=>{f.back&&l({id:f.id}),p(null)}}),u&&(0,Q.jsx)(dl,{versions:G(u.id),onClose:V,onRestore:B})]})}function il({tests:e,only:t,grader:n,onGrader:r,onOpen:i,onClone:a,onRemove:o,onTest:c,onResult:l}){let u=e=>e.name||`Unnamed profile`,d=l=>[{label:`Edit…`,icon:W.edit,onSelect:()=>i(l.id)},{label:`Rename…`,icon:W.rename,onSelect:()=>i(l.id,`name`)},{label:`Clone`,icon:W.clone,onSelect:()=>a(l.id)},{label:`Test connection`,icon:L,busy:e[l.id]?.phase===`checking`,onSelect:()=>void c(l.id)},...(s().CONNECTION_TYPES[l.type]?.answers??[`prompt`]).includes(`prompt`)&&!s().CONNECTION_TYPES[l.type]?.local?[{label:n===l.id?`Stop grading`:`Make grader`,icon:ft,onSelect:()=>r(l.id)}]:[],...t?[]:[{label:`Remove`,icon:W.remove,destructive:!0,onSelect:()=>o(l.id)}]];return[{key:`name`,header:`Profile`,role:`title`,sort:u,cell:t=>{let r=e[t.id];return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`button`,{type:`button`,className:`setup-open`,onClick:()=>i(t.id),children:u(t)}),n===t.id&&(0,Q.jsx)(`span`,{className:`setup-note`,children:`Grader`}),r&&(0,Q.jsx)(`button`,{type:`button`,className:`edit-outcome setup-note${r.phase===`error`?` bad`:``}`,"aria-label":`Test connection: ${fl[r.phase]}`,onClick:()=>l(t.id),children:fl[r.phase]})]})}},{key:`type`,header:`Type`,label:``,sort:e=>s().CONNECTION_TYPES[e.type]?.label??e.type,cell:e=>s().CONNECTION_TYPES[e.type]?.label??e.type},{key:`url`,header:`Address`,sort:e=>e.url.trim(),cell:e=>s().CONNECTION_TYPES[e.type]?.local?(0,Q.jsx)(`span`,{className:`setup-unset`,children:`—`}):e.url.trim()||(0,Q.jsx)(`span`,{className:`setup-unset`,children:`Default`})},{key:`model`,header:`Model`,sort:e=>e.model.trim(),cell:e=>s().CONNECTION_TYPES[e.type]?.local?(0,Q.jsx)(`span`,{className:`setup-unset`,children:`—`}):e.model.trim()||(0,Q.jsx)(`span`,{className:`setup-unset`,children:`Not set`})},{key:`key`,header:`Key`,sort:e=>e.key?`Set`:``,cell:e=>s().CONNECTION_TYPES[e.type]?.keyless?(0,Q.jsx)(`span`,{className:`setup-unset`,children:`—`}):e.key?`Set`:(0,Q.jsx)(`span`,{className:`setup-unset`,children:`Not set`})},{key:`menu`,header:``,label:``,className:`setup-menu`,role:`menu`,sort:null,cell:e=>(0,Q.jsx)(se,{actions:d(e),label:`${u(e)} actions`})}]}function al({profile:e,slug:t,focus:n,test:r,models:i,presets:a,canRestore:o,onClose:c,onSetting:l,onType:u,onTest:d,onResult:f,onRestore:p,onApplyPreset:h}){let g=s().CONNECTION_TYPES[e.type],_=(g?.answers??[`prompt`]).includes(`prompt`),v=(0,q.useMemo)(()=>ul(e),[e]),y=t=>n=>l(e.id,t,n),b=[{key:`name`,label:`Name`,required:!0,control:{type:`text`,value:e.name,onChange:y(`name`)}},{key:`slug`,label:`Slug`,required:!0,...e.slug&&s().slugOf(e.slug)!==t?{hint:`Taken`}:{},control:{type:`text`,value:e.slug??``,placeholder:t,onChange:y(`slug`)}},{key:`type`,label:`Type`,required:!0,hint:g?.description,control:{type:`select`,value:e.type,onChange:t=>u(e.id,t),options:Object.entries(s().CONNECTION_TYPES).filter(([t,n])=>n.picker!==!1||t===e.type).map(([e,t])=>({value:e,label:t.label}))}},...g?.local?[]:[{key:`url`,label:`Address`,control:{type:`text`,value:e.url,placeholder:g?.url??`the lab's Ollama`,onChange:y(`url`)}},...g?.keyless?[]:[{key:`key`,label:`Key`,control:{type:`secret`,value:Ec(e.key)?``:e.key,held:Ec(e.key),onChange:y(`key`)}}],..._?[{key:`model`,label:`Model`,control:gl(e.model,i,y(`model`))}]:[]]],x=(g?.settings??[]).map(t=>ol(e,t,y(t.key))),S=[{key:`identity`,rows:b},...x.length?[{key:`settings`,title:`Settings`,rows:x}]:[],...g?.local||!_?[]:[{key:`image`,title:`Image`,rows:Fc(e,y)},{key:`debug`,title:`Debug`,rows:v,folded:!0}]],C=[{label:`Restore…`,icon:m,disabled:!o,onSelect:p},...a.map(e=>({label:`Apply preset: ${e.label}`,icon:W.preset,onSelect:()=>h(e)})),...(g?.templates??[]).map(t=>({label:`Apply template: ${t.label}`,icon:W.preset,onSelect:()=>h({id:t.id,label:t.label,type:e.type,opts:t.settings})}))];return(0,Q.jsx)(V,{title:e.name||`Unnamed profile`,...n?{focusRow:n}:{},sections:S,menu:C,actions:g?.tests===!1?[]:[{label:`Test connection`,icon:L,busy:r?.phase===`checking`,onSelect:()=>d(e.id),outcome:r?{label:fl[r.phase],bad:r.phase===`error`,onOpen:f}:void 0}],onClose:c})}function ol(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:cl(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 sl=`424242`;function cl(e,t){let n=s().apiBase(e.url),r,i;try{r=ll(s().connectionRequest({...e,[t]:``},`(prompt)`,null,n).body),i=ll(s().connectionRequest({...e,[t]:sl},`(prompt)`,null,n).body)}catch{return null}let a=Object.keys(i).find(e=>i[e]===sl||i[e]===JSON.stringify(sl));if(a===void 0)return null;let o=i[a]===sl,c=a in r?JSON.parse(r[a]):null;return c===null?{numeric:o}:{placeholder:String(c),numeric:o}}function ll(e,t=``,n={}){if(e&&typeof e==`object`&&!Array.isArray(e))for(let[r,i]of Object.entries(e))ll(i,t?`${t}.${r}`:r,n);else n[t]=JSON.stringify(e)??`null`;return n}function ul(e){let t=s().apiBase(e.url),n=[];try{let{url:r,body:i}=s().connectionRequest(e,`(prompt)`,null,t);n.push({key:`endpoint`,label:`Endpoint`,required:!0,control:{type:`code`,text:r}});let a=i,o=a.messages,c=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(c).slice(0,40)}}),n.push({key:`image`,label:`Image`,required:!0,control:{type:`code`,text:Ic(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 dl({versions:e,onClose:t,onRestore:n}){return(0,Q.jsx)(G,{title:`Restore profile`,onClose:t,children:(0,Q.jsxs)(`div`,{className:`version-list`,children:[e.length===0&&(0,Q.jsx)(`p`,{className:`note`,children:`No versions of this profile yet.`}),e.map((e,t)=>(0,Q.jsxs)(`div`,{className:`version-row`,children:[(0,Q.jsxs)(`span`,{className:`version-when`,children:[wl(e.at),`, `,Cl(e.reason)]}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>n(e),children:`Restore`})]},`${e.at}-${t}`))]})})}var fl={checking:`Checking…`,connected:`Connected`,error:`Error`};function pl({test:e,onClose:t}){return(0,Q.jsx)(V,{title:`Test connection`,sections:[{key:`result`,rows:[{key:`time`,label:`Time`,required:!0,control:{type:`static`,text:e.ms==null?`—`:hl(e.ms)}},{key:`result`,label:`Result`,required:!0,control:{type:`textarea`,value:e.lines.join(`
|
|
14
|
+
`)}}]}],onClose:t})}function ml(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 hl=e=>e<1e3?`${e} ms`:`${(e/1e3).toFixed(1)}s`;function gl(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 _l(e){return s().CONNECTION_TYPES[e]?.settings.map(e=>e.key).filter(e=>e!==`temperature`)??[]}function vl(e){return s().CONNECTION_TYPES[e]?.settings.map(e=>e.key)??[]}var yl=e=>e===1?`1 profile`:`${e} profiles`,bl=()=>`p${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,xl=(e,t)=>s().uniqueSlug(s().slugOf(e),new Set(s().withSlugs(t).map(e=>e.slug))),Sl=e=>({id:bl(),name:`New profile`,slug:xl(`New profile`,e),url:``,model:``,key:``,temperature:``,nPredict:``,maxTokens:``,type:`ollama`}),Cl=e=>e===`run`?`before a run`:e===`restore`?`before a restore`:`after editing`,wl=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()},Tl=[];function El(e,t){let n=Y(),[r,i]=(0,q.useState)(null);(0,q.useEffect)(()=>{if(t===null)return;let r=!0,a=Se(n);return a.runDataset(e).then(n=>{if(n){r&&i({run:e,cases:s().upgradeDatasetBody(n).cases,current:!1});return}return a.dataset(t).then(t=>{r&&i({run:e,cases:s().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:Tl,current:a?.current??!1}}function Dl(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=>s().metricLines(e.values)),forbidden:t.filter(e=>e.not&&e.type===`contains`).map(e=>({value:String(e.value??``),except:s().metricLines(e.except)}))}}var Ol=e=>e==null?`—`:Cn(e);function kl(e){return e?.transcript||[]}function Al(e,t){return t.flatMap((n,r)=>{let i=kl(e?.scenarios?.[r]?.res);return t.length>1?i.map(e=>({...e,scenario:n.name})):i})}function jl({stages:e}){if(!e.length)return null;let t=!e.some(e=>e.scenario)&&e.length>1?`, ${e.map(e=>Ol(e.ms)).join(` + `)}`:``;return(0,Q.jsxs)(`div`,{className:`transcript`,children:[(0,Q.jsxs)(`div`,{className:`meta`,children:[`Transcript`,t]}),e.map((e,t)=>(0,Q.jsxs)(`pre`,{children:[(0,Q.jsxs)(`b`,{children:[e.scenario?`${e.scenario}, `:``,`job `,e.n,` `,e.withImage?`(with image)`:`(text only)`,e.kind?`, ${e.kind}`:``,e.conn?`, ${e.conn}`:``,`, `,Ol(e.ms),` — sent`]}),`
|
|
15
|
+
`,e.sent,`
|
|
16
|
+
`,(0,Q.jsx)(`b`,{children:`— returned`}),`
|
|
17
|
+
`,e.got||(e.error?`(nothing)`:``),e.error?`\n<b className="fault">Error - ${e.error}</b>`:``]},t))]})}function Ml({text:e,kind:t}){return(0,Q.jsx)(`span`,{className:`term${t?` ${t}`:``}`,children:e})}function Nl({res:e,kase:t}){let n=e?.dropped||[];if(!n.length)return null;let r=e=>t?Dl(t).wanted.some(t=>s().termIn([e],t)):!1;return(0,Q.jsxs)(`details`,{className:`dropped`,children:[(0,Q.jsxs)(`summary`,{children:[`Dropped `,n.length]}),n.map((e,t)=>(0,Q.jsxs)(`div`,{className:`droppedrow`,children:[(0,Q.jsx)(Ml,{text:e.item,kind:`no`}),(0,Q.jsxs)(`span`,{className:`note`,children:[e.by,r(e.item)&&(0,Q.jsx)(`b`,{className:`fault`,children:`, wanted`})]})]},t))]})}function Pl({kase:e}){return(0,Q.jsx)(Q.Fragment,{children:(e.metrics??[]).map((e,t)=>(0,Q.jsx)(`div`,{className:`wants${e.weight===0?` watched`:``}`,children:ur(e)},t))})}var Fl=e=>e?.transcript?.at(-1)?.kind===`text`;function Il({res:e}){return e?.error?(0,Q.jsx)(`span`,{className:`err`,children:e.error}):Fl(e)?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`pre`,{children:e?.transcript?.at(-1)?.got||`(empty)`}),(0,Q.jsx)(`div`,{className:`meta`,children:Ol(e?.ms)})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`chips`,children:(e?.terms||[]).map((e,t)=>(0,Q.jsx)(Ml,{text:String(e)},t))}),(0,Q.jsx)(Nl,{res:e,kase:null}),(0,Q.jsxs)(`div`,{className:`meta`,children:[(e?.terms||[]).length,` items, `,Ol(e?.ms)]})]})}function Ll({res:e}){if(e?.error)return(0,Q.jsx)(`span`,{className:`err`,children:e.error});let t=e?.transcript?.at(-1)?.got??e?.raw??``;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`pre`,{children:t||`(empty)`}),(0,Q.jsxs)(`div`,{className:`meta`,children:[Ol(e?.ms),`, `,Fl(e)?`answered as text`:`read as ${(e?.terms||[]).length} items`]})]})}function Rl({tab:e,undo:t}){let n=Y(),i=te(),a=t??i,{setShow:o,openRun:c,closeRun:l}=Qt(),{openCaseEditor:u}=Ur(),[d,p]=(0,q.useState)(null),[m,h]=(0,q.useState)(!1),[_,v]=(0,q.useState)(null),[b,x]=(0,q.useState)(new Set),[S,C]=(0,q.useState)(!1),[w,T]=(0,q.useState)(null),[E,D]=(0,q.useState)(null),[O,A]=(0,q.useState)(0),[j,M]=(0,q.useState)(null);(0,q.useEffect)(()=>{let t=!0,r=!1,i,a=async()=>{try{let o=await n.run(e.id);if(!t)return;r=!0,p(o),D(null),Pn(o.status)||(i=setTimeout(()=>void a(),1e3))}catch(e){if(!t)return;r?i=setTimeout(()=>void a(),1e3):D(e instanceof ge?e.message:`Run not loaded: server unreachable.`)}};return a(),()=>{t=!1,i&&clearTimeout(i)}},[n,e.id,O]);let N=(0,q.useMemo)(()=>d?qn(d):null,[d]),P=N?s().evalsDataset(N.snapshot)?.id??null:null,I=El(e.id,P),L=(0,q.useMemo)(()=>new Map(I.cases.map(e=>[s().caseItem(e),e])),[I.cases]),ee=(0,q.useCallback)(async()=>{M(null);try{let{run:t}=await n.rerunRun(e.id);c(t.id,{at:t.submittedAt,from:e.from}),a.offer({label:mc(t),restore:()=>{hc(n,t.id),l(t.id)}})}catch(e){M(`Not re-run: ${e instanceof Error?e.message:`server unreachable`}.`)}},[n,e.id,e.from,c,l,a]),z=(0,q.useCallback)(async()=>{h(!0);try{await n.cancel(e.id)}catch{}h(!1)},[n,e.id]);if(!N)return(0,Q.jsx)(k,{id:`run-${e.id}`,title:mn(e.at)||`Run`,children:(0,Q.jsx)(y,{label:`Run`,error:E,onRetry:()=>{D(null),A(e=>e+1)}})});let B=N.progress,V=B.n??B.total??0,ne=!Pn(N.status),H=B.total&&V!=null&&ne?Math.round(V/B.total*100):null,re=mr(N,I.cases),ie=N.scenarios.map((e,t)=>gr(N,I.cases,t)),U=rr(N),ae=(e,t,n)=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t),n(r)},oe=async(e,t,n)=>{let r=Math.max(0,N.scenarios.findIndex((t,n)=>Vn(N,e,n))),i=(t.scenarios??[])[r]?.res;i&&await Ds(dr(N.snapshot,n,i,r))&&(C(!0),setTimeout(()=>C(!1),1600))},G=async()=>{await Ds(re.map(e=>dr(N.snapshot,e.kase,e.res,e.scenarioIndex)).join(`
|
|
18
|
+
|
|
19
|
+
`+`-`.repeat(60)+`
|
|
20
|
+
|
|
21
|
+
`))&&(C(!0),setTimeout(()=>C(!1),1600))},K=[...re.length?[{label:`Copy all failures`,icon:f,onSelect:()=>void G()}]:[],...d&&pc(d)?[{label:`Re-run`,icon:Ct,onSelect:()=>void ee()}]:[]],ce={key:`show`,label:`Show`,value:e.show,onChange:t=>o(e.id,t),options:[{value:`all`,label:`All`},{value:`failed`,label:`Failed`}]},J=!!P,le=N.evals.find(e=>s().casesRef(e))?.id??null,ue=!!(N.content&&s().CONTENT_TYPES[N.content.type]?.inline),X=e=>{let t=N.results[e]?.name;return t?L.get(t):void 0},de=t=>{let r=N.results[t],i=X(t),a=!!r&&!r.unrun&&Pn(N.status),o=(r?.scenarios??[]).some(e=>e?.res?.transcript?.length),s=[];return o&&s.push({label:`Show details`,icon:g,onSelect:()=>ae(b,t,x)}),a&&r?.name&&i&&s.push({label:`Edit case`,icon:W.edit,onSelect:()=>P&&u(r.name,{dataset:P,resultFor:e=>N.results[t]?.scenarios?.[e]?.res??null,scenarioCount:N.scenarios.length,files:N.results.filter(e=>e.kind!==`text`).map(e=>e.name??``)})}),a&&N.id&&s.push({label:`Re-run row`,icon:bt,onSelect:()=>void n.rerun(e.id,t).then(e=>p(e.run)).catch(()=>{})}),a&&i&&zl(N,t)&&s.push({label:`Copy as AI prompt`,icon:f,onSelect:()=>void oe(t,r,i)}),s};return(0,Q.jsxs)(`div`,{className:`runview`,children:[(0,Q.jsxs)(k,{id:`run-${e.id}`,title:N.name||mn(e.at),actions:K,children:[(0,Q.jsxs)(`div`,{className:`runhead`,children:[U&&(0,Q.jsxs)(`span`,{className:`note run-queue`,children:[(0,Q.jsx)(`span`,{className:`run-state`,children:U.state}),U.detail&&(0,Q.jsx)(`span`,{className:`run-item`,children:U.detail})]}),ne&&(0,Q.jsxs)(`button`,{type:`button`,className:`ghost stop-btn`,disabled:m,onClick:()=>void z(),children:[m?(0,Q.jsx)(r,{}):(0,Q.jsx)(et,{size:14,"aria-hidden":`true`}),`Stop`]})]}),ne&&(0,Q.jsx)(`div`,{className:`rrbar`,children:H==null?(0,Q.jsx)(`span`,{className:`rrprogress`,children:`Waiting`}):(0,Q.jsxs)(`div`,{className:`rrmeter`,role:`progressbar`,"aria-valuenow":H,"aria-valuemin":0,"aria-valuemax":100,children:[(0,Q.jsx)(`div`,{className:`rrbarfill`,style:{width:`${H}%`}}),(0,Q.jsxs)(`span`,{className:`rrpct`,style:{"--pct":`${H}%`},children:[H,`%`]})]})}),d?.rerunOf&&(0,Q.jsxs)(`p`,{className:`note rrorigin`,children:[`Re-run of`,` `,d.rerunOfAt?(0,Q.jsx)(`a`,{href:`#`,onClick:t=>{t.preventDefault(),c(d.rerunOf,{at:d.rerunOfAt,from:e.from})},children:mn(d.rerunOfAt)}):`a cleared run`]}),N.error&&(0,Q.jsx)(`p`,{className:`note bad rrstatus`,role:`status`,children:N.error}),j&&(0,Q.jsx)(`p`,{className:`note bad rrstatus`,role:`status`,children:j}),(0,Q.jsx)(`div`,{id:`run-${e.id}-stats`,className:`runstats`,children:(0,Q.jsx)(rn,{label:`Run Statistics`,...Qn(N)})}),N.evals.length>0&&(0,Q.jsx)(Vl,{id:`run-${e.id}-evals`,rows:Kn(N),scenarios:N.scenarios,onScenario:T}),(0,Q.jsxs)(k,{id:`run-${e.id}-results`,title:`Results`,level:3,children:[(0,Q.jsx)(F,{noun:`results`,filters:[ce],lead:(0,Q.jsx)(`p`,{className:`note`,children:hn(N.items.length,`item`)}),count:{total:N.items.length,shown:e.show===`failed`?N.items.filter((e,t)=>zl(N,t)).length:N.items.length}}),I.current&&(0,Q.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,Q.jsx)(`div`,{className:`scrollx`,style:{"--scenarios":N.scenarios.length},children:(0,Q.jsx)(R,{className:J?`rrtable graded`:`rrtable`,defaultSort:null,label:`Results`,rows:N.items.map((e,t)=>t),rowKey:e=>`${N.items[e]}-${e}`,pinned:(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`tr`,{className:`scenstats`,children:[(0,Q.jsx)(`td`,{className:`scenstats-label`,children:`Statistics`}),J&&(0,Q.jsx)(`td`,{className:`scenstats-blank`}),N.scenarios.map((e,t)=>(0,Q.jsx)(`td`,{className:`scenstat`,"data-label":e.name,children:(0,Q.jsx)(rn,{dense:!0,label:`${e.name} statistics`,...er(N,t)})},e.id))]}),ie.some(e=>e.length>0)&&P&&(0,Q.jsx)(Bl,{from:mn(e.at)||N.name,datasetId:P,failing:ie,scenarios:N.scenarios,items:N.items.length,graded:J})]}),rowProps:t=>({"data-item":t,className:b.has(t)?`hasdetail`:void 0,hidden:e.show===`failed`&&!zl(N,t)}),after:t=>b.has(t)&&(0,Q.jsx)(`tr`,{className:`rrdetail`,"data-detail":t,hidden:e.show===`failed`&&!zl(N,t),children:(0,Q.jsx)(`td`,{colSpan:1+ +!!J+N.scenarios.length,children:(0,Q.jsx)(jl,{stages:Al(N.results[t],N.scenarios)})})}),columns:[{key:`item`,header:ue?`Text`:`Item`,label:``,className:`col-item`,sort:e=>N.items[e]||``,cell:e=>{let t=N.results[e],n=N.items[e];return(0,Q.jsxs)(Q.Fragment,{children:[t?.name&&!ue&&Ar(t.name)?(0,Q.jsx)(`button`,{type:`button`,className:`thumb`,"aria-label":`Open ${t.name}`,onClick:()=>v(t.name),children:(0,Q.jsx)(`img`,{src:ar(N,t.name),alt:``,loading:`lazy`,"data-name":t.name})}):null,(0,Q.jsxs)(`div`,{className:`rritem`,children:[(0,Q.jsx)(`div`,{className:`meta`,children:n||``}),(0,Q.jsx)(se,{actions:de(e),label:`${n||`row`} actions`})]})]})}},...J?[{key:`expected`,header:`Expected`,className:`col-expected`,sort:e=>{let t=X(e);return t&&!t.todo?t.metrics?.length??0:null},cell:e=>{let t=X(e);return N.results[e]?t&&!t.todo?(0,Q.jsx)(Pl,{kase:t}):(0,Q.jsx)(`span`,{className:`note`,children:`n/a`}):``}}]:[],...N.scenarios.map((e,t)=>({key:`scenario-${t}`,header:e.name,label:e.name,onHeader:()=>T(t),cell:e=>(0,Q.jsx)(Hl,{item:N.results[e],i:t,readings:(N.outcomes[t]??[]).filter(e=>!e.whole).map(t=>({label:t.label,dataset:t.id===le,score:t.items[e]??null}))})}))]})})]}),S&&(0,Q.jsx)(`p`,{className:`note`,role:`status`,children:`Copied to clipboard.`})]}),w!=null&&(0,Q.jsx)(zs,{run:N.snapshot,i:w,onClose:()=>T(null)}),_&&(0,Q.jsx)(Kl,{src:or(N,_),name:_,onClose:()=>v(null)})]})}var zl=(e,t)=>{let n=e.results[t];return!!n&&(!!n.unrun||(n.scenarios??[]).some((n,r)=>Vn(e,t,r)||!!n?.res?.error))};function Bl({from:e,datasetId:t,failing:n,scenarios:r,items:i,graded:a}){let{showCases:o}=Yt(),{list:s}=ze(),c=s!==null&&!s.some(e=>e.id===t),l=r.length>1;return(0,Q.jsxs)(`tr`,{className:`reasons`,children:[(0,Q.jsx)(`td`,{className:`scenstats-label`,children:`Reasons`}),a&&(0,Q.jsx)(`td`,{className:`scenstats-blank`}),r.map((r,a)=>{let s=r.name,u=n[a]??[];return(0,Q.jsx)(`td`,{className:`reasons-cell`,"data-label":s,children:u.length===0?(0,Q.jsx)(`span`,{className:`reasons-none`,children:`No failures`}):(0,Q.jsx)(`ul`,{className:`reasons-list`,"aria-label":`${s} reasons`,children:u.map(n=>{let r=n.files.length,a=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`reason-n`,children:r}),(0,Q.jsxs)(`span`,{className:`reason-t`,children:[n.label,n.note&&(0,Q.jsxs)(`span`,{className:`reason-note`,children:[` `,n.note]})]})]});return(0,Q.jsx)(`li`,{"data-group":n.key,style:{"--share":`${Math.round(r/Math.max(i,1)*100)}%`},children:c?(0,Q.jsx)(`span`,{className:`reason`,children:a}):(0,Q.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(),o(t,n.files,`${e}${l?`, ${s}`:``}, ${n.label}`)},children:a})},n.key)})})},r.id)})]})}function Vl({id:e,rows:t,scenarios:n,onScenario:r}){return(0,Q.jsx)(k,{id:e,title:`Evals`,level:3,children:(0,Q.jsx)(`div`,{className:`scrollx`,style:{"--scenarios":n.length},children:(0,Q.jsx)(R,{className:`ruletable`,label:`Evals`,rows:t,rowKey:e=>e.key,defaultSort:null,rowProps:e=>({className:e.first?`rule-first`:void 0,"data-rule":e.key}),columns:[{key:`eval`,header:`Eval`,label:``,sort:e=>e.eval,className:`col-eval rule-eval`,cell:e=>e.first&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`rule-eval-name`,children:e.eval}),` `,(0,Q.jsx)(`span`,{className:`rule-type`,children:e.type})]})},{key:`rule`,header:`Rule`,label:``,sort:null,className:`col-rule`,cell:e=>(0,Q.jsxs)(Q.Fragment,{children:[e.rule,e.want!=null&&(0,Q.jsxs)(Q.Fragment,{children:[` `,(0,Q.jsx)(`code`,{className:`rule-want`,children:e.want})]})]})},...n.map((e,t)=>({key:`scenario-${t}`,header:e.name,label:e.name,onHeader:()=>r(t),cell:e=>{let n=e.cells[t];if(!n)return null;let r=n.state===`met`?`✓ `:n.state===`not`?`✗ `:``;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`span`,{className:`rule-state ${n.state}`,children:[r,n.value]}),n.note&&(0,Q.jsx)(`span`,{className:`rule-note`,children:n.note})]})}}))]})})})}function Hl({item:e,i:t,readings:n}){let r=e?.scenarios?.[t]?.res;if(e?.unrun)return(0,Q.jsx)(`span`,{className:`err`,children:e.unrun});if(!r)return(0,Q.jsx)(`span`,{className:`spin`,"aria-hidden":`true`});let i=n.some(e=>e.score&&!s().isSkipped(e.score)&&e.score.metrics?.length),a=n.length===1&&s().isSkipped(n[0].score),o=(0,Q.jsxs)(Q.Fragment,{children:[(n.length>1||!i&&n.some(e=>e.score))&&(0,Q.jsx)(Gl,{readings:n}),a&&n.length===1&&(0,Q.jsx)(`span`,{className:`verdict skipped`,children:`Skipped`}),(0,Q.jsx)(Ul,{readings:n})]});return(0,Q.jsxs)(Q.Fragment,{children:[o,e?.kind===`text`?(0,Q.jsx)(Ll,{res:r}):(0,Q.jsx)(Il,{res:r})]})}function Ul({readings:e}){let t=e.flatMap(e=>e.score&&!s().isSkipped(e.score)&&e.score.metrics?.length?[{...e,score:e.score}]:[]);return t.length?(0,Q.jsx)(Q.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,Q.jsxs)(`div`,{className:`metric-readings`,children:[(0,Q.jsx)(`span`,{className:`verdict ${e.score.pass?`pass`:`fail`}`,children:e.score.pass?`Pass`:`Fail`}),e.score.score!=null&&(0,Q.jsx)(`span`,{className:`metric-score`,children:Wl(e.score.score,!!e.score.points)}),n.length>0&&(0,Q.jsx)(`ul`,{children:n.map((e,t)=>(0,Q.jsxs)(`li`,{className:e.pass?`pass`:`fail`,children:[(0,Q.jsx)(`span`,{className:`eval-name`,children:e.label}),!e.pass&&(0,Q.jsxs)(Q.Fragment,{children:[` `,(0,Q.jsx)(`span`,{className:`metric-reason`,children:e.reason})]})]},t))}),r.length>0&&(0,Q.jsxs)(`div`,{className:`watched`,children:[(0,Q.jsx)(`b`,{children:`Watch`}),(0,Q.jsx)(`ul`,{children:r.map((e,t)=>(0,Q.jsxs)(`li`,{className:e.pass?`met`:`unmet`,children:[(0,Q.jsx)(`span`,{className:`eval-name`,children:e.label}),` `,(0,Q.jsx)(`span`,{className:`metric-reason`,children:e.reason})]},t))})]})]},t)})}):null}var Wl=(e,t)=>t?`${Math.round(e*100)/100} points`:`${Math.round(e*100)}%`;function Gl({readings:e}){return(0,Q.jsx)(`ul`,{className:`eval-verdicts`,children:e.map((e,t)=>{let n=e.score?s().isSkipped(e.score)?`Skipped`:e.score.pass?`Pass`:`Fail`:null;return n&&(0,Q.jsxs)(`li`,{children:[(0,Q.jsx)(`span`,{className:`eval-name`,children:e.label}),(0,Q.jsx)(`span`,{className:`verdict ${n.toLowerCase()}`,children:n})]},t)})})}function Kl({src:e,name:t,onClose:n}){return(0,Q.jsx)(G,{title:t||`Image`,onClose:n,children:(0,Q.jsx)(`img`,{className:`lightbox-img`,src:e,alt:t})})}function ql(){let{tabs:e,focusedId:t,closeRun:n,focusRun:r,goBack:i}=Qt(),a=te(),o=e.find(e=>e.id===t);return o?(0,Q.jsxs)(`div`,{className:`results`,role:`region`,"aria-label":`Open runs`,children:[(0,Q.jsxs)(`div`,{className:`results-bar`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`ghost icon-btn rrback`,onClick:i,"aria-label":`Back`,children:(0,Q.jsx)(K,{size:18,"aria-hidden":`true`})}),(0,Q.jsx)(`code`,{className:`rrcode`,children:mn(o.at)||`…`}),(0,Q.jsx)(`div`,{className:`rtabs`,role:`tablist`,"aria-label":`Open runs`,children:e.map(e=>(0,Q.jsxs)(`div`,{className:`rtab${e.id===t?` on`:``}`,children:[(0,Q.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":e.id===t,className:`rname`,title:mn(e.at)||`run`,onClick:()=>r(e.id),children:mn(e.at)||`…`}),(0,Q.jsx)(`button`,{type:`button`,className:`rx`,"aria-label":`Close`,onClick:()=>n(e.id),children:`×`})]},e.id))})]}),(0,Q.jsx)(Rl,{tab:o,undo:a}),(0,Q.jsx)(O,{undo:a.undo,onUndo:a.undoNow,onDismiss:a.dismiss})]}):null}function Jl(){let e=Re(),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,Q.jsxs)(Q.Fragment,{children:[n.map(t=>(0,Q.jsxs)(`div`,{className:`sync bad`,role:`alert`,children:[(0,Q.jsxs)(`span`,{children:[t.doc?.name??t.id,` changed in another browser.`]}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.resolve(t.id,`theirs`),children:`Use theirs`}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.resolve(t.id,`mine`),children:`Keep mine`})]},t.id)),r.map(t=>(0,Q.jsxs)(`div`,{className:`sync bad`,role:`status`,children:[(0,Q.jsxs)(`span`,{children:[t.doc?.name??t.id,` not saved: `,t.sync.state===`offline`?t.sync.message.replace(/\.$/,``):``,`.`]}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void e.flush(t.id),children:`Retry`})]},t.id))]})}var Yl=`promptlab.theme`,Xl=typeof matchMedia==`function`?matchMedia(`(prefers-color-scheme: light)`):null;function Zl(){try{let e=JSON.parse(localStorage.getItem(Yl)||`null`)?.choice;return e===`light`||e===`dark`?e:null}catch{return null}}var Ql=()=>Zl()??(Xl?.matches?`light`:`dark`),$l=()=>{let e=Ql();return document.documentElement.setAttribute(`data-theme`,e),e};$l();function eu(){let[e,t]=(0,q.useState)(Ql);(0,q.useEffect)(()=>{let e=()=>t($l());return Xl?.addEventListener?.(`change`,e),()=>Xl?.removeEventListener?.(`change`,e)},[]);let n=e===`light`?`dark`:`light`,r=n===`light`?`Light mode`:`Dark mode`;return(0,Q.jsx)(`button`,{type:`button`,className:`icon-btn`,title:r,"aria-label":r,onClick:()=>{try{localStorage.setItem(Yl,JSON.stringify({choice:n}))}catch{}document.documentElement.setAttribute(`data-theme`,n),t(n)},children:(0,Q.jsx)(n===`light`?kt:yt,{size:16,"aria-hidden":`true`})})}var tu=()=>{let e=decodeURIComponent(location.hash.replace(/^#\/?/,``)),t=e.match(/^(evals|datasets|sources)(\/.*)?$/);t&&(e=`library/${t[1]===`sources`?`sources`:`datasets`}${t[1]===`sources`?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`;return{tab:`library`,section:e,src:e===`sources`?n[2]??null:null}}return{tab:_r.find(t=>t.id===e)?.id??`home`,section:`datasets`,src:null}};function nu(){return(0,Q.jsx)(Le,{children:(0,Q.jsx)(qe,{children:(0,Q.jsx)(Zt,{children:(0,Q.jsx)(Jt,{children:(0,Q.jsx)(Hr,{children:(0,Q.jsx)(ru,{})})})})})})}function ru(){let[e,t]=(0,q.useState)(tu),{hide:n}=Qt();(0,q.useEffect)(()=>{let e=()=>{t(tu()),n()};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[n]);let r=_r.find(t=>t.id===e.tab);return(0,Q.jsxs)(`div`,{className:`app`,children:[(0,Q.jsxs)(`header`,{className:`app-head`,children:[(0,Q.jsx)(`h1`,{children:`Evals Lab`}),(0,Q.jsx)(au,{}),(0,Q.jsx)(Jl,{}),(0,Q.jsx)(eu,{})]}),(0,Q.jsx)(`nav`,{className:`app-tabs`,role:`tablist`,"aria-label":`Lab`,children:_r.map(t=>(0,Q.jsxs)(`a`,{role:`tab`,id:`tab-${t.id}`,href:`#/${t.id}`,"aria-selected":t.id===e.tab,"aria-controls":`panel-${t.id}`,className:t.id===e.tab?`on`:void 0,children:[(0,Q.jsx)(t.icon,{size:18,"aria-hidden":`true`,className:`tab-icon`}),(0,Q.jsx)(`span`,{className:`tab-word`,children:t.label})]},t.id))}),(0,Q.jsx)(iu,{tab:r,section:e.section,src:e.src})]})}function iu({tab:e,section:t,src:n}){let{focusedId:r}=Qt(),i=r?(0,Q.jsx)(ql,{}):e.id===`home`?(0,Q.jsx)(wo,{}):e.id===`runs`?(0,Q.jsx)(sc,{}):e.id===`history`?(0,Q.jsx)(bc,{}):e.id===`library`?(0,Q.jsx)(_o,{section:t,sourceId:n}):(0,Q.jsx)(rl,{});return(0,Q.jsx)(`main`,{role:`tabpanel`,id:`panel-${e.id}`,"aria-labelledby":`tab-${e.id}`,"data-tab":e.id,children:i})}function au(){let{sync:e,resolve:t}=xe();return e.state===`offline`?(0,Q.jsxs)(`p`,{className:`sync bad`,role:`status`,children:[`Not saved to the server: `,e.message,`. Kept in this browser.`]}):e.state===`conflict`?(0,Q.jsxs)(`div`,{className:`sync bad`,role:`alert`,children:[(0,Q.jsx)(`span`,{children:`Changed on another device.`}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void t(`theirs`),children:`Use theirs`}),(0,Q.jsx)(`button`,{type:`button`,className:`ghost`,onClick:()=>void t(`mine`),children:`Keep mine`})]}):null}var ou=`promptlab.sync`,su=e=>typeof e==`object`&&!!e&&!Array.isArray(e),cu=(e,t)=>{let n=Dc[e];return su(n)&&su(t)?{...n,...t}:t};function lu({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(ou)??{},d={},f=new Set,p=()=>o(ou,{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 kc){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 ge&&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,cu(e,s(e))),a.get(e)??Dc[e]},set(e,t){o(e,t),l&&kc.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 kc){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 uu=e=>[1,2,3,4,5,6,7,8,9,10].includes(e?.version)||s().fatProfileRef(e),du=e=>e?.version===1||e?.version===2;function fu(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(du).map(e=>e?.tests?.type===`graded`?e.tests.dataset?.id:void 0);return[...new Set(t.filter(e=>!!e))]}function pu(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=>s().upgradePipeline(e,r),a=e=>uu(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 c=e.get(`promptlab.versions`),l=c.pipeline??{};Object.values(l).some(e=>e.some(e=>a(e.doc)))&&e.set(`promptlab.versions`,{...c,pipeline:Object.fromEntries(Object.entries(l).map(([e,t])=>[e,t.map(e=>({...e,doc:i(e.doc)}))]))})}async function mu(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 hu(){s();let e=_e(),t=()=>{},n=new Promise(e=>{t=e});if(/^#\/?history\/?$/.test(location.hash)&&e.askQueue({limit:25},n),Bi())try{let t=(await e.config()).microsoft;t&&await Vi(t)}catch{}if(Gi())try{let t=(await e.config()).microsoft;if(t){await Ki(t);return}}catch{}await he(e),t();let r=lu({api:e,storage:localStorage,server:await mu(e)}),i=r.get(`promptlab.profiles`);i.list.some(e=>`profile`in e)&&r.set(`promptlab.profiles`,{...i,list:i.list.map(e=>s().convertProfile(e))});let a=r.get(`promptlab.profiles`),o=e=>s().pinReplyTokens(s().splitOllama(e));a.list.some(e=>o(e)!==e)&&r.set(`promptlab.profiles`,{...a,list:a.list.map(e=>o(e))});let c=r.get(`promptlab.profiles`),l=s().withSlugs(c.list);l!==c.list&&r.set(`promptlab.profiles`,{...c,list:l});let u={};if(fu(r).length)try{u=(await e.archivedRules()).rules}catch{}pu(r,u),addEventListener(`pagehide`,()=>{r.flush(!0)}),(0,ce.createRoot)(document.getElementById(`root`)).render((0,Q.jsx)(q.StrictMode,{children:(0,Q.jsx)(ve.Provider,{value:r,children:(0,Q.jsx)(J.Provider,{value:e,children:(0,Q.jsx)(nu,{})})})}))}hu();
|