@vostride/agent-qa-dashboard-ui 0.0.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +105 -0
- package/NOTICE.md +11 -0
- package/dist/assets/abap-tccnpReA.js +1 -0
- package/dist/assets/apex-BKVkKsbj.js +1 -0
- package/dist/assets/arrow-up-down-DyIZvSrC.js +1 -0
- package/dist/assets/azcli-BRcTI6AW.js +1 -0
- package/dist/assets/badge-BbhOGRC0.js +1 -0
- package/dist/assets/bat-CY1d4Jjr.js +1 -0
- package/dist/assets/batch-action-bar-CZxUcNFZ.js +1 -0
- package/dist/assets/bicep--LouBhCq.js +2 -0
- package/dist/assets/cameligo-DSekJmSA.js +1 -0
- package/dist/assets/chunk-CilyBKbf.js +1 -0
- package/dist/assets/circle-alert-pBH5T6su.js +1 -0
- package/dist/assets/circle-x-DLBotPS8.js +1 -0
- package/dist/assets/clojure-GBhsYY7r.js +1 -0
- package/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/dist/assets/coffee-9z_JJIkP.js +1 -0
- package/dist/assets/config-BfxB7vJt.js +10 -0
- package/dist/assets/copy-Gj5_oF-8.js +1 -0
- package/dist/assets/cpp-D7LwQw_o.js +1 -0
- package/dist/assets/csharp-Df6S3RJJ.js +1 -0
- package/dist/assets/csp-AyuN80rc.js +1 -0
- package/dist/assets/css-CYIs0S-t.js +3 -0
- package/dist/assets/css.worker-Wv5dxAWO.js +89 -0
- package/dist/assets/cssMode-BB-fH2D6.js +1 -0
- package/dist/assets/cypher-CWTgbj6F.js +1 -0
- package/dist/assets/dart-BkjNQt7D.js +1 -0
- package/dist/assets/display-step-CV3zilMS.js +1 -0
- package/dist/assets/dist-DFSjTjXY.js +1 -0
- package/dist/assets/dist-DZYW0-Ta.js +1 -0
- package/dist/assets/dist-o2A-YJGQ.js +1 -0
- package/dist/assets/dockerfile-jNxF4_km.js +1 -0
- package/dist/assets/ecl-CybE3oEZ.js +1 -0
- package/dist/assets/editor-Br_kD0ds.css +1 -0
- package/dist/assets/editor.api2-DEGvZ9jW.js +872 -0
- package/dist/assets/editor.worker-Bd9IXS8d.js +26 -0
- package/dist/assets/elixir-CdaOBnQZ.js +1 -0
- package/dist/assets/empty-state-Dluv5C1Q.js +1 -0
- package/dist/assets/external-link-BZ9gsZx_.js +1 -0
- package/dist/assets/eye-CZ7GiZXJ.js +1 -0
- package/dist/assets/file-code-GHpcb0ud.js +1 -0
- package/dist/assets/file-search-CIA16Vb8.js +1 -0
- package/dist/assets/filename-validation-BOmZP9gf.js +1 -0
- package/dist/assets/flow9-0HKoddfT.js +1 -0
- package/dist/assets/format-BpI4TiHn.js +1 -0
- package/dist/assets/freemarker2-BZ9nT_ca.js +3 -0
- package/dist/assets/fsharp-B4rCGS2D.js +1 -0
- package/dist/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/dist/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/dist/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/dist/assets/geist-mono-cyrillic-wght-normal-BZdD_g9V.woff2 +0 -0
- package/dist/assets/geist-mono-latin-ext-wght-normal-b6lpi8_2.woff2 +0 -0
- package/dist/assets/geist-mono-latin-wght-normal-Cjtb1TV-.woff2 +0 -0
- package/dist/assets/go-BMkOAZO-.js +1 -0
- package/dist/assets/graphql-CT1i0Azo.js +1 -0
- package/dist/assets/grip-vertical-aDoBVncr.js +1 -0
- package/dist/assets/handlebars-CcFgORss.js +1 -0
- package/dist/assets/hcl-Dqo24S10.js +1 -0
- package/dist/assets/hook-editor-Dvrur2VR.js +1 -0
- package/dist/assets/hook-runtime-ChJ0-jZo.js +5 -0
- package/dist/assets/hook-viewer-DwQt3CRN.js +1 -0
- package/dist/assets/hooks-DcW2AVgE.js +1 -0
- package/dist/assets/html-C5cEOw4y.js +1 -0
- package/dist/assets/html.worker-CQP8QQsS.js +502 -0
- package/dist/assets/htmlMode-B54wW7aG.js +1 -0
- package/dist/assets/id-badge-Dzm7eQ9l.js +111 -0
- package/dist/assets/index-B3xPCIyH.js +57 -0
- package/dist/assets/index-cLLRFOsN.css +2 -0
- package/dist/assets/ini-B2qo6Bwi.js +1 -0
- package/dist/assets/insights-line-grid-G3ouKANt.js +39 -0
- package/dist/assets/insights-rNBE_Oot.js +1 -0
- package/dist/assets/java-BIPaikgB.js +1 -0
- package/dist/assets/javascript-jZJvS0Ev.js +1 -0
- package/dist/assets/json.worker-DzV-CpCQ.js +58 -0
- package/dist/assets/jsonMode-BJu_sWuN.js +7 -0
- package/dist/assets/julia-DaOMlCPl.js +1 -0
- package/dist/assets/kotlin-Bu1Cf0EE.js +1 -0
- package/dist/assets/less-CkzKMiAu.js +2 -0
- package/dist/assets/lexon-TKzNnbcT.js +1 -0
- package/dist/assets/lib-BPEPp1D-.js +4 -0
- package/dist/assets/liquid-B0Wk3SRC.js +1 -0
- package/dist/assets/live-run-C2WLFzlf.js +1 -0
- package/dist/assets/lspLanguageFeatures-Bn8JS-MZ.js +4 -0
- package/dist/assets/lua-6W3WJOvj.js +1 -0
- package/dist/assets/m3-B_B1XtJr.js +1 -0
- package/dist/assets/markdown-LT3qFBoR.js +1 -0
- package/dist/assets/marked.esm-Ba5AUJng.js +64 -0
- package/dist/assets/mdx-BE6dqG5T.js +1 -0
- package/dist/assets/memory-DcKox3BM.js +1 -0
- package/dist/assets/memory-product-oHTD8fqS.js +2 -0
- package/dist/assets/mips-BuZ0JnPP.js +1 -0
- package/dist/assets/monaco-editor-CDJrOpKK.js +2 -0
- package/dist/assets/monaco-editor-inner-Q9WqqJ52.js +6 -0
- package/dist/assets/monaco.contribution-DTHp-zXN.js +2 -0
- package/dist/assets/msdax-BHMmXeIF.js +1 -0
- package/dist/assets/mysql-B1RGnQ_F.js +1 -0
- package/dist/assets/objective-c-CFGQUdp0.js +1 -0
- package/dist/assets/observation-block-DdB7C1c0.js +1 -0
- package/dist/assets/observation-markdown-CvCuqq7R.js +1 -0
- package/dist/assets/pascal-Bunb0gdj.js +1 -0
- package/dist/assets/pascaligo-Ci9pazxY.js +1 -0
- package/dist/assets/pencil-BmkcPKBm.js +1 -0
- package/dist/assets/perl-Brcsz0QG.js +1 -0
- package/dist/assets/pgsql-BeM5icw2.js +1 -0
- package/dist/assets/php-D_0c0usD.js +1 -0
- package/dist/assets/pla-BXJXsrLp.js +1 -0
- package/dist/assets/plus-C6Zz9JLt.js +1 -0
- package/dist/assets/popover-CvQRjfg5.js +1 -0
- package/dist/assets/postiats-Bh7pQpS0.js +1 -0
- package/dist/assets/powerquery-17x2qNlN.js +1 -0
- package/dist/assets/powershell-BK7CP1HA.js +1 -0
- package/dist/assets/protobuf-BIk_BSvx.js +2 -0
- package/dist/assets/pug-AfVB1dqb.js +1 -0
- package/dist/assets/python-DYEP_Px-.js +1 -0
- package/dist/assets/qsharp-DdD7_Hjo.js +1 -0
- package/dist/assets/r-BGqTutCA.js +1 -0
- package/dist/assets/razor-BARiZmvH.js +1 -0
- package/dist/assets/redis-Dlp6Na1w.js +1 -0
- package/dist/assets/redshift-i2kKyIGQ.js +1 -0
- package/dist/assets/refresh-cw-v_0wwa0P.js +1 -0
- package/dist/assets/resizable-COfX_iMb.js +1 -0
- package/dist/assets/restructuredtext-LmY6AGSd.js +1 -0
- package/dist/assets/ruby-BxBoU2eR.js +1 -0
- package/dist/assets/run-detail-B6QhqCjq.js +1 -0
- package/dist/assets/runs-DO4LkmoV.js +1 -0
- package/dist/assets/rust-D9N2vQ1K.js +1 -0
- package/dist/assets/sb-BLTMTQei.js +1 -0
- package/dist/assets/scala-Ctl2an6m.js +1 -0
- package/dist/assets/scheme-DWYXU9Gm.js +1 -0
- package/dist/assets/scroll-area-DfPMtFw0.js +1 -0
- package/dist/assets/scss-Fo6PaAQp.js +3 -0
- package/dist/assets/select-B5gV6YUf.js +1 -0
- package/dist/assets/shell-gQZQk28C.js +1 -0
- package/dist/assets/shortcut-hints-CfVf0REF.js +1 -0
- package/dist/assets/solidity-np-sz1ji.js +1 -0
- package/dist/assets/sophia-Cpc3f9d7.js +1 -0
- package/dist/assets/sparql-BM_09I__.js +1 -0
- package/dist/assets/split-button-C7J0EKrF.js +1 -0
- package/dist/assets/sql-wg3M4gQ8.js +1 -0
- package/dist/assets/square-CvSqzenY.js +1 -0
- package/dist/assets/st-CRbYFk1r.js +1 -0
- package/dist/assets/step-name-pills-COKv64-4.js +1 -0
- package/dist/assets/suite-editor-CaMQ5mWb.js +5 -0
- package/dist/assets/suite-navbar-CnJmeIp-.js +1 -0
- package/dist/assets/suite-viewer-HsI0Pn4t.js +1 -0
- package/dist/assets/suites-Cbjz7uPI.js +1 -0
- package/dist/assets/swift-B8HA7HL5.js +1 -0
- package/dist/assets/switch-BOdp7A9U.js +1 -0
- package/dist/assets/systemverilog-Dm-upaoS.js +1 -0
- package/dist/assets/tab-console-CLKFTABo.js +1 -0
- package/dist/assets/table-DL0PmHAE.js +1 -0
- package/dist/assets/tabs-CfNQIHt-.js +1 -0
- package/dist/assets/tcl-BroSe0zp.js +1 -0
- package/dist/assets/test-editor-CIRL6zSb.js +9 -0
- package/dist/assets/test-navbar-CZhYoxgB.js +7 -0
- package/dist/assets/test-viewer-C6Rg-HeW.js +1 -0
- package/dist/assets/tests-C0Xhq39F.js +1 -0
- package/dist/assets/tests-suites-table-widths-tlOYaS72.js +1 -0
- package/dist/assets/textarea-ByegDm2e.js +1 -0
- package/dist/assets/trash-2-CawFHfTJ.js +1 -0
- package/dist/assets/ts.worker-METxwbDZ.js +67719 -0
- package/dist/assets/tsMode-DGJI_hpV.js +11 -0
- package/dist/assets/twig-C-LV7gG6.js +1 -0
- package/dist/assets/typescript-BrDOgG8S.js +1 -0
- package/dist/assets/typespec-DxaoVH5m.js +1 -0
- package/dist/assets/use-hook-run-session-Cjqu9VED.js +1 -0
- package/dist/assets/use-keyboard-shortcuts-BRF3cm7O.js +1 -0
- package/dist/assets/use-page-title-CK82kWb2.js +1 -0
- package/dist/assets/use-run-status-favicon-DoJZcfHz.js +1 -0
- package/dist/assets/use-selection-queue-CZ4rXNAT.js +1 -0
- package/dist/assets/vb-qvhMNncD.js +1 -0
- package/dist/assets/viewer-url-state-CZTYs75z.js +1 -0
- package/dist/assets/wgsl-CZM87x1c.js +298 -0
- package/dist/assets/workers-BbHjH3Kx.js +1 -0
- package/dist/assets/xml-6YL6VXLw.js +1 -0
- package/dist/assets/yaml-sHG1-XNr.js +1 -0
- package/dist/assets/zap-C7OZlYXQ.js +1 -0
- package/dist/favicon.svg +3 -0
- package/dist/index.html +37 -0
- package/package.json +81 -3
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{c as t}from"./id-badge-Dzm7eQ9l.js";import{t as n}from"./monaco-editor-CDJrOpKK.js";import{t as r}from"./file-code-GHpcb0ud.js";import{n as i}from"./split-button-C7J0EKrF.js";import{t as a}from"./refresh-cw-v_0wwa0P.js";import{a as o,c as s,i as c,n as l,o as ee,r as te,s as u,t as d}from"./filename-validation-BOmZP9gf.js";import{t as ne}from"./use-page-title-CK82kWb2.js";import{a as re,c as f,d as ie,f as p,i as ae,l as oe,n as se,o as ce,p as m,r as le,s as ue,t as de,u as h}from"./test-navbar-CZhYoxgB.js";import{a as fe,r as pe}from"./dist-DFSjTjXY.js";import{i as me,n as he,r as ge,t as _e}from"./tabs-CfNQIHt-.js";import{At as g,B as ve,E as ye,Et as be,Ft as xe,Ht as Se,It as Ce,Jt as we,Kn as _,Lt as Te,Mn as Ee,Nt as v,O as De,Ot as Oe,P as ke,Pt as y,Qn as b,Rt as Ae,Ut as x,Vt as je,Zn as Me,cr as Ne,dt as S,fr as C,jt as w,kt as T,lr as Pe,lt as Fe,r as Ie,sr as Le,xt as Re,zn as ze,zt as Be}from"./index-B3xPCIyH.js";import{n as Ve,r as He,t as Ue}from"./resizable-COfX_iMb.js";import{t as We}from"./empty-state-Dluv5C1Q.js";import{t as Ge}from"./use-keyboard-shortcuts-BRF3cm7O.js";import{t as Ke}from"./observation-markdown-CvCuqq7R.js";var E=e(C(),1),D=Me();function qe(e){return e>=.7?`text-emerald-500`:e>=.4?`text-amber-500`:`text-destructive`}function Je(e){try{return new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:`numeric`})}catch{return e}}function Ye({observation:e,onDelete:t,isDeleting:n}){return(0,D.jsxs)(`div`,{className:`rounded-md border bg-card/60 px-3 py-2 space-y-1.5`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px]`,children:[(0,D.jsxs)(g,{children:[(0,D.jsx)(v,{asChild:!0,children:(0,D.jsx)(`span`,{className:x(`font-mono tabular-nums font-medium cursor-default`,qe(e.trust)),children:e.trust.toFixed(2)})}),(0,D.jsx)(w,{side:`top`,className:`max-w-xs text-xs`,children:`Trust score (0–1). Higher means the agent is more confident this observation is accurate. Increases when confirmed across runs, decreases when contradicted.`})]}),(0,D.jsxs)(g,{children:[(0,D.jsx)(v,{asChild:!0,children:(0,D.jsx)(`span`,{className:`text-muted-foreground cursor-default`,children:Je(e.created)})}),(0,D.jsx)(w,{side:`top`,className:`text-xs`,children:`First observed on this date`})]}),(0,D.jsxs)(g,{children:[(0,D.jsx)(v,{asChild:!0,children:(0,D.jsxs)(`span`,{className:`text-muted-foreground cursor-default`,children:[e.confirmed_count,`x confirmed · `,e.contradicted_count,`x contradicted`]})}),(0,D.jsx)(w,{side:`top`,className:`max-w-xs text-xs`,children:`Confirmed: how many runs validated this observation. Contradicted: how many runs found it inaccurate.`})]}),(0,D.jsx)(`div`,{className:`ml-auto`,children:(0,D.jsxs)(re,{children:[(0,D.jsx)(m,{asChild:!0,children:(0,D.jsx)(Se,{type:`button`,variant:`ghost`,size:`icon-sm`,disabled:n,"aria-label":`Delete observation: ${e.title.slice(0,40)}`,className:`shrink-0 text-muted-foreground/70 hover:text-destructive`,children:(0,D.jsx)(Ee,{className:`size-3.5`})})}),(0,D.jsxs)(f,{size:`sm`,children:[(0,D.jsxs)(ie,{children:[(0,D.jsx)(p,{children:`Delete observation?`}),(0,D.jsx)(oe,{children:`This observation will be permanently removed. The agent will no longer use it during future runs.`})]}),(0,D.jsxs)(h,{children:[(0,D.jsx)(ue,{children:`Cancel`}),(0,D.jsx)(ce,{variant:`destructive`,onClick:()=>t(e.id),disabled:n,children:`Delete Observation`})]})]})]})})]}),(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsx)(`h4`,{className:`text-sm font-semibold tracking-tight text-foreground`,children:e.title}),(0,D.jsx)(Ke,{content:e.content})]})]})}function Xe({testId:e}){let[t,n]=(0,E.useState)([]),[r,i]=(0,E.useState)([]),[o,s]=(0,E.useState)(!0),[c,l]=(0,E.useState)(null),[ee,te]=(0,E.useState)(null),u=(0,E.useCallback)(()=>{let t=!1;return s(!0),l(null),i([]),S(e).then(e=>{t||(n(e.observations),i(e.invalidFiles),s(!1))}).catch(e=>{t||(n([]),l(e instanceof Error?e.message:`Failed to load observations`),s(!1))}),()=>{t=!0}},[e]);(0,E.useEffect)(()=>u(),[u]);let d=(0,E.useCallback)(async t=>{te(t);try{await ke(e,t),n(e=>e.filter(e=>e.id!==t)),T.success(`Observation deleted`)}catch(e){T.error(`Failed to delete: ${e instanceof Error?e.message:String(e)}`)}finally{te(null)}},[e]);return o?(0,D.jsxs)(`div`,{className:`space-y-2 px-4 py-2`,children:[(0,D.jsx)(y,{className:`h-16 w-full rounded-md`}),(0,D.jsx)(y,{className:`h-16 w-full rounded-md`}),(0,D.jsx)(y,{className:`h-16 w-full rounded-md`})]}):c?(0,D.jsxs)(`div`,{className:`flex flex-col items-center justify-center gap-3 px-4 py-12 text-center`,children:[(0,D.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Could not load observations. Check that the dashboard server is running and try again.`}),(0,D.jsxs)(Se,{variant:`outline`,size:`sm`,onClick:u,children:[(0,D.jsx)(a,{className:`mr-1.5 size-3.5`}),`Retry`]})]}):t.length===0?(0,D.jsxs)(`div`,{className:`space-y-3 px-4 py-2`,children:[r.length>0?(0,D.jsx)(O,{invalidFiles:r}):null,(0,D.jsx)(We,{icon:_,title:`No observations yet`,description:`Memory observations are created automatically when this test runs. They help the agent remember facts about your product.`})]}):(0,D.jsxs)(`div`,{className:`space-y-2 px-4 py-2`,children:[r.length>0?(0,D.jsx)(O,{invalidFiles:r}):null,(0,D.jsx)(`div`,{className:`flex items-center justify-between`,children:(0,D.jsxs)(`span`,{className:`text-[11px] text-muted-foreground`,children:[t.length,` observation`,t.length===1?``:`s`]})}),(0,D.jsx)(`div`,{className:`space-y-2`,children:t.map(e=>(0,D.jsx)(Ye,{observation:e,onDelete:d,isDeleting:ee===e.id},e.id))})]})}function O({invalidFiles:e}){return(0,D.jsxs)(`div`,{className:`rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs text-amber-950 dark:text-amber-200`,children:[(0,D.jsxs)(`p`,{className:`font-medium`,children:[e.length,` invalid memory file`,e.length===1?``:`s`,` hidden from this panel.`]}),(0,D.jsx)(`p`,{className:`mt-1 text-[11px] text-amber-900/80 dark:text-amber-200/80`,children:e.map(e=>e.filename).join(`, `)})]})}var Ze=`name: My Test
|
|
2
|
+
test-id: ""
|
|
3
|
+
target: ""
|
|
4
|
+
context: ""
|
|
5
|
+
steps:
|
|
6
|
+
- Navigate to the homepage
|
|
7
|
+
- Verify the page loads
|
|
8
|
+
`;function Qe({text:e}){return(0,D.jsxs)(g,{children:[(0,D.jsx)(v,{asChild:!0,children:(0,D.jsx)(ze,{className:`h-3 w-3 text-muted-foreground/40 hover:text-muted-foreground/70 transition-colors cursor-help`})}),(0,D.jsx)(w,{className:`max-w-[250px] text-[13px]`,children:e})]})}function $e(e){return e instanceof DOMException&&e.name===`AbortError`||e instanceof Error&&e.name===`AbortError`}function et(e,t,n){if(t===`web`)return n||e?.url||`Configured start URL`;let r=e?.device;return(typeof r?.deviceName==`string`?r.deviceName:typeof r?.name==`string`?r.name:null)||e?.product||e?.bundleId||e?.appPackage||(t===`android`?`Android device`:`iOS device`)}function tt(e){return JSON.stringify({text:e.text,overrides:e.overrides??null})}function nt(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function rt(e){let t=(0,E.useRef)([]);return(0,E.useMemo)(()=>{let n=t.current,r=new Set,i=e.map((e,t)=>{let i=tt(e),a=n[t];if(a&&a.signature===i)return r.add(a.id),{id:a.id,instruction:e.text,signature:i};let o=n.find(e=>e.signature===i&&!r.has(e.id));return o?(r.add(o.id),{id:o.id,instruction:e.text,signature:i}):a&&!r.has(a.id)?(r.add(a.id),{id:a.id,instruction:e.text,signature:i}):{id:crypto.randomUUID(),instruction:e.text,signature:i}});return t.current=i.map(({id:e,signature:t})=>({id:e,signature:t})),i},[e])}function it(){let{t_id:e}=Ne(),a=Le(),[re]=Pe(),f=we(),{defaultRunMode:ie}=i(),{targets:p,globalUse:oe,isLoading:ce}=t(),m=e??``,{suggestions:ue}=l(m||null),h=!e,g=re.get(`live`)===`1`,Se=(0,E.useRef)(null),_=(0,E.useRef)(null),Ee=(0,E.useRef)(null),v=(0,E.useRef)(()=>{}),ke=(0,E.useRef)(!1),[y,x]=(0,E.useState)(h?Ze:``),[Me,S]=(0,E.useState)(``),[C,w]=(0,E.useState)(``),[ze,Ke]=(0,E.useState)(!h),[qe,Je]=(0,E.useState)(!1),[Ye,O]=(0,E.useState)(!1),[tt,it]=(0,E.useState)(!1),[k,at]=(0,E.useState)(!1),[A,ot]=(0,E.useState)(null),[j,M]=(0,E.useState)(null),[N,P]=(0,E.useState)(null),[F,I]=(0,E.useState)(!1),[L,R]=(0,E.useState)(!1),[z,B]=(0,E.useState)(null),[st,V]=(0,E.useState)(`reasoning`),[ct,H]=(0,E.useState)(null),[lt,U]=(0,E.useState)({setup:[],teardown:[]}),[W,ut]=(0,E.useState)(null),[dt,ft]=(0,E.useState)(!1),[pt,mt]=(0,E.useState)(!1),[G,ht]=(0,E.useState)(void 0),[gt,_t]=(0,E.useState)(``),vt=!h&&y!==Me,yt=h&&C?d(C.trim(),G,`testMatch`):null,bt=h&&!!C&&!!yt;(0,E.useEffect)(()=>{if(h)return;let e=!1;return Ke(!0),Fe(m).then(t=>{e||(x(t.content),S(t.content),_t(t.path))}).catch(()=>{e||(Je(!0),T.error(`Failed to load test file`))}).finally(()=>{e||Ke(!1)}),()=>{e=!0}},[m,h]),(0,E.useEffect)(()=>{if(!h)return;let e=!1;return ve().then(t=>{if(e)return;let n=t.config.workspace?.testMatch;ht(Array.isArray(n)?n:[])}).catch(()=>{e||ht([])}),()=>{e=!0}},[h]),(0,E.useEffect)(()=>{if(!h)return;let e=pe();x(t=>le(t,[`test-id`],e))},[h]);let K=(0,E.useMemo)(()=>ae(y),[y]);K&&(Se.current=K);let q=K??Se.current,xt=rt(q?.steps??[]),St=(0,E.useMemo)(()=>xt.map(e=>({draftId:e.id,instruction:e.instruction})),[xt]),J=(0,E.useMemo)(()=>K?{testName:K.name.trim()||`Untitled Live Draft`,testContext:K.context.trim()||void 0}:null,[K]),Y=c(j,{steps:St,setupHooks:lt.setup,teardownHooks:lt.teardown,allowReconnect:!1}),X=Y.terminateSession;Ee.current=j,v.current=X;let Ct=q?.target?.trim()??``,wt=Ct?p[Ct]:void 0,Tt=j?Y.platform:wt?.platform??`web`,Et=(0,E.useMemo)(()=>et(wt,Tt,Y.currentUrl),[wt,Tt,Y.currentUrl]),Dt=K===null?`invalid`:vt||h?`unsaved`:`saved`,Ot=(0,E.useMemo)(()=>xt.map(e=>e.id),[xt]),Z=L?`connecting`:Y.connectionState,Q=j!==null,kt=Q&&K!==null&&!nt(K.setup,lt.setup);ne((0,E.useMemo)(()=>Q&&N!==null?`Live #${N} — ${q?.name?.trim()||m||`Test`}`:h?`New Test`:`Edit Test`,[Q,N,q?.name,m,h]));let At=(0,E.useMemo)(()=>z===`ended`?{reason:`ended`,title:`Live session ended`,description:`The current draft is unchanged. Close live mode or start a fresh disposable session from this target.`}:z===`disconnected`?{reason:`disconnected`,title:`Live session disconnected`,description:`The connection dropped and the disposable session was terminated. Start a fresh session to reconnect.`}:null,[z]),jt=Q&&Z===`connected`&&K!==null&&K.steps.some(e=>e.text.trim()),Mt=L||Q,Nt=L||Q||k||A!==null||K===null||!K?.target.trim()||ce,$=(0,E.useCallback)(async()=>{O(!0);try{if(h){let e=d(C.trim(),G,`testMatch`);if(e){T.error(e);return}await De(C.trim(),y),T.success(`Test file created`),a(b.testView(K?.testId??``))}else await be(m,y),S(y),T.success(`Saved`)}catch(e){T.error(`Failed to save: ${e instanceof Error?e.message:String(e)}`)}finally{O(!1)}},[h,C,G,y,m,a,K]),Pt=(0,E.useCallback)(()=>{o(`page`,`closing live mode`,{liveSessionId:j??void 0,terminalReason:z??void 0}),_.current?.abort(),_.current=null,j&&X(),R(!1),M(null),P(null),B(null),H(null),U({setup:[],teardown:[]}),I(!1)},[j,z,X]),Ft=(0,E.useCallback)(()=>{o(`page`,`ending live session from UI`,{liveSessionId:j??void 0}),_.current?.abort(),_.current=null,j&&X(),R(!1),M(null),P(null),B(`ended`),H(null),U({setup:[],teardown:[]}),I(!0)},[j,X]),It=(0,E.useCallback)(async(e,t)=>{let n=e.target.trim();if(!n){T.error(`Select a target before starting live mode`);return}let r=new AbortController;_.current?.abort(),_.current=r,I(!0),B(null),V(`reasoning`),H(null),R(!0);try{t?.replaceCurrentSession&&j&&(X(),M(null),P(null));let i=te({content:y,targetName:n,targets:p,globalUse:oe});o(`page`,`requesting live session`,{targetName:n,platform:i.platform,headless:i.headless??void 0,replacingSession:t?.replaceCurrentSession??!1});let a=[...e.setup],s=[...e.teardown],c=e.testId?.trim()||null,l=c?{type:`test`,id:c}:void 0,{sessionId:ee,sessionNumber:u}=await ye({...i,setupHooks:a,teardownHooks:s,entity:l},r.signal);if(r.signal.aborted)return;U({setup:a,teardown:s}),M(ee),P(u),o(`page`,`live session created`,{sessionId:ee,targetName:n})}catch(e){$e(e)||(o(`page`,`failed to create live session`,{error:e instanceof Error?e.message:String(e),targetName:n}),T.error(e instanceof Error?e.message:`Failed to start live session`)),t?.replaceCurrentSession||I(!1)}finally{_.current===r&&(_.current=null),R(!1)}},[y,oe,j,p,X]),Lt=(0,E.useCallback)(async()=>{if(!Nt){if(!K){T.error(`Fix YAML errors before starting live mode`);return}await It(K)}},[K,It,Nt]),Rt=(0,E.useCallback)(async()=>{if(Q){if(!K){T.error(`Fix YAML errors before restarting live mode`);return}await It(K,{replaceCurrentSession:!0})}},[K,Q,It]),zt=(0,E.useCallback)(e=>{if(e){I(!0);return}Pt()},[Pt]),Bt=async()=>{it(!0);try{let e=await Oe(y,gt||C.trim());if(e.valid)T.success(`Valid YAML`);else{let t=e.errors.map(e=>e.line?`Line ${e.line}: ${e.message}`:e.message).join(`
|
|
9
|
+
`);T.error(t)}}catch(e){T.error(`Validation error: ${e instanceof Error?e.message:String(e)}`)}finally{it(!1)}},Vt=(0,E.useCallback)(async e=>{if(!k){try{if(h){let e=d(C.trim(),G,`testMatch`);if(e){T.error(e);return}await De(C.trim(),y),a(b.testView(K?.testId??``));return}vt&&(await be(m,y),S(y))}catch(e){T.error(`Failed to save before run: ${e instanceof Error?e.message:String(e)}`);return}at(!0);try{ot((await Re({file:gt,local:e})).runId),T.success(`Run started`)}catch(e){T.error(`Failed to start run: ${e instanceof Error?e.message:String(e)}`),at(!1)}}},[k,h,C,G,y,vt,m,gt,a,K]),Ht=(0,E.useCallback)(()=>{ot(null),at(!1)},[]),Ut=(0,E.useCallback)(e=>{if(!Q)return;if(!J){T.error(`Fix YAML errors before running live steps. Live mode uses the current valid draft, not the last valid snapshot.`);return}let t=Y.steps[e]?.id;t&&H({type:`step`,stepId:t}),V(`reasoning`),Y.executeStepByIndex(e,J)},[J,Q,Y]),Wt=(0,E.useCallback)(e=>{Y.runningStepIndex===e&&(V(`reasoning`),Y.cancelStep())},[Y]),Gt=(0,E.useCallback)((e,t)=>{if(!Q)return;if(e===`setup`){T.error(`Setup hooks only run when a live session starts`);return}let n=Y.teardownHooks.find(e=>e.id===t);n&&H({type:`hook`,hookId:n.id}),V(`reasoning`),Y.executeHookById(e,t)},[Q,Y]);if((0,E.useEffect)(()=>()=>{_.current?.abort(),Ee.current&&v.current()},[]),(0,E.useEffect)(()=>{j&&Z===`disconnected`&&(o(`page`,`live session moved to terminal state`,{liveSessionId:j,liveConnectionState:Z}),M(null),P(null),R(!1),B(`disconnected`),H(null),U({setup:[],teardown:[]}),I(!0))},[Z,j]),(0,E.useEffect)(()=>{!g||ke.current||h||ze||qe||L||F||Q||!K||!K.target.trim()||(ke.current=!0,a(b.testEdit(m),{replace:!0}),Lt())},[K,Lt,Q,h,L,ze,F,a,qe,g,m]),(0,E.useEffect)(()=>{W&&!Ot.includes(W)&&ut(null)},[Ot,W]),(0,E.useEffect)(()=>{if(!F){H(null);return}let e=[...Y.setupHooks,...Y.teardownHooks];if(Y.steps.length===0&&e.length===0){H(null);return}H(t=>t?.type===`hook`&&e.some(e=>e.id===t.hookId)||t&&`stepId`in t&&Y.steps.some(e=>e.id===t.stepId)?t:e.length>0?{type:`hook`,hookId:e[0].id}:{type:`step`,stepId:Y.steps[0].id})},[Y.setupHooks,Y.steps,Y.teardownHooks,F]),Ge((0,E.useMemo)(()=>({r:()=>{h||Vt(ie===`local`)},escape:()=>{A&&Ht()}}),[h,A,Vt,Ht,ie])),(0,E.useEffect)(()=>{function e(e){(e.metaKey||e.ctrlKey)&&e.key===`s`&&(e.preventDefault(),$())}return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[$]),ze)return(0,D.jsx)(Ie,{});if(qe)return(0,D.jsx)(We,{icon:r,title:`Test not found`,description:`This test file doesn't exist`,actionLabel:`View All Tests`,onAction:()=>a(b.tests)});let Kt=(0,D.jsx)(se,{content:y,onChange:x,isCreateMode:h,showLiveStepActions:Q,canRunLiveStep:Z===`connected`&&K!==null,canRunLiveHook:Z===`connected`&&K!==null,liveEditorSteps:Y.steps,draftStepIds:Ot,liveSetupHooks:Y.setupHooks,liveTeardownHooks:Y.teardownHooks,onRunLiveStep:Ut,onCancelLiveStep:Wt,onRunLiveHook:Gt,openStepSettingsId:W,onOpenStepSettingsChange:ut,selection:ct,onSelect:H,variableSuggestions:ue}),qt=(0,D.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[h&&(0,D.jsx)(`div`,{className:`px-4 pt-3`,children:(0,D.jsxs)(`div`,{className:`rounded-md border bg-muted/15 px-3 py-2`,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsxs)(fe,{className:`flex items-center gap-1 text-xs font-medium`,children:[`File Path `,(0,D.jsx)(Qe,{text:`Path is relative to your workspace root. Must match your workspace's testMatch pattern. Directories are created automatically on save.`})]}),(0,D.jsx)(`span`,{className:`text-[11px] text-muted-foreground`,children:`Created only when you save`})]}),(0,D.jsx)(je,{placeholder:`my-test.yaml`,value:C,onChange:e=>w(e.target.value),className:`mt-2 max-w-md ${bt?`border-red-500 focus-visible:ring-red-500`:``}`}),bt&&(0,D.jsx)(`p`,{className:`mt-1 text-xs text-red-500`,children:yt})]})}),(0,D.jsxs)(_e,{defaultValue:`builder`,className:`flex-1 flex min-h-0 flex-col`,children:[(0,D.jsxs)(ge,{variant:`line`,className:`px-4`,children:[(0,D.jsx)(me,{value:`builder`,children:`Builder`}),(0,D.jsx)(me,{value:`yaml`,children:`YAML`}),!h&&(0,D.jsx)(me,{value:`memory`,children:`Memory`})]}),(0,D.jsx)(he,{value:`builder`,className:`mt-2 flex-1 overflow-auto`,children:Kt}),(0,D.jsx)(he,{value:`yaml`,className:`flex-1 min-h-0 mt-2`,children:(0,D.jsx)(n,{value:y,onChange:x,onSave:$,showErrors:!0,className:`h-full`})}),!h&&(0,D.jsx)(he,{value:`memory`,className:`mt-2 flex-1 overflow-auto`,children:(0,D.jsx)(Xe,{testId:m})})]})]}),Jt=(0,D.jsx)(ee,{connectionState:Y.connectionState,isLaunching:L,targetName:Ct||`Selected Target`,targetLabel:Et,liveSessionNumber:N,platform:Tt,screenshot:Y.screenshot,currentUrl:Y.currentUrl,pendingNavigation:Y.pendingNavigation,steps:Y.steps,setupHooks:Y.setupHooks,teardownHooks:Y.teardownHooks,selection:ct,runningStepId:Y.runningStepId,terminalState:At,draftState:Dt,ariaTree:Y.ariaTree,errorMessage:Y.error,devtoolsTab:st,canRunAll:jt,isRunningAll:Y.isRunningAll,isStoppingRunAll:Y.isStoppingRunAll,setupHooksStale:kt,onDevtoolsTabChange:V,onRunAll:()=>{if(!J){T.error(`Fix YAML errors before running live steps. Live mode uses the current valid draft, not the last valid snapshot.`);return}Y.runAll(J)},onStopAll:Y.cancelRunAll,onEndSession:Ft,onRestartSession:kt?()=>void Rt():void 0,showEndSessionAction:f,onCloseLiveMode:Pt,onStartFreshSession:()=>void Lt(),onBack:Y.goBack,onForward:Y.goForward,onRefresh:Y.refreshPage,onNavigate:Y.navigate,onRequestAriaTree:Y.requestAriaTree});return(0,D.jsxs)(`div`,{className:`flex flex-col h-screen`,children:[(0,D.jsx)(de,{testName:h?`New Test`:q?.name??m,testId:q?.testId??``,unsaved:vt,isCreateMode:h,mode:h?`view`:`edit`,testHref:h?void 0:b.testView(m),isSaving:Ye,isValidating:tt,isRunning:k,runDisabled:Mt,hasInvalidFilename:bt,showTestId:!1,hasLiveSession:Q,liveConnectionState:Z,isLiveActionDisabled:Nt,liveSessionNumber:N,onBack:()=>a(h?b.tests:b.testView(m)),onSave:$,onValidate:Bt,onRun:Vt,onLiveConnect:F?void 0:Lt,onLiveEnd:Q?Ft:void 0,onSettingsOpen:()=>ft(!0),shortcutsOpen:pt,onToggleShortcuts:()=>mt(e=>!e)}),A?(0,D.jsxs)(He,{orientation:`horizontal`,className:`flex-1 rounded-md border border-border`,children:[(0,D.jsx)(Ve,{defaultSize:60,minSize:30,children:(0,D.jsx)(n,{value:y,onChange:x,onSave:$,className:`h-full`})}),(0,D.jsx)(Ue,{withHandle:!0}),(0,D.jsx)(Ve,{defaultSize:40,minSize:25,children:(0,D.jsx)(u,{runId:A,onClose:Ht})})]}):F&&!f?(0,D.jsxs)(He,{orientation:`horizontal`,className:`flex-1 rounded-md border border-border`,children:[(0,D.jsx)(Ve,{defaultSize:42,minSize:34,children:qt}),(0,D.jsx)(Ue,{withHandle:!0}),(0,D.jsx)(Ve,{defaultSize:58,minSize:38,children:Jt})]}):qt,(0,D.jsx)(xe,{open:dt,onOpenChange:ft,children:(0,D.jsxs)(Ce,{side:`right`,className:`sm:max-w-[400px] overflow-y-auto p-0`,children:[(0,D.jsxs)(Ae,{className:`px-4 pt-4 pb-2`,children:[(0,D.jsx)(Be,{children:`Test Settings`}),(0,D.jsx)(Te,{children:`Advanced configuration for this test`})]}),(0,D.jsx)(`div`,{className:`px-4 pb-4`,children:(0,D.jsx)(s,{content:y,onChange:x,selectedTarget:q?.target})})]})}),f&&(0,D.jsx)(xe,{open:F,onOpenChange:zt,children:(0,D.jsxs)(Ce,{side:`bottom`,showCloseButton:!1,className:`h-[100dvh] max-h-[100dvh] rounded-none p-0`,children:[(0,D.jsxs)(Ae,{className:`sr-only`,children:[(0,D.jsx)(Be,{children:`Live Session`}),(0,D.jsx)(Te,{children:`Live execution workspace for the current draft.`})]}),Jt]})})]})}export{it as default};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{i as t,n,o as r,s as i,t as a}from"./select-B5gV6YUf.js";import{t as o}from"./circle-alert-pBH5T6su.js";import{C as s,S as c,_ as l,a as u,b as d,c as f,d as p,f as m,g as h,h as g,l as ee,m as _,n as v,o as y,p as b,r as x,s as S,t as C,u as w,v as T,w as E,x as D,y as te}from"./id-badge-Dzm7eQ9l.js";import{n as ne,r as O}from"./monaco-editor-CDJrOpKK.js";import{c as k,t as A}from"./split-button-C7J0EKrF.js";import{t as re}from"./grip-vertical-aDoBVncr.js";import{n as j,r as M,t as N}from"./shortcut-hints-CfVf0REF.js";import{t as ie}from"./plus-C6Zz9JLt.js";import{t as P}from"./refresh-cw-v_0wwa0P.js";import{n as F,t as ae}from"./textarea-ByegDm2e.js";import{t as oe}from"./square-CvSqzenY.js";import{a as I,r as L}from"./dist-DFSjTjXY.js";import{n as R,r as z,t as se}from"./popover-CvQRjfg5.js";import{t as ce}from"./switch-BOdp7A9U.js";import{At as B,Cn as le,Fn as ue,Hn as V,Ht as H,Ln as de,Mn as fe,Nn as pe,Nt as U,Pn as me,Rn as W,Sn as he,Un as ge,Ut as G,Vt as K,Zn as _e,an as ve,cn as ye,fr as be,in as xe,jn as Se,jt as q,kn as Ce,ln as we,nn as Te,on as Ee,or as J,rn as De,sn as Oe,tn as ke,un as Ae,zn as je}from"./index-B3xPCIyH.js";import{t as Me}from"./badge-BbhOGRC0.js";var Y=e(be(),1),X=_e(),Ne=`AlertDialog`,[Pe,Fe]=le(Ne,[Ae]),Z=Ae(),Ie=e=>{let{__scopeAlertDialog:t,...n}=e,r=Z(t);return(0,X.jsx)(Ee,{...r,...n,modal:!0})};Ie.displayName=Ne;var Le=`AlertDialogTrigger`,Re=Y.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Z(n);return(0,X.jsx)(ye,{...i,...r,ref:t})});Re.displayName=Le;var ze=`AlertDialogPortal`,Be=e=>{let{__scopeAlertDialog:t,...n}=e,r=Z(t);return(0,X.jsx)(ve,{...r,...n})};Be.displayName=ze;var Ve=`AlertDialogOverlay`,He=Y.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Z(n);return(0,X.jsx)(xe,{...i,...r,ref:t})});He.displayName=Ve;var Q=`AlertDialogContent`,[Ue,We]=Pe(Q),Ge=Ce(`AlertDialogContent`),Ke=Y.forwardRef((e,t)=>{let{__scopeAlertDialog:n,children:r,...i}=e,a=Z(n),o=Y.useRef(null),s=Se(t,o),c=Y.useRef(null);return(0,X.jsx)(we,{contentName:Q,titleName:qe,docsSlug:`alert-dialog`,children:(0,X.jsx)(Ue,{scope:n,cancelRef:c,children:(0,X.jsxs)(Te,{role:`alertdialog`,...a,...i,ref:s,onOpenAutoFocus:he(i.onOpenAutoFocus,e=>{e.preventDefault(),c.current?.focus({preventScroll:!0})}),onPointerDownOutside:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),children:[(0,X.jsx)(Ge,{children:r}),(0,X.jsx)(tt,{contentRef:o})]})})})});Ke.displayName=Q;var qe=`AlertDialogTitle`,Je=Y.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Z(n);return(0,X.jsx)(Oe,{...i,...r,ref:t})});Je.displayName=qe;var Ye=`AlertDialogDescription`,Xe=Y.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Z(n);return(0,X.jsx)(De,{...i,...r,ref:t})});Xe.displayName=Ye;var Ze=`AlertDialogAction`,Qe=Y.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,i=Z(n);return(0,X.jsx)(ke,{...i,...r,ref:t})});Qe.displayName=Ze;var $e=`AlertDialogCancel`,et=Y.forwardRef((e,t)=>{let{__scopeAlertDialog:n,...r}=e,{cancelRef:i}=We($e,n),a=Z(n),o=Se(t,i);return(0,X.jsx)(ke,{...a,...r,ref:o})});et.displayName=$e;var tt=({contentRef:e})=>{let t=`\`${Q}\` requires a description for the component to be accessible for screen reader users.
|
|
2
|
+
|
|
3
|
+
You can add a description to the \`${Q}\` by passing a \`${Ye}\` component as a child, which also benefits sighted users by adding visible context to the dialog.
|
|
4
|
+
|
|
5
|
+
Alternatively, you can use your own component as a description by assigning it an \`id\` and passing the same value to the \`aria-describedby\` prop in \`${Q}\`. If the description is confusing or duplicative for sighted users, you can use the \`@radix-ui/react-visually-hidden\` primitive as a wrapper around your description component.
|
|
6
|
+
|
|
7
|
+
For more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;return Y.useEffect(()=>{document.getElementById(e.current?.getAttribute(`aria-describedby`))||console.warn(t)},[t,e]),null},nt=Ie,rt=Re,it=Be,at=He,ot=Ke,st=Qe,ct=et,lt=Je,ut=Xe;function dt({...e}){return(0,X.jsx)(nt,{"data-slot":`alert-dialog`,...e})}function ft({...e}){return(0,X.jsx)(rt,{"data-slot":`alert-dialog-trigger`,...e})}function pt({...e}){return(0,X.jsx)(it,{"data-slot":`alert-dialog-portal`,...e})}function mt({className:e,...t}){return(0,X.jsx)(at,{"data-slot":`alert-dialog-overlay`,className:G(`fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function ht({className:e,size:t=`default`,...n}){return(0,X.jsxs)(pt,{children:[(0,X.jsx)(mt,{}),(0,X.jsx)(ot,{"data-slot":`alert-dialog-content`,"data-size":t,className:G(`group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-md border bg-background p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg`,e),...n})]})}function gt({className:e,...t}){return(0,X.jsx)(`div`,{"data-slot":`alert-dialog-header`,className:G(`grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]`,e),...t})}function _t({className:e,...t}){return(0,X.jsx)(`div`,{"data-slot":`alert-dialog-footer`,className:G(`flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end`,e),...t})}function vt({className:e,...t}){return(0,X.jsx)(lt,{"data-slot":`alert-dialog-title`,className:G(`text-lg font-semibold sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2`,e),...t})}function yt({className:e,...t}){return(0,X.jsx)(ut,{"data-slot":`alert-dialog-description`,className:G(`text-sm text-muted-foreground`,e),...t})}function bt({className:e,variant:t=`default`,size:n=`default`,...r}){return(0,X.jsx)(H,{variant:t,size:n,asChild:!0,children:(0,X.jsx)(st,{"data-slot":`alert-dialog-action`,className:G(e),...r})})}function xt({className:e,variant:t=`outline`,size:n=`default`,...r}){return(0,X.jsx)(H,{variant:t,size:n,asChild:!0,children:(0,X.jsx)(ct,{"data-slot":`alert-dialog-cancel`,className:G(e),...r})})}var St={running:{label:`Running`,badgeClass:`border-primary/30 bg-primary/10 text-primary`,cardClass:`live-running-surface border-border/60 bg-primary/5`},cancelling:{label:`Cancelling`,badgeClass:`border-amber-500/30 bg-amber-500/10 text-amber-600 dark:text-amber-400`,cardClass:`border-amber-500/30 bg-amber-500/5`},passed:{label:`Passed`,badgeClass:`border-emerald-500/30 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400`,cardClass:`border-emerald-500/25 bg-emerald-500/[0.03]`},failed:{label:`Failed`,badgeClass:`border-destructive/30 bg-destructive/10 text-destructive`,cardClass:`border-destructive/25 bg-destructive/[0.03]`},cancelled:{label:`Cancelled`,badgeClass:`border-amber-500/30 bg-amber-500/10 text-amber-600 dark:text-amber-400`,cardClass:`border-amber-500/25 bg-amber-500/[0.03]`}};function Ct(e){let t=[];return e.timeout&&t.push(`TIMEOUT: ${e.timeout.toUpperCase()}`),e.retries!=null&&t.push(`RETRIES: ${e.retries}`),e.screenshot!=null&&t.push(`SCREENSHOT: ${e.screenshot?`ON`:`OFF`}`),e.maxAttempts!=null&&t.push(`MAX ATTEMPTS: ${e.maxAttempts}`),t.length>0?t.join(` · `):null}function wt(e){return e instanceof HTMLElement?!!e.closest(`button, textarea, input, select, label, [role="switch"]`):!1}function Tt({result:e}){switch(e){case`success`:return(0,X.jsx)(V,{className:`size-3.5 text-emerald-500`});case`failure`:return(0,X.jsx)(me,{className:`size-3.5 text-destructive`});default:return(0,X.jsx)(E,{className:`size-3.5 text-muted-foreground`})}}function Et({status:e}){switch(e){case`running`:return(0,X.jsx)(W,{className:`size-3.5 animate-spin text-primary`});case`cancelling`:return(0,X.jsx)(W,{className:`size-3.5 animate-spin text-amber-500`});case`passed`:return(0,X.jsx)(V,{className:`size-3.5 text-emerald-500`});case`failed`:return(0,X.jsx)(me,{className:`size-3.5 text-destructive`});case`cancelled`:return(0,X.jsx)(E,{className:`size-3.5 text-amber-500`})}}function Dt(e){if(!e.plannedAction)return`Sub-action ${e.index+1}`;try{let t=typeof e.plannedAction==`string`?JSON.parse(e.plannedAction):e.plannedAction;if(t&&typeof t==`object`){let e=[t.type||t.action||``,t.target||t.selector||t.ref||``].filter(Boolean).join(` `);if(e)return e}}catch{if(typeof e.plannedAction==`string`)return e.plannedAction}return`Sub-action ${e.index+1}`}function Ot({id:e,index:t,value:n,overrides:r,onChange:i,onOverrideChange:a,onDelete:o,disabled:s=!1,liveStatus:l=`idle`,showLiveControls:d=!1,canRunLiveStep:f=!1,onRunLiveStep:p,onCancelLiveStep:m,stepError:h,isSettingsOpen:g=!1,onToggleSettings:ee,isSelected:v=!1,onSelectStep:b,subActions:x,selectedSubActionIndex:C=null,onSelectSubAction:w,suggestions:T=[],hookLabels:E={}}){let D=l===`running`||l===`cancelling`,{attributes:te,listeners:ne,setNodeRef:O,transform:k,transition:A,isDragging:j}=_({id:e,disabled:s||D}),M=(0,Y.useRef)(null),[N,ie]=(0,Y.useState)(0),P=u({text:n,cursorPos:N,suggestions:T,anchorRef:M,onInsert:(0,Y.useCallback)((e,r,a)=>{i(t,n.slice(0,r)+e+n.slice(a)),requestAnimationFrame(()=>{let t=M.current;if(t){let n=r+e.length;t.selectionStart=n,t.selectionEnd=n,t.focus()}})},[n,i,t])}),F=(0,Y.useMemo)(()=>Object.fromEntries(T.filter(e=>e.namespace===`runHook`&&e.insertValue).map(e=>[e.insertValue,e.name])),[T]),ae=(0,Y.useMemo)(()=>({...E,...F}),[E,F]),L=Ct(r),R=L!==null,z=l===`idle`?null:St[l],se=v||g||D,B=(0,Y.useCallback)(()=>{let e=M.current;e&&(e.style.height=`0`,e.style.height=`${e.scrollHeight}px`)},[]);(0,Y.useEffect)(()=>{B()},[n,B]),(0,Y.useEffect)(()=>{let e=M.current;if(!e)return;let t=new ResizeObserver(()=>B());return t.observe(e.parentElement??e),()=>t.disconnect()},[B]);let le={transform:c.Transform.toString(k),transition:A,opacity:j?.5:1,zIndex:j?10:void 0},V=(0,Y.useCallback)(t=>{!b||wt(t)||b(e)},[e,b]);return(0,X.jsxs)(`div`,{ref:O,style:le,onClick:e=>V(e.target),className:G(`group/step relative overflow-hidden rounded-md border bg-card/60 transition-colors`,`hover:bg-card`,j&&`shadow-lg ring-2 ring-primary/20`,z?.cardClass,v&&`ring-2 ring-primary/35 ring-offset-1 ring-offset-background bg-primary/[0.04]`,s&&`pointer-events-none opacity-60`),children:[(0,X.jsxs)(`div`,{className:`flex items-start gap-2 px-3 py-2`,children:[(0,X.jsx)(`button`,{type:`button`,className:`mt-0.5 flex shrink-0 items-center p-0.5 text-muted-foreground/40 hover:text-muted-foreground cursor-grab active:cursor-grabbing touch-none disabled:cursor-not-allowed`,"aria-label":`Reorder step ${t+1}`,disabled:s||D,...te,...ne,children:(0,X.jsx)(re,{className:`size-3.5`})}),(0,X.jsxs)(`span`,{className:`mt-[3px] shrink-0 text-[11px] tabular-nums text-muted-foreground/50`,children:[`#`,t+1]}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[l!==`idle`&&z&&(0,X.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[11px] text-muted-foreground`,children:[(0,X.jsx)(Et,{status:l}),(0,X.jsx)(`span`,{className:`font-medium`,children:z.label})]}),(0,X.jsxs)(`div`,{className:`relative`,children:[(0,X.jsx)(`textarea`,{ref:M,value:n,onChange:e=>{i(t,e.target.value),ie(e.target.selectionStart??0),B()},onKeyDown:e=>{P.handleKeyDown(e)},onBlur:()=>{setTimeout(()=>P.setVisible(!1),150)},placeholder:`Describe what this step should do...`,disabled:s||D,rows:1,className:`min-w-0 w-full resize-none overflow-hidden border-none bg-transparent p-0 text-sm text-foreground outline-none placeholder:text-muted-foreground/40`,"aria-haspopup":P.visible?`listbox`:void 0,"aria-expanded":P.visible||void 0}),P.dropdown]}),S(n)&&(0,X.jsx)(y,{text:n,hookLabels:ae}),(R||g)&&(0,X.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1 text-muted-foreground/70`,children:[(0,X.jsx)(ue,{className:`size-3 shrink-0`}),(0,X.jsx)(`span`,{className:`truncate text-[11px] font-mono uppercase tracking-wide`,children:L??`Step settings open`})]})]}),(0,X.jsx)(`div`,{className:`flex shrink-0 items-start gap-2`,children:(0,X.jsxs)(`div`,{className:G(`mt-0.5 flex shrink-0 items-center gap-1 transition-opacity`,se?`opacity-100`:`opacity-0 pointer-events-none group-hover/step:pointer-events-auto group-hover/step:opacity-100 group-focus-within/step:pointer-events-auto group-focus-within/step:opacity-100`),children:[d&&(D?(0,X.jsxs)(H,{type:`button`,variant:`outline`,size:`xs`,onClick:()=>m?.(t),disabled:s||!m,children:[l===`cancelling`?(0,X.jsx)(W,{className:`size-3 animate-spin`}):(0,X.jsx)(oe,{className:`size-3`}),`Cancel`]}):(0,X.jsxs)(H,{type:`button`,variant:`outline`,size:`xs`,onClick:()=>p?.(t),disabled:s||!f||!p,children:[(0,X.jsx)(de,{className:`size-3`}),`Run`]})),(0,X.jsx)(H,{type:`button`,variant:`ghost`,size:`icon-sm`,onClick:()=>ee?.(e),disabled:s,className:G(`shrink-0 text-muted-foreground/70 hover:text-foreground`,g&&`bg-muted/60 text-foreground`),"aria-label":`Open settings for step ${t+1}`,title:`Step settings`,children:(0,X.jsx)(ue,{className:`size-3.5`})}),(0,X.jsxs)(dt,{children:[(0,X.jsx)(ft,{asChild:!0,children:(0,X.jsx)(H,{type:`button`,variant:`ghost`,size:`icon-sm`,disabled:s||D,"aria-label":`Delete step ${t+1}`,title:`Delete step`,className:`text-muted-foreground/70 hover:text-destructive`,children:(0,X.jsx)(fe,{className:`size-3.5`})})}),(0,X.jsxs)(ht,{size:`sm`,children:[(0,X.jsxs)(gt,{children:[(0,X.jsx)(vt,{children:`Delete step?`}),(0,X.jsxs)(yt,{children:[`Step #`,t+1,` will be removed. This cannot be undone.`]})]}),(0,X.jsxs)(_t,{children:[(0,X.jsx)(xt,{children:`Cancel`}),(0,X.jsx)(bt,{variant:`destructive`,onClick:()=>o(t),children:`Delete`})]})]})]})]})})]}),g&&(0,X.jsx)(`div`,{className:`border-t px-3 py-3`,children:(0,X.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 md:grid-cols-2`,children:[(0,X.jsxs)(`div`,{className:`space-y-1`,children:[(0,X.jsx)(I,{htmlFor:`step-${t}-timeout`,className:`text-[11px] text-muted-foreground`,children:`Timeout`}),(0,X.jsx)(K,{id:`step-${t}-timeout`,value:r.timeout??``,onChange:e=>a(t,`timeout`,e.target.value||void 0),placeholder:`e.g. 30s`,disabled:s,className:`h-8 text-xs`})]}),(0,X.jsxs)(`div`,{className:`space-y-1`,children:[(0,X.jsx)(I,{htmlFor:`step-${t}-retries`,className:`text-[11px] text-muted-foreground`,children:`Retries`}),(0,X.jsx)(K,{id:`step-${t}-retries`,type:`number`,min:0,value:r.retries??``,onChange:e=>a(t,`retries`,e.target.value?Number(e.target.value):void 0),placeholder:`0`,disabled:s,className:`h-8 text-xs`})]}),(0,X.jsxs)(`div`,{className:`space-y-1`,children:[(0,X.jsx)(I,{htmlFor:`step-${t}-maxAttempts`,className:`text-[11px] text-muted-foreground`,children:`Max Attempts`}),(0,X.jsx)(K,{id:`step-${t}-maxAttempts`,type:`number`,min:1,value:r.maxAttempts??``,onChange:e=>a(t,`maxAttempts`,e.target.value?Number(e.target.value):void 0),placeholder:`1`,disabled:s,className:`h-8 text-xs`})]}),(0,X.jsxs)(`div`,{className:`space-y-1`,children:[(0,X.jsx)(I,{className:`text-[11px] text-muted-foreground`,children:`Screenshot`}),(0,X.jsx)(`div`,{className:`flex h-8 items-center`,children:(0,X.jsx)(ce,{checked:r.screenshot??!1,onCheckedChange:e=>a(t,`screenshot`,e?!0:void 0),disabled:s})})]})]})}),x&&x.length>0&&(0,X.jsxs)(`div`,{className:`border-t px-3 py-2`,children:[(0,X.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,X.jsx)(`span`,{className:`text-[11px] font-medium uppercase tracking-wide text-muted-foreground`,children:`Sub-actions`}),(0,X.jsx)(Me,{variant:`outline`,className:`text-[10px]`,children:x.length})]}),(0,X.jsx)(`div`,{className:`space-y-1`,children:x.map((t,n)=>(0,X.jsxs)(`button`,{type:`button`,onClick:()=>w?.(e,n),className:G(`flex w-full items-center gap-2 rounded-md border px-2.5 py-2 text-left text-xs transition-colors`,C===n?`border-primary/40 bg-primary/10 text-foreground`:`border-border/60 bg-background/70 text-muted-foreground hover:border-border hover:text-foreground`),children:[(0,X.jsx)(Tt,{result:t.result}),(0,X.jsxs)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:[`#`,n+1]}),(0,X.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:Dt(t)})]},`${e}-sub-${n}`))})]}),l===`failed`&&(0,X.jsx)(`div`,{className:`border-t px-3 py-2 text-xs text-destructive`,children:h||`Step failed. Select the step to inspect reasoning, env, network, or console output.`})]})}function kt({text:e}){return(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{asChild:!0,children:(0,X.jsx)(je,{className:`h-3 w-3 text-muted-foreground/40 hover:text-muted-foreground/70 transition-colors cursor-help`})}),(0,X.jsx)(q,{className:`max-w-[250px] text-[13px]`,children:e})]})}function At({name:e,testId:o,target:c,context:l,isCreateMode:u,onChange:d,disabled:p=!1}){let{targets:m,isLoading:h}=ee(),{targets:g}=f(),_=c?g[c]:void 0;return(0,X.jsxs)(`div`,{className:`space-y-3`,children:[(0,X.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,X.jsxs)(I,{htmlFor:`test-name`,className:`text-xs`,children:[`Test Name `,(0,X.jsx)(`span`,{className:`text-destructive`,children:`*`})]}),(0,X.jsx)(K,{id:`test-name`,value:e,onChange:e=>d(`name`,e.target.value),placeholder:`My Test`,disabled:p,className:`h-8 text-sm`})]}),(0,X.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,X.jsxs)(I,{htmlFor:`test-id`,className:`text-xs flex items-center gap-1`,children:[`Test ID `,(0,X.jsx)(kt,{text:`Unique identifier used for memory and analytics. Changing this breaks the association with past runs and observations.`})]}),u?(0,X.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,X.jsx)(K,{id:`test-id`,value:o,readOnly:!0,disabled:!0,className:`h-8 text-sm font-mono flex-1`}),(0,X.jsx)(H,{type:`button`,variant:`ghost`,size:`icon-sm`,onClick:()=>d(`test-id`,L()),"aria-label":`Generate new ID`,disabled:p,children:(0,X.jsx)(P,{className:`size-3.5`})})]}):(0,X.jsx)(`p`,{className:`text-[13px] font-mono text-muted-foreground`,children:o||`No ID assigned`})]}),(0,X.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,X.jsxs)(I,{htmlFor:`test-target`,className:`text-xs flex items-center gap-1`,children:[`Target `,(0,X.jsx)(`span`,{className:`text-destructive`,children:`*`}),` `,(0,X.jsx)(kt,{text:`A registered app target from your workspace config. Defines where the test runs (web URL or mobile app).`})]}),!h&&m.length===0?(0,X.jsxs)(`p`,{className:`text-[13px] text-muted-foreground`,children:[`No targets configured.`,` `,(0,X.jsx)(J,{to:`/config`,className:`text-primary underline underline-offset-4 hover:text-primary/80`,children:`Add targets in Settings`}),`.`]}):(0,X.jsxs)(a,{value:c||void 0,onValueChange:e=>d(`target`,e),disabled:p||h,children:[(0,X.jsx)(r,{className:`w-full h-8 text-sm`,children:(0,X.jsx)(i,{placeholder:`Select a target`})}),(0,X.jsx)(n,{children:m.map(e=>(0,X.jsx)(t,{value:e,children:e},e))})]}),_&&(0,X.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[13px] text-muted-foreground mt-1.5`,children:[_.platform===`web`?(0,X.jsx)(k,{className:`h-3.5 w-3.5 shrink-0`}):(0,X.jsx)(s,{className:`h-3.5 w-3.5 shrink-0`}),(0,X.jsx)(`span`,{className:`text-muted-foreground/70 uppercase text-[11px] tracking-wider shrink-0`,children:_.platform}),(0,X.jsxs)(`span`,{className:`font-mono truncate`,children:[_.product&&(0,X.jsx)(`span`,{className:`mr-1.5`,children:_.product}),_.platform===`web`&&_.url,_.platform===`android`&&`${_.appPackage}${_.appActivity?` / ${_.appActivity}`:``}`,_.platform===`ios`&&_.bundleId]})]})]}),(0,X.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,X.jsxs)(I,{htmlFor:`test-context`,className:`text-xs flex items-center gap-1`,children:[`Context `,(0,X.jsx)(kt,{text:`Additional instructions the AI agent receives before executing steps. Use this for login credentials, test-specific rules, or environment details.`})]}),(0,X.jsx)(ae,{id:`test-context`,value:l,onChange:e=>d(`context`,e.target.value),placeholder:`Additional instructions for the AI agent...`,disabled:p,className:`min-h-[60px] resize-none text-sm`,rows:2})]})]})}var jt=[`name`,`test-id`,`target`,`use`,`meta`,`context`,`setup`,`steps`,`teardown`];function Mt(e){function t(e,n){if(x(e)){n?e.items.sort((e,t)=>{let n=jt.indexOf(String(e.key)),r=jt.indexOf(String(t.key));return(n===-1?jt.length:n)-(r===-1?jt.length:r)}):e.items.sort((e,t)=>String(e.key).localeCompare(String(t.key)));for(let n of e.items)t(n.value,!1)}}t(e.contents,!0)}function $(e){return Mt(e),e.toString()}function Nt(e,t,n){let r=[...e],[i]=r.splice(t,1);return r.splice(n,0,i),r}function Pt(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Ft(e){try{let t=v(e);if(t.errors.length>0)return null;let n=t.toJSON();return!n||typeof n!=`object`?null:{name:n.name??``,testId:n[`test-id`]??``,target:n.target??``,context:n.context??``,setup:Pt(n.setup),steps:Array.isArray(n.steps)?n.steps.map(e=>{if(typeof e==`string`)return{text:e,overrides:{}};let t=e;return{text:t.step??``,overrides:{timeout:t.timeout,retries:t.retries,screenshot:t.screenshot,maxAttempts:t.maxAttempts}}}):[],teardown:Pt(n.teardown)}}catch{return null}}function It(e,t,n){try{let r=v(e);return n===void 0||Array.isArray(n)&&n.length===0?r.deleteIn(t):r.setIn(t,n),$(r)}catch{return e}}function Lt(e,t,n){try{let r=v(e),i=r.getIn([`steps`,t]);if(i&&typeof i==`object`&&`toJSON`in i){let e=i.toJSON();if(e&&typeof e==`object`&&`step`in e)return r.setIn([`steps`,t,`step`],n),$(r)}return r.setIn([`steps`,t],n),$(r)}catch{return e}}function Rt(e,t,n,r){try{let i=v(e),a=i.getIn([`steps`,t]),o=a&&typeof a==`object`&&`toJSON`in a?a.toJSON():a;if(typeof o==`string`||!o){let e=typeof o==`string`?o:``;i.setIn([`steps`,t],{step:e,[n]:r})}else if(r===void 0||r===``||r===null){i.deleteIn([`steps`,t,n]);let e=i.getIn([`steps`,t])?.toJSON?.();e&&typeof e==`object`&&Object.keys(e).filter(e=>e!==`step`).length===0&&i.setIn([`steps`,t],e.step??``)}else i.setIn([`steps`,t,n],r);return $(i)}catch{return e}}function zt(e,t){try{let n=v(e),r=n.getIn([`steps`]);return r&&typeof r.deleteIn==`function`&&r.deleteIn([t]),$(n)}catch{return e}}function Bt(e){try{let t=v(e),n=t.toJSON(),r=Array.isArray(n?.steps)?[...n.steps,``]:[``];return t.setIn([`steps`],r),$(t)}catch{return e}}function Vt(e,t,n,r){try{if(n===r||n<0||r<0)return e;let i=v(e),a=i.getIn([t]),o=a&&typeof a==`object`&&`toJSON`in a&&typeof a.toJSON==`function`?a.toJSON():a;return!Array.isArray(o)||n>=o.length||r>=o.length?e:(i.setIn([t],Nt(o,n,r)),$(i))}catch{return e}}function Ht({status:e}){switch(e){case`running`:return(0,X.jsx)(E,{className:`size-3.5 text-primary`});case`passed`:return(0,X.jsx)(V,{className:`size-3.5 text-emerald-500`});case`failed`:return(0,X.jsx)(me,{className:`size-3.5 text-destructive`});default:return(0,X.jsx)(pe,{className:`size-3.5 text-muted-foreground`})}}function Ut({phase:e,title:t,hooks:n,selection:r,onSelect:i,canRunHook:a=!1,onRunHook:o}){return n.length===0?null:(0,X.jsxs)(`div`,{"data-live-hook-section":e,className:`space-y-1.5`,children:[(0,X.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:t}),(0,X.jsx)(`div`,{className:`space-y-1.5`,children:n.map(e=>(0,X.jsxs)(`div`,{className:G(`relative overflow-hidden flex items-center gap-2 rounded-md border bg-muted/15 px-3 py-2 transition-colors`,e.status===`running`?`live-running-surface border-border/60 bg-primary/5`:r?.type===`hook`&&r.hookId===e.id?`border-primary/20 bg-primary/10 ring-1 ring-primary/30`:`border-border/60 hover:border-border hover:bg-muted/25`),children:[(0,X.jsxs)(`button`,{type:`button`,onClick:()=>i?.({type:`hook`,hookId:e.id}),className:`flex min-w-0 flex-1 items-center gap-2 text-left`,children:[(0,X.jsx)(Ht,{status:e.status}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,X.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.name}),(0,X.jsx)(`div`,{className:`truncate font-mono text-[11px] text-muted-foreground`,children:e.id}),(0,X.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:e.status===`pending`?`Waiting for session lifecycle`:e.status===`running`?`Running hook`:e.status===`passed`?`Completed`:e.error??`Hook failed`})]})]}),a&&(0,X.jsxs)(H,{type:`button`,variant:`outline`,size:`xs`,className:`shrink-0`,onClick:t=>{t.stopPropagation(),i?.({type:`hook`,hookId:e.id}),o?.(e.phase,e.id)},disabled:e.status===`running`||!o,children:[(0,X.jsx)(de,{className:`size-3`}),`Run`]})]},e.id))})]})}function Wt({content:e,onChange:t,isCreateMode:n,disabled:r=!1,showLiveStepActions:i=!1,canRunLiveStep:a=!1,canRunLiveHook:s=!1,liveEditorSteps:c,draftStepIds:u,liveSetupHooks:f,liveTeardownHooks:ee,onRunLiveStep:_,onCancelLiveStep:v,onRunLiveHook:y,openStepSettingsId:x,onOpenStepSettingsChange:S,selection:C,onSelect:E,variableSuggestions:ne}){let O=(0,Y.useRef)(null),{hooks:k,warningCopy:A}=w(),re=(0,Y.useMemo)(()=>Object.fromEntries(k.map(e=>[e.id,e.name])),[k]),j=Ft(e),M=j===null,N=j??O.current;j&&(O.current=j);let P=D(d(T,{activationConstraint:{distance:8}}),d(l,{coordinateGetter:b})),F=(0,Y.useCallback)((n,r)=>{t(It(e,[n],r))},[e,t]),ae=(0,Y.useCallback)((n,r)=>{t(Lt(e,n,r))},[e,t]),oe=(0,Y.useCallback)((n,r,i)=>{t(Rt(e,n,r,i))},[e,t]),I=(0,Y.useCallback)(n=>{t(zt(e,n))},[e,t]),L=(0,Y.useCallback)(()=>{t(Bt(e))},[e,t]),R=(0,Y.useMemo)(()=>N?.steps.map((e,t)=>u?.[t]??c?.[t]?.id??`draft-step-${t}`)??[],[N?.steps,u,c]),z=(0,Y.useCallback)(n=>{if(r||M)return;let{active:i,over:a}=n;if(!a||i.id===a.id)return;let o=R.indexOf(String(i.id)),s=R.indexOf(String(a.id));if(o===-1||s===-1)return;let c=Vt(e,`steps`,o,s);c!==e&&t(c)},[e,r,t,R,M]);return(0,X.jsx)(`div`,{className:`flex flex-col`,children:(0,X.jsxs)(`div`,{className:`space-y-4 p-4`,children:[M&&(0,X.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,X.jsx)(o,{className:`size-4 shrink-0`}),(0,X.jsx)(`span`,{children:`YAML has errors — builder shows last valid state`})]}),N?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(At,{name:N.name,testId:N.testId,target:N.target,context:N.context,isCreateMode:n??!1,onChange:F,disabled:r||M}),(0,X.jsxs)(`div`,{className:`space-y-3 rounded-md border bg-card/20 p-3`,children:[(0,X.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,X.jsx)(pe,{className:`size-4 text-muted-foreground`}),(0,X.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`Hooks`})]}),(0,X.jsxs)(`span`,{className:`text-[10px] text-muted-foreground/50`,children:[N.setup.length+N.teardown.length,` `,N.setup.length+N.teardown.length===1?`hook`:`hooks`]})]}),A&&(0,X.jsxs)(`div`,{className:`flex gap-2 rounded-md border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-xs text-amber-700 dark:text-amber-300`,children:[(0,X.jsx)(o,{className:`mt-0.5 size-3.5 shrink-0`}),(0,X.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,X.jsx)(`p`,{className:`font-medium`,children:A.title}),(0,X.jsx)(`p`,{children:A.body})]})]}),(0,X.jsxs)(`div`,{className:`space-y-3`,children:[(0,X.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Search hook names or paste an h_ ID. Saved as stable ID in YAML. Inline runHook uses the stable hook ID.`}),(0,X.jsx)(p,{phase:`setup`,label:`Setup`,values:N.setup,suggestions:k,disabled:r||M,placeholder:`Search hook names or paste an h_ ID`,onChange:e=>F(`setup`,e)}),(0,X.jsx)(p,{phase:`teardown`,label:`Teardown`,values:N.teardown,suggestions:k,disabled:r||M,placeholder:`Search hook names or paste an h_ ID`,onChange:e=>F(`teardown`,e)})]})]}),(0,X.jsxs)(`div`,{className:`space-y-1.5`,children:[i&&(0,X.jsx)(Ut,{phase:`setup`,title:`Setup Run Status`,hooks:f??[],selection:C??null,onSelect:E,canRunHook:!1,onRunHook:y}),(0,X.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,X.jsxs)(`span`,{className:`text-xs font-medium text-muted-foreground flex items-center gap-1`,children:[`Steps`,(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{asChild:!0,children:(0,X.jsx)(je,{className:`h-3 w-3 text-muted-foreground/40 hover:text-muted-foreground/70 transition-colors cursor-help`})}),(0,X.jsx)(q,{className:`max-w-[250px] text-[13px]`,children:`Plain-English instructions the AI agent executes in order. Each step is interpreted and acted upon independently.`})]})]}),(0,X.jsxs)(`span`,{className:`text-[10px] text-muted-foreground/50`,children:[N.steps.length,` `,N.steps.length===1?`step`:`steps`]})]}),(0,X.jsx)(h,{sensors:P,collisionDetection:te,onDragEnd:z,children:(0,X.jsx)(m,{items:R,strategy:g,children:(0,X.jsx)(`div`,{className:`space-y-1.5`,children:N.steps.map((e,t)=>(()=>{let n=c?.[t],o=R[t]??n?.id??`draft-step-${t}`,s=C?.type===`subaction`&&C.stepId===o?C.subIndex:null,l=C?.type===`step`||C?.type===`subaction`?C.stepId===o:!1,u=n?.status??`idle`;return(0,X.jsx)(Ot,{id:o,index:t,value:e.text,overrides:e.overrides,onChange:ae,onOverrideChange:oe,onDelete:I,disabled:r||M,liveStatus:u,showLiveControls:i,canRunLiveStep:a&&!!e.text.trim(),onRunLiveStep:_,onCancelLiveStep:v,stepError:n?.error,isSettingsOpen:x===o,onToggleSettings:e=>S?.(x===e?null:e),isSelected:l,onSelectStep:e=>E?.({type:`step`,stepId:e}),subActions:n?.subActionsData??null,selectedSubActionIndex:s,onSelectSubAction:(e,t)=>E?.({type:`subaction`,stepId:e,subIndex:t}),suggestions:ne,hookLabels:re},o)})())})})}),(0,X.jsxs)(H,{variant:`outline`,size:`sm`,className:`w-full mt-2 text-xs`,onClick:L,disabled:r||M,children:[(0,X.jsx)(ie,{className:`size-3.5`}),`Add Step`]}),i&&(0,X.jsx)(Ut,{phase:`teardown`,title:`Teardown Run Status`,hooks:ee??[],selection:C??null,onSelect:E,canRunHook:s,onRunHook:y})]})]}):(0,X.jsx)(`div`,{className:`flex items-center justify-center py-12 text-sm text-muted-foreground`,children:`Enter valid YAML to use the visual builder`})]})})}function Gt({testName:e,testId:t,unsaved:n,isCreateMode:r,mode:i=`view`,testHref:a,isSaving:o,isValidating:s,isRunning:c,runDisabled:l=!1,hasInvalidFilename:u,shortcutsOpen:d,showTestId:f=!0,hasLiveSession:p=!1,liveConnectionState:m=`disconnected`,isLiveActionDisabled:h=!1,liveSessionNumber:g=null,onSave:ee,onValidate:_,onRun:v,onLiveConnect:y,onLiveEnd:b,onSettingsOpen:x,onToggleShortcuts:S}){let w=i===`view`&&!r,T=!!y||!!b||p||m===`connecting`,E=!r||T,D=!r&&!w&&i===`edit`,te=!w&&p&&typeof g==`number`&&(m===`connected`||m===`executing`),k=`Start a disposable live session for this test. Setup hooks run on connect, teardown hooks run when the session ends, and changes are not saved automatically.`;return(0,X.jsxs)(`div`,{className:`flex h-14 shrink-0 items-center justify-between border-b px-4 min-w-0`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,X.jsx)(J,{to:`/tests`,className:`text-sm text-muted-foreground hover:text-foreground transition-colors shrink-0`,children:`Tests`}),(0,X.jsx)(ge,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),r?(0,X.jsx)(`span`,{className:`text-sm font-medium truncate`,children:`New Test`}):a&&!w?(0,X.jsx)(J,{to:a,className:`truncate text-sm font-medium hover:text-primary transition-colors`,children:e}):(0,X.jsx)(`span`,{className:`text-sm font-medium truncate`,children:e}),D&&(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(ge,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),(0,X.jsx)(`span`,{className:`text-sm font-medium truncate`,children:`Edit`})]}),n&&(0,X.jsx)(Me,{variant:`outline`,className:`text-xs`,children:`Unsaved`}),!w&&!r&&t&&f&&(0,X.jsx)(C,{label:`T`,value:t})]}),(0,X.jsx)(`div`,{className:`flex items-center gap-3 shrink-0`,children:w?(0,X.jsxs)(X.Fragment,{children:[a?(0,X.jsx)(H,{variant:`outline`,size:`sm`,asChild:!0,children:(0,X.jsxs)(J,{to:a,children:[`Edit`,(0,X.jsx)(N,{shortcut:`E`})]})}):(0,X.jsxs)(H,{variant:`outline`,size:`sm`,disabled:!0,children:[`Edit`,(0,X.jsx)(N,{shortcut:`E`})]}),(0,X.jsx)(A,{onRun:v,disabled:c||l,label:c?`Running...`:`Run`,shortcutKey:`R`,size:`sm`}),T&&(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{asChild:!0,children:(0,X.jsxs)(H,{size:`sm`,onClick:y,disabled:h||!y,children:[m===`connecting`?(0,X.jsx)(W,{className:`h-3.5 w-3.5 animate-spin`}):(0,X.jsx)(O,{className:`h-3.5 w-3.5`}),m===`connecting`?`Connecting...`:`Connect Live Session`,(0,X.jsx)(N,{shortcut:`L`,className:`border-primary-foreground/20 bg-primary-foreground/10 text-primary-foreground`})]})}),(0,X.jsx)(q,{className:`max-w-sm text-[13px]`,children:k})]}),!r&&(0,X.jsxs)(se,{open:d,onOpenChange:e=>{e||S()},children:[(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{asChild:!0,children:(0,X.jsx)(z,{asChild:!0,children:(0,X.jsx)(H,{variant:`ghost`,size:`icon-sm`,onClick:S,"aria-label":`Shortcuts`,children:(0,X.jsx)(M,{className:`h-3.5 w-3.5`})})})}),(0,X.jsx)(q,{children:`Shortcuts`})]}),(0,X.jsx)(R,{align:`end`,sideOffset:8,className:`w-72 p-4`,children:(0,X.jsx)(`div`,{className:`space-y-3`,children:(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`h4`,{className:`text-[10px] uppercase tracking-wider text-muted-foreground font-medium mb-2`,children:`Actions`}),(0,X.jsx)(j,{hints:[{key:`E`,label:`Edit`},{key:`R`,label:`Run`},{key:`L`,label:`Connect Live Session`}]})]})})})]})]}):(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(H,{variant:`ghost`,size:`sm`,onClick:_,disabled:s||u,children:[(0,X.jsx)(V,{className:`h-3.5 w-3.5`}),s?`Validating...`:`Validate`]}),(0,X.jsxs)(H,{variant:`ghost`,size:`sm`,onClick:ee,disabled:o||u,children:[(0,X.jsx)(ne,{className:`h-3.5 w-3.5`}),o?`Saving...`:`Save`]}),(0,X.jsxs)(H,{variant:`ghost`,size:`sm`,onClick:x,children:[(0,X.jsx)(F,{className:`h-3.5 w-3.5`}),`Settings`]}),E&&(0,X.jsx)(`div`,{className:`h-4 w-px bg-border`}),!r&&(0,X.jsx)(X.Fragment,{children:(0,X.jsx)(A,{onRun:v,disabled:c||l,label:c?`Running...`:`Run`,size:`sm`})}),T&&(p&&m!==`connecting`?(0,X.jsxs)(H,{variant:`destructive`,size:`sm`,onClick:b,disabled:!b,children:[(0,X.jsx)(oe,{className:`h-3.5 w-3.5`}),`End Live Session`]}):(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{asChild:!0,children:(0,X.jsxs)(H,{size:`sm`,onClick:y,disabled:h||!y,children:[m===`connecting`?(0,X.jsx)(W,{className:`h-3.5 w-3.5 animate-spin`}):(0,X.jsx)(O,{className:`h-3.5 w-3.5`}),m===`connecting`?`Connecting...`:`Connect Live Session`]})}),(0,X.jsx)(q,{className:`max-w-sm text-[13px]`,children:k})]})),te&&(0,X.jsxs)(Me,{variant:`outline`,"aria-live":`polite`,className:`text-[10px] tracking-wider font-medium text-muted-foreground bg-muted/50 border-border/50`,children:[`Session #`,g]}),!r&&(0,X.jsxs)(se,{open:d,onOpenChange:e=>{e||S()},children:[(0,X.jsxs)(B,{children:[(0,X.jsx)(U,{asChild:!0,children:(0,X.jsx)(z,{asChild:!0,children:(0,X.jsx)(H,{variant:`ghost`,size:`icon-sm`,onClick:S,"aria-label":`Shortcuts`,children:(0,X.jsx)(M,{className:`h-3.5 w-3.5`})})})}),(0,X.jsx)(q,{children:`Shortcuts`})]}),(0,X.jsx)(R,{align:`end`,sideOffset:8,className:`w-72 p-4`,children:(0,X.jsx)(`div`,{className:`space-y-3`,children:(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`h4`,{className:`text-[10px] uppercase tracking-wider text-muted-foreground font-medium mb-2`,children:`Actions`}),(0,X.jsx)(j,{hints:[{key:`R`,label:`Run test`},{key:`Cmd+S`,label:`Save`},{key:`Esc`,label:`Close results panel`}]})]})})})]})]})})]})}export{dt as a,ht as c,gt as d,vt as f,Ft as i,yt as l,Wt as n,bt as o,ft as p,It as r,xt as s,Gt as t,_t as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{t}from"./monaco-editor-CDJrOpKK.js";import{t as n}from"./file-code-GHpcb0ud.js";import{n as r}from"./split-button-C7J0EKrF.js";import{t as i}from"./zap-C7OZlYXQ.js";import{t as a}from"./use-page-title-CK82kWb2.js";import{n as o,t as ee}from"./test-navbar-CZhYoxgB.js";import{a as te,n as s,o as ne,t as c}from"./insights-line-grid-G3ouKANt.js";import{i as l,n as u,r as d,t as f}from"./tabs-CfNQIHt-.js";import{At as p,Gt as m,Ht as h,Kt as g,Mt as re,Nt as _,Qn as v,Wt as y,Zn as b,cr as ie,ct as ae,fr as x,jt as S,kt as C,lr as oe,lt as se,or as w,qt as T,r as ce,sr as le,xt as ue}from"./index-B3xPCIyH.js";import{t as E}from"./badge-BbhOGRC0.js";import{a as D,i as O,n as k,o as A,r as j,t as M}from"./table-DL0PmHAE.js";import{t as de}from"./empty-state-Dluv5C1Q.js";import{t as fe}from"./use-keyboard-shortcuts-BRF3cm7O.js";import{n as N,r as pe,t as me}from"./viewer-url-state-CZTYs75z.js";var P=e(x(),1),F=b();function he(e){if(!e)return``;let t=new Date(T(e)),n=Date.now()-t.getTime(),r=Math.floor(n/1e3);if(r<60)return`just now`;let i=Math.floor(r/60);if(i<60)return`${i}m ago`;let a=Math.floor(i/60);if(a<24)return`${a}h ago`;let o=Math.floor(a/24);return o<7?`${o}d ago`:y(e)}function I({configured:e,mode:t,scopedCount:n,totalCount:r,onModeChange:i}){return e?(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,F.jsx)(`div`,{className:`inline-flex rounded border border-border p-0.5`,children:[`scoped`,`all`].map(e=>(0,F.jsx)(h,{type:`button`,size:`xs`,variant:t===e?`default`:`ghost`,"aria-pressed":t===e,className:`h-7 rounded-[2px] px-2 text-xs`,onClick:()=>i(e),children:e===`scoped`?`Scoped`:`All runs`},e))}),(0,F.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[n,` scoped / `,r,` total runs`]})]}):(0,F.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No analytics scope configured`})}var ge=[`builder`,`yaml`,`memory`];function L({status:e}){switch(e){case`passed`:return(0,F.jsx)(E,{className:`bg-emerald-500/15 text-emerald-500 border-emerald-500/20`,children:`Passed`});case`failed`:return(0,F.jsx)(E,{variant:`destructive`,children:`Failed`});case`healed`:return(0,F.jsx)(E,{className:`bg-amber-500/15 text-amber-500 border-amber-500/20`,children:`Healed`});case`flaky`:return(0,F.jsx)(E,{className:`bg-amber-500/15 text-amber-500 border-amber-500/20`,children:`Flaky`});case`running`:return(0,F.jsx)(E,{className:`bg-blue-500/15 text-blue-500 border-blue-500/20 animate-pulse`,children:`Running`});case`cancelled`:return(0,F.jsx)(E,{className:`bg-muted text-muted-foreground border-border`,children:`Cancelled`});default:return(0,F.jsx)(E,{variant:`outline`,children:e})}}function _e({runs:e}){return e.length===0?(0,F.jsx)(`div`,{className:`flex items-center justify-center h-32 text-sm text-muted-foreground`,children:`No runs yet — click Run to start`}):(0,F.jsxs)(M,{children:[(0,F.jsx)(D,{children:(0,F.jsxs)(A,{children:[(0,F.jsx)(O,{children:`Status`}),(0,F.jsx)(O,{children:`Duration`}),(0,F.jsx)(O,{children:`Date`})]})}),(0,F.jsx)(k,{children:e.map(e=>(0,F.jsxs)(A,{className:`relative cursor-pointer hover:bg-muted/50`,children:[(0,F.jsxs)(j,{children:[(0,F.jsx)(w,{to:v.runDetailOrLive(e.id,e.status),className:`absolute inset-0`,tabIndex:-1}),(0,F.jsx)(L,{status:e.status})]}),(0,F.jsx)(j,{children:e.status===`running`?(0,F.jsx)(`span`,{className:`text-blue-500 text-sm`,children:`In progress...`}):(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:g(e.duration)})}),(0,F.jsx)(j,{children:(0,F.jsxs)(p,{children:[(0,F.jsx)(_,{asChild:!0,children:(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:y(e.createdAt)})}),(0,F.jsx)(S,{children:m(e.createdAt)})]})})]},e.id))})]})}function R(){let{t_id:e}=ie(),p=le(),{defaultRunMode:m}=r(),[h,_]=oe(),y=e??``,b=(0,P.useMemo)(()=>me(h,ge),[h]),x=(0,P.useMemo)(()=>N(b,h),[h,b]),S=b.tab,T=b.view,[R,ve]=(0,P.useState)(``),[ye,be]=(0,P.useState)(``),[xe,z]=(0,P.useState)(!0),[Se,B]=(0,P.useState)(!1),[V,Ce]=(0,P.useState)(null),[H,U]=(0,P.useState)(`all`),[W,G]=(0,P.useState)(!1),[we,Te]=(0,P.useState)(!1),K=(0,P.useMemo)(()=>{let e=R.match(/^name:\s*(.+)$/m);return e?e[1].trim():null},[R]);a(K||`Test`);let q=V?.scope?.configured===!0,J=H===`scoped`&&q&&V?.scopedTrends?V.scopedTrends:V?.trends,Y=H===`scoped`&&q&&V?.scopedFlakyScore!==void 0?V.scopedFlakyScore:V?.flakyScore??0,Ee=H===`scoped`&&q?V?.scopedRuns??[]:V?.runs??[],De=(0,P.useMemo)(()=>J?.daily?J.daily.map(e=>({date:e.date,passRate:e.total>0?Math.round(e.passed/e.total*1e3)/10:0})):[],[J]),Oe=(0,P.useMemo)(()=>V?.trends.daily?V.trends.daily.map(e=>({date:e.date,duration:e.avgDuration})):[],[V]),X=Ee;(0,P.useEffect)(()=>{V&&U(V.scope?.configured?`scoped`:`all`)},[V]),(0,P.useEffect)(()=>{x.toString()!==h.toString()&&_(x,{replace:!0})},[x,h,_]),(0,P.useEffect)(()=>{if(!y){B(!0),z(!1);return}let e=!1;return se(y).then(t=>{e||(ve(t.content),be(t.path))}).catch(()=>{e||(B(!0),C.error(`Failed to load test file`))}).finally(()=>{e||z(!1)}),()=>{e=!0}},[y]),(0,P.useEffect)(()=>{if(!K)return;let e=!1;return ae(K,{limit:50}).then(t=>{e||Ce(t)}).catch(()=>{}),()=>{e=!0}},[K]);let Z=async e=>{if(!W){G(!0);try{let t=await ue({file:ye,local:e});C.success(`Run started`),p(v.runLive(t.runId))}catch(e){C.error(`Failed to start run: ${e instanceof Error?e.message:String(e)}`)}finally{G(!1)}}},Q=v.testEdit(y),$=v.testEditLive(y);fe({e:()=>p(Q),r:()=>{Z(m===`local`)},l:()=>p($)});let ke=e=>{_(N(e,h),{replace:!0})};if(xe)return(0,F.jsx)(ce,{});if(Se)return(0,F.jsx)(de,{icon:n,title:`Test not found`,description:`This test file doesn't exist`,actionLabel:`View All Tests`,onAction:()=>p(v.tests)});let Ae=(0,F.jsx)(o,{content:R,onChange:()=>{},disabled:!0}),je=(0,F.jsx)(t,{value:R,onChange:()=>{},readOnly:!0,className:`h-full`}),Me=V&&(0,F.jsxs)(`aside`,{"data-testid":`test-detail-analytics-sidebar`,className:`flex flex-col gap-0 overflow-y-auto border-t border-border md:border-t-0 md:border-l md:border-border`,children:[(0,F.jsx)(`div`,{className:`border-b border-border px-3 py-2`,children:(0,F.jsx)(I,{configured:q,mode:H,scopedCount:V.scope?.scopedCount??0,totalCount:V.scope?.totalCount??V.total,onModeChange:U})}),(0,F.jsxs)(s,{className:`grid-cols-2 divide-x divide-y-0 border-x-0 border-t-0`,children:[(0,F.jsxs)(c,{className:`flex flex-col gap-0.5 px-3 py-2`,children:[(0,F.jsx)(`span`,{className:`text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:`Pass Rate`}),(0,F.jsxs)(`span`,{className:`text-xl font-semibold text-foreground`,children:[Math.round((J??V.trends).passRate*100),`%`]})]}),(0,F.jsxs)(c,{className:`flex flex-col gap-0.5 px-3 py-2`,children:[(0,F.jsx)(`span`,{className:`text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:`Avg Duration`}),(0,F.jsx)(`span`,{className:`text-xl font-semibold text-foreground`,children:g(V.trends.avgDuration)})]}),(0,F.jsxs)(c,{className:`flex flex-col gap-0.5 border-t border-border px-3 py-2`,children:[(0,F.jsx)(`span`,{className:`text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:`Total Runs`}),(0,F.jsx)(`span`,{className:`text-xl font-semibold text-foreground`,children:V.total.toLocaleString()})]}),(0,F.jsxs)(c,{className:`flex flex-col gap-0.5 border-t border-border px-3 py-2`,children:[(0,F.jsx)(`span`,{className:`text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:`Flaky Score`}),(0,F.jsxs)(`span`,{className:`text-xl font-semibold text-foreground`,children:[(Y*100).toFixed(0),`%`]})]})]}),(0,F.jsx)(s,{className:`border-x-0 border-y-0`,children:(0,F.jsxs)(c,{className:`flex flex-col gap-2 px-3 py-3`,children:[(0,F.jsxs)(`span`,{className:`text-sm font-medium text-foreground`,children:[H===`scoped`&&q?`Scoped Runs`:`All Runs`,` (`,X.length,`)`]}),X.length===0?(0,F.jsx)(`div`,{className:`flex items-center justify-center h-16 text-sm text-muted-foreground`,children:`No runs yet`}):(0,F.jsxs)(M,{children:[(0,F.jsx)(D,{children:(0,F.jsxs)(A,{children:[(0,F.jsx)(O,{children:`Status`}),(0,F.jsx)(O,{children:`Duration`}),(0,F.jsx)(O,{children:`Date`})]})}),(0,F.jsx)(k,{children:X.slice(0,5).map(e=>(0,F.jsxs)(A,{className:`relative cursor-pointer hover:bg-muted/50`,children:[(0,F.jsxs)(j,{children:[(0,F.jsx)(w,{to:v.runDetailOrLive(e.id,e.status),className:`absolute inset-0`,tabIndex:-1}),(0,F.jsx)(L,{status:e.status})]}),(0,F.jsx)(j,{children:e.status===`running`?(0,F.jsx)(`span`,{className:`text-blue-500 text-sm`,children:`In progress...`}):(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:g(e.duration)})}),(0,F.jsx)(j,{children:(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:he(e.createdAt)})})]},e.id))})]})]})})]});return(0,F.jsx)(re,{children:(0,F.jsxs)(`div`,{className:`flex flex-col h-screen`,children:[(0,F.jsx)(ee,{testName:K||`Test`,testId:y,unsaved:!1,isCreateMode:!1,mode:`view`,testHref:Q,isSaving:!1,isValidating:!1,isRunning:W,hasInvalidFilename:!1,showTestId:!1,onBack:()=>p(v.tests),onSave:()=>{},onValidate:()=>{},onRun:e=>Z(e),onLiveConnect:()=>p($),onSettingsOpen:()=>{},shortcutsOpen:we,onToggleShortcuts:()=>Te(e=>!e)}),(0,F.jsxs)(f,{value:S,onValueChange:e=>ke({tab:e,view:T}),className:`flex-1 min-h-0 flex flex-col`,children:[(0,F.jsx)(`div`,{className:`px-4 border-b border-border`,children:(0,F.jsxs)(d,{variant:`line`,children:[(0,F.jsx)(l,{value:`overview`,children:`Overview`}),(0,F.jsx)(l,{value:`insights`,children:`Insights`})]})}),(0,F.jsxs)(u,{value:`overview`,className:`flex-1 min-h-0 mt-0 grid grid-cols-1 md:grid-cols-[minmax(480px,1fr)_minmax(260px,320px)]`,children:[(0,F.jsx)(`div`,{className:`min-w-0 min-h-0 flex flex-col`,children:(0,F.jsxs)(f,{value:T,onValueChange:e=>ke({tab:S,view:e}),className:`flex-1 min-h-0 flex flex-col`,children:[(0,F.jsx)(`div`,{className:`px-4 border-b border-border`,children:(0,F.jsxs)(d,{variant:`line`,className:`w-full grid grid-cols-3 md:w-fit md:inline-flex`,children:[(0,F.jsx)(l,{value:`builder`,children:`Builder`}),(0,F.jsx)(l,{value:`yaml`,children:`YAML`}),(0,F.jsx)(l,{value:`memory`,children:`Memory`})]})}),(0,F.jsxs)(`div`,{className:`relative flex-1 min-h-0`,children:[(0,F.jsx)(u,{value:`builder`,className:`absolute inset-0 overflow-y-auto data-[state=inactive]:hidden`,children:Ae}),(0,F.jsx)(u,{value:`yaml`,className:`absolute inset-0 data-[state=inactive]:hidden`,children:je}),(0,F.jsx)(u,{value:`memory`,className:`absolute inset-0 overflow-y-auto data-[state=inactive]:hidden`,children:(0,F.jsx)(pe,{scope:`test`,scopeId:y,emptyTitle:`No test memory yet`,emptyDescription:`This test doesn't have cataloged observations in this workspace yet. Run the test with memory enabled, then reopen this tab.`})})]})]})}),Me]}),(0,F.jsx)(u,{value:`insights`,className:`flex-1 overflow-y-auto mt-0`,children:(0,F.jsx)(`div`,{"data-testid":`test-detail-insights`,className:`px-4 py-3`,children:V?(0,F.jsxs)(`div`,{className:`space-y-3`,children:[V.isFlaky&&(0,F.jsxs)(E,{variant:`destructive`,children:[(0,F.jsx)(i,{className:`size-3`}),`Flaky (score: `,V.flakyScore.toFixed(2),`)`]}),(0,F.jsxs)(s,{className:`grid-cols-2 divide-x divide-y-0 md:grid-cols-4`,children:[(0,F.jsx)(c,{className:`border-b border-border md:border-b-0`,children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Total Runs`}),(0,F.jsx)(`p`,{className:`text-2xl font-semibold mt-0.5`,children:V.total.toLocaleString()})]})}),(0,F.jsx)(c,{className:`border-b border-border md:border-b-0 md:border-r`,children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Pass Rate`}),(0,F.jsxs)(`p`,{className:`text-2xl font-semibold mt-0.5`,children:[Math.round((J??V.trends).passRate*100),`%`]})]})}),(0,F.jsx)(c,{children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Avg Duration`}),(0,F.jsx)(`p`,{className:`text-2xl font-semibold mt-0.5`,children:g(V.trends.avgDuration)})]})}),(0,F.jsx)(c,{children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Flaky Score`}),(0,F.jsxs)(`p`,{className:`text-2xl font-semibold mt-0.5`,children:[(Y*100).toFixed(0),`%`]})]})})]}),(0,F.jsx)(s,{children:(0,F.jsx)(c,{className:`px-4 py-3`,children:(0,F.jsx)(I,{configured:q,mode:H,scopedCount:V.scope?.scopedCount??0,totalCount:V.scope?.totalCount??V.total,onModeChange:U})})}),(J?.daily.length??0)>0&&(0,F.jsxs)(s,{className:`md:grid-cols-2 md:divide-x md:divide-y-0`,children:[(0,F.jsxs)(c,{className:`px-4 py-3`,children:[(0,F.jsx)(`p`,{className:`text-sm font-medium mb-2`,children:`Pass Rate`}),(0,F.jsx)(`div`,{className:`h-[160px] overflow-hidden`,children:(0,F.jsx)(ne,{data:De})})]}),(0,F.jsxs)(c,{className:`px-4 py-3`,children:[(0,F.jsx)(`p`,{className:`text-sm font-medium mb-2`,children:`Duration`}),(0,F.jsx)(`div`,{className:`h-[160px] overflow-hidden`,children:(0,F.jsx)(te,{data:Oe})})]})]}),(0,F.jsx)(s,{children:(0,F.jsxs)(c,{className:`px-4 py-3`,children:[(0,F.jsxs)(`p`,{className:`text-sm font-medium mb-2`,children:[H===`scoped`&&q?`Scoped Runs`:`All Runs`,` (`,X.length,`)`]}),(0,F.jsx)(_e,{runs:X})]})})]}):(0,F.jsx)(s,{children:(0,F.jsx)(c,{className:`flex h-32 items-center justify-center text-sm text-muted-foreground`,children:`No analytics data available`})})})})]})]})})}export{R as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./chunk-CilyBKbf.js";import{t}from"./arrow-up-down-DyIZvSrC.js";import{i as n,n as r,o as i,s as a,t as o}from"./select-B5gV6YUf.js";import{n as s}from"./split-button-C7J0EKrF.js";import{n as c,r as l}from"./shortcut-hints-CfVf0REF.js";import{t as u}from"./plus-C6Zz9JLt.js";import{t as d}from"./use-page-title-CK82kWb2.js";import{t as f}from"./batch-action-bar-CZxUcNFZ.js";import{n as p,t as ee}from"./scroll-area-DfPMtFw0.js";import{At as m,Ht as h,Mn as te,Mt as ne,N as re,Nt as ie,Qn as g,Ut as _,Vn as ae,Vt as oe,Wt as v,Zn as se,a as ce,fr as y,ht as le,jt as ue,kt as b,lr as de,or as x,sr as fe,tt as pe,ut as me,xt as he}from"./index-B3xPCIyH.js";import{t as S}from"./badge-BbhOGRC0.js";import{a as ge,n as _e,o as ve,r as ye,t as be}from"./lib-BPEPp1D-.js";import{a as xe,i as Se,n as Ce,o as C,r as we,t as Te}from"./table-DL0PmHAE.js";import{t as Ee}from"./empty-state-Dluv5C1Q.js";import{t as De}from"./use-keyboard-shortcuts-BRF3cm7O.js";import{n as Oe,t as ke}from"./use-selection-queue-CZ4rXNAT.js";import{n as Ae,r as je,t as Me}from"./tests-suites-table-widths-tlOYaS72.js";var w=e(y(),1),T=new Set([`asc`,`desc`]),E=50;function Ne(e){if(!e)return 1;let t=Number.parseInt(e,10);return Number.isFinite(t)&&t>1?t:1}function D(e){let t=new URLSearchParams;return e.search&&t.set(`search`,e.search),e.status&&t.set(`status`,e.status),e.platform&&t.set(`platform`,e.platform),e.target&&t.set(`target`,e.target),e.sort&&(t.set(`sort`,e.sort),t.set(`order`,e.order)),e.page>1&&t.set(`page`,String(e.page)),t}function Pe(){let[e,t]=de(),n=e.get(`search`)??``,r=e.get(`status`)??``,i=e.get(`platform`)??``,a=e.get(`target`)??``,o=e.get(`sort`)??``,s=e.get(`order`)??`desc`,c=T.has(s)?s:`desc`,l=Ne(e.get(`page`)),u=(0,w.useMemo)(()=>o?[{id:o,desc:c===`desc`}]:[],[o,c]),d=(0,w.useRef)(u);d.current=u;let f=(0,w.useMemo)(()=>({search:n,status:r,platform:i,target:a,sort:o,order:c,page:l}),[n,r,i,a,o,c,l]);(0,w.useEffect)(()=>{let n=D(f);e.toString()!==n.toString()&&t(n,{replace:!0})},[e,t,f]);let p=(0,w.useCallback)((e,n)=>{let r={...f,...e};n?.resetPage&&(r.page=1),t(D(r),{replace:!0})},[t,f]),ee=(0,w.useCallback)(e=>{let t=typeof e==`function`?e(d.current):e;t.length>0?p({sort:t[0].id,order:t[0].desc?`desc`:`asc`}):p({sort:``,order:`desc`})},[p]),m=(0,w.useMemo)(()=>({pageIndex:l-1,pageSize:E}),[l]);return{search:n,status:r,platform:i,target:a,sort:o,order:c,page:l,sorting:u,pagination:m,onSortingChange:ee,onPaginationChange:(0,w.useCallback)(e=>{p({page:(typeof e==`function`?e(m):e).pageIndex+1})},[m,p]),setSearch:(0,w.useCallback)(e=>p({search:e},{resetPage:!0}),[p]),setStatus:(0,w.useCallback)(e=>p({status:e},{resetPage:!0}),[p]),setPlatform:(0,w.useCallback)(e=>p({platform:e},{resetPage:!0}),[p]),setTarget:(0,w.useCallback)(e=>p({target:e},{resetPage:!0}),[p]),setPage:(0,w.useCallback)(e=>p({page:e}),[p])}}var O=se();function k({status:e}){switch(e){case`passed`:return(0,O.jsx)(S,{className:`bg-emerald-500/15 text-emerald-500 border-emerald-500/20`,children:`Passed`});case`failed`:return(0,O.jsx)(S,{variant:`destructive`,children:`Failed`});case`healed`:return(0,O.jsx)(S,{className:`bg-amber-500/15 text-amber-500 border-amber-500/20`,children:`Healed`});case`flaky`:return(0,O.jsx)(S,{className:`bg-amber-500/15 text-amber-500 border-amber-500/20`,children:`Flaky`});case`running`:return(0,O.jsx)(S,{className:`bg-blue-500/15 text-blue-500 border-blue-500/20 animate-pulse`,children:`Running`});case`cancelled`:return(0,O.jsx)(S,{className:`bg-muted text-muted-foreground border-border`,children:`Cancelled`});default:return(0,O.jsx)(S,{variant:`outline`,children:e})}}var Fe=new Set([`passed`,`healed`]),Ie=new Set([`passed`,`healed`,`failed`,`flaky`,`cancelled`]);function A(e){return e?e===`ios`?`iOS`:e.charAt(0).toUpperCase()+e.slice(1):`—`}function j(e){return e.replace(/\\/g,`/`)}function M(e){let t=j(e).split(`/`).filter(Boolean);return t.length>1?t.slice(1).join(`/`):t[0]??e}function N(e){return e.createdAt||e.startedAt||e.endedAt||``}function Le(e){return _(`h-10 bg-background text-[13px] font-medium text-foreground/90`,e===`select`?`px-2 text-center`:`px-3`,(e===`passRate`||e===`lastRun`)&&`text-right`)}function Re(e){return _(`py-2 align-top`,e===`select`&&`px-2`,e===`name`&&`max-w-0 px-3`,(e===`target`||e===`targetName`)&&`max-w-0 px-3`,e===`platform`&&`px-3`,e===`passRate`&&`px-3 text-right`,e===`lastRun`&&`max-w-0 px-3 text-right`)}function ze({isActive:e,isBatchSelected:t}){return _(`cursor-pointer outline-none hover:bg-muted/20 focus-visible:bg-primary/10 focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-primary/60`,t&&!e&&`bg-muted/20`,e&&`bg-primary/10 ring-1 ring-inset ring-primary/60`)}var P=[{accessorKey:`name`,header:({column:e})=>(0,O.jsxs)(h,{variant:`ghost`,className:`-ml-4`,onClick:()=>e.toggleSorting(e.getIsSorted()===`asc`),children:[`Test Name`,(0,O.jsx)(t,{className:`ml-2 h-4 w-4`})]}),cell:({row:e})=>(0,O.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,O.jsx)(`span`,{className:`block whitespace-normal break-words text-sm font-medium leading-snug text-foreground`,children:e.getValue(`name`)}),(0,O.jsx)(`span`,{className:`block whitespace-normal break-all text-xs leading-snug text-muted-foreground`,children:M(e.original.path)})]}),filterFn:(e,t,n)=>{let r=e.getValue(`name`).toLowerCase(),i=e.original.path.toLowerCase(),a=n.toLowerCase();return r.includes(a)||i.includes(a)}},{accessorKey:`targetName`,header:({column:e})=>(0,O.jsxs)(h,{variant:`ghost`,className:`-ml-4`,onClick:()=>e.toggleSorting(e.getIsSorted()===`asc`),children:[`Target`,(0,O.jsx)(t,{className:`ml-2 h-4 w-4`})]}),cell:({row:e})=>(0,O.jsx)(`span`,{className:`block whitespace-normal break-words text-sm leading-snug text-muted-foreground`,children:e.original.targetName??`No target`})},{accessorKey:`platform`,header:({column:e})=>(0,O.jsxs)(h,{variant:`ghost`,className:`-ml-4`,onClick:()=>e.toggleSorting(e.getIsSorted()===`asc`),children:[`Platform`,(0,O.jsx)(t,{className:`ml-2 h-4 w-4`})]}),cell:({row:e})=>(0,O.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:A(e.getValue(`platform`))})},{accessorKey:`passRate`,header:({column:e})=>(0,O.jsxs)(h,{variant:`ghost`,className:`-ml-4`,onClick:()=>e.toggleSorting(e.getIsSorted()===`asc`),children:[`Pass rate`,(0,O.jsx)(t,{className:`ml-2 h-4 w-4`})]}),cell:({row:e})=>e.original.passRate===null?(0,O.jsxs)(`div`,{className:`space-y-0.5 text-right`,children:[(0,O.jsx)(`div`,{className:`text-sm font-medium text-foreground`,children:`No runs`}),(0,O.jsx)(`div`,{className:`text-xs tabular-nums text-muted-foreground`,children:`0 completed`})]}):(0,O.jsxs)(`div`,{className:`space-y-0.5 text-right`,children:[(0,O.jsxs)(`div`,{className:`text-sm font-medium tabular-nums text-foreground`,children:[e.original.passRate,`%`]}),(0,O.jsxs)(`div`,{className:`text-xs tabular-nums text-muted-foreground`,children:[e.original.passCount,`/`,e.original.completedRunCount]})]})},{id:`lastRun`,accessorFn:e=>e.lastRun?.createdAt??e.lastRun?.startedAt??e.lastRun?.endedAt??``,header:({column:e})=>(0,O.jsx)(`div`,{className:`flex items-center justify-end`,children:(0,O.jsxs)(h,{variant:`ghost`,className:`h-auto justify-end px-0 text-[13px] font-medium text-foreground/90 hover:bg-transparent`,onClick:()=>e.toggleSorting(e.getIsSorted()===`asc`),children:[`Last run`,(0,O.jsx)(t,{className:`ml-2 h-4 w-4`})]})}),cell:({row:e})=>e.original.lastRun?(0,O.jsxs)(x,{to:g.runDetail(e.original.lastRun.id),className:`relative z-10 flex w-full flex-col items-end gap-1 rounded-sm text-right focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60`,onClick:e=>e.stopPropagation(),children:[(0,O.jsx)(k,{status:e.original.lastRun.status}),(0,O.jsx)(`span`,{className:`whitespace-normal break-words text-xs leading-snug text-muted-foreground`,children:v(N(e.original.lastRun))})]}):(0,O.jsx)(`span`,{className:`block text-sm text-muted-foreground`,children:`No runs`}),sortingFn:(e,t)=>{let n=N(e.original.lastRun??{createdAt:``,startedAt:null,endedAt:null}),r=N(t.original.lastRun??{createdAt:``,startedAt:null,endedAt:null});return n.localeCompare(r)}}];function F(){d(`Tests`);let[e,t]=(0,w.useState)([]),[v,se]=(0,w.useState)([]),[y,de]=(0,w.useState)([]),[x,S]=(0,w.useState)(!0),[T,E]=(0,w.useState)(!1),[Ne,D]=(0,w.useState)(!1),[k,A]=(0,w.useState)(!0),[F,Be]=(0,w.useState)(!0),I=fe(),{hasFarm:Ve,isLoading:He}=s();(0,w.useEffect)(()=>{let e=!1;return Promise.all([me(),pe({limit:200})]).then(([n,r])=>{e||(t(n.files),de(n.targets??[]),se(r.runs))}).catch(()=>{e||b.error(`Failed to load test files`)}).finally(()=>{e||S(!1)}),()=>{e=!0}},[]);let{search:L,status:R,platform:z,target:B,page:V,sorting:Ue,pagination:H,onSortingChange:We,onPaginationChange:Ge,setSearch:Ke,setStatus:qe,setPlatform:Je,setTarget:Ye,setPage:Xe}=Pe(),[U,W]=(0,w.useState)(-1),Ze=(0,w.useRef)([]),G=(0,w.useMemo)(()=>{let t=new Map,n=new Map,r=(e,t,n)=>{if(!t)return;let r=e.get(t);r?r.push(n):e.set(t,[n])};for(let e of v){if(!e.filePath)continue;let i=j(e.filePath);r(t,i,e),r(n,M(i),e)}return e.map(e=>{let r=j(e.path),i=[...t.get(r)??n.get(M(r))??[]].sort((e,t)=>N(t).localeCompare(N(e))),a=i.filter(e=>Ie.has(e.status)),o=a.filter(e=>Fe.has(e.status)).length,s=a.length>0?Math.round(o/a.length*100):null,c=i[0]??null;return{path:e.path,name:e.name,testId:e.testId,targetName:e.targetName,platform:e.platform,lastRunStatus:c?.status??null,lastRun:c,passRate:s,passCount:o,completedRunCount:a.length}})},[e,v]),K=(0,w.useMemo)(()=>{let e=G;if(L){let t=L.toLowerCase();e=e.filter(e=>{let n=e.targetName?.toLowerCase()??``;return e.name.toLowerCase().includes(t)||e.path.toLowerCase().includes(t)||n.includes(t)})}return R&&(e=R===`no-runs`?e.filter(e=>!e.lastRunStatus):e.filter(e=>e.lastRunStatus===R)),z&&(e=e.filter(e=>e.platform===z)),B&&(e=e.filter(e=>e.targetName===B)),e},[G,L,R,z,B]),q=ke({items:G,getId:e=>e.path,visibleIds:K.map(e=>e.path)}),Qe=(0,w.useMemo)(()=>Array.from(new Set([B,...y,...G.map(e=>e.targetName??``)].filter(e=>!!e))),[G,B,y]),$e={id:`select`,header:({table:e})=>(0,O.jsx)(`div`,{className:`flex items-center justify-center`,children:(0,O.jsx)(je,{checked:q.getVisibleSelectionState(e.getRowModel().rows.map(e=>e.original.path)),onCheckedChange:t=>q.setItemsSelected(e.getRowModel().rows.map(e=>e.original),t),ariaLabel:`Select all`})}),cell:({row:e})=>(0,O.jsx)(je,{checked:q.isSelected(e.original.path),onCheckedChange:t=>q.setItemSelected(e.original,t)}),enableSorting:!1,size:48},J=q.selectedIds,Y=q.selectedItems,et=(0,w.useCallback)(()=>{q.clearSelection(),D(!1),A(!0),Be(!0)},[q]),tt=(0,w.useCallback)(async e=>{if(J.length!==0){E(!0);try{let t=await Promise.allSettled(J.map(t=>he({file:t,local:e,noCache:!k,noMemory:!F}))),n=t.filter(e=>e.status===`fulfilled`).length,r=t.length-n;r>0?b.error(`${n} runs queued, ${r} failed`):b.success(`${n} runs queued`),D(!1)}finally{E(!1)}}},[J,k,F]),nt=(0,w.useCallback)(async()=>{if(J.length!==0){E(!0);try{let e=await Promise.allSettled(J.map(e=>le({file:e}))),t=e.filter(e=>e.status===`fulfilled`).length,n=e.filter(e=>e.status===`fulfilled`).reduce((e,t)=>e+t.value.purged,0),r=e.length-t;r>0?b.error(`Purged ${n} plans from ${t} tests, ${r} failed`):b.success(`Purged ${n} cached plan${n===1?``:`s`}`)}finally{E(!1)}}},[J]),rt=(0,w.useCallback)(async()=>{if(Y.length!==0){E(!0);try{let e=await Promise.allSettled(Y.map(e=>e.testId?re(e.testId):Promise.reject(Error(`Missing test id for ${e.path}`)))),n=Y.filter((t,n)=>e[n]?.status===`fulfilled`),r=new Set(n.map(e=>e.path)),i=e.length-n.length;n.length>0&&(q.setItemsSelected(n,!1),t(e=>e.filter(e=>!r.has(e.path))),D(!1)),i>0?b.error(`Deleted ${n.length} test${n.length===1?``:`s`}, ${i} failed`):b.success(`Deleted ${n.length} test${n.length===1?``:`s`}`)}finally{E(!1)}}},[Y,q]),X=_e({data:K,columns:[$e,...P],getCoreRowModel:ye(),getSortedRowModel:ve(),getPaginationRowModel:ge(),onSortingChange:We,onPaginationChange:Ge,getRowId:e=>e.path,state:{sorting:Ue,pagination:H}}),Z=X.getRowModel().rows,Q=q.hiddenCount,it=L;(0,w.useEffect)(()=>{if(x)return;let e=Math.max(1,Math.ceil(K.length/H.pageSize));V>e&&Xe(e)},[K.length,x,V,H.pageSize,Xe]);let at=(0,w.useCallback)(e=>{Ke(e),W(-1)},[Ke]);De((0,w.useMemo)(()=>{let e=()=>W(e=>Math.min(e+1,Z.length-1)),t=()=>W(e=>Math.max(e-1,0));return{j:e,arrowdown:e,k:t,arrowup:t,enter:e=>{if(U>=0&&Z[U]){let t=Z[U].original,n=g.testView(t.testId??t.path);e.metaKey||e.ctrlKey?window.open(n,`_blank`):I(n)}}}},[Z,U,I])),(0,w.useEffect)(()=>{if(U<0)return;let e=Ze.current[U];e&&document.activeElement!==e&&e.focus()},[U,Z.length]);let ot=(0,w.useCallback)((e,t)=>{t&&t.preventDefault(),I(g.testView(e.testId??e.path))},[I]);if(x)return(0,O.jsx)(ce,{});if(e.length===0)return(0,O.jsx)(Ee,{icon:ae,title:`No tests found`,description:`Create your first test file to get started`,actionLabel:`Create Test`,onAction:()=>I(g.testNew)});let $=K.length,st=H.pageIndex,ct=H.pageSize,lt=st*ct+1,ut=Math.min(lt+ct-1,$);return(0,O.jsx)(ne,{children:(0,O.jsxs)(`div`,{className:`space-y-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,O.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Tests`}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsxs)(m,{children:[(0,O.jsx)(ie,{asChild:!0,children:(0,O.jsx)(h,{variant:`ghost`,size:`icon-sm`,"aria-label":`Keyboard shortcuts`,children:(0,O.jsx)(l,{className:`h-4 w-4`})})}),(0,O.jsx)(ue,{side:`bottom`,className:`p-3`,children:(0,O.jsx)(c,{hints:[{key:`J / ↓`,label:`Next row`},{key:`K / ↑`,label:`Previous row`},{key:`Enter`,label:`Open test`},{key:`⌘+Enter`,label:`Open in new tab`}]})})]}),(0,O.jsxs)(h,{size:`sm`,onClick:()=>I(g.testNew),children:[(0,O.jsx)(u,{className:`size-4`}),`New Test`]})]})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,O.jsx)(oe,{placeholder:`Search tests...`,value:it,onChange:e=>at(e.target.value),className:`max-w-[220px]`}),(0,O.jsxs)(o,{value:R||`all`,onValueChange:e=>{qe(e===`all`?``:e),W(-1)},children:[(0,O.jsx)(i,{className:`w-[150px]`,children:(0,O.jsx)(a,{placeholder:`All statuses`})}),(0,O.jsxs)(r,{children:[(0,O.jsx)(n,{value:`all`,children:`All statuses`}),(0,O.jsx)(n,{value:`passed`,children:`Passed`}),(0,O.jsx)(n,{value:`failed`,children:`Failed`}),(0,O.jsx)(n,{value:`running`,children:`Running`}),(0,O.jsx)(n,{value:`no-runs`,children:`No runs`})]})]}),(0,O.jsxs)(o,{value:z||`all`,onValueChange:e=>{Je(e===`all`?``:e),W(-1)},children:[(0,O.jsx)(i,{className:`w-[140px]`,children:(0,O.jsx)(a,{placeholder:`All platforms`})}),(0,O.jsxs)(r,{children:[(0,O.jsx)(n,{value:`all`,children:`All platforms`}),(0,O.jsx)(n,{value:`web`,children:`Web`}),(0,O.jsx)(n,{value:`android`,children:`Android`}),(0,O.jsx)(n,{value:`ios`,children:`iOS`})]})]}),(0,O.jsxs)(o,{value:B||`all`,onValueChange:e=>{Ye(e===`all`?``:e),W(-1)},children:[(0,O.jsx)(i,{className:`w-[180px]`,children:(0,O.jsx)(a,{placeholder:`All targets`})}),(0,O.jsxs)(r,{children:[(0,O.jsx)(n,{value:`all`,children:`All targets`}),Qe.map(e=>(0,O.jsx)(n,{value:e,children:e},e))]})]})]}),(0,O.jsxs)(ee,{className:`rounded-md border`,children:[(0,O.jsxs)(Te,{className:`min-w-full table-fixed`,children:[(0,O.jsx)(`colgroup`,{children:Me.map(e=>{let t=Ae(e);return(0,O.jsx)(`col`,{"data-column-id":e,style:t?{width:t}:void 0},e)})}),(0,O.jsx)(xe,{children:X.getHeaderGroups().map(e=>(0,O.jsx)(C,{className:`hover:bg-transparent`,children:e.headers.map(e=>(0,O.jsx)(Se,{className:Le(e.column.id),children:e.isPlaceholder?null:be(e.column.columnDef.header,e.getContext())},e.id))},e.id))}),(0,O.jsx)(Ce,{children:Z.length?Z.map((e,t)=>{let n=t===U,r=q.isSelected(e.original.path);return(0,O.jsx)(C,{ref:e=>{Ze.current[t]=e},"data-runs-row-surface":e.id,tabIndex:n?0:-1,"aria-selected":n,className:ze({isActive:n,isBatchSelected:r}),onClick:()=>ot(e.original),onFocus:()=>W(t),onKeyDown:t=>{t.key===`Enter`&&ot(e.original,t)},children:e.getVisibleCells().map(e=>{let t=e.column.id===`select`;return(0,O.jsx)(we,{className:_(Re(e.column.id),t&&`relative z-10`),children:be(e.column.columnDef.cell,e.getContext())},e.id)})},e.id)}):(0,O.jsx)(C,{children:(0,O.jsx)(we,{colSpan:P.length+1,className:`h-24 text-center`,children:`No tests match the current search or filters.`})})})]}),(0,O.jsx)(p,{orientation:`horizontal`})]}),(0,O.jsxs)(`div`,{className:`flex items-center justify-between px-2`,children:[(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:$>0?`Showing ${lt}-${ut} of ${$}${it||R||z||B?` (${G.length} total)`:``}`:`No tests found`}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(h,{variant:`outline`,size:`sm`,onClick:()=>X.previousPage(),disabled:!X.getCanPreviousPage(),children:`Previous`}),(0,O.jsx)(h,{variant:`outline`,size:`sm`,onClick:()=>X.nextPage(),disabled:!X.getCanNextPage(),children:`Next`})]})]}),(0,O.jsx)(f,{selectedCount:q.selectedCount,summaryMeta:Q>0?`${Q} hidden by filters`:void 0,secondaryIcon:(0,O.jsx)(te,{className:`size-4`}),secondaryAriaLabel:`Clear queue`,onDelete:rt,actionSlot:(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(Oe,{selectedCount:q.selectedCount,hiddenCount:Q,useCache:k,useMemory:F,browserStackAvailable:!He&&Ve,open:Ne,onOpenChange:D,onUseCacheChange:A,onUseMemoryChange:Be,onRunLocal:()=>tt(!0),onRunBrowserStack:()=>tt(!1),disabled:T}),(0,O.jsx)(h,{variant:`outline`,size:`sm`,onClick:nt,disabled:T,children:`Purge cache`})]}),onCancel:et,isRunning:T})]})})}export{F as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./batch-action-bar-CZxUcNFZ.js";import{Zn as t}from"./index-B3xPCIyH.js";var n=t();function r({checked:t,onCheckedChange:r,ariaLabel:i}){function a(e){e.stopPropagation(),!(e.target instanceof Element&&e.target.closest(`[data-slot="checkbox"]`))&&r(t!==!0)}function o(e){e.stopPropagation()}return(0,n.jsx)(`div`,{"data-selection-checkbox-hit-area":!0,className:`relative z-10 flex min-h-8 min-w-8 items-center justify-center -my-1 -mx-2 px-2 py-1`,onPointerDown:e=>e.stopPropagation(),onFocus:o,onClick:a,children:(0,n.jsx)(e,{checked:t,onCheckedChange:e=>r(e===!0),onClick:e=>e.stopPropagation(),"aria-label":i??`Select row`})})}var i=[`select`,`name`,`target`,`platform`,`passRate`,`lastRun`],a={select:`2.75rem`,target:`10rem`,platform:`6.25rem`,passRate:`7.25rem`,lastRun:`9rem`};function o(e){return a[e]}export{o as n,r,i as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./chunk-CilyBKbf.js";import{Ut as e,Zn as t,fr as n,qn as r}from"./index-B3xPCIyH.js";var i=r(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]);n();var a=t();function o({className:t,...n}){return(0,a.jsx)(`textarea`,{"data-slot":`textarea`,className:e(`flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40`,t),...n})}export{i as n,o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{qn as e}from"./index-B3xPCIyH.js";var t=e(`trash-2`,[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]]);export{t};
|