qpilot 0.7.3 → 0.9.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.
Files changed (57) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +9 -9
  3. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +18 -18
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  9. package/.next/standalone/.next/server/app/api/run/[id]/answer/route.js +1 -1
  10. package/.next/standalone/.next/server/app/api/run/[id]/answer/route_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/api/run/[id]/pause/route.js +1 -1
  12. package/.next/standalone/.next/server/app/api/run/[id]/pause/route_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/api/run/[id]/shot/[num]/route.js +1 -1
  14. package/.next/standalone/.next/server/app/api/run/[id]/shot/[num]/route_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/api/run/[id]/stream/route.js +2 -2
  16. package/.next/standalone/.next/server/app/api/run/[id]/stream/route_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/api/run/route.js +15 -7
  18. package/.next/standalone/.next/server/app/api/run/route_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/api/runs/route.js +1 -1
  20. package/.next/standalone/.next/server/app/api/runs/route_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/index.html +1 -1
  22. package/.next/standalone/.next/server/app/index.rsc +3 -3
  23. package/.next/standalone/.next/server/app/page.js +3 -3
  24. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/run/[id]/page.js +2 -2
  27. package/.next/standalone/.next/server/app/run/[id]/page.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/run/[id]/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app-paths-manifest.json +1 -1
  30. package/.next/standalone/.next/server/chunks/{231.js → 436.js} +1 -1
  31. package/.next/standalone/.next/server/chunks/801.js +1 -0
  32. package/.next/standalone/.next/server/functions-config-manifest.json +2 -2
  33. package/.next/standalone/.next/server/pages/404.html +1 -1
  34. package/.next/standalone/.next/server/pages/500.html +1 -1
  35. package/.next/standalone/.next/server/pages-manifest.json +1 -1
  36. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  37. package/.next/{static/chunks/839-27d93ad965dbd0b1.js → standalone/.next/static/chunks/662-486fc9b77e778f35.js} +1 -1
  38. package/.next/standalone/.next/static/chunks/app/page-56375c9e96da21ab.js +1 -0
  39. package/.next/standalone/.next/static/chunks/app/run/[id]/page-109b9cc55ebeb74b.js +1 -0
  40. package/.next/standalone/.next/static/css/4aa9ce635c4228de.css +3 -0
  41. package/.next/standalone/package.json +1 -1
  42. package/.next/{standalone/.next/static/chunks/839-27d93ad965dbd0b1.js → static/chunks/662-486fc9b77e778f35.js} +1 -1
  43. package/.next/static/chunks/app/page-56375c9e96da21ab.js +1 -0
  44. package/.next/static/chunks/app/run/[id]/page-109b9cc55ebeb74b.js +1 -0
  45. package/.next/static/css/4aa9ce635c4228de.css +3 -0
  46. package/README.md +80 -105
  47. package/package.json +1 -1
  48. package/.next/standalone/.next/static/chunks/app/page-639721bc5f624dcf.js +0 -1
  49. package/.next/standalone/.next/static/chunks/app/run/[id]/page-dfa34b0aa5404c0e.js +0 -1
  50. package/.next/standalone/.next/static/css/d5da188841bb3394.css +0 -3
  51. package/.next/static/chunks/app/page-639721bc5f624dcf.js +0 -1
  52. package/.next/static/chunks/app/run/[id]/page-dfa34b0aa5404c0e.js +0 -1
  53. package/.next/static/css/d5da188841bb3394.css +0 -3
  54. /package/.next/standalone/.next/static/{BFdDfLCK9JW3uxIjdFkIk → UAfGlL27qHrp3YOr0QwfK}/_buildManifest.js +0 -0
  55. /package/.next/standalone/.next/static/{BFdDfLCK9JW3uxIjdFkIk → UAfGlL27qHrp3YOr0QwfK}/_ssgManifest.js +0 -0
  56. /package/.next/static/{BFdDfLCK9JW3uxIjdFkIk → UAfGlL27qHrp3YOr0QwfK}/_buildManifest.js +0 -0
  57. /package/.next/static/{BFdDfLCK9JW3uxIjdFkIk → UAfGlL27qHrp3YOr0QwfK}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{2324:(e,t,n)=>{Promise.resolve().then(n.bind(n,6732))},2391:(e,t,n)=>{"use strict";n.d(t,{jd:()=>r});let a={back:"Back",newRun:"New run",notFound:"Run not found — it may have finished and been cleared from memory.",steps:"steps",passedCount:"passed",warnCount:"warn",failedCount:"failed",waitingForPlan:"waiting for plan…",noSteps:"no steps were run",pause:"Pause",resume:"Resume",waitingToStart:"waiting for agent to start…",endedBeforePlan:"The run ended before the agent produced a plan.",seeReason:"See the reason below.",summary:"Summary",testCase:"Test case",attached:"Attached",noEvents:"no events for this step",runFinished:"Run finished",stepLabel:"Step",asking:"Asking",userAnswered:"User answered",needInput:"Agent needs input",submit:"Submit",sending:"Sending…",secretPlaceholder:"OTP / password",answerPlaceholder:"answer",status:{running:{label:"Running",sub:"agent is executing steps"},waiting:{label:"Waiting",sub:"agent needs your input"},paused:{label:"Paused",sub:"run is paused"},passed:{label:"Passed",sub:"all steps passed"},failed:{label:"Failed",sub:"some steps failed"},error:{label:"Error",sub:"agent crashed"}},home:{tagline:"Paste a test case. Watch it run.",chooseFolder:"Choose folder",uploadMd:"Upload .md",files:"files",clearList:"Clear file list",selectAll:"Select all",selected:"selected",run:"Run",runN:"Run",withPreview:"With preview",runPreview:"Run with preview",running:"Running…",stop:"Stop",example:"Example",placeholder:"Paste your test case here…",expand:"Expand",collapse:"Collapse",batchRun:"Batch run",recentRuns:"Recent runs",attach:"Attach files",addFile:"Add file",attachHint:"optional — images, CSV or documents the test needs to upload",remove:"Remove"},stepStatus:{queued:"queued",pass:"pass",warn:"warn",fail:"fail",skipped:"skipped",running:"running"},action:{opening:"Opening",readingPage:"Reading page",readingBlock:"Reading block",clicking:"Clicking",clickingElement:"Clicking element",filling:"Filling",selecting:"Selecting",hovering:"Hovering",hoveringElement:"Hovering element",scrollingTo:"Scrolling to",scrolling:"Scrolling",inside:"inside",pressing:"Pressing",closingOverlay:"Closing overlay",waiting:"Waiting",askingUser:"Asking user",uploading:"Uploading",to:"to",down:"down",up:"up",right:"right",left:"left"}},s={en:a,ru:{back:"Назад",newRun:"Новый прогон",notFound:"Прогон не найден — возможно, он завершился и был вытеснен из памяти.",steps:"шагов",passedCount:"успешно",warnCount:"предупреждений",failedCount:"провалено",waitingForPlan:"ждём план…",noSteps:"шаги не выполнялись",pause:"Пауза",resume:"Продолжить",waitingToStart:"ждём запуска агента…",endedBeforePlan:"Прогон завершился до того, как агент составил план.",seeReason:"Причина — ниже.",summary:"Итог",testCase:"Тест-кейс",attached:"Вложения",noEvents:"событий по этому шагу нет",runFinished:"Прогон завершён",stepLabel:"Шаг",asking:"Спрашивает",userAnswered:"Пользователь ответил",needInput:"Агенту нужен ввод",submit:"Отправить",sending:"Отправка…",secretPlaceholder:"код / пароль",answerPlaceholder:"ответ",status:{running:{label:"Выполняется",sub:"агент проходит шаги"},waiting:{label:"Ожидание",sub:"агенту нужен ваш ввод"},paused:{label:"Пауза",sub:"прогон приостановлен"},passed:{label:"Успешно",sub:"все шаги пройдены"},failed:{label:"Провален",sub:"часть шагов не прошла"},error:{label:"Ошибка",sub:"агент упал"}},home:{tagline:"Вставьте тест-кейс. Смотрите, как он проходит.",chooseFolder:"Выбрать папку",uploadMd:"Загрузить .md",files:"файлов",clearList:"Очистить список",selectAll:"Выбрать все",selected:"выбрано",run:"Запустить",runN:"Запустить",withPreview:"С превью",runPreview:"Запустить с превью",running:"Запускаем…",stop:"Остановить",example:"Пример",placeholder:"Вставьте сюда свой тест-кейс…",expand:"Развернуть",collapse:"Свернуть",batchRun:"Пакетный прогон",recentRuns:"Последние прогоны",attach:"Прикрепить файлы",addFile:"Добавить файл",attachHint:"необязательно — картинки, CSV или документы, которые нужно загрузить в тесте",remove:"Убрать"},stepStatus:{queued:"в очереди",pass:"успех",warn:"внимание",fail:"провал",skipped:"пропущен",running:"выполняется"},action:{opening:"Открывает",readingPage:"Читает страницу",readingBlock:"Читает блок",clicking:"Кликает",clickingElement:"Кликает по элементу",filling:"Заполняет",selecting:"Выбирает",hovering:"Наводит на",hoveringElement:"Наводит на элемент",scrollingTo:"Скроллит к",scrolling:"Скроллит",inside:"внутри",pressing:"Нажимает",closingOverlay:"Закрывает оверлей",waiting:"Ждёт",askingUser:"Спрашивает пользователя",uploading:"Загружает",to:"в",down:"вниз",up:"вверх",right:"вправо",left:"влево"}}};function r(e){var t;return null!=(t=s[null!=e?e:"en"])?t:a}},5016:(e,t,n)=>{"use strict";n.d(t,{a:()=>i,cn:()=>r});var a=n(2821),s=n(5889);function r(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,s.QP)((0,a.$)(t))}function i(e){let t=Math.max(0,Math.floor(e/1e3));return"".concat(Math.floor(t/60),":").concat(String(t%60).padStart(2,"0"))}},6329:(e,t,n)=>{"use strict";function a(e){return"data:image/svg+xml,".concat(encodeURIComponent(e))}function s(e){let t=document.querySelector('link[rel="icon"]');t||(t=Object.assign(document.createElement("link"),{rel:"icon"}),document.head.appendChild(t)),t.href=e}function r(e){return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">'.concat(e,"</svg>")}n.d(t,{O:()=>u,g:()=>p});let i=Array.from({length:10},(e,t)=>{let n=t/10*Math.PI*2-Math.PI/2,s=.65*Math.PI,i=12+10*Math.cos(n),l=12+10*Math.sin(n),o=12+10*Math.cos(n+s),d=12+10*Math.sin(n+s);return a(r('<circle cx="12" cy="12" r="10" stroke="#38bdf8" stroke-width="2.5" fill="none" opacity="0.15"/>'+'<path d="M'.concat(i.toFixed(3)," ").concat(l.toFixed(3)," A10 10 0 0 1 ").concat(o.toFixed(3)," ").concat(d.toFixed(3),'" stroke="#38bdf8" stroke-width="2.5" fill="none" stroke-linecap="round"/>')))}),l={passed:a(r('<circle cx="12" cy="12" r="10" fill="#22c55e"/><path d="M7 12.5l3.5 3.5 6.5-7" stroke="white" stroke-width="2.2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>')),failed:a(r('<circle cx="12" cy="12" r="10" fill="#ef4444"/><path d="M8 8l8 8M16 8l-8 8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),error:a(r('<circle cx="12" cy="12" r="10" fill="#ef4444"/><path d="M8 8l8 8M16 8l-8 8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),waiting:a(r('<circle cx="12" cy="12" r="10" fill="#facc15"/><path d="M12 7v5.5l3 3" stroke="white" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>')),paused:a(r('<circle cx="12" cy="12" r="10" fill="#64748b"/><path d="M9 8v8M15 8v8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),default:a(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="'.concat(e,'" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">').concat('<path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/>').concat(t,"</svg>")}("white"))},o=null,d=0;function c(){o&&(clearInterval(o),o=null)}function u(e){var t;if(c(),"running"===e){d=0,s(i[0]),o=setInterval(()=>{s(i[d=(d+1)%10])},100);return}s(null!=(t=l[e])?t:l.default)}function p(){c(),s(l.default)}},6732:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>U});var a=n(5155),s=n(7260),r=n(2115),i=n(2619),l=n.n(i),o=n(6479);let d=(0,o.A)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]),c=(0,o.A)("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"}]]),u=(0,o.A)("upload",[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]]);var p=n(4788);let h=(0,o.A)("square-check-big",[["path",{d:"M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344",key:"2acyp4"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]),m=(0,o.A)("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),g=(0,o.A)("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);var x=n(9746);let f=(0,o.A)("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);var v=n(3916);let b=(0,o.A)("file-text",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);var k=n(8215),w=n(8316),y=n(5352),j=n(3410),N=n(7003),z=n(5016);function S(e){let{className:t,...n}=e;return(0,a.jsx)("textarea",{"data-slot":"textarea",className:(0,z.cn)("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",t),...n})}var A=n(6329),M=n(2391);let C=new Set(["running","waiting","paused"]),P="rounded-xl border border-white/7 overflow-hidden",R="px-4 py-2.5 bg-white/[0.02]",F="text-[10.5px] font-semibold uppercase tracking-widest text-muted-foreground/40",E="",_=[],I=null,D=new Set,L=[],B=[],O=!1,H=!1,T=null,$=null,q=null;function U(){let e=(0,s.useRouter)(),t=(0,r.useRef)(null),n=(0,r.useRef)(null),i=(0,r.useRef)(null),o=(0,r.useRef)(null),w=(0,r.useRef)(null),[y,j]=(0,r.useState)(E),[U,J]=(0,r.useState)(!1),[Q,Y]=(0,r.useState)(null),[Z,G]=(0,r.useState)(!1),[X,ee]=(0,r.useState)(!1),[et,en]=(0,r.useState)(!1),[ea,es]=(0,r.useState)(_),[er,ei]=(0,r.useState)(I),[el,eo]=(0,r.useState)(L),[ed,ec]=(0,r.useState)([]),[eu,ep]=(0,r.useState)(D),[eh,em]=(0,r.useState)(B),[eg,ex]=(0,r.useState)(O),[ef,ev]=(0,r.useState)(()=>Date.now()),[eb,ek]=(0,r.useState)("en"),ew=(0,M.jd)(eb).home;function ey(e){E=e,j(e)}function ej(e){D=e,ep(e)}function eN(e){let t="function"==typeof e?e(B):e;B=t,em([...t])}async function ez(e){var t;ey(await e.file.text()),I=t=e.name,ei(t)}async function eS(e,t){let n=new FormData;for(let a of(n.append("testCase",e),n.append("headless",String(t)),L))n.append("files",a);let a=await fetch("/api/run",{method:"POST",body:n}),s=await a.json();if(!a.ok)throw Error(s.error||"error");return s.id}async function eA(t){if(y.trim()){J(!0),Y(null);try{let n=await eS(y,t);e.push("/run/".concat(n))}catch(e){Y(e instanceof Error?e.message:String(e)),J(!1)}}}async function eM(){H=!0;let e=T;e&&fetch("/api/run/".concat(e,"/pause"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"pause"})}).catch(()=>{})}async function eC(e){let t=ea.filter(e=>eu.has(e.name));if(!t.length)return;let n=t.map(e=>({file:e,id:null,status:"queued"}));eN(n),O=!0,ex(!0),H=!1,T=null,$=Date.now(),q=null;for(let t=0;t<n.length;t++){if(H){eN(e=>e.map((e,n)=>n>=t?{...e,status:"skipped"}:e));break}let a=Date.now();eN(e=>e.map((e,n)=>n===t?{...e,status:"running",startedAt:a}:e));try{let a=await n[t].file.file.text(),s=await eS(a,e);T=s,eN(e=>e.map((e,n)=>n===t?{...e,id:s}:e));let r=await function(e){return new Promise(t=>{let n=new EventSource("/api/run/".concat(e,"/stream")),a=setInterval(()=>{H&&(clearInterval(a),n.close(),t("paused"))},150);n.onmessage=e=>{var s;let r=null==(s=JSON.parse(e.data).run)?void 0:s.status;if(H){clearInterval(a),n.close(),t("paused");return}r&&!C.has(r)&&(clearInterval(a),n.close(),t(r))},n.onerror=()=>{clearInterval(a),n.close(),t("error")}})}(s),i=Date.now();if(eN(e=>e.map((e,n)=>n===t?{...e,status:r,finishedAt:i}:e)),H){eN(e=>e.map((e,n)=>n>t?{...e,status:"skipped"}:e));break}}catch(e){eN(e=>e.map((e,n)=>n===t?{...e,status:"error",finishedAt:Date.now()}:e))}}T=null,q=Date.now(),O=!1,ex(!1),fetch("/api/runs").then(e=>e.ok?e.json():[]).then(ec).catch(()=>{})}(0,r.useEffect)(()=>{var e;(null==(e=navigator.language)?void 0:e.toLowerCase().startsWith("ru"))&&ek("ru")},[]),(0,r.useEffect)(()=>{if(!eg)return;let e=setInterval(()=>ev(Date.now()),1e3);return()=>clearInterval(e)},[eg]),(0,r.useEffect)(()=>{fetch("/api/runs").then(e=>e.ok?e.json():[]).then(ec).catch(()=>{})},[]),(0,r.useEffect)(()=>{let e=w.current;e&&en(e.scrollHeight>364)},[y]),(0,r.useEffect)(()=>{if(!O)return;let e=setInterval(()=>{em([...B]),ex(O),O||clearInterval(e)},200);return()=>clearInterval(e)},[]),(0,r.useEffect)(()=>{if(eg)(0,A.O)("running");else if(B.length>0){let e=B.some(e=>"failed"===e.status||"error"===e.status),t=B.every(e=>"passed"===e.status);(0,A.O)(e?"failed":t?"passed":"default")}},[eg]),(0,r.useEffect)(()=>()=>{(0,A.g)()},[]);let eP=eu.size,eR=ea.length>0&&eu.size===ea.length,eF=eP>0,eE=ea.length>0&&!eF,e_=ea.length>0?"max-w-3xl":"max-w-2xl";return(0,a.jsxs)("main",{className:"flex flex-col items-center min-h-screen px-6 pt-20 pb-24",children:[(0,a.jsx)("div",{className:"flex items-center justify-center size-11 rounded-2xl border border-white/10 bg-white/5 mb-6 shadow-lg",children:(0,a.jsx)(d,{className:"size-5 text-foreground/80"})}),(0,a.jsx)("h1",{className:"text-3xl font-semibold tracking-tight mb-2",children:"QA Agent"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground mb-10",children:ew.tagline}),(0,a.jsxs)("div",{className:(0,z.cn)("w-full space-y-3",e_),children:[(0,a.jsx)("input",{ref:i,type:"file",webkitdirectory:"",multiple:!0,className:"hidden",onChange:function(e){var t;let n=Array.from(null!=(t=e.target.files)?t:[]).filter(e=>e.name.endsWith(".md")).map(e=>({name:e.webkitRelativePath||e.name,file:e}));n.sort((e,t)=>e.name.localeCompare(t.name)),_=n,es(n),I=null,ei(null),ej(new Set),eN([]),e.target.value=""}}),(0,a.jsx)("input",{ref:n,type:"file",accept:".md,text/markdown",className:"hidden",onChange:function(e){var t;let n=null==(t=e.target.files)?void 0:t[0];if(!n)return;let a=new FileReader;a.onload=e=>{var t;"string"==typeof(null==(t=e.target)?void 0:t.result)&&ey(e.target.result)},a.readAsText(n,"utf-8"),e.target.value=""}}),(0,a.jsx)("input",{ref:o,type:"file",multiple:!0,className:"hidden",onChange:function(e){var t;!function(e){if(!e.length)return;let t=e.find(e=>e.size>0x1900000);if(t)return Y('"'.concat(t.name,'" is larger than ').concat(25," MB"));let n=new Map(el.map(e=>[e.name,e]));for(let t of e)n.set(t.name,t);let a=[...n.values()];if(a.length>10)return Y("At most ".concat(10," attachments per run"));Y(null),L=a,eo(a)}(Array.from(null!=(t=e.target.files)?t:[])),e.target.value=""}}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)(N.$,{type:"button",variant:"outline",size:"sm",onClick:()=>{var e;return null==(e=i.current)?void 0:e.click()},className:"gap-2 text-muted-foreground hover:text-foreground",children:[(0,a.jsx)(c,{className:"size-4"}),ew.chooseFolder]}),(0,a.jsxs)(N.$,{type:"button",variant:"outline",size:"sm",onClick:()=>{var e;return null==(e=n.current)?void 0:e.click()},className:"gap-2 text-muted-foreground hover:text-foreground",children:[(0,a.jsx)(u,{className:"size-4"}),ew.uploadMd]}),ea.length>0&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("span",{className:"text-xs text-muted-foreground/60",children:[ea.length," .md ",ew.files]}),(0,a.jsx)(N.$,{type:"button",variant:"ghost",size:"sm",onClick:function(){var e;_=e=[],es(e),I=null,ei(null),ej(new Set),eN([])},title:ew.clearList,className:"ml-auto size-7 p-0 text-muted-foreground/50 hover:text-foreground",children:(0,a.jsx)(p.A,{className:"size-3.5"})})]})]}),(0,a.jsxs)("div",{className:(0,z.cn)(eE&&"flex gap-4 items-start"),children:[ea.length>0&&(0,a.jsxs)("div",{className:(0,z.cn)(eE?"w-64 shrink-0":"w-full","space-y-3"),children:[(0,a.jsxs)("ul",{className:(0,z.cn)(P,"divide-y divide-white/5"),children:[(0,a.jsx)("li",{children:(0,a.jsxs)("div",{className:(0,z.cn)(R,"flex items-center gap-3 py-2"),children:[(0,a.jsxs)("button",{type:"button",onClick:function(){ej(eu.size===ea.length?new Set:new Set(ea.map(e=>e.name)))},className:"flex items-center gap-2 shrink-0 text-muted-foreground/50 hover:text-foreground transition-colors",children:[eR?(0,a.jsx)(h,{className:"size-4 text-foreground/70"}):(0,a.jsx)(m,{className:"size-4"}),(0,a.jsx)("span",{className:"text-[11px] text-muted-foreground/70 select-none",children:eP>0?"".concat(eP," ").concat(ew.selected):ew.selectAll})]}),eP>0&&!eg&&(0,a.jsxs)("div",{className:"ml-auto flex items-center gap-1.5",children:[(0,a.jsxs)(N.$,{type:"button",size:"sm",className:"h-7 gap-1.5 text-xs font-medium",onClick:()=>eC(!0),children:[(0,a.jsx)(g,{className:"size-3.5"}),ew.runN," ",eP]}),(0,a.jsxs)(N.$,{type:"button",size:"sm",variant:"secondary",className:"h-7 gap-1.5 text-xs",onClick:()=>eC(!1),children:[(0,a.jsx)(g,{className:"size-3.5"}),ew.withPreview]})]}),eg&&(0,a.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[(0,a.jsx)(x.A,{className:"size-3.5 text-muted-foreground/50 animate-spin"}),(0,a.jsx)(N.$,{type:"button",size:"sm",variant:"ghost",className:"h-7 text-xs text-destructive hover:text-destructive",onClick:eM,children:ew.stop})]})]})}),ea.map(e=>(0,a.jsxs)("li",{className:"flex items-center",children:[(0,a.jsx)("button",{type:"button",onClick:()=>(function(e){let t=new Set(eu);t.has(e)?t.delete(e):t.add(e),ej(t)})(e.name),className:"shrink-0 px-4 py-2.5 text-muted-foreground/50 hover:text-foreground transition-colors",children:eu.has(e.name)?(0,a.jsx)(h,{className:"size-4 text-foreground/70"}):(0,a.jsx)(m,{className:"size-4"})}),(0,a.jsx)("button",{type:"button",onClick:()=>ez(e),className:(0,z.cn)("flex-1 text-left py-2.5 pr-4 text-sm font-mono transition-colors truncate",er===e.name?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e.name})]},e.name))]}),eh.length>0&&(0,a.jsxs)("div",{className:P,children:[(0,a.jsxs)("div",{className:(0,z.cn)(R,"flex items-center gap-2"),children:[(0,a.jsx)("span",{className:F,children:ew.batchRun}),$&&(0,a.jsx)("span",{className:"ml-auto text-[11px] font-mono tabular-nums text-muted-foreground/40",children:(0,z.a)((null!=q?q:ef)-$)})]}),(0,a.jsx)("ul",{className:"divide-y divide-white/5",children:eh.map((e,t)=>{var n;return(0,a.jsxs)("li",{className:"flex items-center gap-3 px-4 py-2.5",children:[(0,a.jsx)(W,{status:e.status}),e.id?(0,a.jsx)(l(),{href:"/run/".concat(e.id),className:"flex-1 min-w-0 text-sm font-mono text-foreground/70 hover:text-foreground truncate transition-colors",children:e.file.name}):(0,a.jsx)("span",{className:"flex-1 min-w-0 text-sm font-mono text-muted-foreground/40 truncate",children:e.file.name}),(0,a.jsx)("span",{className:"shrink-0 text-[11px] font-mono tabular-nums text-muted-foreground/30",children:e.startedAt?(0,z.a)((null!=(n=e.finishedAt)?n:"running"===e.status?ef:e.startedAt)-e.startedAt):""}),"queued"!==e.status&&"running"!==e.status&&"skipped"!==e.status&&(0,a.jsx)("span",{className:(0,z.cn)("shrink-0 text-[10.5px] font-semibold uppercase tracking-wide","passed"===e.status?"text-success":"failed"===e.status||"error"===e.status?"text-destructive":"text-muted-foreground/40"),children:e.status})]},t)})})]})]}),!eF&&(0,a.jsxs)("form",{ref:t,onSubmit:function(e){e.preventDefault(),eA(!0)},className:(0,z.cn)("space-y-3",eE&&"flex-1 min-w-0"),children:[(0,a.jsxs)("div",{className:(0,z.cn)("relative rounded-xl border transition-all duration-200",Z?"border-white/15 shadow-[0_0_0_3px_oklch(0.5_0.1_270_/_12%)]":"border-white/7"),children:[(0,a.jsx)(S,{ref:w,placeholder:ew.placeholder,value:y,onChange:e=>ey(e.target.value),onFocus:()=>G(!0),onBlur:()=>G(!1),onKeyDown:e=>{if((e.metaKey||e.ctrlKey)&&"Enter"===e.key){var n;e.preventDefault(),null==(n=t.current)||n.requestSubmit()}},rows:16,className:(0,z.cn)("min-h-[320px] font-mono text-[12.5px] leading-relaxed resize-none border-0 bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 rounded-xl p-4 overflow-y-auto",X?"max-h-[65vh]":"max-h-[360px]",et&&"pb-9")}),et&&(0,a.jsx)("button",{type:"button",onClick:()=>ee(e=>!e),className:"absolute bottom-2 right-3 flex items-center gap-1 rounded-md border border-white/10 bg-background/80 backdrop-blur px-2 py-1 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:X?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(f,{className:"size-3.5"}),ew.collapse]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(v.A,{className:"size-3.5"}),ew.expand]})})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(N.$,{type:"submit",disabled:!y.trim()||U,size:"lg",className:"gap-2 font-medium",children:U?ew.running:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g,{className:"size-4"}),ew.run]})}),(0,a.jsx)(N.$,{type:"button",disabled:!y.trim()||U,size:"lg",variant:"secondary",onClick:()=>eA(!1),className:"gap-2",children:U?ew.running:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g,{className:"size-4"}),ew.runPreview]})}),(0,a.jsxs)(N.$,{type:"button",variant:"ghost",size:"lg",onClick:()=>ey('TC-001 — Login and add item to cart\nURL: https://www.saucedemo.com/\nCredentials: standard_user / secret_sauce\n\nSteps:\n1. Open the home page.\n Expected: login form with Username and Password fields is visible.\n2. Enter Username "standard_user" and Password "secret_sauce", click Login.\n Expected: Products page opens with 6 items.\n3. Click "Add to cart" on "Sauce Labs Backpack".\n Expected: cart counter shows 1.\n4. Click the cart icon.\n Expected: cart contains exactly one item — Sauce Labs Backpack at $29.99.'),className:"ml-auto text-muted-foreground hover:text-foreground",children:[(0,a.jsx)(b,{className:"size-4"}),ew.example]})]})]})]}),(0,a.jsx)(V,{t:(0,M.jd)(eb).home,files:el,onPick:()=>{var e;return null==(e=o.current)?void 0:e.click()},onRemove:function(e){var t;L=t=el.filter(t=>t.name!==e),eo(t)}}),Q&&(0,a.jsxs)("div",{className:"flex items-start gap-2 rounded-xl border border-destructive/25 bg-destructive/[0.06] px-4 py-3",children:[(0,a.jsx)(k.A,{className:"size-4 shrink-0 text-destructive mt-px"}),(0,a.jsx)("span",{className:"text-xs leading-relaxed text-destructive",children:Q})]})]}),ed.length>0&&(0,a.jsxs)("div",{className:(0,z.cn)("w-full mt-12",e_),children:[(0,a.jsx)("div",{className:(0,z.cn)(F,"mb-3"),children:ew.recentRuns}),(0,a.jsx)("ul",{className:"space-y-1.5",children:ed.map(e=>(0,a.jsx)("li",{children:(0,a.jsxs)(l(),{href:"/run/".concat(e.id),className:"flex items-center gap-3 rounded-xl border border-white/7 px-4 py-3 hover:bg-white/5 transition-colors",children:[(0,a.jsx)(K,{status:e.status}),(0,a.jsx)("span",{className:"flex-1 min-w-0 text-sm text-foreground/80 truncate",children:e.title}),(0,a.jsx)("span",{className:"shrink-0 text-[11px] text-muted-foreground/40 font-mono tabular-nums",children:function(e){let t=new Date(e),n=new Date;return t.getDate()===n.getDate()&&t.getMonth()===n.getMonth()&&t.getFullYear()===n.getFullYear()?t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):t.toLocaleDateString([],{month:"short",day:"numeric"})+" "+t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}(e.createdAt)})]})},e.id))})]})]})}function V(e){let{files:t,onPick:n,onRemove:s,t:r}=e;return(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,a.jsxs)(N.$,{type:"button",variant:"ghost",size:"sm",onClick:n,className:"gap-2 text-muted-foreground/70 hover:text-foreground",children:[(0,a.jsx)(w.A,{className:"size-3.5"}),t.length?r.addFile:r.attach]}),0===t.length?(0,a.jsx)("span",{className:"text-[11px] text-muted-foreground/35",children:r.attachHint}):t.map(e=>{var t;return(0,a.jsxs)("span",{className:"group inline-flex items-center gap-1.5 rounded-lg border border-white/8 bg-white/[0.03] pl-2.5 pr-1 py-1",children:[(0,a.jsx)("span",{className:"text-[11px] font-mono text-foreground/70 max-w-[180px] truncate",children:e.name}),(0,a.jsx)("span",{className:"text-[10px] tabular-nums text-muted-foreground/35",children:(t=e.size)<1024?"".concat(t," B"):t<1048576?"".concat(Math.round(t/1024)," KB"):"".concat((t/1024/1024).toFixed(1)," MB")}),(0,a.jsx)("button",{type:"button",onClick:()=>s(e.name),title:"".concat(r.remove," ").concat(e.name),className:"rounded p-0.5 text-muted-foreground/40 hover:text-destructive transition-colors",children:(0,a.jsx)(p.A,{className:"size-3"})})]},e.name)})]})}function W(e){let{status:t}=e;return"running"===t?(0,a.jsx)(x.A,{className:"size-3.5 shrink-0 text-muted-foreground/50 animate-spin"}):"passed"===t?(0,a.jsx)(y.A,{className:"size-3.5 shrink-0 text-success",strokeWidth:2.5}):"failed"===t||"error"===t?(0,a.jsx)(k.A,{className:"size-3.5 shrink-0 text-destructive"}):"paused"===t?(0,a.jsx)("span",{className:"size-3.5 shrink-0 text-[10px] text-muted-foreground/40 font-mono",children:"▐▐"}):"skipped"===t?(0,a.jsx)("span",{className:"size-3.5 shrink-0 text-[10px] text-muted-foreground/30 font-mono",children:"—"}):(0,a.jsx)("span",{className:"size-3.5 shrink-0 rounded-sm border border-white/15 inline-block"})}function K(e){let{status:t}=e;return"passed"===t?(0,a.jsx)(y.A,{className:"size-3.5 shrink-0 text-success",strokeWidth:2.5}):"failed"===t||"error"===t?(0,a.jsx)(k.A,{className:"size-3.5 shrink-0 text-destructive"}):(0,a.jsx)(j.A,{className:"size-3.5 shrink-0 text-muted-foreground/40"})}},7003:(e,t,n)=>{"use strict";n.d(t,{$:()=>o});var a=n(5155),s=n(9574),r=n(3101),i=n(5016);let l=(0,r.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:n="default",size:r="default",...o}=e;return(0,a.jsx)(s.$,{"data-slot":"button",className:(0,i.cn)(l({variant:n,size:r,className:t})),...o})}}},e=>{e.O(0,[662,441,255,358],()=>e(e.s=2324)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[170],{191:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>G});var r=n(5155),s=n(2115),a=n(2619),i=n.n(a),o=n(3229),l=n(3228),d=n(2638),c=n(3410),u=n(9746),g=n(8215),p=n(7212),x=n(3916),m=n(8316),h=n(7274),f=n(5352),b=n(4788),v=n(6329),w=n(2391),j=n(1083),N=n(2027),k=n(3101),y=n(5016);let S=(0,k.F)("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function z(e){let{className:t,variant:n="default",render:r,...s}=e;return(0,N.C)({defaultTagName:"span",props:(0,j.v6)({className:(0,y.cn)(S({variant:n}),t)},s),render:r,state:{slot:"badge",variant:n}})}var A=n(7003),C=n(4036),P=n(5949),M=n(4915),E=n(8502),F=n(8905),R=n(989);function _(e){let{...t}=e;return(0,r.jsx)(C.D,{"data-slot":"dialog",...t})}function T(e){let{...t}=e;return(0,r.jsx)(P.Z,{"data-slot":"dialog-portal",...t})}function B(e){let{className:t,...n}=e;return(0,r.jsx)(M.X,{"data-slot":"dialog-overlay",className:(0,y.cn)("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",t),...n})}function I(e){let{className:t,children:n,showCloseButton:s=!0,...a}=e;return(0,r.jsxs)(T,{children:[(0,r.jsx)(B,{}),(0,r.jsxs)(E.h,{"data-slot":"dialog-content",className:(0,y.cn)("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",t),...a,children:[n,s&&(0,r.jsxs)(F.H,{"data-slot":"dialog-close",render:(0,r.jsx)(A.$,{variant:"ghost",className:"absolute top-2 right-2",size:"icon-sm"}),children:[(0,r.jsx)(b.A,{}),(0,r.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})}function O(e){let{className:t,...n}=e;return(0,r.jsx)("div",{"data-slot":"dialog-header",className:(0,y.cn)("flex flex-col gap-2",t),...n})}function q(e){let{className:t,...n}=e;return(0,r.jsx)(R.L,{"data-slot":"dialog-title",className:(0,y.cn)("font-heading text-base leading-none font-medium",t),...n})}var U=n(2045);function W(e){let{className:t,type:n,...s}=e;return(0,r.jsx)(U.p,{type:n,"data-slot":"input",className:(0,y.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",t),...s})}var H=n(8521),D=n(2577),L=n(1127);function V(e){let{...t}=e;return(0,r.jsx)(H.N,{"data-slot":"collapsible",...t})}function $(e){let{...t}=e;return(0,r.jsx)(D.R,{"data-slot":"collapsible-trigger",...t})}function J(e){let{...t}=e;return(0,r.jsx)(L.j,{"data-slot":"collapsible-content",...t})}function G(e){var t,n,a,h,f;let{params:b}=e,{id:j}=(0,s.use)(b),[N,k]=(0,s.useState)(null),[S,z]=(0,s.useState)([]),[C,P]=(0,s.useState)(!1),[M,E]=(0,s.useState)(null),[F,R]=(0,s.useState)(()=>Date.now()),[T,B]=(0,s.useState)(!1),O=(0,s.useRef)(!1);(0,s.useEffect)(()=>{O.current=!1;let e=new EventSource("/api/run/".concat(j,"/stream"));return e.onmessage=e=>{let t=JSON.parse(e.data);if(O.current=!0,t.events?z(t.events):t.event&&z(e=>[...e,t.event]),k({...t.run,events:[]}),!["running","waiting","paused"].includes(t.run.status)){var n,r,s,a,i;let e=null!=(i=null!=(a=null==(n=t.event)?void 0:n.ts)?a:null==(s=t.events)||null==(r=s.at(-1))?void 0:r.ts)?i:Date.now();E(t=>null!=t?t:e)}},e.onerror=()=>{e.close(),O.current||P(!0)},()=>e.close()},[j]);let q=(0,w.jd)(null==N?void 0:N.language),U=null!=(n=null==N?void 0:N.status)?n:"running",W=null!=(a=null==N?void 0:N.steps)?a:[],H=W.filter(e=>"pass"===e.status).length,D=W.filter(e=>"fail"===e.status).length,L=W.filter(e=>"warn"===e.status).length,G="running"===U||"waiting"===U,Q=G||"paused"===U;async function Z(){Q&&(B(!0),await fetch("/api/run/".concat(j,"/pause"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"paused"===U?"resume":"pause"})}).catch(()=>{}),B(!1))}let Y=G&&null!=(h=null==(t=W.find(e=>"queued"===e.status))?void 0:t.num)?h:null;(0,s.useEffect)(()=>{if(!G)return;let e=setInterval(()=>R(Date.now()),1e3);return()=>clearInterval(e)},[G]),(0,s.useEffect)(()=>((0,v.O)(U),()=>{(0,v.g)()}),[U]),(0,s.useEffect)(()=>{if(!(null==N?void 0:N.title))return;let e=document.title;return document.title=N.title,()=>{document.title=e}},[null==N?void 0:N.title]),(0,s.useEffect)(()=>{var e;null!=Y&&(null==(e=document.getElementById("step-".concat(Y)))||e.scrollIntoView({behavior:"smooth",block:"center"}))},[Y]);let ee=N?(null!=M?M:F)-N.createdAt:0,en=W.filter(e=>"queued"!==e.status).length,es=W.length?en/W.length*100:0,ea=[];for(let e of W){let t=ea[ea.length-1];t&&t.title===e.group?t.steps.push(e):ea.push({title:e.group,steps:[e]})}return C?(0,r.jsxs)("main",{className:"flex flex-col items-center justify-center min-h-screen px-6 text-center",children:[(0,r.jsx)("p",{className:"text-6xl font-semibold text-muted-foreground/20 mb-4",children:"404"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground mb-6",children:q.notFound}),(0,r.jsxs)(i(),{href:"/",className:"inline-flex items-center gap-1.5 text-sm text-foreground/70 hover:text-foreground transition-colors",children:[(0,r.jsx)(o.A,{className:"size-3.5"}),q.newRun]})]}):(0,r.jsxs)("main",{className:"mx-auto max-w-2xl px-6 pt-10 pb-24",children:[(0,r.jsxs)(i(),{href:"/",className:"inline-flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors mb-8",children:[(0,r.jsx)(o.A,{className:"size-3.5"}),q.back]}),(0,r.jsxs)("section",{className:"mb-8",children:[(0,r.jsx)(X,{status:U,t:q}),(0,r.jsx)("h1",{className:"text-lg font-semibold tracking-tight mt-5 break-words text-foreground/90",children:null!=(f=null==N?void 0:N.title)?f:j}),N&&(0,r.jsxs)("div",{className:"flex items-center justify-between gap-3 mt-1.5",children:[(0,r.jsx)("p",{className:"text-xs text-muted-foreground font-mono",children:W.length>0?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("span",{className:"text-foreground/60",children:[en,"/",W.length," ",q.steps]}),H>0&&(0,r.jsxs)("span",{className:"text-success ml-2",children:["\xb7 ",H," ",q.passedCount]}),L>0&&(0,r.jsxs)("span",{className:"text-warning ml-2",children:["\xb7 ",L," ",q.warnCount]}),D>0&&(0,r.jsxs)("span",{className:"text-destructive ml-2",children:["\xb7 ",D," ",q.failedCount]})]}):(0,r.jsx)("span",{className:"text-muted-foreground/50",children:Q?q.waitingForPlan:q.noSteps})}),(0,r.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:[Q&&(0,r.jsx)(A.$,{variant:"ghost",size:"sm",onClick:Z,disabled:T||"waiting"===U,className:"h-7 px-2 text-muted-foreground/60 hover:text-foreground",children:"paused"===U?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(l.A,{className:"size-3.5 mr-1"}),q.resume]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(d.A,{className:"size-3.5 mr-1"}),q.pause]})}),(0,r.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs text-muted-foreground/60 font-mono tabular-nums",children:[(0,r.jsx)(c.A,{className:"size-3"}),(0,y.a)(ee)]})]})]}),W.length>0&&(0,r.jsx)("div",{className:"relative mt-3 h-[3px] rounded-full bg-white/5 overflow-hidden",children:(0,r.jsx)("div",{className:(0,y.cn)("absolute inset-y-0 left-0 rounded-full transition-all duration-700 ease-out","failed"===U||"error"===U?"bg-destructive":"bg-success"),style:{width:"".concat(es,"%")}})})]}),(0,r.jsxs)("section",{className:"space-y-2",children:[0===W.length&&(Q?(0,r.jsxs)("div",{className:"flex flex-col items-center justify-center py-16 text-center",children:[(0,r.jsx)(u.A,{className:"size-5 text-muted-foreground/30 animate-spin mb-3"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground/50",children:q.waitingToStart})]}):(0,r.jsxs)("div",{className:"flex flex-col items-center justify-center py-16 text-center",children:[(0,r.jsx)(g.A,{className:"size-5 text-muted-foreground/25 mb-3"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground/50",children:q.endedBeforePlan}),(0,r.jsx)("p",{className:"text-xs text-muted-foreground/35 mt-1",children:q.seeReason})]})),ea.map((e,t)=>(0,r.jsxs)("div",{className:"space-y-2",children:[e.title&&(0,r.jsx)("div",{className:"pt-4 first:pt-0 text-[10.5px] font-semibold uppercase tracking-widest text-muted-foreground/40",children:e.title}),e.steps.map((e,t)=>(0,r.jsx)("div",{id:"step-".concat(e.num),className:"scroll-mt-6",children:(0,r.jsx)(et,{t:q,step:e,displayNum:t+1,active:e.num===Y,events:S.filter(t=>t.stepNum===e.num)})},e.num))]},t))]}),(null==N?void 0:N.summary)&&(0,r.jsxs)("div",{className:"mt-6 rounded-xl border border-white/7 bg-card/60 px-4 py-3",children:[(0,r.jsx)("div",{className:"text-[10px] font-semibold uppercase tracking-widest text-muted-foreground/40 mb-1.5",children:q.summary}),(0,r.jsx)("div",{className:"text-sm leading-relaxed text-foreground/80",children:N.summary})]}),(null==N?void 0:N.testCase)&&(0,r.jsx)(V,{className:"mt-3",children:(0,r.jsxs)("div",{className:"rounded-xl border border-white/7 bg-card/60 overflow-hidden",children:[(0,r.jsxs)($,{className:"group w-full flex items-center justify-between px-4 py-3 hover:bg-white/[0.02] transition-colors",children:[(0,r.jsx)("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-muted-foreground/40",children:q.testCase}),(0,r.jsx)(p.A,{className:"size-3.5 text-muted-foreground/30 group-data-open:hidden"}),(0,r.jsx)(x.A,{className:"size-3.5 text-muted-foreground/30 hidden group-data-open:inline"})]}),(0,r.jsx)(J,{children:(0,r.jsx)("pre",{className:"px-4 pb-4 text-[11.5px] font-mono leading-relaxed text-foreground/60 whitespace-pre-wrap break-words border-t border-white/5 pt-3",children:N.testCase})})]})}),(null==N?void 0:N.attachments)&&N.attachments.length>0&&(0,r.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-1.5",children:[(0,r.jsxs)("span",{className:"inline-flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-widest text-muted-foreground/40 mr-1",children:[(0,r.jsx)(m.A,{className:"size-3"}),q.attached]}),N.attachments.map(e=>{var t;return(0,r.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-lg border border-white/8 bg-white/[0.03] px-2.5 py-1",children:[(0,r.jsx)("span",{className:"text-[11px] font-mono text-foreground/70 max-w-[200px] truncate",children:e.name}),(0,r.jsx)("span",{className:"text-[10px] tabular-nums text-muted-foreground/35",children:(t=e.size)<1024?"".concat(t," B"):t<1048576?"".concat(Math.round(t/1024)," KB"):"".concat((t/1024/1024).toFixed(1)," MB")})]},e.name)})]}),("passed"===U||"failed"===U)&&(0,r.jsx)(K,{}),(0,r.jsx)(_,{open:!!(null==N?void 0:N.pending),children:(0,r.jsx)(I,{showCloseButton:!1,children:(null==N?void 0:N.pending)&&(0,r.jsx)(er,{runId:j,question:N.pending,t:q})})})]})}function K(){return(0,r.jsxs)("a",{href:"https://github.com/broxhq/qpilot",target:"_blank",rel:"noreferrer",className:"group mt-6 flex items-center gap-3 rounded-xl border border-white/7 bg-card/60 px-4 py-3 transition-colors hover:border-warning/30 hover:bg-warning/[0.03]",children:[(0,r.jsx)(h.A,{className:"size-4 shrink-0 text-muted-foreground/50 transition-colors group-hover:text-warning group-hover:fill-warning"}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsxs)("div",{className:"text-sm text-foreground/80",children:["Did qpilot save you time?"," ",(0,r.jsx)("span",{className:"text-foreground/95 group-hover:text-warning transition-colors",children:"Star it on GitHub"})]}),(0,r.jsx)("div",{className:"text-xs text-muted-foreground/50",children:"A ⭐ helps more people find it — takes two seconds."})]})]})}let Q={running:{icon:(0,r.jsx)(u.A,{className:"size-4 animate-spin"}),color:"text-foreground/70",bg:"bg-white/5",border:"border-white/10"},waiting:{icon:(0,r.jsx)(g.A,{className:"size-4"}),color:"text-warning",bg:"bg-warning/10",border:"border-warning/20"},paused:{icon:(0,r.jsx)(d.A,{className:"size-4"}),color:"text-foreground/50",bg:"bg-white/5",border:"border-white/10"},passed:{icon:(0,r.jsx)(f.A,{className:"size-4",strokeWidth:2.5}),color:"text-success",bg:"bg-success/10",border:"border-success/20"},failed:{icon:(0,r.jsx)(b.A,{className:"size-4",strokeWidth:2.5}),color:"text-destructive",bg:"bg-destructive/10",border:"border-destructive/20"},error:{icon:(0,r.jsx)(g.A,{className:"size-4"}),color:"text-destructive",bg:"bg-destructive/10",border:"border-destructive/20"}};function X(e){var t,n;let{status:s,t:a}=e,i=null!=(t=Q[s])?t:Q.running,o=null!=(n=a.status[s])?n:a.status.running;return(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:(0,y.cn)("flex items-center justify-center size-9 rounded-xl border transition-colors",i.bg,i.border,i.color),children:i.icon}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:(0,y.cn)("text-sm font-semibold tracking-tight",i.color),children:o.label}),(0,r.jsx)("div",{className:"text-xs text-muted-foreground/60",children:o.sub})]})]})}let Z={queued:{border:"border-l-white/8",badge:"bg-white/5 text-muted-foreground/50",bg:""},pass:{border:"border-l-success/60",badge:"bg-success/10 text-success",bg:""},warn:{border:"border-l-warning/60",badge:"bg-warning/10 text-warning",bg:""},fail:{border:"border-l-destructive/60",badge:"bg-destructive/10 text-destructive",bg:"bg-destructive/[0.03]"},skipped:{border:"border-l-white/8",badge:"bg-white/4 text-muted-foreground/30",bg:""}},Y={border:"border-l-warning/80",badge:"bg-warning/10 text-warning",bg:"bg-warning/[0.03]"};function ee(e){if("action"===e.kind&&("report_step"===e.toolName||"finish"===e.toolName||"set_plan"===e.toolName))return!1;if("observation"===e.kind){var t;let n=null!=(t=e.text)?t:"";return n.startsWith("Error:")||n.startsWith("[debug]")}return!0}function et(e){var t,n;let{step:a,events:i,active:o,displayNum:l,t:d}=e,c=null!=(t=Z[a.status])?t:Z.queued,g=o?{...c,...Y}:c,m=i.filter(ee),h=o||"fail"===a.status,[f,b]=(0,s.useState)(h);return(0,s.useEffect)(()=>b(h),[h]),(0,r.jsx)(V,{open:f,onOpenChange:b,children:(0,r.jsxs)("div",{className:(0,y.cn)("rounded-xl border border-white/7 border-l-2 overflow-hidden transition-colors",g.border,g.bg),children:[(0,r.jsxs)($,{className:"group w-full flex items-center gap-3 px-4 py-3 text-left hover:bg-white/[0.02] transition-colors",children:[(0,r.jsx)(z,{className:(0,y.cn)("border-0 text-[9.5px] tracking-widest font-semibold shrink-0 gap-1 uppercase rounded-md px-1.5",g.badge),children:o?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(u.A,{className:"size-2.5 animate-spin"}),d.stepStatus.running]}):null!=(n=d.stepStatus[a.status])?n:a.status}),(0,r.jsxs)("span",{className:"flex-1 min-w-0 text-[13px] text-foreground/80",children:[(0,r.jsx)("span",{className:"text-muted-foreground/40 mr-2 font-mono text-[11px]",children:String(null!=l?l:a.num).padStart(2,"0")}),a.description]}),(0,r.jsx)(p.A,{className:"size-3.5 text-muted-foreground/30 shrink-0 group-data-open:hidden"}),(0,r.jsx)(x.A,{className:"size-3.5 text-muted-foreground/30 shrink-0 hidden group-data-open:inline"})]}),a.evidence&&(0,r.jsx)("div",{className:"px-4 pb-3 -mt-0.5 text-[11.5px] text-muted-foreground/60 leading-relaxed font-mono",children:a.evidence}),(0,r.jsx)(J,{children:(0,r.jsxs)("div",{className:"px-4 pb-4 pt-3 space-y-3 border-t border-white/5",children:[a.screenshot&&(0,r.jsx)("a",{href:a.screenshot,target:"_blank",rel:"noreferrer",className:"block rounded-lg overflow-hidden border border-white/8 hover:border-white/15 transition-colors",children:(0,r.jsx)("img",{src:a.screenshot,alt:"screenshot step ".concat(a.num),className:"max-h-64 w-full object-contain bg-black/20"})}),m.length>0?(0,r.jsx)("div",{className:"space-y-0.5",children:m.map((e,t)=>(0,r.jsx)(en,{event:e,t:d},t))}):(0,r.jsx)("div",{className:"text-[11px] text-muted-foreground/30",children:d.noEvents})]})})]})})}function en(e){let{event:t,t:n}=e,{icon:s,text:a,cls:i}=function(e,t){var n,r,s,a,i,o,l,d,c,u,g,p,x;switch(e.kind){case"action":return{icon:"→",text:function(e,t){var n,r,s,a,i,o,l,d,c;let u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:(0,w.jd)("en"),g=null!=t?t:{},p=u.action;switch(e){case"navigate":return"".concat(p.opening," ").concat(null!=(n=g.url)?n:"");case"snapshot":return g.near?"".concat(p.readingBlock,' "').concat(g.near,'"'):p.readingPage;case"click":return g.name?"".concat(p.clicking,' "').concat(g.name,'"'):p.clickingElement;case"fill":return g.name?"".concat(p.filling,' "').concat(g.name,'" → "').concat(null!=(r=g.value)?r:"",'"'):"".concat(p.filling,' "').concat(null!=(s=g.value)?s:"",'"');case"select":return g.name?"".concat(p.selecting,' "').concat(null!=(a=g.value)?a:"",'" — "').concat(g.name,'"'):"".concat(p.selecting,' "').concat(null!=(i=g.value)?i:"",'"');case"hover":return g.name?"".concat(p.hovering,' "').concat(g.name,'"'):p.hoveringElement;case"scroll_to":return"".concat(p.scrollingTo," ").concat(g.text?'"'.concat(g.text,'"'):null!=(o=g.ref)?o:"");case"scroll":{let e=[Number(g.y)?"".concat(Number(g.y)>0?p.down:p.up," ").concat(Math.abs(Number(g.y)),"px"):"",Number(g.x)?"".concat(Number(g.x)>0?p.right:p.left," ").concat(Math.abs(Number(g.x)),"px"):""].filter(Boolean).join(", "),t=g.ref?" ".concat(p.inside," ").concat(g.ref):"";return"".concat(p.scrolling," ").concat(e||"0px").concat(t)}case"press":return"".concat(p.pressing," ").concat(null!=(l=g.key)?l:"");case"upload_file":return"".concat(p.uploading,' "').concat(null!=(d=g.file)?d:"",'"').concat(g.name?" ".concat(p.to,' "').concat(g.name,'"'):"");case"dismiss":return p.closingOverlay;case"wait":return"".concat(p.waiting," ").concat(null!=(c=g.ms)?c:""," ms");case"ask_user":return p.askingUser;default:return null!=e?e:"action"}}(e.toolName,e.toolInput,t),cls:"text-foreground/70"};case"step":{let i=null!=(s=null==(n=e.step)?void 0:n.status)?s:"",o="pass"===i?"text-success":"fail"===i?"text-destructive":"text-warning";return{icon:"pass"===i?"✓":"fail"===i?"✗":"!",text:"".concat(t.stepLabel," ").concat(null==(r=e.step)?void 0:r.num," — ").concat((null!=(a=t.stepStatus[i])?a:i).toUpperCase()),cls:o}}case"observation":{let t=null!=(i=e.text)?i:"";if(t.startsWith("Error:"))return{icon:"✗",text:t,cls:"text-destructive"};return{icon:"\xb7",text:t,cls:"text-muted-foreground/40"}}case"question":return{icon:"?",text:"".concat(t.asking,": ").concat(null!=(l=null==(o=e.question)?void 0:o.prompt)?l:""),cls:"text-warning"};case"answer":return{icon:"✎",text:t.userAnswered,cls:"text-foreground/50"};case"thought":return{icon:"›",text:null!=(d=e.text)?d:"",cls:"text-muted-foreground/40 italic"};case"done":return{icon:"■",text:"".concat(t.runFinished," — ").concat(null!=(p=null!=(g=null==(c=t.status[null!=(u=e.status)?u:""])?void 0:c.label)?g:e.status)?p:""),cls:"text-foreground/60"};case"error":return{icon:"✗",text:null!=(x=e.text)?x:"",cls:"text-destructive"};default:return{icon:"\xb7",text:"",cls:"text-muted-foreground/30"}}}(t,n),o=new Date(t.ts).toLocaleTimeString("en-US",{hour12:!1});return(0,r.jsxs)("div",{className:"flex gap-2.5 text-[11.5px] leading-relaxed items-baseline font-mono",children:[(0,r.jsx)("span",{className:"shrink-0 tabular-nums text-muted-foreground/25 text-[10px]",children:o}),(0,r.jsx)("span",{className:(0,y.cn)("shrink-0 w-3.5 text-center",i),children:s}),(0,r.jsx)("span",{className:(0,y.cn)("min-w-0 break-words",i),children:a})]})}function er(e){let{runId:t,question:n,t:a}=e,[i,o]=(0,s.useState)(""),[l,d]=(0,s.useState)(!1),[c,u]=(0,s.useState)(null);async function p(e){if(e.preventDefault(),i){d(!0),u(null);try{let e=await fetch("/api/run/".concat(t,"/answer"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({questionId:n.id,answer:i})});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||"HTTP ".concat(e.status))}o("")}catch(e){u(e instanceof Error?e.message:String(e)),d(!1)}}}return(0,r.jsxs)("form",{onSubmit:p,className:"space-y-4",children:[(0,r.jsx)(O,{children:(0,r.jsxs)(q,{className:"flex items-center gap-2 text-base",children:[(0,r.jsx)(g.A,{className:"size-4 text-warning shrink-0"}),a.needInput]})}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground leading-relaxed",children:n.prompt}),(0,r.jsx)(W,{autoFocus:!0,type:n.secret?"password":"text",value:i,onChange:e=>o(e.target.value),placeholder:n.secret?a.secretPlaceholder:a.answerPlaceholder,className:"font-mono"}),c&&(0,r.jsx)("p",{className:"text-destructive text-xs",children:c}),(0,r.jsx)(A.$,{type:"submit",disabled:!i||l,className:"w-full",children:l?a.sending:a.submit})]})}},2391:(e,t,n)=>{"use strict";n.d(t,{jd:()=>a});let r={back:"Back",newRun:"New run",notFound:"Run not found — it may have finished and been cleared from memory.",steps:"steps",passedCount:"passed",warnCount:"warn",failedCount:"failed",waitingForPlan:"waiting for plan…",noSteps:"no steps were run",pause:"Pause",resume:"Resume",waitingToStart:"waiting for agent to start…",endedBeforePlan:"The run ended before the agent produced a plan.",seeReason:"See the reason below.",summary:"Summary",testCase:"Test case",attached:"Attached",noEvents:"no events for this step",runFinished:"Run finished",stepLabel:"Step",asking:"Asking",userAnswered:"User answered",needInput:"Agent needs input",submit:"Submit",sending:"Sending…",secretPlaceholder:"OTP / password",answerPlaceholder:"answer",status:{running:{label:"Running",sub:"agent is executing steps"},waiting:{label:"Waiting",sub:"agent needs your input"},paused:{label:"Paused",sub:"run is paused"},passed:{label:"Passed",sub:"all steps passed"},failed:{label:"Failed",sub:"some steps failed"},error:{label:"Error",sub:"agent crashed"}},home:{tagline:"Paste a test case. Watch it run.",chooseFolder:"Choose folder",uploadMd:"Upload .md",files:"files",clearList:"Clear file list",selectAll:"Select all",selected:"selected",run:"Run",runN:"Run",withPreview:"With preview",runPreview:"Run with preview",running:"Running…",stop:"Stop",example:"Example",placeholder:"Paste your test case here…",expand:"Expand",collapse:"Collapse",batchRun:"Batch run",recentRuns:"Recent runs",attach:"Attach files",addFile:"Add file",attachHint:"optional — images, CSV or documents the test needs to upload",remove:"Remove"},stepStatus:{queued:"queued",pass:"pass",warn:"warn",fail:"fail",skipped:"skipped",running:"running"},action:{opening:"Opening",readingPage:"Reading page",readingBlock:"Reading block",clicking:"Clicking",clickingElement:"Clicking element",filling:"Filling",selecting:"Selecting",hovering:"Hovering",hoveringElement:"Hovering element",scrollingTo:"Scrolling to",scrolling:"Scrolling",inside:"inside",pressing:"Pressing",closingOverlay:"Closing overlay",waiting:"Waiting",askingUser:"Asking user",uploading:"Uploading",to:"to",down:"down",up:"up",right:"right",left:"left"}},s={en:r,ru:{back:"Назад",newRun:"Новый прогон",notFound:"Прогон не найден — возможно, он завершился и был вытеснен из памяти.",steps:"шагов",passedCount:"успешно",warnCount:"предупреждений",failedCount:"провалено",waitingForPlan:"ждём план…",noSteps:"шаги не выполнялись",pause:"Пауза",resume:"Продолжить",waitingToStart:"ждём запуска агента…",endedBeforePlan:"Прогон завершился до того, как агент составил план.",seeReason:"Причина — ниже.",summary:"Итог",testCase:"Тест-кейс",attached:"Вложения",noEvents:"событий по этому шагу нет",runFinished:"Прогон завершён",stepLabel:"Шаг",asking:"Спрашивает",userAnswered:"Пользователь ответил",needInput:"Агенту нужен ввод",submit:"Отправить",sending:"Отправка…",secretPlaceholder:"код / пароль",answerPlaceholder:"ответ",status:{running:{label:"Выполняется",sub:"агент проходит шаги"},waiting:{label:"Ожидание",sub:"агенту нужен ваш ввод"},paused:{label:"Пауза",sub:"прогон приостановлен"},passed:{label:"Успешно",sub:"все шаги пройдены"},failed:{label:"Провален",sub:"часть шагов не прошла"},error:{label:"Ошибка",sub:"агент упал"}},home:{tagline:"Вставьте тест-кейс. Смотрите, как он проходит.",chooseFolder:"Выбрать папку",uploadMd:"Загрузить .md",files:"файлов",clearList:"Очистить список",selectAll:"Выбрать все",selected:"выбрано",run:"Запустить",runN:"Запустить",withPreview:"С превью",runPreview:"Запустить с превью",running:"Запускаем…",stop:"Остановить",example:"Пример",placeholder:"Вставьте сюда свой тест-кейс…",expand:"Развернуть",collapse:"Свернуть",batchRun:"Пакетный прогон",recentRuns:"Последние прогоны",attach:"Прикрепить файлы",addFile:"Добавить файл",attachHint:"необязательно — картинки, CSV или документы, которые нужно загрузить в тесте",remove:"Убрать"},stepStatus:{queued:"в очереди",pass:"успех",warn:"внимание",fail:"провал",skipped:"пропущен",running:"выполняется"},action:{opening:"Открывает",readingPage:"Читает страницу",readingBlock:"Читает блок",clicking:"Кликает",clickingElement:"Кликает по элементу",filling:"Заполняет",selecting:"Выбирает",hovering:"Наводит на",hoveringElement:"Наводит на элемент",scrollingTo:"Скроллит к",scrolling:"Скроллит",inside:"внутри",pressing:"Нажимает",closingOverlay:"Закрывает оверлей",waiting:"Ждёт",askingUser:"Спрашивает пользователя",uploading:"Загружает",to:"в",down:"вниз",up:"вверх",right:"вправо",left:"влево"}}};function a(e){var t;return null!=(t=s[null!=e?e:"en"])?t:r}},5016:(e,t,n)=>{"use strict";n.d(t,{a:()=>i,cn:()=>a});var r=n(2821),s=n(5889);function a(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,s.QP)((0,r.$)(t))}function i(e){let t=Math.max(0,Math.floor(e/1e3));return"".concat(Math.floor(t/60),":").concat(String(t%60).padStart(2,"0"))}},6329:(e,t,n)=>{"use strict";function r(e){return"data:image/svg+xml,".concat(encodeURIComponent(e))}function s(e){let t=document.querySelector('link[rel="icon"]');t||(t=Object.assign(document.createElement("link"),{rel:"icon"}),document.head.appendChild(t)),t.href=e}function a(e){return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">'.concat(e,"</svg>")}n.d(t,{O:()=>u,g:()=>g});let i=Array.from({length:10},(e,t)=>{let n=t/10*Math.PI*2-Math.PI/2,s=.65*Math.PI,i=12+10*Math.cos(n),o=12+10*Math.sin(n),l=12+10*Math.cos(n+s),d=12+10*Math.sin(n+s);return r(a('<circle cx="12" cy="12" r="10" stroke="#38bdf8" stroke-width="2.5" fill="none" opacity="0.15"/>'+'<path d="M'.concat(i.toFixed(3)," ").concat(o.toFixed(3)," A10 10 0 0 1 ").concat(l.toFixed(3)," ").concat(d.toFixed(3),'" stroke="#38bdf8" stroke-width="2.5" fill="none" stroke-linecap="round"/>')))}),o={passed:r(a('<circle cx="12" cy="12" r="10" fill="#22c55e"/><path d="M7 12.5l3.5 3.5 6.5-7" stroke="white" stroke-width="2.2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>')),failed:r(a('<circle cx="12" cy="12" r="10" fill="#ef4444"/><path d="M8 8l8 8M16 8l-8 8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),error:r(a('<circle cx="12" cy="12" r="10" fill="#ef4444"/><path d="M8 8l8 8M16 8l-8 8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),waiting:r(a('<circle cx="12" cy="12" r="10" fill="#facc15"/><path d="M12 7v5.5l3 3" stroke="white" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>')),paused:r(a('<circle cx="12" cy="12" r="10" fill="#64748b"/><path d="M9 8v8M15 8v8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),default:r(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="'.concat(e,'" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">').concat('<path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/>').concat(t,"</svg>")}("white"))},l=null,d=0;function c(){l&&(clearInterval(l),l=null)}function u(e){var t;if(c(),"running"===e){d=0,s(i[0]),l=setInterval(()=>{s(i[d=(d+1)%10])},100);return}s(null!=(t=o[e])?t:o.default)}function g(){c(),s(o.default)}},7003:(e,t,n)=>{"use strict";n.d(t,{$:()=>l});var r=n(5155),s=n(9574),a=n(3101),i=n(5016);let o=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:n="default",size:a="default",...l}=e;return(0,r.jsx)(s.$,{"data-slot":"button",className:(0,i.cn)(o({variant:n,size:a,className:t})),...l})}},9578:(e,t,n)=>{Promise.resolve().then(n.bind(n,191))}},e=>{e.O(0,[662,775,441,255,358],()=>e(e.s=9578)),_N_E=e.O()}]);
@@ -0,0 +1,3 @@
1
+ @font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/f639721981034f88-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/9766a7e9e2e0ad5a-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/b66cf8e69499582a-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/aa016aab0e6d1295-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Geist;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/22a5144ee8d83bca-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Geist Fallback;src:local("Arial");ascent-override:95.94%;descent-override:28.16%;line-gap-override:0.00%;size-adjust:104.76%}.__className_246ccd{font-family:Geist,Geist Fallback;font-style:normal}.__variable_246ccd{--font-sans:"Geist","Geist Fallback"}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/013b72fa676f92e0-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/b9408752a0c24fb9-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/65f03d54ccadf4a8-s.woff2) format("woff2");unicode-range:u+2000-2001,u+2004-2008,u+200a,u+23b8-23bd,u+2500-259f}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/e038a29029a234f2-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/2b5b02fc7e511755-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Geist Mono;font-style:normal;font-weight:100 900;font-display:swap;src:url(/_next/static/media/7d4881bb7e1bf84d-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Geist Mono Fallback;src:local("Arial");ascent-override:74.67%;descent-override:21.92%;line-gap-override:0.00%;size-adjust:134.59%}.__className_c29908{font-family:Geist Mono,Geist Mono Fallback;font-style:normal}.__variable_c29908{--font-mono:"Geist Mono","Geist Mono Fallback"}
2
+
3
+ /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:host,:root{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:calc(var(--radius) * .8);--radius-2xl:1rem;--radius-4xl:2rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-spin:spin 1s linear infinite;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring) 40%,transparent)}}html{scroll-behavior:smooth}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"rlig" 1,"calt" 1;letter-spacing:-.01em;background-image:radial-gradient(oklch(100% 0 0/.035) 1px,#0000 0);background-size:22px 22px;background-attachment:fixed}body:before{content:"";pointer-events:none;z-index:0;background:radial-gradient(80% 40% at 50% -10%,oklch(35% .06 270/.18),#0000);position:fixed;inset:0}#__next,main{z-index:1;position:relative}}@layer components;@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden}.absolute,.sr-only{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.isolate{isolation:isolate}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-px{margin-top:1px}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-\[3px\]{height:3px}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[65vh\]{max-height:65vh}.max-h-\[360px\]{max-height:360px}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[320px\]{min-height:320px}.min-h-screen{min-height:100vh}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-64{width:calc(var(--spacing) * 64)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1)}.-translate-x-1\/2,.-translate-y-1\/2{translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1)}.animate-spin{animation:var(--animate-spin)}.resize-none{resize:none}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-white\/5>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){:where(.divide-white\/5>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap}.overflow-hidden,.truncate{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-4xl{border-radius:var(--radius-4xl)}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md),10px)}.rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md),12px)}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) * .8)}.rounded-sm{border-radius:calc(var(--radius) * .6)}.rounded-xl{border-radius:calc(var(--radius) * 1.4)}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) * 1.4);border-bottom-left-radius:calc(var(--radius) * 1.4)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-border{border-color:var(--border)}.border-destructive\/20{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/20{border-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.border-destructive\/25{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/25{border-color:color-mix(in oklab,var(--destructive) 25%,transparent)}}.border-input{border-color:var(--input)}.border-success\/20{border-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.border-success\/20{border-color:color-mix(in oklab,var(--success) 20%,transparent)}}.border-transparent{border-color:#0000}.border-warning\/20{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/20{border-color:color-mix(in oklab,var(--warning) 20%,transparent)}}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/7{border-color:#ffffff12}@supports (color:color-mix(in lab,red,red)){.border-white\/7{border-color:color-mix(in oklab,var(--color-white) 7%,transparent)}}.border-white\/8{border-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.border-white\/8{border-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.border-white\/15{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.border-l-destructive\/60{border-left-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-l-destructive\/60{border-left-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}.border-l-success\/60{border-left-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.border-l-success\/60{border-left-color:color-mix(in oklab,var(--success) 60%,transparent)}}.border-l-warning\/60{border-left-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-l-warning\/60{border-left-color:color-mix(in oklab,var(--warning) 60%,transparent)}}.border-l-warning\/80{border-left-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-l-warning\/80{border-left-color:color-mix(in oklab,var(--warning) 80%,transparent)}}.border-l-white\/8{border-left-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.border-l-white\/8{border-left-color:color-mix(in oklab,var(--color-white) 8%,transparent)}}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--background) 80%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.bg-card\/60{background-color:var(--card)}@supports (color:color-mix(in lab,red,red)){.bg-card\/60{background-color:color-mix(in oklab,var(--card) 60%,transparent)}}.bg-destructive,.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-destructive\/\[0\.03\]{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/\[0\.03\]{background-color:color-mix(in oklab,var(--destructive) 3%,transparent)}}.bg-destructive\/\[0\.06\]{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/\[0\.06\]{background-color:color-mix(in oklab,var(--destructive) 6%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-success,.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--success) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,var(--warning) 10%,transparent)}}.bg-warning\/\[0\.03\]{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/\[0\.03\]{background-color:color-mix(in oklab,var(--warning) 3%,transparent)}}.bg-white\/4{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/4{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-white) 2%,transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.bg-clip-padding{background-clip:padding-box}.object-contain{object-fit:contain}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-4{padding:calc(var(--spacing) * 4)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-9{padding-bottom:calc(var(--spacing) * 9)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.text-left{text-align:left}.font-heading{font-family:var(--font-sans)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[9\.5px\]{font-size:9.5px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13px\]{font-size:13px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-destructive{color:var(--destructive)}.text-foreground,.text-foreground\/50{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/50{color:color-mix(in oklab,var(--foreground) 50%,transparent)}}.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/60{color:color-mix(in oklab,var(--foreground) 60%,transparent)}}.text-foreground\/70{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/70{color:color-mix(in oklab,var(--foreground) 70%,transparent)}}.text-foreground\/80{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--foreground) 80%,transparent)}}.text-foreground\/90{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,var(--foreground) 90%,transparent)}}.text-foreground\/95{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/95{color:color-mix(in oklab,var(--foreground) 95%,transparent)}}.text-muted-foreground,.text-muted-foreground\/20{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/20{color:color-mix(in oklab,var(--muted-foreground) 20%,transparent)}}.text-muted-foreground\/25{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/25{color:color-mix(in oklab,var(--muted-foreground) 25%,transparent)}}.text-muted-foreground\/30{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/30{color:color-mix(in oklab,var(--muted-foreground) 30%,transparent)}}.text-muted-foreground\/35{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/35{color:color-mix(in oklab,var(--muted-foreground) 35%,transparent)}}.text-muted-foreground\/40{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,var(--muted-foreground) 40%,transparent)}}.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--muted-foreground) 60%,transparent)}}.text-muted-foreground\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,var(--muted-foreground) 70%,transparent)}}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.shadow-\[0_0_0_3px_oklch\(0\.5_0\.1_270_\/_12\%\)\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,oklch(50% .1 270/.12))}.shadow-\[0_0_0_3px_oklch\(0\.5_0\.1_270_\/_12\%\)\],.shadow-lg{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab,var(--foreground) 10%,transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.paused{animation-play-state:paused}.running{animation-play-state:running}@media (hover:hover){.group-hover\:fill-warning:is(:where(.group):hover *){fill:var(--warning)}.group-hover\:text-warning:is(:where(.group):hover *){color:var(--warning)}}.group-data-open\:hidden:is(:where(.group)[data-open] *){display:none}.group-data-open\:inline:is(:where(.group)[data-open] *){display:inline}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.first\:pt-0:first-child{padding-top:calc(var(--spacing) * 0)}@media (hover:hover){.hover\:border-warning\/30:hover{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.hover\:border-warning\/30:hover{border-color:color-mix(in oklab,var(--warning) 30%,transparent)}}.hover\:border-white\/15:hover{border-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.hover\:border-white\/15:hover{border-color:color-mix(in oklab,var(--color-white) 15%,transparent)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:bg-warning\/\[0\.03\]:hover{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/\[0\.03\]:hover{background-color:color-mix(in oklab,var(--warning) 3%,transparent)}}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.hover\:bg-white\/\[0\.02\]:hover{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.02\]:hover{background-color:color-mix(in oklab,var(--color-white) 2%,transparent)}}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-3:focus-visible,.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring) 50%,transparent)}}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-input\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.disabled\:bg-input\/50:disabled{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-lg{border-radius:var(--radius)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.data-closed\:animate-out[data-closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-closed\:zoom-out-95[data-closed]{--tw-exit-scale:.95}.data-open\:animate-in[data-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:fade-in-0[data-open]{--tw-enter-opacity:0}.data-open\:zoom-in-95[data-open]{--tw-enter-scale:.95}@supports ((-webkit-backdrop-filter:var(--tw )) or (backdrop-filter:var(--tw ))){.supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}}@media (min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}@media (hover:hover){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:color-mix(in oklab,var(--destructive) 30%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:color-mix(in oklab,var(--input) 80%,transparent)}}.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab,var(--destructive) 50%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive) 40%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}:is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}:is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:var(--muted)}.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:color-mix(in oklab,var(--primary) 80%,transparent)}}.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:var(--foreground)}}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(13% .005 270);--foreground:oklch(97% 0 0);--card:oklch(17% .006 270);--card-foreground:oklch(97% 0 0);--popover:oklch(17% .006 270);--popover-foreground:oklch(97% 0 0);--primary:oklch(97% 0 0);--primary-foreground:oklch(13% 0 0);--secondary:oklch(22% .005 270);--secondary-foreground:oklch(97% 0 0);--muted:oklch(22% .005 270);--muted-foreground:oklch(60% .01 270);--accent:oklch(22% .005 270);--accent-foreground:oklch(97% 0 0);--destructive:oklch(65% .2 22);--success:oklch(72% .17 152);--warning:oklch(76% .16 80);--border:oklch(100% 0 0/.07);--input:oklch(100% 0 0/.08);--ring:oklch(60% .06 270)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:oklch(100% 0 0/.08);border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:oklch(100% 0 0/.14)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(1turn)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
package/README.md CHANGED
@@ -1,108 +1,49 @@
1
- # qpilot
2
-
3
- **AI agent that runs your manual test cases in a real browser**
4
-
5
- [![npm](https://img.shields.io/npm/v/qpilot)](https://www.npmjs.com/package/qpilot)
6
- [![GitHub stars](https://img.shields.io/github/stars/broxhq/qpilot?style=social)](https://github.com/broxhq/qpilot)
7
- ![node](https://img.shields.io/badge/node-%3E%3D20.12-brightgreen)
8
- ![license](https://img.shields.io/badge/license-MIT-blue)
9
-
10
- > If qpilot saved you time → **[⭐ Star it on GitHub](https://github.com/broxhq/qpilot)**. It helps more than you'd think.
1
+ <h1 align="center">qpilot</h1>
11
2
 
12
3
  <p align="center">
13
- <img src="docs/assets/demo.gif" width="700" alt="qpilot demo — paste a test case, hit Run, watch live pass/fail per step" />
4
+ <b>An AI agent that runs your manual test cases in a real browser.</b><br>
5
+ Paste plain text. Watch it click.
14
6
  </p>
15
7
 
16
- ---
17
-
18
- ## How it works
19
-
20
- 1. You paste a plain-text test case
21
- 2. The agent opens Chrome and executes each step
22
- 3. You watch results appear live — `pass`, `fail`, or `warn` per step
23
- 4. If it hits a captcha or OTP, it pauses and asks you directly
24
-
25
- No code. No Selenium. No config files.
26
-
27
- | | Manual testing | Selenium / Playwright scripts | **qpilot** |
28
- |---|---|---|---|
29
- | Setup | none | write + maintain a test suite | paste plain text |
30
- | Survives UI changes | n/a (a human adapts) | breaks on selector/layout changes | reads the page like a human, via ARIA semantics |
31
- | Who can write a test | anyone | someone who codes | anyone who can write a step-by-step description |
32
- | OTP / captcha | human handles it | usually blocks the run | pauses and asks you, then continues |
33
- | Result | you watched it yourself | pass/fail, no narrative | pass/fail/warn per step, with evidence |
34
-
35
- ---
36
-
37
- ## Quick start
8
+ <p align="center">
9
+ <a href="https://www.npmjs.com/package/qpilot"><img src="https://img.shields.io/npm/v/qpilot" alt="npm"></a>
10
+ <img src="https://img.shields.io/badge/node-%3E%3D20.12-brightgreen" alt="node">
11
+ <img src="https://img.shields.io/badge/license-MIT-blue" alt="license">
12
+ <a href="https://github.com/broxhq/qpilot"><img src="https://img.shields.io/github/stars/broxhq/qpilot?style=social" alt="stars"></a>
13
+ </p>
38
14
 
39
- **Requirements:** Node.js 20.12+, Google Chrome, an [Anthropic API key](https://console.anthropic.com) — or any OpenAI-compatible model endpoint (Qwen, vLLM, Ollama, corporate gateway)
15
+ <p align="center">
16
+ <img src="docs/assets/demo.gif" width="720" alt="Paste a test case, hit Run, watch live pass/fail per step">
17
+ </p>
40
18
 
41
19
  ```bash
42
20
  npx qpilot
43
21
  ```
44
22
 
45
- That's it. On first run qpilot walks you through a quick provider setup (arrow-key menu), then every launch shows your config and a Start menu.
46
-
47
- Browser opens automatically at `http://localhost:3847`.
48
-
49
- ---
50
-
51
- ## Models & providers
52
-
53
- On first run qpilot asks which model to use. You can re-run setup anytime:
54
-
55
- ```bash
56
- npx qpilot config
57
- ```
58
-
59
- Two options:
60
-
61
- - **Anthropic (Claude)** — enter your `sk-ant-…` key. Default model is `claude-haiku-4-5`.
62
- Base URL is optional — set it if you reach Claude through a corporate proxy/gateway.
63
- - **Custom** — any **OpenAI-compatible** endpoint: Qwen, vLLM, Ollama, a corporate
64
- gateway, OpenRouter, or OpenAI itself. You provide a **base URL**, **API token**
65
- and **model id**, e.g.:
66
-
67
- ```
68
- Base URL: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
69
- Model id: qwen2.5-72b-instruct
70
- ```
71
-
72
- Your choice is saved to `~/.qpilot/config.json` (mode `600`) and reused on every run.
73
-
74
- > The custom path speaks the OpenAI `/chat/completions` protocol with tool calling —
75
- > so the model must support function/tool calling for the agent to drive the browser.
76
-
77
- ### API key (Anthropic shortcut)
78
-
79
- For the Anthropic provider you can skip setup by supplying the key via env:
80
-
81
- 1. `ANTHROPIC_API_KEY` environment variable
82
- 2. `.env.local` file in the current directory
83
-
84
- ```bash
85
- echo "ANTHROPIC_API_KEY=sk-ant-..." > .env.local
86
- ```
87
-
88
- The key is never stored except in `~/.qpilot/config.json` when you run setup.
89
-
90
- ---
23
+ That's the whole install. First launch walks you through picking a model, then opens
24
+ the UI in your browser.
91
25
 
92
- ## Options
26
+ **Needs:** Node.js 20.12+, Google Chrome, and an [Anthropic API key](https://console.anthropic.com)
27
+ — or any OpenAI-compatible endpoint (Qwen, vLLM, Ollama, a corporate gateway).
93
28
 
94
- | Command | Description |
95
- |------|-------------|
96
- | `qpilot config` | Re-run provider setup (Anthropic or custom model) |
29
+ ## How it works
97
30
 
98
- ```bash
99
- npx qpilot config
100
- ```
31
+ 1. Paste a plain-text test case — the messy kind a PM writes in Confluence is fine.
32
+ 2. The agent opens Chrome and executes each step.
33
+ 3. Results stream in live: `pass`, `fail` or `warn` per step, with evidence quoted
34
+ from the page and a screenshot on failure.
35
+ 4. Hits an OTP or captcha? It pauses and asks you, then carries on.
101
36
 
102
- Browser visibility is a per-run choice in the UI, not a CLI flag: hit **Run** to
103
- stay headless, or **Run with preview** to watch Chrome click through the page.
37
+ There is no test code, no selectors and no config files. The agent reads the page
38
+ as an accessibility tree on every action, so nothing is stored that can go stale.
104
39
 
105
- ---
40
+ | | Manual testing | Scripted e2e | **qpilot** |
41
+ |---|---|---|---|
42
+ | To add a test | write the steps | write and maintain code | write the steps |
43
+ | Who can write it | anyone | someone who codes | anyone |
44
+ | After a redesign | a human adapts | update the test code | nothing to update |
45
+ | OTP / captcha | handled by the human | usually blocks the run | pauses and asks you |
46
+ | Output | you watched it | pass/fail | pass/fail/warn per step + evidence |
106
47
 
107
48
  ## Writing a test case
108
49
 
@@ -120,27 +61,61 @@ Steps:
120
61
 
121
62
  3. Click "Add to cart" on "Sauce Labs Backpack".
122
63
  Expected: cart counter shows 1.
64
+ ```
65
+
66
+ No format is required — headings, numbering and "Expected:" lines are all optional.
67
+ The clearer the expected result, the stricter the check. Paste several test cases
68
+ at once and the agent runs them in order, grouped in the UI.
69
+
70
+ ## Attachments
123
71
 
124
- 4. Click the cart icon.
125
- Expected: cart contains Sauce Labs Backpack at $29.99.
72
+ Some steps need a file: an avatar to upload, a CSV to import, a PDF to attach.
73
+ Click **Attach files** before running, and the agent can hand them to any upload
74
+ control on the page — including the hidden `<input type=file>` behind a styled
75
+ "Choose file" button.
76
+
77
+ Files live only for the duration of the run and are deleted when it ends. The agent
78
+ can upload them, but never sees what is inside them.
79
+
80
+ ## A folder of test cases
81
+
82
+ **Choose folder** points qpilot at a directory of `.md` files. Tick the ones you
83
+ want and run them as a batch — one after another, with live status and timing, and
84
+ a **Stop** button. Finished runs land under **Recent runs**.
85
+
86
+ ## Models
87
+
88
+ ```bash
89
+ npx qpilot config
126
90
  ```
127
91
 
128
- You can paste multiple test cases at once — the agent runs them in order.
92
+ - **Anthropic (Claude)** — paste your `sk-ant-…` key. Defaults to `claude-haiku-4-5`.
93
+ A base URL is optional, for reaching Claude through a corporate proxy.
94
+ - **Custom** — any OpenAI-compatible endpoint. Give it a base URL, token and model id:
129
95
 
130
- ---
96
+ ```
97
+ Base URL: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
98
+ Model id: qwen2.5-72b-instruct
99
+ ```
131
100
 
132
- ## Running a folder of test cases
101
+ The model must support tool calling — that is how the agent drives the browser.
133
102
 
134
- Click **Choose folder** to point qpilot at a directory of `.md` files (or **Upload
135
- .md** for a single file). Check the ones you want, then **Run** the batch — each
136
- file runs one after another with live status and timing, and you can **Stop**
137
- mid-batch. Finished runs (including past batches) show up under **Recent runs**
138
- on the home page.
103
+ Your choice is saved to `~/.qpilot/config.json` (mode `600`). For the Anthropic
104
+ provider you can skip setup entirely with an `ANTHROPIC_API_KEY` env var or a
105
+ `.env.local` file.
139
106
 
140
- ---
107
+ ## Good to know
141
108
 
142
- ## Notes
109
+ - Everything runs locally. Nothing leaves your machine except the model calls, so
110
+ qpilot works against staging and internal networks.
111
+ - Browser visibility is per run: **Run** stays headless, **Run with preview** lets
112
+ you watch Chrome work.
113
+ - Runs are held in memory, last 50 only — restarting the server clears them.
114
+ - A genuinely broken page still fails the run. That is the point.
143
115
 
144
- - API key is stored only in `~/.qpilot/config.json` (file mode `600`) — never sent anywhere except your chosen model provider
145
- - Runs are in-memory and capped at the last 50 — restarting the server clears all of them
146
- - Powered by [Claude](https://anthropic.com) + [Playwright](https://playwright.dev)
116
+ ---
117
+
118
+ <p align="center">
119
+ Built with <a href="https://www.anthropic.com">Claude</a> and <a href="https://playwright.dev">Playwright</a>.<br>
120
+ If qpilot saved you time, a <a href="https://github.com/broxhq/qpilot">⭐ on GitHub</a> helps more than you'd think.
121
+ </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qpilot",
3
- "version": "0.7.3",
3
+ "version": "0.9.0",
4
4
  "description": "Run manual test cases with an AI agent in a real browser",
5
5
  "bin": {
6
6
  "qpilot": "bin/qa-agent.js"
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{2324:(e,t,n)=>{Promise.resolve().then(n.bind(n,6732))},5016:(e,t,n)=>{"use strict";n.d(t,{cn:()=>r});var a=n(2821),s=n(5889);function r(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return(0,s.QP)((0,a.$)(t))}},6329:(e,t,n)=>{"use strict";function a(e){return"data:image/svg+xml,".concat(encodeURIComponent(e))}function s(e){let t=document.querySelector('link[rel="icon"]');t||(t=Object.assign(document.createElement("link"),{rel:"icon"}),document.head.appendChild(t)),t.href=e}function r(e){return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">'.concat(e,"</svg>")}n.d(t,{O:()=>u,g:()=>h});let i=Array.from({length:10},(e,t)=>{let n=t/10*Math.PI*2-Math.PI/2,s=.65*Math.PI,i=12+10*Math.cos(n),o=12+10*Math.sin(n),l=12+10*Math.cos(n+s),d=12+10*Math.sin(n+s);return a(r('<circle cx="12" cy="12" r="10" stroke="#38bdf8" stroke-width="2.5" fill="none" opacity="0.15"/>'+'<path d="M'.concat(i.toFixed(3)," ").concat(o.toFixed(3)," A10 10 0 0 1 ").concat(l.toFixed(3)," ").concat(d.toFixed(3),'" stroke="#38bdf8" stroke-width="2.5" fill="none" stroke-linecap="round"/>')))}),o={passed:a(r('<circle cx="12" cy="12" r="10" fill="#22c55e"/><path d="M7 12.5l3.5 3.5 6.5-7" stroke="white" stroke-width="2.2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>')),failed:a(r('<circle cx="12" cy="12" r="10" fill="#ef4444"/><path d="M8 8l8 8M16 8l-8 8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),error:a(r('<circle cx="12" cy="12" r="10" fill="#ef4444"/><path d="M8 8l8 8M16 8l-8 8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),waiting:a(r('<circle cx="12" cy="12" r="10" fill="#facc15"/><path d="M12 7v5.5l3 3" stroke="white" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>')),paused:a(r('<circle cx="12" cy="12" r="10" fill="#64748b"/><path d="M9 8v8M15 8v8" stroke="white" stroke-width="2.2" stroke-linecap="round"/>')),default:a(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="'.concat(e,'" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">').concat('<path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/>').concat(t,"</svg>")}("white"))},l=null,d=0;function c(){l&&(clearInterval(l),l=null)}function u(e){var t;if(c(),"running"===e){d=0,s(i[0]),l=setInterval(()=>{s(i[d=(d+1)%10])},100);return}s(null!=(t=o[e])?t:o.default)}function h(){c(),s(o.default)}},6732:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>O});var a=n(5155),s=n(7260),r=n(2115),i=n(2619),o=n.n(i),l=n(6479);let d=(0,l.A)("bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]),c=(0,l.A)("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"}]]),u=(0,l.A)("upload",[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]]);var h=n(4788);let x=(0,l.A)("square-check-big",[["path",{d:"M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344",key:"2acyp4"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]),m=(0,l.A)("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),p=(0,l.A)("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);var f=n(9746);let g=(0,l.A)("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);var v=n(3916);let b=(0,l.A)("file-text",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);var k=n(5352),w=n(8215),y=n(3410),j=n(7003),N=n(5016);function z(e){let{className:t,...n}=e;return(0,a.jsx)("textarea",{"data-slot":"textarea",className:(0,N.cn)("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",t),...n})}var M=n(6329);let S=new Set(["running","waiting","paused"]),A="",C=[],_=null,E=new Set,I=[],D=!1,R=!1,P=null,F=null,$=null;function O(){let e=(0,s.useRouter)(),t=(0,r.useRef)(null),n=(0,r.useRef)(null),i=(0,r.useRef)(null),l=(0,r.useRef)(null),[k,w]=(0,r.useState)(A),[y,O]=(0,r.useState)(!1),[T,V]=(0,r.useState)(null),[B,U]=(0,r.useState)(!1),[W,J]=(0,r.useState)(!1),[K,Q]=(0,r.useState)(!1),[Y,Z]=(0,r.useState)(C),[G,X]=(0,r.useState)(_),[ee,et]=(0,r.useState)([]),[en,ea]=(0,r.useState)(E),[es,er]=(0,r.useState)(I),[ei,eo]=(0,r.useState)(D),[el,ed]=(0,r.useState)(()=>Date.now());function ec(e){A=e,w(e)}function eu(e){E=e,ea(e)}function eh(e){let t="function"==typeof e?e(I):e;I=t,er([...t])}async function ex(e){var t;ec(await e.file.text()),_=t=e.name,X(t)}async function em(e,t){let n=await fetch("/api/run",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({testCase:e,headless:t})}),a=await n.json();if(!n.ok)throw Error(a.error||"error");return a.id}async function ep(t){if(k.trim()){O(!0),V(null);try{let n=await em(k,t);e.push("/run/".concat(n))}catch(e){V(e instanceof Error?e.message:String(e)),O(!1)}}}async function ef(){R=!0;let e=P;e&&fetch("/api/run/".concat(e,"/pause"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"pause"})}).catch(()=>{})}async function eg(e){let t=Y.filter(e=>en.has(e.name));if(!t.length)return;let n=t.map(e=>({file:e,id:null,status:"queued"}));eh(n),D=!0,eo(!0),R=!1,P=null,F=Date.now(),$=null;for(let t=0;t<n.length;t++){if(R){eh(e=>e.map((e,n)=>n>=t?{...e,status:"skipped"}:e));break}let a=Date.now();eh(e=>e.map((e,n)=>n===t?{...e,status:"running",startedAt:a}:e));try{let a=await n[t].file.file.text(),s=await em(a,e);P=s,eh(e=>e.map((e,n)=>n===t?{...e,id:s}:e));let r=await function(e){return new Promise(t=>{let n=new EventSource("/api/run/".concat(e,"/stream")),a=setInterval(()=>{R&&(clearInterval(a),n.close(),t("paused"))},150);n.onmessage=e=>{var s;let r=null==(s=JSON.parse(e.data).run)?void 0:s.status;if(R){clearInterval(a),n.close(),t("paused");return}r&&!S.has(r)&&(clearInterval(a),n.close(),t(r))},n.onerror=()=>{clearInterval(a),n.close(),t("error")}})}(s),i=Date.now();if(eh(e=>e.map((e,n)=>n===t?{...e,status:r,finishedAt:i}:e)),R){eh(e=>e.map((e,n)=>n>t?{...e,status:"skipped"}:e));break}}catch(e){eh(e=>e.map((e,n)=>n===t?{...e,status:"error",finishedAt:Date.now()}:e))}}P=null,$=Date.now(),D=!1,eo(!1),fetch("/api/runs").then(e=>e.ok?e.json():[]).then(et).catch(()=>{})}(0,r.useEffect)(()=>{if(!ei)return;let e=setInterval(()=>ed(Date.now()),1e3);return()=>clearInterval(e)},[ei]),(0,r.useEffect)(()=>{fetch("/api/runs").then(e=>e.ok?e.json():[]).then(et).catch(()=>{})},[]),(0,r.useEffect)(()=>{let e=l.current;e&&Q(e.scrollHeight>364)},[k]),(0,r.useEffect)(()=>{if(!D)return;let e=setInterval(()=>{er([...I]),eo(D),D||clearInterval(e)},200);return()=>clearInterval(e)},[]),(0,r.useEffect)(()=>{if(ei)(0,M.O)("running");else if(I.length>0){let e=I.some(e=>"failed"===e.status||"error"===e.status),t=I.every(e=>"passed"===e.status);(0,M.O)(e?"failed":t?"passed":"default")}},[ei]),(0,r.useEffect)(()=>()=>{(0,M.g)()},[]);let ev=en.size,eb=Y.length>0&&en.size===Y.length,ek=ev>0,ew=Y.length>0&&!ek,ey=Y.length>0?"max-w-3xl":"max-w-2xl";return(0,a.jsxs)("main",{className:"flex flex-col items-center min-h-screen px-6 pt-20 pb-24",children:[(0,a.jsx)("div",{className:"flex items-center justify-center size-11 rounded-2xl border border-white/10 bg-white/5 mb-6 shadow-lg",children:(0,a.jsx)(d,{className:"size-5 text-foreground/80"})}),(0,a.jsx)("h1",{className:"text-3xl font-semibold tracking-tight mb-2",children:"QA Agent"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground mb-10",children:"Paste a test case. Watch it run."}),(0,a.jsxs)("div",{className:(0,N.cn)("w-full space-y-3",ey),children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{ref:i,type:"file",webkitdirectory:"",multiple:!0,className:"hidden",onChange:function(e){var t;let n=Array.from(null!=(t=e.target.files)?t:[]).filter(e=>e.name.endsWith(".md")).map(e=>({name:e.webkitRelativePath||e.name,file:e}));n.sort((e,t)=>e.name.localeCompare(t.name)),C=n,Z(n),_=null,X(null),eu(new Set),eh([]),e.target.value=""}}),(0,a.jsx)("input",{ref:n,type:"file",accept:".md,text/markdown",className:"hidden",onChange:function(e){var t;let n=null==(t=e.target.files)?void 0:t[0];if(!n)return;let a=new FileReader;a.onload=e=>{var t;"string"==typeof(null==(t=e.target)?void 0:t.result)&&ec(e.target.result)},a.readAsText(n,"utf-8"),e.target.value=""}}),(0,a.jsxs)(j.$,{type:"button",variant:"outline",size:"sm",onClick:()=>{var e;return null==(e=i.current)?void 0:e.click()},className:"gap-2 text-muted-foreground hover:text-foreground",children:[(0,a.jsx)(c,{className:"size-4"}),"Choose folder"]}),(0,a.jsxs)(j.$,{type:"button",variant:"outline",size:"sm",onClick:()=>{var e;return null==(e=n.current)?void 0:e.click()},className:"gap-2 text-muted-foreground hover:text-foreground",children:[(0,a.jsx)(u,{className:"size-4"}),"Upload .md"]}),Y.length>0&&(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:[Y.length," .md file",1!==Y.length?"s":""," found"]}),Y.length>0&&(0,a.jsx)(j.$,{type:"button",variant:"ghost",size:"sm",onClick:()=>{var e;C=e=[],Z(e),_=null,X(null),eu(new Set),eh([])},className:"ml-auto text-muted-foreground hover:text-foreground p-1 h-auto",children:(0,a.jsx)(h.A,{className:"size-3.5"})})]}),(0,a.jsxs)("div",{className:(0,N.cn)(ew&&"flex gap-4 items-start"),children:[Y.length>0&&(0,a.jsxs)("div",{className:(0,N.cn)(ew?"w-64 shrink-0":"w-full","space-y-3"),children:[(0,a.jsxs)("ul",{className:"rounded-xl border border-white/7 divide-y divide-white/5 overflow-hidden",children:[(0,a.jsx)("li",{children:(0,a.jsxs)("div",{className:"flex items-center gap-3 px-4 py-2 bg-white/[0.02]",children:[(0,a.jsxs)("button",{type:"button",onClick:function(){eu(en.size===Y.length?new Set:new Set(Y.map(e=>e.name)))},className:"flex items-center gap-2 shrink-0 text-muted-foreground/50 hover:text-foreground transition-colors",children:[eb?(0,a.jsx)(x,{className:"size-4 text-foreground/70"}):(0,a.jsx)(m,{className:"size-4"}),(0,a.jsx)("span",{className:"text-[11px] text-muted-foreground/70 select-none",children:ev>0?"".concat(ev," selected"):"Select all"})]}),ev>0&&!ei&&(0,a.jsxs)("div",{className:"ml-auto flex items-center gap-1.5",children:[(0,a.jsxs)(j.$,{type:"button",size:"sm",className:"h-7 gap-1.5 text-xs font-medium",onClick:()=>eg(!0),children:[(0,a.jsx)(p,{className:"size-3.5"}),"Run ",ev]}),(0,a.jsxs)(j.$,{type:"button",size:"sm",variant:"secondary",className:"h-7 gap-1.5 text-xs",onClick:()=>eg(!1),children:[(0,a.jsx)(p,{className:"size-3.5"}),"With preview"]})]}),ei&&(0,a.jsxs)("div",{className:"ml-auto flex items-center gap-2",children:[(0,a.jsx)(f.A,{className:"size-3.5 text-muted-foreground/50 animate-spin"}),(0,a.jsx)(j.$,{type:"button",size:"sm",variant:"ghost",className:"h-7 text-xs text-destructive hover:text-destructive",onClick:ef,children:"Stop"})]})]})}),Y.map(e=>(0,a.jsxs)("li",{className:"flex items-center",children:[(0,a.jsx)("button",{type:"button",onClick:()=>(function(e){let t=new Set(en);t.has(e)?t.delete(e):t.add(e),eu(t)})(e.name),className:"shrink-0 px-4 py-2.5 text-muted-foreground/50 hover:text-foreground transition-colors",children:en.has(e.name)?(0,a.jsx)(x,{className:"size-4 text-foreground/70"}):(0,a.jsx)(m,{className:"size-4"})}),(0,a.jsx)("button",{type:"button",onClick:()=>ex(e),className:(0,N.cn)("flex-1 text-left py-2.5 pr-4 text-sm font-mono transition-colors truncate",G===e.name?"text-foreground":"text-muted-foreground hover:text-foreground"),children:e.name})]},e.name))]}),es.length>0&&(0,a.jsxs)("div",{className:"rounded-xl border border-white/7 overflow-hidden",children:[(0,a.jsxs)("div",{className:"px-4 py-2.5 bg-white/[0.02] flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-[10.5px] font-semibold uppercase tracking-widest text-muted-foreground/40",children:"Batch run"}),F&&(0,a.jsx)("span",{className:"ml-auto text-[11px] font-mono tabular-nums text-muted-foreground/40",children:H((null!=$?$:el)-F)})]}),(0,a.jsx)("ul",{className:"divide-y divide-white/5",children:es.map((e,t)=>{var n;return(0,a.jsxs)("li",{className:"flex items-center gap-3 px-4 py-2.5",children:[(0,a.jsx)(L,{status:e.status}),e.id?(0,a.jsx)(o(),{href:"/run/".concat(e.id),className:"flex-1 min-w-0 text-sm font-mono text-foreground/70 hover:text-foreground truncate transition-colors",children:e.file.name}):(0,a.jsx)("span",{className:"flex-1 min-w-0 text-sm font-mono text-muted-foreground/40 truncate",children:e.file.name}),(0,a.jsx)("span",{className:"shrink-0 text-[11px] font-mono tabular-nums text-muted-foreground/30",children:e.startedAt?H((null!=(n=e.finishedAt)?n:"running"===e.status?el:e.startedAt)-e.startedAt):""}),"queued"!==e.status&&"running"!==e.status&&"skipped"!==e.status&&(0,a.jsx)("span",{className:(0,N.cn)("shrink-0 text-[10.5px] font-semibold uppercase tracking-wide","passed"===e.status?"text-success":"failed"===e.status||"error"===e.status?"text-destructive":"text-muted-foreground/40"),children:e.status})]},t)})})]})]}),!ek&&(0,a.jsxs)("form",{ref:t,onSubmit:function(e){e.preventDefault(),ep(!0)},className:(0,N.cn)("space-y-3",ew&&"flex-1 min-w-0"),children:[(0,a.jsxs)("div",{className:(0,N.cn)("relative rounded-xl border transition-all duration-200",B?"border-white/15 shadow-[0_0_0_3px_oklch(0.5_0.1_270_/_12%)]":"border-white/7"),children:[(0,a.jsx)(z,{ref:l,placeholder:"Paste your test case here…",value:k,onChange:e=>ec(e.target.value),onFocus:()=>U(!0),onBlur:()=>U(!1),onKeyDown:e=>{if((e.metaKey||e.ctrlKey)&&"Enter"===e.key){var n;e.preventDefault(),null==(n=t.current)||n.requestSubmit()}},rows:16,className:(0,N.cn)("min-h-[320px] font-mono text-[12.5px] leading-relaxed resize-none border-0 bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 rounded-xl p-4 overflow-y-auto",W?"max-h-[65vh]":"max-h-[360px]",K&&"pb-9")}),K&&(0,a.jsx)("button",{type:"button",onClick:()=>J(e=>!e),className:"absolute bottom-2 right-3 flex items-center gap-1 rounded-md border border-white/10 bg-background/80 backdrop-blur px-2 py-1 text-[11px] text-muted-foreground hover:text-foreground transition-colors",children:W?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g,{className:"size-3.5"}),"Collapse"]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(v.A,{className:"size-3.5"}),"Expand"]})})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(j.$,{type:"submit",disabled:!k.trim()||y,size:"lg",className:"gap-2 font-medium",children:y?"Running…":(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(p,{className:"size-4"}),"Run"]})}),(0,a.jsx)(j.$,{type:"button",disabled:!k.trim()||y,size:"lg",variant:"secondary",onClick:()=>ep(!1),className:"gap-2",children:y?"Running…":(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(p,{className:"size-4"}),"Run with preview"]})}),(0,a.jsxs)("div",{className:"ml-auto flex items-center gap-3",children:[T&&(0,a.jsx)("span",{className:"text-destructive text-xs",children:T}),(0,a.jsxs)(j.$,{type:"button",variant:"ghost",size:"lg",onClick:()=>ec('TC-001 — Login and add item to cart\nURL: https://www.saucedemo.com/\nCredentials: standard_user / secret_sauce\n\nSteps:\n1. Open the home page.\n Expected: login form with Username and Password fields is visible.\n2. Enter Username "standard_user" and Password "secret_sauce", click Login.\n Expected: Products page opens with 6 items.\n3. Click "Add to cart" on "Sauce Labs Backpack".\n Expected: cart counter shows 1.\n4. Click the cart icon.\n Expected: cart contains exactly one item — Sauce Labs Backpack at $29.99.'),className:"text-muted-foreground hover:text-foreground",children:[(0,a.jsx)(b,{className:"size-4"}),"Example"]})]})]})]})]})]}),ee.length>0&&(0,a.jsxs)("div",{className:(0,N.cn)("w-full mt-12",ey),children:[(0,a.jsx)("div",{className:"text-[10.5px] font-semibold uppercase tracking-widest text-muted-foreground/40 mb-3",children:"Recent runs"}),(0,a.jsx)("ul",{className:"space-y-1.5",children:ee.map(e=>(0,a.jsx)("li",{children:(0,a.jsxs)(o(),{href:"/run/".concat(e.id),className:"flex items-center gap-3 rounded-xl border border-white/7 px-4 py-3 hover:bg-white/5 transition-colors",children:[(0,a.jsx)(q,{status:e.status}),(0,a.jsx)("span",{className:"flex-1 min-w-0 text-sm text-foreground/80 truncate",children:e.title}),(0,a.jsx)("span",{className:"shrink-0 text-[11px] text-muted-foreground/40 font-mono tabular-nums",children:function(e){let t=new Date(e),n=new Date;return t.getDate()===n.getDate()&&t.getMonth()===n.getMonth()&&t.getFullYear()===n.getFullYear()?t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):t.toLocaleDateString([],{month:"short",day:"numeric"})+" "+t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}(e.createdAt)})]})},e.id))})]})]})}function L(e){let{status:t}=e;return"running"===t?(0,a.jsx)(f.A,{className:"size-3.5 shrink-0 text-muted-foreground/50 animate-spin"}):"passed"===t?(0,a.jsx)(k.A,{className:"size-3.5 shrink-0 text-success",strokeWidth:2.5}):"failed"===t||"error"===t?(0,a.jsx)(w.A,{className:"size-3.5 shrink-0 text-destructive"}):"paused"===t?(0,a.jsx)("span",{className:"size-3.5 shrink-0 text-[10px] text-muted-foreground/40 font-mono",children:"▐▐"}):"skipped"===t?(0,a.jsx)("span",{className:"size-3.5 shrink-0 text-[10px] text-muted-foreground/30 font-mono",children:"—"}):(0,a.jsx)("span",{className:"size-3.5 shrink-0 rounded-sm border border-white/15 inline-block"})}function q(e){let{status:t}=e;return"passed"===t?(0,a.jsx)(k.A,{className:"size-3.5 shrink-0 text-success",strokeWidth:2.5}):"failed"===t||"error"===t?(0,a.jsx)(w.A,{className:"size-3.5 shrink-0 text-destructive"}):(0,a.jsx)(y.A,{className:"size-3.5 shrink-0 text-muted-foreground/40"})}function H(e){let t=Math.max(0,Math.floor(e/1e3));return"".concat(Math.floor(t/60),":").concat(String(t%60).padStart(2,"0"))}},7003:(e,t,n)=>{"use strict";n.d(t,{$:()=>l});var a=n(5155),s=n(9574),r=n(3101),i=n(5016);let o=(0,r.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:n="default",size:r="default",...l}=e;return(0,a.jsx)(s.$,{"data-slot":"button",className:(0,i.cn)(o({variant:n,size:r,className:t})),...l})}}},e=>{e.O(0,[839,441,255,358],()=>e(e.s=2324)),_N_E=e.O()}]);