@botbuddy/react 0.8.0 → 0.8.1

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/README.md CHANGED
@@ -19,11 +19,13 @@ function App() {
19
19
  {/* Your app */}
20
20
  <TestRunWidget
21
21
  config={{
22
- serverUrl: "https://your-project.supabase.co/functions/v1/mcp-server",
22
+ serverUrl: "https://api.bot-buddy.ai/functions/v1/mcp-server",
23
23
  anonKey: "your-supabase-anon-key",
24
+ supabaseUrl: "https://api.bot-buddy.ai", // enables realtime updates
24
25
  }}
25
26
  appSlug="my-app"
26
27
  environment="staging"
28
+ ticketId="PROJ-123"
27
29
  targetUrl={window.location.origin}
28
30
  onNavigate={(path) => (window.location.href = path)}
29
31
  />
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');function xe(n,o){let[a,v]=react.useState({x:n,y:o}),x=react.useRef(false),g=react.useRef({x:0,y:0}),w=react.useRef(false),S=react.useCallback(p=>{x.current=true,w.current=false,g.current={x:p.clientX-a.x,y:p.clientY-a.y},p.target.setPointerCapture(p.pointerId);},[a]),m=react.useCallback(p=>{x.current&&(w.current=true,v({x:p.clientX-g.current.x,y:p.clientY-g.current.y}));},[]),f=react.useCallback(()=>{x.current=false;},[]);return {pos:a,onPointerDown:S,onPointerMove:m,onPointerUp:f,didDrag:w}}function ae(n,o){let a={apikey:n.anonKey};return o?a.Authorization=`Bearer ${o}`:n.apiKey?a.Authorization=`Bearer ${n.apiKey}`:a.Authorization=`Bearer ${n.anonKey}`,a}async function lt(n){if(n)return n;try{let o=await fetch("/.botbuddy-token",{cache:"no-store"});if(o.ok){let a=(await o.text()).trim();if(a.startsWith("public_"))return a}}catch{}try{let o=undefined?.VITE_BOTBUDDY_TEST_RUN_TOKEN;if(o&&typeof o=="string"&&o.startsWith("public_"))return o}catch{}return null}function be(n){let[o,a]=react.useState(null),[v,x]=react.useState("loading"),g=react.useCallback(async()=>{try{let f=await lt(n.testRunToken);if(!f){x("no-match"),a(null);return}if(!n.ticketId){x("no-match"),a(null);return}let p=new URLSearchParams;p.set("token",f),p.set("ticket_id",n.ticketId),p.set("app_slug",n.appSlug),n.environment&&p.set("environment",n.environment),n.testRunId&&p.set("test_run_id",n.testRunId),n.targetUrl&&p.set("target_url",n.targetUrl),n.version&&p.set("version",n.version),n.commitSha&&p.set("commit_sha",n.commitSha),n.prNumber&&p.set("pr_number",String(n.prNumber)),n.branchName&&p.set("branch_name",n.branchName);let _=await fetch(`${n.config.serverUrl}/widget/test-run?${p.toString()}`,{headers:ae(n.config,n.authToken)});if(_.status===404){x("no-match"),a(null);return}if(_.status===401||_.status===403){x("error");return}if(!_.ok){x("error");return}let T=await _.json();a(T),x(T.status==="completed"?"completed":"ready");}catch{x("error");}},[n.config.serverUrl,n.config.anonKey,n.config.apiKey,n.authToken,n.appSlug,n.environment,n.ticketId,n.testRunId,n.testRunToken,n.targetUrl,n.version,n.commitSha,n.branchName,n.prNumber]);return react.useEffect(()=>{g();},[g]),{run:o,widgetState:v,fetchRun:g,setVerdict:async(f,p,_,T="human")=>(a(B=>{if(!B)return null;let z=B.test_cases.map(l=>l.id===f?{...l,verdict:p,fail_reason:p==="fail"&&_||null,verdict_by_display_name:T,verdict_at:new Date().toISOString()}:l),t={total:z.length,pending:0,pass:0,fail:0,skip:0};return z.forEach(l=>{l.verdict in t&&t[l.verdict]++;}),{...B,test_cases:z,summary:t}}),(await fetch(`${n.config.serverUrl}/widget/test-cases/${f}/verdict`,{method:"POST",headers:{"Content-Type":"application/json",...ae(n.config,n.authToken)},body:JSON.stringify({verdict:p,fail_reason:_,display_name:T})})).ok),markComplete:async()=>o?(a(p=>p?{...p,status:"completed"}:null),x("completed"),(await fetch(`${n.config.serverUrl}/widget/test-runs/${o.id}/complete`,{method:"POST",headers:{"Content-Type":"application/json",...ae(n.config,n.authToken)}})).ok):false,resetRun:async()=>{if(!o)return false;let f=await fetch(`${n.config.serverUrl}/widget/test-runs/${o.id}/reset`,{method:"POST",headers:{"Content-Type":"application/json",...ae(n.config,n.authToken)}});return f.ok&&g(),f.ok},setRun:a}}var me="botbuddy-widget-auth-token",ye="botbuddy-widget-auth-name";function he(n){let[o,a]=react.useState(()=>{try{return localStorage.getItem(me)}catch{return null}}),[v,x]=react.useState(()=>{try{return localStorage.getItem(ye)}catch{return null}});react.useEffect(()=>{let S=m=>{if(m.data?.type==="botbuddy-widget-auth"&&m.data.token){let{token:f,displayName:p}=m.data;a(f),x(p||"human");try{localStorage.setItem(me,f),p&&localStorage.setItem(ye,p);}catch{}}};return window.addEventListener("message",S),()=>window.removeEventListener("message",S)},[]);let g=react.useCallback(()=>{let S=`${n}/widget-auth`,m=420,f=520,p=window.screenX+(window.innerWidth-m)/2,_=window.screenY+(window.innerHeight-f)/2;window.open(S,"botbuddy-auth",`width=${m},height=${f},left=${p},top=${_},popup=yes`);},[n]),w=react.useCallback(()=>{a(null),x(null);try{localStorage.removeItem(me),localStorage.removeItem(ye);}catch{}},[]);return {token:o,displayName:v,isAuthenticated:!!o,openLogin:g,logout:w}}var u=({d:n,className:o,size:a=14})=>jsxRuntime.jsx("svg",{className:o,width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:n})}),c={clipboard:"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2",check:"M22 11.08V12a10 10 0 1 1-5.93-9.14M22 4 12 14.01l-3-3",x:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20M15 9l-6 6M9 9l6 6",circle:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20",skip:"M5 4l10 8-10 8V4M19 5v14",grip:"M9 5h.01M15 5h.01M9 12h.01M15 12h.01M9 19h.01M15 19h.01",minus:"M5 12h14",chevronUp:"M18 15l-6-6-6 6",chevronDown:"M6 9l6 6 6-6",externalLink:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3",pr:"M6 3v18M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6M6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6M18 9a9 9 0 0 1-9 9",ticket:"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z",loader:"M21 12a9 9 0 1 1-6.219-8.56",checkAll:"M18 6L7 17l-5-5M22 10l-7.5 7.5L13 16",alert:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0M12 9v4M12 17h.01",user:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2M12 3a4 4 0 1 0 0 8 4 4 0 0 0 0-8",bot:"M12 8V4H8M2 14h2M20 14h2M15 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M9 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M18 10a6 6 0 0 0-12 0v4a6 6 0 0 0 12 0Z",terminal:"M4 17l6-6-6-6M12 19h8",key:"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4",shield:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10",copy:"M20 9h-9a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-9a2 2 0 0 0-2-2ZM5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1",search:"M11 17.25a6.25 6.25 0 1 1 0-12.5 6.25 6.25 0 0 1 0 12.5ZM16 16l4.5 4.5"};function pt(){let[n,o]=react.useState(()=>typeof window>"u"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return react.useEffect(()=>{if(typeof window>"u")return;let a=document.documentElement,v=()=>a.classList.contains("dark")?"dark":a.classList.contains("light")?"light":null,x=v();x&&o(x);let g=window.matchMedia("(prefers-color-scheme: dark)"),w=m=>{let f=v();o(f||(m.matches?"dark":"light"));};g.addEventListener("change",w);let S=new MutationObserver(()=>{let m=v();o(m||(g.matches?"dark":"light"));});return S.observe(a,{attributes:true,attributeFilter:["class"]}),()=>{g.removeEventListener("change",w),S.disconnect();}},[]),n}function ct(n){let o=n==="dark";return {bg:o?"rgb(30,30,30)":"rgb(255,255,255)",bgSoft:o?"rgba(255,255,255,0.02)":"rgba(0,0,0,0.02)",text:o?"#e5e5e5":"#1a1a1a",textMuted:o?"rgba(255,255,255,0.4)":"rgba(0,0,0,0.45)",textFaint:o?"#555":"#999",border:o?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.12)",borderSubtle:o?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",shadow:o?"rgba(0,0,0,0.4)":"rgba(0,0,0,0.12)",inputBg:o?"rgba(0,0,0,0.3)":"rgba(0,0,0,0.04)",inputBorder:o?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.12)",green:"#34d399",greenBg:o?"rgba(52,211,153,0.05)":"rgba(52,211,153,0.08)",greenBorder:o?"rgba(52,211,153,0.6)":"rgba(52,211,153,0.5)",greenBorderSubtle:o?"rgba(52,211,153,0.2)":"rgba(52,211,153,0.15)",red:"#f87171",amber:"#f59e0b",blue:"#60a5fa",purple:"#a78bfa",versionText:o?"rgba(255,255,255,0.5)":"rgba(0,0,0,0.35)",versionNum:o?"rgba(255,255,255,0.3)":"rgba(0,0,0,0.2)",gripColor:o?"#888":"#aaa",btnHover:o?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.06)"}}var ut={pending:"#888",pass:"#34d399",fail:"#f87171",skip:"#f59e0b"},gt={pending:c.circle,pass:c.check,fail:c.x,skip:c.skip},He={local:{bg:"rgba(59,130,246,0.15)",text:"#60a5fa",border:"rgba(59,130,246,0.3)"},preview:{bg:"rgba(168,85,247,0.15)",text:"#c084fc",border:"rgba(168,85,247,0.3)"},staging:{bg:"rgba(245,158,11,0.15)",text:"#fbbf24",border:"rgba(245,158,11,0.3)"},production:{bg:"rgba(239,68,68,0.15)",text:"#f87171",border:"rgba(239,68,68,0.3)"},custom:{bg:"rgba(128,128,128,0.15)",text:"#888",border:"rgba(128,128,128,0.3)"}},ft=n=>({root:{position:"fixed",zIndex:9999,userSelect:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},pill:o=>({display:"inline-flex",alignItems:"center",gap:"6px",padding:"4px 8px",borderRadius:"9999px",background:n.bg,border:o?`1px solid ${n.greenBorder}`:`1px solid ${n.border}`,boxShadow:o?`0 4px 12px ${n.shadow}, 0 0 0 1px ${n.greenBorderSubtle}`:`0 4px 12px ${n.shadow}`,cursor:"pointer",fontSize:"9px",color:n.text}),card:(o,a)=>({width:`${o}px`,borderRadius:"8px",background:n.bg,border:a?`1px solid ${n.greenBorder}`:`1px solid ${n.border}`,boxShadow:a?`0 8px 24px ${n.shadow}, 0 0 0 1px ${n.greenBorderSubtle}`:`0 8px 24px ${n.shadow}`,overflow:"hidden",display:"flex",flexDirection:"column"}),handle:{padding:"8px 12px",display:"flex",alignItems:"center",gap:"8px",cursor:"grab",borderBottom:`1px solid ${n.borderSubtle}`},title:{fontSize:"10px",fontWeight:600,color:n.text,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},sub:{fontSize:"9px",color:n.textMuted,display:"flex",alignItems:"center",gap:"6px"},btn:{padding:"2px",borderRadius:"4px",background:"transparent",border:"none",cursor:"pointer",color:n.gripColor,display:"flex",flexShrink:0},stats:{padding:"4px 12px",display:"flex",alignItems:"center",gap:"8px",fontSize:"9px",borderBottom:`1px solid ${n.borderSubtle}`},badge:o=>{let a=He[o]||He.custom;return {fontSize:"8px",padding:"0 4px",borderRadius:"4px",background:a.bg,color:a.text,border:`1px solid ${a.border}`,lineHeight:"14px"}},progress:{height:"2px",background:n.borderSubtle,flexShrink:0},progressBar:o=>({height:"100%",width:`${o}%`,background:"linear-gradient(to right, #34d399, #3b82f6)",transition:"width 0.5s"}),link:o=>({display:"inline-flex",alignItems:"center",gap:"4px",fontSize:"9px",padding:"2px 6px",borderRadius:"4px",background:`${o}15`,color:o,textDecoration:"none",border:"none",cursor:"pointer"}),caseRow:{padding:"6px 12px",borderBottom:`1px solid ${n.borderSubtle}`,transition:"background 0.15s"},verdictBtn:(o,a)=>({fontSize:"8px",padding:"2px 6px",borderRadius:"4px",border:"none",cursor:"pointer",background:o?`${a}33`:"transparent",color:o?a:n.gripColor,transition:"all 0.15s"}),input:{flex:1,fontSize:"9px",background:n.inputBg,border:`1px solid ${n.inputBorder}`,borderRadius:"4px",padding:"2px 6px",color:n.text,outline:"none"},humanBanner:{padding:"6px 12px",fontSize:"11px",fontWeight:600,color:n.green,borderBottom:`1px solid ${n.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",background:n.greenBg,cursor:"pointer",textDecoration:"none"}});function xt({config:n,appSlug:o,environment:a,seedUserSlug:v,authToken:x,tk:g}){let[w,S]=react.useState(null),[m,f]=react.useState(0),[p,_]=react.useState(false),[T,L]=react.useState(null),[B,z]=react.useState(false),t=react.useRef(null),l=react.useMemo(()=>v.split("/")[0].trim(),[v]),K=react.useCallback(async()=>{_(true),L(null);try{let C=new URLSearchParams({app_slug:o,seed_user_slug:l,environment:a}),N={apikey:n.anonKey};x?N.Authorization=`Bearer ${x}`:N.Authorization=`Bearer ${n.anonKey}`;let W=await fetch(`${n.serverUrl}/widget/totp-code?${C}`,{headers:N});if(!W.ok){let h=await W.json().catch(()=>({error:"Failed"}));if(W.status===404){L("No 2FA seed registered");return}L(h.error||"Failed to get code");return}let E=await W.json();S(E.code),f(E.remaining_seconds);try{await navigator.clipboard.writeText(E.code),z(!0),setTimeout(()=>z(!1),2e3);}catch{}t.current&&clearInterval(t.current);let O=E.remaining_seconds;t.current=setInterval(()=>{O--,O<=0?(t.current&&clearInterval(t.current),K()):f(O);},1e3);}catch{L("Network error");}finally{_(false);}},[n.serverUrl,n.anonKey,x,o,l,a]);return react.useEffect(()=>()=>{t.current&&clearInterval(t.current);},[]),T==="No 2FA seed registered"?null:w?jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"3px"},children:[jsxRuntime.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:"6px",padding:"3px 8px",borderRadius:"4px",background:`${g.purple}15`,border:`1px solid ${g.purple}40`,fontSize:"12px",fontFamily:"ui-monospace, monospace",fontWeight:700,color:g.purple,letterSpacing:"0.15em"},children:[jsxRuntime.jsx(u,{d:c.shield,size:11}),jsxRuntime.jsx("span",{children:w}),jsxRuntime.jsxs("span",{style:{fontSize:"8px",fontWeight:400,color:g.textMuted,letterSpacing:"0"},children:[m,"s"]})]}),jsxRuntime.jsx("button",{onClick:C=>{C.stopPropagation(),navigator.clipboard.writeText(w).then(()=>{z(true),setTimeout(()=>z(false),1500);});},style:{padding:"2px",background:"none",border:"none",cursor:"pointer",color:B?g.green:g.gripColor,fontSize:"8px"},title:"Copy code",children:B?jsxRuntime.jsx(u,{d:c.check,size:10}):jsxRuntime.jsx(u,{d:c.copy,size:10})})]}):jsxRuntime.jsxs("button",{onClick:C=>{C.stopPropagation(),K();},disabled:p,style:{display:"inline-flex",alignItems:"center",gap:"4px",marginTop:"3px",fontSize:"8px",padding:"2px 6px",borderRadius:"4px",background:`${g.purple}12`,color:g.purple,border:`1px solid ${g.purple}30`,cursor:p?"wait":"pointer",opacity:p?.6:1},children:[jsxRuntime.jsx(u,{d:c.shield,size:9}),p?"generating...":T||"Get 2FA code"]})}var Ve="botbuddy-widget-state";function bt({config:n,appSlug:o,environment:a,ticketId:v,testRunId:x,testRunToken:g,targetUrl:w,version:S,commitSha:m,prNumber:f,branchName:p,onNavigate:_,displayName:T="human",defaultMode:L="mini",defaultPosition:B}){let z=pt(),t=react.useMemo(()=>ct(z),[z]),l=react.useMemo(()=>ft(t),[t]),[K,C]=react.useState(false),[N,W]=react.useState(false),E=react.useRef(false),O=n.dashboardUrl||"https://botbuddy.lovable.app",h=he(O),le=(()=>{try{let e=typeof window<"u"?localStorage.getItem(Ve):null;if(e)return JSON.parse(e)}catch{}return null})(),[Y,j]=react.useState(le?.mode||L),[de,re]=react.useState(""),[Ke,G]=react.useState(null),[ve,Se]=react.useState(null),[Oe,Ye]=react.useState(new Set),[U,_e]=react.useState(""),je=react.useCallback(e=>{Ye(d=>{let b=new Set(d);return b.has(e)?b.delete(e):b.add(e),b});},[]),Ge=le?.x??B?.x??16,Xe=le?.y??B?.y??(typeof window<"u"?window.innerHeight-56:600),{pos:R,onPointerDown:X,onPointerMove:J,onPointerUp:Z,didDrag:pe}=xe(Ge,Xe);react.useEffect(()=>{try{localStorage.setItem(Ve,JSON.stringify({mode:Y,x:R.x,y:R.y}));}catch{}},[Y,R.x,R.y]);let ke=react.useRef(h.isAuthenticated);react.useEffect(()=>{!ke.current&&h.isAuthenticated&&j("max"),ke.current=h.isAuthenticated;},[h.isAuthenticated]);let we="botbuddy-widget-max-size",Je=()=>{try{let e=localStorage.getItem(we);if(e)return JSON.parse(e)}catch{}return {w:340,h:500}},[Q,Me]=react.useState(Je),q=react.useRef(false),ee=react.useRef({x:0,y:0,w:0,h:0}),Ze=react.useCallback(e=>{e.stopPropagation(),q.current=true,ee.current={x:e.clientX,y:e.clientY,w:Q.w,h:Q.h},e.target.setPointerCapture(e.pointerId);},[Q]),Qe=react.useCallback(e=>{if(!q.current)return;let d=Math.max(280,Math.min(600,ee.current.w+(e.clientX-ee.current.x))),b=Math.max(300,Math.min(window.innerHeight*.9,ee.current.h+(e.clientY-ee.current.y)));Me({w:d,h:b});},[]),qe=react.useCallback(()=>{q.current&&(q.current=false,Me(e=>(localStorage.setItem(we,JSON.stringify(e)),e)));},[]),oe=w??(typeof window<"u"?window.location.href:void 0),ze=h.displayName||T,[I,Ce]=react.useState(null);react.useEffect(()=>{if(h.isAuthenticated)return;let e=new URLSearchParams;g&&e.set("token",g),v&&e.set("ticket_id",v),e.set("app_slug",o),a&&e.set("environment",a),x&&e.set("test_run_id",x),oe&&e.set("target_url",oe),S&&e.set("version",S),m&&e.set("commit_sha",m),f&&e.set("pr_number",String(f)),p&&e.set("branch_name",p),fetch(`${n.serverUrl}/widget/preview?${e}`,{headers:{apikey:n.anonKey}}).then(d=>d.json()).then(d=>Ce(d)).catch(()=>Ce(null));},[h.isAuthenticated,n.serverUrl,n.anonKey,o,a,v,x,g,oe,S,m,f,p]);let{run:s,widgetState:D,fetchRun:et,setVerdict:Te,markComplete:tt,resetRun:nt}=be({config:n,appSlug:o,environment:a,ticketId:v,testRunId:x,testRunToken:g,targetUrl:oe,version:S,commitSha:m,prNumber:f?String(f):void 0,branchName:p,authToken:h.token}),ie=react.useCallback(async(e,d,b)=>{Se(e);try{await Te(e,d,b,ze);}finally{Se(null),G(null),re("");}},[Te,ze]),y=s?.summary||{total:0,pending:0,pass:0,fail:0,skip:0},rt=y.total>0&&y.pending===0,A=D==="completed",se=react.useMemo(()=>{let e=s?.test_cases||[];if(!U.trim())return e;let d=U.toLowerCase();return e.filter(b=>b.title.toLowerCase().includes(d)||b.description&&b.description.toLowerCase().includes(d)||b.url_path&&b.url_path.toLowerCase().includes(d)||b.seed_user&&b.seed_user.toLowerCase().includes(d))},[s?.test_cases,U]),Re=react.useMemo(()=>{let e=se,d=s?.test_cases||[];if(new Set(d.map(M=>M.source_pr_number)).size<=1)return null;let $=[],te=new Map;e.forEach(M=>{let P=M.source_pr_number;te.has(P)||te.set(P,[]),te.get(P).push(M);});let ot=[...te.keys()].sort((M,P)=>M===null?1:P===null?-1:P-M);for(let M of ot){let P=te.get(M),ue={total:P.length,pass:0,fail:0,skip:0,pending:0};P.forEach(Ne=>{Ne.verdict in ue&&ue[Ne.verdict]++;}),$.push({key:M!=null?`pr-${M}`:"general",label:M!=null?`PR #${M}`:"General",cases:P,summary:ue});}return $.filter(M=>M.cases.length>0)},[se,s?.test_cases]),$e=y.total>0?(y.pass+y.fail)/y.total*100:0,ce=react.useMemo(()=>{let e=s?.auto_tooltip_seconds??I?.auto_tooltip_seconds;return e!=null&&e>0?e*1e3:5e3},[s,I]),Pe=D==="ready"||D==="completed"||I?.enabled&&I.run;react.useEffect(()=>{if(!Pe||E.current||ce<=0)return;E.current=true,W(true);let e=window.setTimeout(()=>W(false),ce);return ()=>window.clearTimeout(e)},[Pe,ce]);let Be=e=>jsxRuntime.jsxs("div",{style:l.caseRow,children:[jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"8px"},children:[jsxRuntime.jsx("div",{style:{marginTop:"2px",flexShrink:0,color:ut[e.verdict]},children:ve===e.id?jsxRuntime.jsx(u,{d:c.loader,className:""}):jsxRuntime.jsx(u,{d:gt[e.verdict],className:""})}),jsxRuntime.jsxs("div",{style:{minWidth:0,flex:1},children:[jsxRuntime.jsx("div",{style:{fontSize:"10px",color:t.text,lineHeight:1.3},children:e.title}),e.description&&jsxRuntime.jsx("div",{style:{fontSize:"9px",color:t.gripColor,marginTop:"2px"},children:e.description}),e.seed_user&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("div",{style:{fontSize:"9px",color:t.amber,marginTop:"3px",display:"flex",alignItems:"center",gap:"4px",padding:"2px 6px",borderRadius:"4px",background:`${t.amber}12`,border:`1px solid ${t.amber}30`},children:[jsxRuntime.jsx(u,{d:c.key,size:10}),jsxRuntime.jsx("span",{children:e.seed_user})]}),(a??s?.environment)!=="production"&&(a??s?.environment)&&jsxRuntime.jsx(xt,{config:n,appSlug:o,environment:a??s?.environment,seedUserSlug:e.seed_user,authToken:h.token,tk:t})]}),e.url_path&&jsxRuntime.jsxs("a",{href:e.url_path,target:"_blank",rel:"noopener noreferrer",onClick:d=>{d.stopPropagation(),_&&(d.preventDefault(),_(e.url_path));},style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",padding:"2px 0",marginTop:"2px",display:"inline-flex",alignItems:"center",gap:"2px",textDecoration:"none",position:"relative",zIndex:1,pointerEvents:"auto"},children:[jsxRuntime.jsx(u,{d:c.externalLink,size:10}),e.url_path]}),e.verdict==="fail"&&e.fail_reason&&jsxRuntime.jsxs("div",{style:{fontSize:"9px",color:t.red,marginTop:"2px"},children:["\u2717 ",e.fail_reason]})]})]}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"4px",marginLeft:"22px"},children:[["pass","fail","skip"].map(d=>jsxRuntime.jsx("button",{onClick:()=>{if(e.verdict===d){ie(e.id,"pending"),G(null);return}if(d==="fail"){G(e.id),re("");return}G(null),ie(e.id,d);},disabled:ve!==null,style:l.verdictBtn(e.verdict===d,d==="pass"?t.green:d==="fail"?t.red:t.amber),children:d.toUpperCase()},d)),e.verdict_by_display_name&&jsxRuntime.jsx("span",{style:{fontSize:"8px",color:t.textFaint,marginLeft:"auto"},children:e.verdict_by_display_name})]}),Ke===e.id&&jsxRuntime.jsxs("div",{style:{marginLeft:"22px",marginTop:"4px",display:"flex",gap:"4px"},children:[jsxRuntime.jsx("input",{autoFocus:true,value:de,onChange:d=>re(d.target.value),onKeyDown:d=>{d.key==="Enter"&&ie(e.id,"fail",de.trim()||void 0),d.key==="Escape"&&(G(null),re(""));},placeholder:"Reason (optional)...",style:l.input}),jsxRuntime.jsx("button",{onClick:()=>{ie(e.id,"fail",de.trim()||void 0);},style:l.verdictBtn(true,t.red),children:"\u2713"})]})]},e.id);if((D==="no-match"||D==="loading")&&!(!h.isAuthenticated&&I?.enabled&&I.run))return null;if(!h.isAuthenticated&&I?.enabled&&I.run){let e=I.run,d=e.summary,b=e.status==="completed";return jsxRuntime.jsx("div",{style:{...l.root,left:R.x,top:R.y},children:jsxRuntime.jsxs("div",{style:{position:"relative"},onMouseEnter:()=>C(true),onMouseLeave:()=>C(false),children:[jsxRuntime.jsxs("div",{style:{...l.pill(b),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:X,onPointerMove:J,onPointerUp:()=>{Z();},children:[jsxRuntime.jsx(u,{d:c.grip,size:10,className:""}),e.ticket_id&&e.ticket_url?jsxRuntime.jsx("a",{href:e.ticket_url,target:"_blank",rel:"noopener noreferrer",onClick:$=>$.stopPropagation(),style:{color:t.amber,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:e.ticket_id}):null,e.pr_url?jsxRuntime.jsxs("a",{href:e.pr_url,target:"_blank",rel:"noopener noreferrer",onClick:$=>$.stopPropagation(),style:{color:t.blue,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:["PR#",e.pr_number??e.pr_id]}):null,e.created_by_agent_name?e.codex_thread_id?jsxRuntime.jsxs("a",{href:`codex://threads/${e.codex_thread_id}`,onClick:$=>$.stopPropagation(),style:{color:t.purple,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsxRuntime.jsx(u,{d:c.terminal,size:10}),e.created_by_agent_name]}):jsxRuntime.jsxs("span",{style:{color:t.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsxRuntime.jsx(u,{d:c.bot,size:10}),e.created_by_agent_name]}):null,jsxRuntime.jsxs("span",{style:b?{color:t.green}:void 0,children:[d.pass,"/",d.total]}),d.fail>0&&jsxRuntime.jsxs("span",{style:{color:t.red},children:[d.fail,"\u2717"]}),jsxRuntime.jsx("span",{onClick:$=>{$.stopPropagation(),h.openLogin();},style:{color:t.textMuted,fontWeight:400,cursor:"pointer",textDecoration:"underline",textUnderlineOffset:"2px"},children:"Sign in"})]}),(K||N)&&e.title&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:t.bg,border:`1px solid ${t.border}`,boxShadow:`0 8px 24px ${t.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsxRuntime.jsx("div",{style:{fontSize:"13px",fontWeight:700,color:t.text,lineHeight:1.3},children:e.title}),(e.description||e.intro_notes)&&jsxRuntime.jsx("div",{style:{fontSize:"11px",color:t.textMuted,marginTop:"6px",lineHeight:1.4},children:e.description||e.intro_notes}),jsxRuntime.jsx("div",{style:{marginTop:"6px",fontSize:"9px",color:t.textFaint},children:'Click "Sign in" to start testing'})]})]})})}if(!h.isAuthenticated)return jsxRuntime.jsxs("div",{style:{...l.root,left:R.x,top:R.y,width:220,minHeight:0,cursor:"move",userSelect:"none",borderRadius:"8px",background:t.bg,border:`1px solid ${t.border}`,boxShadow:`0 8px 24px ${t.shadow}`},onPointerDown:X,onPointerMove:J,onPointerUp:Z,children:[jsxRuntime.jsx("div",{style:{...l.handle,borderBottom:"none"},children:jsxRuntime.jsxs("div",{style:l.sub,children:[jsxRuntime.jsx(u,{d:c.grip,size:10,className:""}),jsxRuntime.jsx(u,{d:c.clipboard,size:12,className:""}),jsxRuntime.jsx("span",{style:{fontWeight:600},children:"BotBuddy"})]})}),jsxRuntime.jsxs("div",{style:{padding:"12px 14px",textAlign:"center"},children:[jsxRuntime.jsx("div",{style:{fontSize:"9px",color:t.textMuted,marginBottom:"8px"},children:"Sign in to access test cases"}),jsxRuntime.jsx("button",{onClick:e=>{e.stopPropagation(),h.openLogin();},style:{fontSize:"10px",fontWeight:600,padding:"6px 16px",borderRadius:"6px",border:`1px solid ${t.green}`,background:`${t.green}22`,color:t.green,cursor:"pointer",width:"100%"},children:"Sign in to test"})]})]});let Ie=()=>{pe.current||(W(false),j(e=>e==="mini"?"max":"mini"));},We=({icon:e,onClick:d})=>jsxRuntime.jsx("button",{style:l.btn,onClick:b=>{b.stopPropagation(),d(b);},children:jsxRuntime.jsx(u,{d:e,className:""})}),Le=()=>{if(!s?.assigned_human_display_name)return null;let e=jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{style:{width:7,height:7,borderRadius:"50%",background:t.green,display:"inline-block",flexShrink:0,boxShadow:`0 0 6px ${t.green}66`}}),jsxRuntime.jsx(u,{d:c.user,size:13}),jsxRuntime.jsx("span",{style:{flex:1},children:s.assigned_human_display_name}),s.codex_thread_id&&jsxRuntime.jsx(u,{d:c.externalLink,size:10})]});return s.codex_thread_id?jsxRuntime.jsx("a",{href:`codex://threads/${s.codex_thread_id}`,style:l.humanBanner,children:e}):jsxRuntime.jsx("div",{style:l.humanBanner,children:e})},Ee=()=>jsxRuntime.jsxs("div",{style:{padding:"6px 12px",display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center",borderTop:`1px solid ${t.borderSubtle}`,flexShrink:0},children:[s?.pr_url&&jsxRuntime.jsxs("a",{href:s.pr_url,target:"_blank",rel:"noopener noreferrer",style:{...l.link(t.blue),textDecoration:"none"},children:[jsxRuntime.jsx(u,{d:c.pr,size:12}),s.pr_id||"PR",jsxRuntime.jsx(u,{d:c.externalLink,size:8})]}),s?.ticket_url&&jsxRuntime.jsxs("a",{href:s.ticket_url,target:"_blank",rel:"noopener noreferrer",style:{...l.link(t.amber),textDecoration:"none"},children:[jsxRuntime.jsx(u,{d:c.ticket,size:12}),s.ticket_id||"Ticket",jsxRuntime.jsx(u,{d:c.externalLink,size:8})]}),s?.created_by_agent_name&&(s.codex_thread_id?jsxRuntime.jsxs("a",{href:`codex://threads/${s.codex_thread_id}`,style:{...l.link(t.purple),textDecoration:"none"},children:[jsxRuntime.jsx(u,{d:c.bot,size:12}),s.created_by_agent_name,jsxRuntime.jsx(u,{d:c.externalLink,size:8})]}):jsxRuntime.jsxs("span",{style:{...l.link(t.purple)},children:[jsxRuntime.jsx(u,{d:c.bot,size:12}),s.created_by_agent_name]})),jsxRuntime.jsx("span",{style:{...l.badge(s?.environment||"custom"),marginLeft:"auto"},children:s?.environment})]}),De=()=>jsxRuntime.jsxs("div",{style:{padding:"4px 12px",display:"flex",alignItems:"center",justifyContent:"center",borderTop:`1px solid ${t.borderSubtle}`,background:t.bgSoft,flexShrink:0},children:[jsxRuntime.jsxs("button",{onClick:()=>{navigator.clipboard.writeText("0.5.10");},style:{fontSize:"9px",fontWeight:600,color:t.versionText,letterSpacing:"0.08em",background:"none",border:"none",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"4px",padding:0},title:"Copy version",children:["BotBuddy ",jsxRuntime.jsx("span",{style:{color:t.versionNum},children:"v0.5.10"})]}),h.isAuthenticated&&jsxRuntime.jsx("button",{onClick:e=>{e.stopPropagation(),h.logout();},style:{fontSize:"8px",color:t.textFaint,background:"none",border:"none",cursor:"pointer",marginLeft:"8px",padding:"0 4px",textDecoration:"underline"},title:"Sign out of widget",children:"sign out"})]});return jsxRuntime.jsxs("div",{style:{...l.root,left:R.x,top:R.y},children:[Y==="mini"&&jsxRuntime.jsxs("div",{style:{position:"relative"},onMouseEnter:()=>C(true),onMouseLeave:()=>C(false),children:[jsxRuntime.jsxs("div",{style:{...l.pill(A),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:X,onPointerMove:J,onPointerUp:()=>{Z(),pe.current||Ie();},children:[jsxRuntime.jsx(u,{d:c.grip,size:10,className:""}),s?.ticket_id&&jsxRuntime.jsx("span",{style:{color:t.amber,fontWeight:600},children:s.ticket_id}),s?.pr_number&&jsxRuntime.jsxs("span",{style:{color:t.blue,fontWeight:600},children:["PR#",s.pr_number]}),s?.created_by_agent_name&&jsxRuntime.jsxs("span",{style:{color:t.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsxRuntime.jsx(u,{d:c.bot,size:10}),s.created_by_agent_name]}),jsxRuntime.jsxs("span",{style:A?{color:t.green}:void 0,children:[y.pass,"/",y.total]}),y.fail>0&&jsxRuntime.jsxs("span",{style:{color:t.red},children:[y.fail,"\u2717"]})]}),(K||N)&&s?.title&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:t.bg,border:`1px solid ${t.border}`,boxShadow:`0 8px 24px ${t.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsxRuntime.jsx("div",{style:{fontSize:"13px",fontWeight:700,color:t.text,lineHeight:1.3},children:s.title}),(s.description||s.intro_notes)&&jsxRuntime.jsx("div",{style:{fontSize:"11px",color:t.textMuted,marginTop:"6px",lineHeight:1.4},children:s.description||s.intro_notes})]})]}),Y==="expanded"&&jsxRuntime.jsxs("div",{style:l.card(300,A),children:[jsxRuntime.jsx(Le,{}),jsxRuntime.jsxs("div",{style:l.handle,onPointerDown:X,onPointerMove:J,onPointerUp:Z,onClick:Ie,children:[jsxRuntime.jsx(u,{d:c.grip,className:""}),jsxRuntime.jsxs("div",{style:{flex:1,minWidth:0},children:[jsxRuntime.jsx("div",{style:l.title,children:s?.title}),jsxRuntime.jsx("div",{style:l.sub,children:s?.branch_name&&jsxRuntime.jsxs("span",{children:["\u2387 ",s.branch_name]})})]}),jsxRuntime.jsx(u,{d:c.chevronUp,className:""}),jsxRuntime.jsx(We,{icon:c.minus,onClick:()=>j("mini")})]}),jsxRuntime.jsxs("div",{style:l.stats,children:[jsxRuntime.jsxs("span",{style:{color:t.green},children:[y.pass,"\u2713"]}),jsxRuntime.jsxs("span",{style:{color:t.red},children:[y.fail,"\u2717"]}),jsxRuntime.jsxs("span",{style:{color:t.amber},children:[y.skip,"\u23ED"]}),jsxRuntime.jsxs("span",{style:{color:t.gripColor},children:[y.pending,"\u25CC"]}),jsxRuntime.jsx("span",{style:{color:t.textFaint,marginLeft:"auto"},children:y.total})]}),s?.description&&jsxRuntime.jsx("div",{style:{padding:"6px 12px",fontSize:"10px",color:t.gripColor,borderBottom:`1px solid ${t.borderSubtle}`,flexShrink:0},children:s.description}),jsxRuntime.jsx(Ee,{}),jsxRuntime.jsx(De,{}),jsxRuntime.jsx("div",{style:l.progress,children:jsxRuntime.jsx("div",{style:l.progressBar($e)})})]}),Y==="max"&&jsxRuntime.jsxs("div",{style:{...l.card(Q.w,A),height:Q.h,position:"relative"},children:[jsxRuntime.jsx(Le,{}),jsxRuntime.jsxs("div",{style:l.handle,onPointerDown:X,onPointerMove:J,onPointerUp:Z,onClick:()=>{pe.current||j("expanded");},children:[jsxRuntime.jsx(u,{d:c.grip,className:""}),jsxRuntime.jsxs("div",{style:{flex:1,minWidth:0},children:[jsxRuntime.jsx("div",{style:l.title,children:s?.title}),jsxRuntime.jsx("div",{style:l.sub,children:s?.branch_name&&jsxRuntime.jsxs("span",{children:["\u2387 ",s.branch_name]})})]}),jsxRuntime.jsx(u,{d:c.chevronDown,className:""}),jsxRuntime.jsx(We,{icon:c.minus,onClick:()=>j("mini")})]}),jsxRuntime.jsxs("div",{style:l.stats,children:[jsxRuntime.jsxs("span",{style:{color:t.green},children:[y.pass,"\u2713"]}),jsxRuntime.jsxs("span",{style:{color:t.red},children:[y.fail,"\u2717"]}),jsxRuntime.jsxs("span",{style:{color:t.amber},children:[y.skip,"\u23ED"]}),jsxRuntime.jsxs("span",{style:{color:t.gripColor},children:[y.pending,"\u25CC"]}),jsxRuntime.jsx("span",{style:{color:t.textFaint,marginLeft:"auto"},children:y.total})]}),(s?.test_cases||[]).length>5&&jsxRuntime.jsxs("div",{style:{padding:"4px 12px",borderBottom:`1px solid ${t.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",flexShrink:0},children:[jsxRuntime.jsx(u,{d:c.search,size:11,className:""}),jsxRuntime.jsx("input",{value:U,onChange:e=>_e(e.target.value),placeholder:"Filter test cases...",style:{flex:1,fontSize:"10px",background:"transparent",border:"none",outline:"none",color:t.text,fontFamily:"monospace"}}),U&&jsxRuntime.jsx("button",{onClick:()=>_e(""),style:{background:"none",border:"none",cursor:"pointer",color:t.textFaint,fontSize:"10px",padding:0},children:"\u2715"})]}),D==="error"&&jsxRuntime.jsxs("div",{style:{padding:"12px",textAlign:"center"},children:[jsxRuntime.jsx(u,{d:c.alert,className:""}),jsxRuntime.jsx("div",{style:{fontSize:"10px",color:t.red},children:"Failed to load"}),jsxRuntime.jsx("button",{onClick:et,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",marginTop:"4px"},children:"Retry"})]}),A&&jsxRuntime.jsxs("div",{style:{padding:"6px 12px",display:"flex",alignItems:"center",gap:"8px",borderBottom:`1px solid ${t.greenBorderSubtle}`,background:t.greenBg},children:[jsxRuntime.jsx(u,{d:c.checkAll,className:""}),jsxRuntime.jsx("span",{style:{fontSize:"10px",color:t.green,flex:1},children:"Run completed"}),jsxRuntime.jsx("button",{onClick:nt,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer"},children:"Reset"})]}),s?.intro_notes&&jsxRuntime.jsx("div",{style:{padding:"6px 12px",borderBottom:`1px solid ${t.borderSubtle}`,fontSize:"10px",color:t.textMuted,fontStyle:"italic",flexShrink:0},children:s.intro_notes}),D!=="error"&&jsxRuntime.jsx("div",{style:{flex:1,overflowY:"auto",minHeight:0},children:(s?.test_cases||[]).length===0?jsxRuntime.jsx("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:t.gripColor},children:"No test cases"}):se.length===0?jsxRuntime.jsxs("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:t.gripColor},children:['No matches for "',U,'"']}):Re?Re.map(e=>{let d=Oe.has(e.key);return jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>je(e.key),style:{width:"100%",display:"flex",alignItems:"center",gap:"6px",padding:"5px 12px",background:t.bgSoft,cursor:"pointer",border:"none",borderLeft:"none",borderRight:"none",borderBottomStyle:"solid",borderTopStyle:"solid",borderBottomWidth:"1px",borderTopWidth:"1px",borderBottomColor:t.borderSubtle,borderTopColor:t.borderSubtle,backgroundColor:t.bgSoft},children:[jsxRuntime.jsx(u,{d:d?c.chevronDown:c.chevronUp,size:10,className:""}),jsxRuntime.jsx("span",{style:{fontSize:"10px",fontWeight:700,color:t.blue,flex:1,textAlign:"left"},children:e.label}),jsxRuntime.jsxs("span",{style:{fontSize:"9px",color:t.green},children:[e.summary.pass,"\u2713"]}),jsxRuntime.jsxs("span",{style:{fontSize:"9px",color:t.red},children:[e.summary.fail,"\u2717"]}),jsxRuntime.jsxs("span",{style:{fontSize:"9px",color:t.gripColor},children:[e.summary.pending,"\u25CC"]}),jsxRuntime.jsx("span",{style:{fontSize:"9px",color:t.textFaint},children:e.summary.total})]}),!d&&e.cases.map(b=>Be(b))]},e.key)}):se.map(e=>Be(e))}),rt&&!A&&jsxRuntime.jsxs("div",{style:{padding:"6px 12px",borderTop:`1px solid ${t.greenBorderSubtle}`,background:t.greenBg,display:"flex",alignItems:"center",justifyContent:"space-between",flexShrink:0},children:[jsxRuntime.jsx("span",{style:{fontSize:"9px",color:t.green},children:"All resolved"}),jsxRuntime.jsx("button",{onClick:tt,style:{fontSize:"8px",padding:"2px 8px",borderRadius:"4px",background:"rgba(52,211,153,0.15)",color:t.green,border:`1px solid ${t.greenBorderSubtle}`,cursor:"pointer"},children:"COMPLETE"})]}),jsxRuntime.jsx(Ee,{}),jsxRuntime.jsx(De,{}),jsxRuntime.jsx("div",{style:l.progress,children:jsxRuntime.jsx("div",{style:l.progressBar($e)})}),jsxRuntime.jsx("div",{style:{position:"absolute",bottom:0,right:0,width:16,height:16,cursor:"se-resize",zIndex:10,display:"flex",alignItems:"flex-end",justifyContent:"flex-end",padding:"2px",opacity:.3},onPointerDown:Ze,onPointerMove:Qe,onPointerUp:qe,onPointerEnter:e=>e.currentTarget.style.opacity="0.7",onPointerLeave:e=>{q.current||(e.currentTarget.style.opacity="0.3");},children:jsxRuntime.jsx("svg",{width:"8",height:"8",viewBox:"0 0 8 8",children:jsxRuntime.jsx("path",{d:"M7 1v6H1",fill:"none",stroke:t.gripColor,strokeWidth:"1.5",strokeLinecap:"round"})})})]})]})}
2
- exports.TestRunWidget=bt;exports.useDraggable=xe;exports.useTestRun=be;exports.useWidgetAuth=he;
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');function xe(t,o){let[s,b]=react.useState({x:t,y:o}),m=react.useRef(false),f=react.useRef({x:0,y:0}),x=react.useRef(false),y=react.useCallback(l=>{m.current=true,x.current=false,f.current={x:l.clientX-s.x,y:l.clientY-s.y},l.target.setPointerCapture(l.pointerId);},[s]),v=react.useCallback(l=>{m.current&&(x.current=true,b({x:l.clientX-f.current.x,y:l.clientY-f.current.y}));},[]),u=react.useCallback(()=>{m.current=false;},[]);return {pos:s,onPointerDown:y,onPointerMove:v,onPointerUp:u,didDrag:x}}function me(t,o,s){let b=react.useRef(s);b.current=s,react.useEffect(()=>{if(!o)return;if(t.supabaseUrl){let f=t.supabaseUrl.replace(/^https:\/\//,"wss://").replace(/^http:\/\//,"ws://"),x=null,y=null,v=null,u=false,l=0,_=()=>{if(!u){try{x=new WebSocket(`${f}/realtime/v1/websocket?apikey=${t.anonKey}&vsn=1.0.0`);}catch{R();return}x.onopen=()=>{if(u||!x)return;let T={topic:`realtime:public:test_run_cases:test_run_id=eq.${o}`,event:"phx_join",payload:{config:{postgres_changes:[{event:"*",schema:"public",table:"test_run_cases",filter:`test_run_id=eq.${o}`}]}},ref:String(++l)};x.send(JSON.stringify(T));let n={topic:`realtime:public:test_runs:id=eq.${o}`,event:"phx_join",payload:{config:{postgres_changes:[{event:"*",schema:"public",table:"test_runs",filter:`id=eq.${o}`}]}},ref:String(++l)};x.send(JSON.stringify(n)),y=setInterval(()=>{x?.readyState===WebSocket.OPEN&&x.send(JSON.stringify({topic:"phoenix",event:"heartbeat",payload:{},ref:String(++l)}));},3e4);},x.onmessage=T=>{try{JSON.parse(T.data).event==="postgres_changes"&&b.current();}catch{}},x.onclose=()=>{M(),u||(v=setTimeout(_,3e3));},x.onerror=()=>{x?.close();};}},M=()=>{y&&(clearInterval(y),y=null);},C=null,R=()=>{u||(C=setInterval(()=>b.current(),15e3));};return _(),()=>{u=true,M(),v&&clearTimeout(v),C&&clearInterval(C),x&&(x.onclose=null,x.onerror=null,x.close());}}let m=setInterval(()=>b.current(),15e3);return ()=>clearInterval(m)},[t.supabaseUrl,t.anonKey,o]);}function se(t,o){let s={apikey:t.anonKey};return o?s.Authorization=`Bearer ${o}`:t.apiKey?s.Authorization=`Bearer ${t.apiKey}`:s.Authorization=`Bearer ${t.anonKey}`,s}async function ct(t){if(t)return t;try{let o=await fetch("/.botbuddy-token",{cache:"no-store"});if(o.ok){let s=(await o.text()).trim();if(s.startsWith("public_"))return s}}catch{}try{let o=undefined?.VITE_BOTBUDDY_TEST_RUN_TOKEN;if(o&&typeof o=="string"&&o.startsWith("public_"))return o}catch{}return null}function be(t){let[o,s]=react.useState(null),[b,m]=react.useState("loading"),f=react.useCallback(async()=>{try{let u=await ct(t.testRunToken);if(!u){m("no-match"),s(null);return}if(!t.ticketId){m("no-match"),s(null);return}let l=new URLSearchParams;l.set("token",u),l.set("ticket_id",t.ticketId),l.set("app_slug",t.appSlug),t.environment&&l.set("environment",t.environment),t.testRunId&&l.set("test_run_id",t.testRunId),t.targetUrl&&l.set("target_url",t.targetUrl),t.version&&l.set("version",t.version),t.commitSha&&l.set("commit_sha",t.commitSha),t.prNumber&&l.set("pr_number",String(t.prNumber)),t.branchName&&l.set("branch_name",t.branchName);let _=await fetch(`${t.config.serverUrl}/widget/test-run?${l.toString()}`,{headers:se(t.config,t.authToken)});if(_.status===404){m("no-match"),s(null);return}if(_.status===401||_.status===403){m("error");return}if(!_.ok){m("error");return}let M=await _.json();s(M),m(M.status==="completed"?"completed":"ready");}catch{m("error");}},[t.config.serverUrl,t.config.anonKey,t.config.apiKey,t.authToken,t.appSlug,t.environment,t.ticketId,t.testRunId,t.testRunToken,t.targetUrl,t.version,t.commitSha,t.branchName,t.prNumber]);return react.useEffect(()=>{f();},[f]),me(t.config,o?.id,f),{run:o,widgetState:b,fetchRun:f,setVerdict:async(u,l,_,M="human")=>(s(R=>{if(!R)return null;let T=R.test_cases.map(d=>d.id===u?{...d,verdict:l,fail_reason:l==="fail"&&_||null,verdict_by_display_name:M,verdict_at:new Date().toISOString()}:d),n={total:T.length,pending:0,pass:0,fail:0,skip:0};return T.forEach(d=>{d.verdict in n&&n[d.verdict]++;}),{...R,test_cases:T,summary:n}}),(await fetch(`${t.config.serverUrl}/widget/test-cases/${u}/verdict`,{method:"POST",headers:{"Content-Type":"application/json",...se(t.config,t.authToken)},body:JSON.stringify({verdict:l,fail_reason:_,display_name:M})})).ok),markComplete:async()=>o?(s(l=>l?{...l,status:"completed"}:null),m("completed"),(await fetch(`${t.config.serverUrl}/widget/test-runs/${o.id}/complete`,{method:"POST",headers:{"Content-Type":"application/json",...se(t.config,t.authToken)}})).ok):false,resetRun:async()=>{if(!o)return false;let u=await fetch(`${t.config.serverUrl}/widget/test-runs/${o.id}/reset`,{method:"POST",headers:{"Content-Type":"application/json",...se(t.config,t.authToken)}});return u.ok&&f(),u.ok},setRun:s}}var ye="botbuddy-widget-auth-token",he="botbuddy-widget-auth-name";function ve(t){let[o,s]=react.useState(()=>{try{return localStorage.getItem(ye)}catch(y){return console.warn("Unable to read BotBuddy widget auth token",y),null}}),[b,m]=react.useState(()=>{try{return localStorage.getItem(he)}catch(y){return console.warn("Unable to read BotBuddy widget display name",y),null}});react.useEffect(()=>{let y=new URL(t).origin,v=u=>{if(u.origin===y&&u.data?.type==="botbuddy-widget-auth"&&u.data.token){let{token:l,displayName:_}=u.data;s(l),m(_||"human");try{localStorage.setItem(ye,l),_&&localStorage.setItem(he,_);}catch(M){console.warn("Unable to persist BotBuddy widget auth token",M);}}};return window.addEventListener("message",v),()=>window.removeEventListener("message",v)},[t]);let f=react.useCallback(()=>{let y=new URL("/widget-auth",t);y.searchParams.set("origin",window.location.origin);let v=420,u=520,l=window.screenX+(window.innerWidth-v)/2,_=window.screenY+(window.innerHeight-u)/2;window.open(y.toString(),"botbuddy-auth",`width=${v},height=${u},left=${l},top=${_},popup=yes`);},[t]),x=react.useCallback(()=>{s(null),m(null);try{localStorage.removeItem(ye),localStorage.removeItem(he);}catch(y){console.warn("Unable to clear BotBuddy widget auth token",y);}},[]);return {token:o,displayName:b,isAuthenticated:!!o,openLogin:f,logout:x}}function gt(t){let o=new Date(t),b=Date.now()-o.getTime();if(b<6e4)return "just now";if(b<36e5)return `${Math.floor(b/6e4)}m ago`;if(b<864e5)return `${Math.floor(b/36e5)}h ago`;let m=o.getDate(),f=o.toLocaleString("en",{month:"short"}),x=o.toLocaleString("en",{hour:"numeric",minute:"2-digit",hour12:true});return `${f} ${m}, ${x}`}var g=({d:t,className:o,size:s=14})=>jsxRuntime.jsx("svg",{className:o,width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:t})}),c={clipboard:"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2",check:"M22 11.08V12a10 10 0 1 1-5.93-9.14M22 4 12 14.01l-3-3",x:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20M15 9l-6 6M9 9l6 6",circle:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20",skip:"M5 4l10 8-10 8V4M19 5v14",grip:"M9 5h.01M15 5h.01M9 12h.01M15 12h.01M9 19h.01M15 19h.01",minus:"M5 12h14",chevronUp:"M18 15l-6-6-6 6",chevronDown:"M6 9l6 6 6-6",externalLink:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3",pr:"M6 3v18M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6M6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6M18 9a9 9 0 0 1-9 9",ticket:"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z",loader:"M21 12a9 9 0 1 1-6.219-8.56",checkAll:"M18 6L7 17l-5-5M22 10l-7.5 7.5L13 16",alert:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0M12 9v4M12 17h.01",user:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2M12 3a4 4 0 1 0 0 8 4 4 0 0 0 0-8",bot:"M12 8V4H8M2 14h2M20 14h2M15 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M9 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M18 10a6 6 0 0 0-12 0v4a6 6 0 0 0 12 0Z",terminal:"M4 17l6-6-6-6M12 19h8",key:"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4",shield:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10",copy:"M20 9h-9a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-9a2 2 0 0 0-2-2ZM5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1",search:"M11 17.25a6.25 6.25 0 1 1 0-12.5 6.25 6.25 0 0 1 0 12.5ZM16 16l4.5 4.5"};function ft(){let[t,o]=react.useState(()=>typeof window>"u"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return react.useEffect(()=>{if(typeof window>"u")return;let s=document.documentElement,b=()=>s.classList.contains("dark")?"dark":s.classList.contains("light")?"light":null,m=b();m&&o(m);let f=window.matchMedia("(prefers-color-scheme: dark)"),x=v=>{let u=b();o(u||(v.matches?"dark":"light"));};f.addEventListener("change",x);let y=new MutationObserver(()=>{let v=b();o(v||(f.matches?"dark":"light"));});return y.observe(s,{attributes:true,attributeFilter:["class"]}),()=>{f.removeEventListener("change",x),y.disconnect();}},[]),t}function xt(t){let o=t==="dark";return {bg:o?"rgb(30,30,30)":"rgb(255,255,255)",bgSoft:o?"rgba(255,255,255,0.02)":"rgba(0,0,0,0.02)",text:o?"#e5e5e5":"#1a1a1a",textMuted:o?"rgba(255,255,255,0.4)":"rgba(0,0,0,0.45)",textFaint:o?"#555":"#999",border:o?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.12)",borderSubtle:o?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",shadow:o?"rgba(0,0,0,0.4)":"rgba(0,0,0,0.12)",inputBg:o?"rgba(0,0,0,0.3)":"rgba(0,0,0,0.04)",inputBorder:o?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.12)",green:"#34d399",greenBg:o?"rgba(52,211,153,0.05)":"rgba(52,211,153,0.08)",greenBorder:o?"rgba(52,211,153,0.6)":"rgba(52,211,153,0.5)",greenBorderSubtle:o?"rgba(52,211,153,0.2)":"rgba(52,211,153,0.15)",red:"#f87171",amber:"#f59e0b",blue:"#60a5fa",purple:"#a78bfa",versionText:o?"rgba(255,255,255,0.5)":"rgba(0,0,0,0.35)",versionNum:o?"rgba(255,255,255,0.3)":"rgba(0,0,0,0.2)",gripColor:o?"#888":"#aaa",btnHover:o?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.06)"}}var mt={pending:"#888",pass:"#34d399",fail:"#f87171",skip:"#f59e0b"},bt={pending:c.circle,pass:c.check,fail:c.x,skip:c.skip},Oe={local:{bg:"rgba(59,130,246,0.15)",text:"#60a5fa",border:"rgba(59,130,246,0.3)"},preview:{bg:"rgba(168,85,247,0.15)",text:"#c084fc",border:"rgba(168,85,247,0.3)"},staging:{bg:"rgba(245,158,11,0.15)",text:"#fbbf24",border:"rgba(245,158,11,0.3)"},production:{bg:"rgba(239,68,68,0.15)",text:"#f87171",border:"rgba(239,68,68,0.3)"},custom:{bg:"rgba(128,128,128,0.15)",text:"#888",border:"rgba(128,128,128,0.3)"}},yt=t=>({root:{position:"fixed",zIndex:9999,userSelect:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},pill:o=>({display:"inline-flex",alignItems:"center",gap:"6px",padding:"4px 8px",borderRadius:"9999px",background:t.bg,border:o?`1px solid ${t.greenBorder}`:`1px solid ${t.border}`,boxShadow:o?`0 4px 12px ${t.shadow}, 0 0 0 1px ${t.greenBorderSubtle}`:`0 4px 12px ${t.shadow}`,cursor:"pointer",fontSize:"9px",color:t.text}),card:(o,s)=>({width:`${o}px`,borderRadius:"8px",background:t.bg,border:s?`1px solid ${t.greenBorder}`:`1px solid ${t.border}`,boxShadow:s?`0 8px 24px ${t.shadow}, 0 0 0 1px ${t.greenBorderSubtle}`:`0 8px 24px ${t.shadow}`,overflow:"hidden",display:"flex",flexDirection:"column"}),handle:{padding:"8px 12px",display:"flex",alignItems:"center",gap:"8px",cursor:"grab",borderBottom:`1px solid ${t.borderSubtle}`},title:{fontSize:"10px",fontWeight:600,color:t.text,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},sub:{fontSize:"9px",color:t.textMuted,display:"flex",alignItems:"center",gap:"6px"},btn:{padding:"2px",borderRadius:"4px",background:"transparent",border:"none",cursor:"pointer",color:t.gripColor,display:"flex",flexShrink:0},stats:{padding:"4px 12px",display:"flex",alignItems:"center",gap:"8px",fontSize:"9px",borderBottom:`1px solid ${t.borderSubtle}`},badge:o=>{let s=Oe[o]||Oe.custom;return {fontSize:"8px",padding:"0 4px",borderRadius:"4px",background:s.bg,color:s.text,border:`1px solid ${s.border}`,lineHeight:"14px"}},progress:{height:"2px",background:t.borderSubtle,flexShrink:0},progressBar:o=>({height:"100%",width:`${o}%`,background:"linear-gradient(to right, #34d399, #3b82f6)",transition:"width 0.5s"}),link:o=>({display:"inline-flex",alignItems:"center",gap:"4px",fontSize:"9px",padding:"2px 6px",borderRadius:"4px",background:`${o}15`,color:o,textDecoration:"none",border:"none",cursor:"pointer"}),caseRow:{padding:"6px 12px",borderBottom:`1px solid ${t.borderSubtle}`,transition:"background 0.15s"},verdictBtn:(o,s)=>({fontSize:"8px",padding:"2px 6px",borderRadius:"4px",border:"none",cursor:"pointer",background:o?`${s}33`:"transparent",color:o?s:t.gripColor,transition:"all 0.15s"}),input:{flex:1,fontSize:"9px",background:t.inputBg,border:`1px solid ${t.inputBorder}`,borderRadius:"4px",padding:"2px 6px",color:t.text,outline:"none"},humanBanner:{padding:"6px 12px",fontSize:"11px",fontWeight:600,color:t.green,borderBottom:`1px solid ${t.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",background:t.greenBg,cursor:"pointer",textDecoration:"none"}});function ht({config:t,appSlug:o,environment:s,seedUserSlug:b,authToken:m,tk:f}){let[x,y]=react.useState(null),[v,u]=react.useState(0),[l,_]=react.useState(false),[M,C]=react.useState(null),[R,T]=react.useState(false),n=react.useRef(null),d=react.useMemo(()=>b.split("/")[0].trim(),[b]),K=react.useCallback(async()=>{_(true),C(null);try{let $=new URLSearchParams({app_slug:o,seed_user_slug:d,environment:s}),E={apikey:t.anonKey};m?E.Authorization=`Bearer ${m}`:E.Authorization=`Bearer ${t.anonKey}`;let B=await fetch(`${t.serverUrl}/widget/totp-code?${$}`,{headers:E});if(!B.ok){let w=await B.json().catch(()=>({error:"Failed"}));if(B.status===404){C("No 2FA seed registered");return}C(w.error||"Failed to get code");return}let U=await B.json();y(U.code),u(U.remaining_seconds);try{await navigator.clipboard.writeText(U.code),T(!0),setTimeout(()=>T(!1),2e3);}catch{}n.current&&clearInterval(n.current);let V=U.remaining_seconds;n.current=setInterval(()=>{V--,V<=0?(n.current&&clearInterval(n.current),K()):u(V);},1e3);}catch{C("Network error");}finally{_(false);}},[t.serverUrl,t.anonKey,m,o,d,s]);return react.useEffect(()=>()=>{n.current&&clearInterval(n.current);},[]),M==="No 2FA seed registered"?null:x?jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"3px"},children:[jsxRuntime.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:"6px",padding:"3px 8px",borderRadius:"4px",background:`${f.purple}15`,border:`1px solid ${f.purple}40`,fontSize:"12px",fontFamily:"ui-monospace, monospace",fontWeight:700,color:f.purple,letterSpacing:"0.15em"},children:[jsxRuntime.jsx(g,{d:c.shield,size:11}),jsxRuntime.jsx("span",{children:x}),jsxRuntime.jsxs("span",{style:{fontSize:"8px",fontWeight:400,color:f.textMuted,letterSpacing:"0"},children:[v,"s"]})]}),jsxRuntime.jsx("button",{onClick:$=>{$.stopPropagation(),navigator.clipboard.writeText(x).then(()=>{T(true),setTimeout(()=>T(false),1500);});},style:{padding:"2px",background:"none",border:"none",cursor:"pointer",color:R?f.green:f.gripColor,fontSize:"8px"},title:"Copy code",children:R?jsxRuntime.jsx(g,{d:c.check,size:10}):jsxRuntime.jsx(g,{d:c.copy,size:10})})]}):jsxRuntime.jsxs("button",{onClick:$=>{$.stopPropagation(),K();},disabled:l,style:{display:"inline-flex",alignItems:"center",gap:"4px",marginTop:"3px",fontSize:"8px",padding:"2px 6px",borderRadius:"4px",background:`${f.purple}12`,color:f.purple,border:`1px solid ${f.purple}30`,cursor:l?"wait":"pointer",opacity:l?.6:1},children:[jsxRuntime.jsx(g,{d:c.shield,size:9}),l?"generating...":M||"Get 2FA code"]})}var Ke="botbuddy-widget-state";function vt({config:t,appSlug:o,environment:s,ticketId:b,testRunId:m,testRunToken:f,targetUrl:x,version:y,commitSha:v,prNumber:u,branchName:l,onNavigate:_,displayName:M="human",defaultMode:C="mini",defaultPosition:R}){let T=ft(),n=react.useMemo(()=>xt(T),[T]),d=react.useMemo(()=>yt(n),[n]),[K,$]=react.useState(false),[E,B]=react.useState(false),U=react.useRef(false),V=t.dashboardUrl||"https://botbuddy.lovable.app",w=ve(V),le=(()=>{try{let e=typeof window<"u"?localStorage.getItem(Ke):null;if(e)return JSON.parse(e)}catch{}return null})(),[j,Y]=react.useState(le?.mode||C),[de,re]=react.useState(""),[Ve,J]=react.useState(null),[_e,Se]=react.useState(null),[je,Ye]=react.useState(new Set),[N,we]=react.useState(""),Je=react.useCallback(e=>{Ye(p=>{let h=new Set(p);return h.has(e)?h.delete(e):h.add(e),h});},[]),Ge=le?.x??R?.x??16,qe=le?.y??R?.y??(typeof window<"u"?window.innerHeight-56:600),{pos:P,onPointerDown:G,onPointerMove:q,onPointerUp:X,didDrag:pe}=xe(Ge,qe);react.useEffect(()=>{try{localStorage.setItem(Ke,JSON.stringify({mode:j,x:P.x,y:P.y}));}catch{}},[j,P.x,P.y]);let ke=react.useRef(w.isAuthenticated);react.useEffect(()=>{!ke.current&&w.isAuthenticated&&Y("max"),ke.current=w.isAuthenticated;},[w.isAuthenticated]);let Me="botbuddy-widget-max-size",Xe=()=>{try{let e=localStorage.getItem(Me);if(e)return JSON.parse(e)}catch{}return {w:340,h:500}},[Z,Te]=react.useState(Xe),Q=react.useRef(false),ee=react.useRef({x:0,y:0,w:0,h:0}),Ze=react.useCallback(e=>{e.stopPropagation(),Q.current=true,ee.current={x:e.clientX,y:e.clientY,w:Z.w,h:Z.h},e.target.setPointerCapture(e.pointerId);},[Z]),Qe=react.useCallback(e=>{if(!Q.current)return;let p=Math.max(280,Math.min(600,ee.current.w+(e.clientX-ee.current.x))),h=Math.max(300,Math.min(window.innerHeight*.9,ee.current.h+(e.clientY-ee.current.y)));Te({w:p,h});},[]),et=react.useCallback(()=>{Q.current&&(Q.current=false,Te(e=>(localStorage.setItem(Me,JSON.stringify(e)),e)));},[]),oe=x??(typeof window<"u"?window.location.href:void 0),ze=w.displayName||M,[W,Ce]=react.useState(null);react.useEffect(()=>{if(w.isAuthenticated)return;let e=new URLSearchParams;f&&e.set("token",f),b&&e.set("ticket_id",b),e.set("app_slug",o),s&&e.set("environment",s),m&&e.set("test_run_id",m),oe&&e.set("target_url",oe),y&&e.set("version",y),v&&e.set("commit_sha",v),u&&e.set("pr_number",String(u)),l&&e.set("branch_name",l),fetch(`${t.serverUrl}/widget/preview?${e}`,{headers:{apikey:t.anonKey}}).then(p=>p.json()).then(p=>Ce(p)).catch(()=>Ce(null));},[w.isAuthenticated,t.serverUrl,t.anonKey,o,s,b,m,f,oe,y,v,u,l]);let{run:a,widgetState:D,fetchRun:tt,setVerdict:Re,markComplete:nt,resetRun:rt}=be({config:t,appSlug:o,environment:s,ticketId:b,testRunId:m,testRunToken:f,targetUrl:oe,version:y,commitSha:v,prNumber:u?String(u):void 0,branchName:l,authToken:w.token}),ie=react.useCallback(async(e,p,h)=>{Se(e);try{await Re(e,p,h,ze);}finally{Se(null),J(null),re("");}},[Re,ze]),S=a?.summary||{total:0,pending:0,pass:0,fail:0,skip:0},ot=S.total>0&&S.pending===0,A=D==="completed",ae=react.useMemo(()=>{let e=a?.test_cases||[];if(!N.trim())return e;let p=N.toLowerCase();return e.filter(h=>h.title.toLowerCase().includes(p)||h.description&&h.description.toLowerCase().includes(p)||h.url_path&&h.url_path.toLowerCase().includes(p)||h.seed_user&&h.seed_user.toLowerCase().includes(p))},[a?.test_cases,N]),$e=react.useMemo(()=>{let e=ae,p=a?.test_cases||[];if(new Set(p.map(z=>z.source_pr_number)).size<=1)return null;let I=[],te=new Map;e.forEach(z=>{let L=z.source_pr_number;te.has(L)||te.set(L,[]),te.get(L).push(z);});let it=[...te.keys()].sort((z,L)=>z===null?1:L===null?-1:L-z);for(let z of it){let L=te.get(z),ue={total:L.length,pass:0,fail:0,skip:0,pending:0};L.forEach(Ne=>{Ne.verdict in ue&&ue[Ne.verdict]++;}),I.push({key:z!=null?`pr-${z}`:"general",label:z!=null?`PR #${z}`:"General",cases:L,summary:ue});}return I.filter(z=>z.cases.length>0)},[ae,a?.test_cases]),Be=S.total>0?(S.pass+S.fail)/S.total*100:0,ce=react.useMemo(()=>{let e=a?.auto_tooltip_seconds??W?.auto_tooltip_seconds;return e!=null&&e>0?e*1e3:5e3},[a,W]),Pe=D==="ready"||D==="completed"||W?.enabled&&W.run;react.useEffect(()=>{if(!Pe||U.current||ce<=0)return;U.current=true,B(true);let e=window.setTimeout(()=>B(false),ce);return ()=>window.clearTimeout(e)},[Pe,ce]);let Ie=e=>jsxRuntime.jsxs("div",{style:d.caseRow,children:[jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"8px"},children:[jsxRuntime.jsx("div",{style:{marginTop:"2px",flexShrink:0,color:mt[e.verdict]},children:_e===e.id?jsxRuntime.jsx(g,{d:c.loader,className:""}):jsxRuntime.jsx(g,{d:bt[e.verdict],className:""})}),jsxRuntime.jsxs("div",{style:{minWidth:0,flex:1},children:[jsxRuntime.jsx("div",{style:{fontSize:"10px",color:n.text,lineHeight:1.3},children:e.title}),e.description&&jsxRuntime.jsx("div",{style:{fontSize:"9px",color:n.gripColor,marginTop:"2px"},children:e.description}),e.seed_user&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("div",{style:{fontSize:"9px",color:n.amber,marginTop:"3px",display:"flex",alignItems:"center",gap:"4px",padding:"2px 6px",borderRadius:"4px",background:`${n.amber}12`,border:`1px solid ${n.amber}30`},children:[jsxRuntime.jsx(g,{d:c.key,size:10}),jsxRuntime.jsx("span",{children:e.seed_user})]}),(s??a?.environment)!=="production"&&(s??a?.environment)&&jsxRuntime.jsx(ht,{config:t,appSlug:o,environment:s??a?.environment,seedUserSlug:e.seed_user,authToken:w.token,tk:n})]}),e.url_path&&jsxRuntime.jsxs("a",{href:e.url_path,target:"_blank",rel:"noopener noreferrer",onClick:p=>{p.stopPropagation(),_&&(p.preventDefault(),_(e.url_path));},style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",padding:"2px 0",marginTop:"2px",display:"inline-flex",alignItems:"center",gap:"2px",textDecoration:"none",position:"relative",zIndex:1,pointerEvents:"auto"},children:[jsxRuntime.jsx(g,{d:c.externalLink,size:10}),e.url_path]}),e.verdict==="fail"&&e.fail_reason&&jsxRuntime.jsxs("div",{style:{fontSize:"9px",color:n.red,marginTop:"2px"},children:["\u2717 ",e.fail_reason]})]})]}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"4px",marginLeft:"22px"},children:[["pass","fail","skip"].map(p=>jsxRuntime.jsx("button",{onClick:()=>{if(e.verdict===p){ie(e.id,"pending"),J(null);return}if(p==="fail"){J(e.id),re("");return}J(null),ie(e.id,p);},disabled:_e!==null,style:d.verdictBtn(e.verdict===p,p==="pass"?n.green:p==="fail"?n.red:n.amber),children:p.toUpperCase()},p)),e.created_by_agent_name&&jsxRuntime.jsxs("span",{style:{fontSize:"8px",color:n.purple,marginLeft:"4px",display:"inline-flex",alignItems:"center",gap:"2px"},children:[jsxRuntime.jsx(g,{d:c.bot,size:8}),e.created_by_agent_name]}),e.verdict_by_display_name&&jsxRuntime.jsxs("span",{style:{fontSize:"8px",color:n.textFaint,marginLeft:"auto",display:"inline-flex",alignItems:"center",gap:"3px"},children:[e.verdict_by_display_name,e.verdict_at&&jsxRuntime.jsx("span",{style:{opacity:.7},children:gt(e.verdict_at)})]})]}),Ve===e.id&&jsxRuntime.jsxs("div",{style:{marginLeft:"22px",marginTop:"4px",display:"flex",gap:"4px"},children:[jsxRuntime.jsx("input",{autoFocus:true,value:de,onChange:p=>re(p.target.value),onKeyDown:p=>{p.key==="Enter"&&ie(e.id,"fail",de.trim()||void 0),p.key==="Escape"&&(J(null),re(""));},placeholder:"Reason (optional)...",style:d.input}),jsxRuntime.jsx("button",{onClick:()=>{ie(e.id,"fail",de.trim()||void 0);},style:d.verdictBtn(true,n.red),children:"\u2713"})]})]},e.id);if((D==="no-match"||D==="loading")&&!(!w.isAuthenticated&&W?.enabled&&W.run))return null;if(!w.isAuthenticated&&W?.enabled&&W.run){let e=W.run,p=e.summary,h=e.status==="completed";return jsxRuntime.jsx("div",{style:{...d.root,left:P.x,top:P.y},children:jsxRuntime.jsxs("div",{style:{position:"relative"},onMouseEnter:()=>$(true),onMouseLeave:()=>$(false),children:[jsxRuntime.jsxs("div",{style:{...d.pill(h),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:G,onPointerMove:q,onPointerUp:()=>{X();},children:[jsxRuntime.jsx(g,{d:c.grip,size:10,className:""}),e.ticket_id&&e.ticket_url?jsxRuntime.jsx("a",{href:e.ticket_url,target:"_blank",rel:"noopener noreferrer",onClick:I=>I.stopPropagation(),style:{color:n.amber,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:e.ticket_id}):null,e.pr_url?jsxRuntime.jsxs("a",{href:e.pr_url,target:"_blank",rel:"noopener noreferrer",onClick:I=>I.stopPropagation(),style:{color:n.blue,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:["PR#",e.pr_number??e.pr_id]}):null,e.created_by_agent_name?e.codex_thread_id?jsxRuntime.jsxs("a",{href:`codex://threads/${e.codex_thread_id}`,onClick:I=>I.stopPropagation(),style:{color:n.purple,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsxRuntime.jsx(g,{d:c.terminal,size:10}),e.created_by_agent_name]}):jsxRuntime.jsxs("span",{style:{color:n.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsxRuntime.jsx(g,{d:c.bot,size:10}),e.created_by_agent_name]}):null,jsxRuntime.jsxs("span",{style:h?{color:n.green}:void 0,children:[p.pass,"/",p.total]}),p.fail>0&&jsxRuntime.jsxs("span",{style:{color:n.red},children:[p.fail,"\u2717"]}),jsxRuntime.jsx("span",{onClick:I=>{I.stopPropagation(),w.openLogin();},style:{color:n.textMuted,fontWeight:400,cursor:"pointer",textDecoration:"underline",textUnderlineOffset:"2px"},children:"Sign in"})]}),(K||E)&&e.title&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:n.bg,border:`1px solid ${n.border}`,boxShadow:`0 8px 24px ${n.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsxRuntime.jsx("div",{style:{fontSize:"13px",fontWeight:700,color:n.text,lineHeight:1.3},children:e.title}),(e.description||e.intro_notes)&&jsxRuntime.jsx("div",{style:{fontSize:"11px",color:n.textMuted,marginTop:"6px",lineHeight:1.4},children:e.description||e.intro_notes}),jsxRuntime.jsx("div",{style:{marginTop:"6px",fontSize:"9px",color:n.textFaint},children:'Click "Sign in" to start testing'})]})]})})}if(!w.isAuthenticated)return jsxRuntime.jsxs("div",{style:{...d.root,left:P.x,top:P.y,width:220,minHeight:0,cursor:"move",userSelect:"none",borderRadius:"8px",background:n.bg,border:`1px solid ${n.border}`,boxShadow:`0 8px 24px ${n.shadow}`},onPointerDown:G,onPointerMove:q,onPointerUp:X,children:[jsxRuntime.jsx("div",{style:{...d.handle,borderBottom:"none"},children:jsxRuntime.jsxs("div",{style:d.sub,children:[jsxRuntime.jsx(g,{d:c.grip,size:10,className:""}),jsxRuntime.jsx(g,{d:c.clipboard,size:12,className:""}),jsxRuntime.jsx("span",{style:{fontWeight:600},children:"BotBuddy"})]})}),jsxRuntime.jsxs("div",{style:{padding:"12px 14px",textAlign:"center"},children:[jsxRuntime.jsx("div",{style:{fontSize:"9px",color:n.textMuted,marginBottom:"8px"},children:"Sign in to access test cases"}),jsxRuntime.jsx("button",{onClick:e=>{e.stopPropagation(),w.openLogin();},style:{fontSize:"10px",fontWeight:600,padding:"6px 16px",borderRadius:"6px",border:`1px solid ${n.green}`,background:`${n.green}22`,color:n.green,cursor:"pointer",width:"100%"},children:"Sign in to test"})]})]});let Le=()=>{pe.current||(B(false),Y(e=>e==="mini"?"max":"mini"));},We=({icon:e,onClick:p})=>jsxRuntime.jsx("button",{style:d.btn,onClick:h=>{h.stopPropagation(),p(h);},children:jsxRuntime.jsx(g,{d:e,className:""})}),Ue=()=>{if(!a?.assigned_human_display_name)return null;let e=jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{style:{width:7,height:7,borderRadius:"50%",background:n.green,display:"inline-block",flexShrink:0,boxShadow:`0 0 6px ${n.green}66`}}),jsxRuntime.jsx(g,{d:c.user,size:13}),jsxRuntime.jsx("span",{style:{flex:1},children:a.assigned_human_display_name}),a.codex_thread_id&&jsxRuntime.jsx(g,{d:c.externalLink,size:10})]});return a.codex_thread_id?jsxRuntime.jsx("a",{href:`codex://threads/${a.codex_thread_id}`,style:d.humanBanner,children:e}):jsxRuntime.jsx("div",{style:d.humanBanner,children:e})},De=()=>jsxRuntime.jsxs("div",{style:{padding:"6px 12px",display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center",borderTop:`1px solid ${n.borderSubtle}`,flexShrink:0},children:[a?.pr_url&&jsxRuntime.jsxs("a",{href:a.pr_url,target:"_blank",rel:"noopener noreferrer",style:{...d.link(n.blue),textDecoration:"none"},children:[jsxRuntime.jsx(g,{d:c.pr,size:12}),a.pr_number?`PR#${a.pr_number}`:a.pr_id||"PR",jsxRuntime.jsx(g,{d:c.externalLink,size:8})]}),a?.ticket_url&&jsxRuntime.jsxs("a",{href:a.ticket_url,target:"_blank",rel:"noopener noreferrer",style:{...d.link(n.amber),textDecoration:"none"},children:[jsxRuntime.jsx(g,{d:c.ticket,size:12}),a.ticket_id||"Ticket",jsxRuntime.jsx(g,{d:c.externalLink,size:8})]}),a?.created_by_agent_name&&(a.codex_thread_id?jsxRuntime.jsxs("a",{href:`codex://threads/${a.codex_thread_id}`,style:{...d.link(n.purple),textDecoration:"none"},children:[jsxRuntime.jsx(g,{d:c.bot,size:12}),a.created_by_agent_name,jsxRuntime.jsx(g,{d:c.externalLink,size:8})]}):jsxRuntime.jsxs("span",{style:{...d.link(n.purple)},children:[jsxRuntime.jsx(g,{d:c.bot,size:12}),a.created_by_agent_name]})),jsxRuntime.jsx("span",{style:{...d.badge(a?.environment||"custom"),marginLeft:"auto"},children:a?.environment})]}),Ee=()=>jsxRuntime.jsxs("div",{style:{padding:"4px 12px",display:"flex",alignItems:"center",justifyContent:"center",borderTop:`1px solid ${n.borderSubtle}`,background:n.bgSoft,flexShrink:0},children:[jsxRuntime.jsxs("button",{onClick:()=>{navigator.clipboard.writeText("0.5.10");},style:{fontSize:"9px",fontWeight:600,color:n.versionText,letterSpacing:"0.08em",background:"none",border:"none",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"4px",padding:0},title:"Copy version",children:["BotBuddy ",jsxRuntime.jsx("span",{style:{color:n.versionNum},children:"v0.5.10"})]}),w.isAuthenticated&&jsxRuntime.jsx("button",{onClick:e=>{e.stopPropagation(),w.logout();},style:{fontSize:"8px",color:n.textFaint,background:"none",border:"none",cursor:"pointer",marginLeft:"8px",padding:"0 4px",textDecoration:"underline"},title:"Sign out of widget",children:"sign out"})]});return jsxRuntime.jsxs("div",{style:{...d.root,left:P.x,top:P.y},children:[j==="mini"&&jsxRuntime.jsxs("div",{style:{position:"relative"},onMouseEnter:()=>$(true),onMouseLeave:()=>$(false),children:[jsxRuntime.jsxs("div",{style:{...d.pill(A),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:G,onPointerMove:q,onPointerUp:()=>{X(),pe.current||Le();},children:[jsxRuntime.jsx(g,{d:c.grip,size:10,className:""}),a?.ticket_id&&jsxRuntime.jsx("span",{style:{color:n.amber,fontWeight:600},children:a.ticket_id}),a?.pr_number&&jsxRuntime.jsxs("span",{style:{color:n.blue,fontWeight:600},children:["PR#",a.pr_number]}),a?.created_by_agent_name&&(a.codex_thread_id?jsxRuntime.jsxs("a",{href:`codex://threads/${a.codex_thread_id}`,onClick:e=>e.stopPropagation(),style:{color:n.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px",textDecoration:"none",cursor:"pointer"},children:[jsxRuntime.jsx(g,{d:c.terminal,size:10}),a.created_by_agent_name,jsxRuntime.jsx(g,{d:c.externalLink,size:8})]}):jsxRuntime.jsxs("span",{style:{color:n.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsxRuntime.jsx(g,{d:c.bot,size:10}),a.created_by_agent_name]})),jsxRuntime.jsxs("span",{style:A?{color:n.green}:void 0,children:[S.pass,"/",S.total]}),S.fail>0&&jsxRuntime.jsxs("span",{style:{color:n.red},children:[S.fail,"\u2717"]})]}),(K||E)&&a?.title&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:n.bg,border:`1px solid ${n.border}`,boxShadow:`0 8px 24px ${n.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsxRuntime.jsx("div",{style:{fontSize:"13px",fontWeight:700,color:n.text,lineHeight:1.3},children:a.title}),(a.description||a.intro_notes)&&jsxRuntime.jsx("div",{style:{fontSize:"11px",color:n.textMuted,marginTop:"6px",lineHeight:1.4},children:a.description||a.intro_notes})]})]}),j==="expanded"&&jsxRuntime.jsxs("div",{style:d.card(300,A),children:[jsxRuntime.jsx(Ue,{}),jsxRuntime.jsxs("div",{style:d.handle,onPointerDown:G,onPointerMove:q,onPointerUp:X,onClick:Le,children:[jsxRuntime.jsx(g,{d:c.grip,className:""}),jsxRuntime.jsxs("div",{style:{flex:1,minWidth:0},children:[jsxRuntime.jsx("div",{style:d.title,children:a?.title}),jsxRuntime.jsx("div",{style:d.sub,children:a?.branch_name&&jsxRuntime.jsxs("span",{children:["\u2387 ",a.branch_name]})})]}),jsxRuntime.jsx(g,{d:c.chevronUp,className:""}),jsxRuntime.jsx(We,{icon:c.minus,onClick:()=>{B(false),Y("mini");}})]}),jsxRuntime.jsxs("div",{style:d.stats,children:[jsxRuntime.jsxs("span",{style:{color:n.green},children:[S.pass,"\u2713"]}),jsxRuntime.jsxs("span",{style:{color:n.red},children:[S.fail,"\u2717"]}),jsxRuntime.jsxs("span",{style:{color:n.amber},children:[S.skip,"\u23ED"]}),jsxRuntime.jsxs("span",{style:{color:n.gripColor},children:[S.pending,"\u25CC"]}),jsxRuntime.jsx("span",{style:{color:n.textFaint,marginLeft:"auto"},children:S.total})]}),a?.description&&jsxRuntime.jsx("div",{style:{padding:"6px 12px",fontSize:"10px",color:n.gripColor,borderBottom:`1px solid ${n.borderSubtle}`,flexShrink:0},children:a.description}),jsxRuntime.jsx(De,{}),jsxRuntime.jsx(Ee,{}),jsxRuntime.jsx("div",{style:d.progress,children:jsxRuntime.jsx("div",{style:d.progressBar(Be)})})]}),j==="max"&&jsxRuntime.jsxs("div",{style:{...d.card(Z.w,A),height:Z.h,position:"relative"},children:[jsxRuntime.jsx(Ue,{}),jsxRuntime.jsxs("div",{style:d.handle,onPointerDown:G,onPointerMove:q,onPointerUp:X,onClick:()=>{pe.current||Y("expanded");},children:[jsxRuntime.jsx(g,{d:c.grip,className:""}),jsxRuntime.jsxs("div",{style:{flex:1,minWidth:0},children:[jsxRuntime.jsx("div",{style:d.title,children:a?.title}),jsxRuntime.jsx("div",{style:d.sub,children:a?.branch_name&&jsxRuntime.jsxs("span",{children:["\u2387 ",a.branch_name]})})]}),jsxRuntime.jsx(g,{d:c.chevronDown,className:""}),jsxRuntime.jsx(We,{icon:c.minus,onClick:()=>{B(false),Y("mini");}})]}),jsxRuntime.jsxs("div",{style:d.stats,children:[jsxRuntime.jsxs("span",{style:{color:n.green},children:[S.pass,"\u2713"]}),jsxRuntime.jsxs("span",{style:{color:n.red},children:[S.fail,"\u2717"]}),jsxRuntime.jsxs("span",{style:{color:n.amber},children:[S.skip,"\u23ED"]}),jsxRuntime.jsxs("span",{style:{color:n.gripColor},children:[S.pending,"\u25CC"]}),jsxRuntime.jsx("span",{style:{color:n.textFaint,marginLeft:"auto"},children:S.total})]}),(a?.test_cases||[]).length>5&&jsxRuntime.jsxs("div",{style:{padding:"4px 12px",borderBottom:`1px solid ${n.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",flexShrink:0},children:[jsxRuntime.jsx(g,{d:c.search,size:11,className:""}),jsxRuntime.jsx("input",{value:N,onChange:e=>we(e.target.value),placeholder:"Filter test cases...",style:{flex:1,fontSize:"10px",background:"transparent",border:"none",outline:"none",color:n.text,fontFamily:"monospace"}}),N&&jsxRuntime.jsx("button",{onClick:()=>we(""),style:{background:"none",border:"none",cursor:"pointer",color:n.textFaint,fontSize:"10px",padding:0},children:"\u2715"})]}),D==="error"&&jsxRuntime.jsxs("div",{style:{padding:"12px",textAlign:"center"},children:[jsxRuntime.jsx(g,{d:c.alert,className:""}),jsxRuntime.jsx("div",{style:{fontSize:"10px",color:n.red},children:"Failed to load"}),jsxRuntime.jsx("button",{onClick:tt,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",marginTop:"4px"},children:"Retry"})]}),A&&jsxRuntime.jsxs("div",{style:{padding:"6px 12px",display:"flex",alignItems:"center",gap:"8px",borderBottom:`1px solid ${n.greenBorderSubtle}`,background:n.greenBg},children:[jsxRuntime.jsx(g,{d:c.checkAll,className:""}),jsxRuntime.jsx("span",{style:{fontSize:"10px",color:n.green,flex:1},children:"Run completed"}),jsxRuntime.jsx("button",{onClick:rt,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer"},children:"Reset"})]}),a?.intro_notes&&jsxRuntime.jsx("div",{style:{padding:"6px 12px",borderBottom:`1px solid ${n.borderSubtle}`,fontSize:"10px",color:n.textMuted,fontStyle:"italic",flexShrink:0},children:a.intro_notes}),D!=="error"&&jsxRuntime.jsx("div",{style:{flex:1,overflowY:"auto",minHeight:0},children:(a?.test_cases||[]).length===0?jsxRuntime.jsx("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:n.gripColor},children:"No test cases"}):ae.length===0?jsxRuntime.jsxs("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:n.gripColor},children:['No matches for "',N,'"']}):$e?$e.map(e=>{let p=je.has(e.key);return jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>Je(e.key),style:{width:"100%",display:"flex",alignItems:"center",gap:"6px",padding:"5px 12px",background:n.bgSoft,cursor:"pointer",border:"none",borderLeft:"none",borderRight:"none",borderBottomStyle:"solid",borderTopStyle:"solid",borderBottomWidth:"1px",borderTopWidth:"1px",borderBottomColor:n.borderSubtle,borderTopColor:n.borderSubtle,backgroundColor:n.bgSoft},children:[jsxRuntime.jsx(g,{d:p?c.chevronDown:c.chevronUp,size:10,className:""}),jsxRuntime.jsx("span",{style:{fontSize:"10px",fontWeight:700,color:n.blue,flex:1,textAlign:"left"},children:e.label}),jsxRuntime.jsxs("span",{style:{fontSize:"9px",color:n.green},children:[e.summary.pass,"\u2713"]}),jsxRuntime.jsxs("span",{style:{fontSize:"9px",color:n.red},children:[e.summary.fail,"\u2717"]}),jsxRuntime.jsxs("span",{style:{fontSize:"9px",color:n.gripColor},children:[e.summary.pending,"\u25CC"]}),jsxRuntime.jsx("span",{style:{fontSize:"9px",color:n.textFaint},children:e.summary.total})]}),!p&&e.cases.map(h=>Ie(h))]},e.key)}):ae.map(e=>Ie(e))}),ot&&!A&&jsxRuntime.jsxs("div",{style:{padding:"6px 12px",borderTop:`1px solid ${n.greenBorderSubtle}`,background:n.greenBg,display:"flex",alignItems:"center",justifyContent:"space-between",flexShrink:0},children:[jsxRuntime.jsx("span",{style:{fontSize:"9px",color:n.green},children:"All resolved"}),jsxRuntime.jsx("button",{onClick:nt,style:{fontSize:"8px",padding:"2px 8px",borderRadius:"4px",background:"rgba(52,211,153,0.15)",color:n.green,border:`1px solid ${n.greenBorderSubtle}`,cursor:"pointer"},children:"COMPLETE"})]}),jsxRuntime.jsx(De,{}),jsxRuntime.jsx(Ee,{}),jsxRuntime.jsx("div",{style:d.progress,children:jsxRuntime.jsx("div",{style:d.progressBar(Be)})}),jsxRuntime.jsx("div",{style:{position:"absolute",bottom:0,right:0,width:16,height:16,cursor:"se-resize",zIndex:10,display:"flex",alignItems:"flex-end",justifyContent:"flex-end",padding:"2px",opacity:.3},onPointerDown:Ze,onPointerMove:Qe,onPointerUp:et,onPointerEnter:e=>e.currentTarget.style.opacity="0.7",onPointerLeave:e=>{Q.current||(e.currentTarget.style.opacity="0.3");},children:jsxRuntime.jsx("svg",{width:"8",height:"8",viewBox:"0 0 8 8",children:jsxRuntime.jsx("path",{d:"M7 1v6H1",fill:"none",stroke:n.gripColor,strokeWidth:"1.5",strokeLinecap:"round"})})})]})]})}
2
+ exports.TestRunWidget=vt;exports.useDraggable=xe;exports.useRealtimeRefresh=me;exports.useTestRun=be;exports.useWidgetAuth=ve;
package/dist/index.d.cts CHANGED
@@ -46,6 +46,8 @@ interface TestCase {
46
46
  fail_reason: string | null;
47
47
  seed_user: string | null;
48
48
  source_pr_number: number | null;
49
+ /** Only populated when multiple agents contributed test cases */
50
+ created_by_agent_name: string | null;
49
51
  }
50
52
  type Verdict = "pending" | "pass" | "fail" | "skip";
51
53
  type WidgetMode = "mini" | "expanded" | "max";
@@ -148,4 +150,14 @@ interface WidgetAuth {
148
150
  }
149
151
  declare function useWidgetAuth(dashboardUrl: string): WidgetAuth;
150
152
 
151
- export { type BotBuddyConfig, type TestCase, type TestRun, type TestRunSummary, TestRunWidget, type TestRunWidgetProps, type Verdict, type WidgetMode, type WidgetState, useDraggable, useTestRun, useWidgetAuth };
153
+ /**
154
+ * Lightweight Supabase Realtime subscription using raw WebSocket.
155
+ * Listens for INSERT/UPDATE/DELETE on test_runs and test_run_cases
156
+ * filtered by the active test run ID, then calls onUpdate().
157
+ *
158
+ * Requires config.supabaseUrl to be set (e.g. "https://api.bot-buddy.ai").
159
+ * Falls back to polling every 15s if WebSocket is unavailable.
160
+ */
161
+ declare function useRealtimeRefresh(config: BotBuddyConfig, testRunId: string | null | undefined, onUpdate: () => void): void;
162
+
163
+ export { type BotBuddyConfig, type TestCase, type TestRun, type TestRunSummary, TestRunWidget, type TestRunWidgetProps, type Verdict, type WidgetMode, type WidgetState, useDraggable, useRealtimeRefresh, useTestRun, useWidgetAuth };
package/dist/index.d.ts CHANGED
@@ -46,6 +46,8 @@ interface TestCase {
46
46
  fail_reason: string | null;
47
47
  seed_user: string | null;
48
48
  source_pr_number: number | null;
49
+ /** Only populated when multiple agents contributed test cases */
50
+ created_by_agent_name: string | null;
49
51
  }
50
52
  type Verdict = "pending" | "pass" | "fail" | "skip";
51
53
  type WidgetMode = "mini" | "expanded" | "max";
@@ -148,4 +150,14 @@ interface WidgetAuth {
148
150
  }
149
151
  declare function useWidgetAuth(dashboardUrl: string): WidgetAuth;
150
152
 
151
- export { type BotBuddyConfig, type TestCase, type TestRun, type TestRunSummary, TestRunWidget, type TestRunWidgetProps, type Verdict, type WidgetMode, type WidgetState, useDraggable, useTestRun, useWidgetAuth };
153
+ /**
154
+ * Lightweight Supabase Realtime subscription using raw WebSocket.
155
+ * Listens for INSERT/UPDATE/DELETE on test_runs and test_run_cases
156
+ * filtered by the active test run ID, then calls onUpdate().
157
+ *
158
+ * Requires config.supabaseUrl to be set (e.g. "https://api.bot-buddy.ai").
159
+ * Falls back to polling every 15s if WebSocket is unavailable.
160
+ */
161
+ declare function useRealtimeRefresh(config: BotBuddyConfig, testRunId: string | null | undefined, onUpdate: () => void): void;
162
+
163
+ export { type BotBuddyConfig, type TestCase, type TestRun, type TestRunSummary, TestRunWidget, type TestRunWidgetProps, type Verdict, type WidgetMode, type WidgetState, useDraggable, useRealtimeRefresh, useTestRun, useWidgetAuth };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {useState,useRef,useCallback,useEffect,useMemo}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function xe(n,o){let[a,v]=useState({x:n,y:o}),x=useRef(false),g=useRef({x:0,y:0}),w=useRef(false),S=useCallback(p=>{x.current=true,w.current=false,g.current={x:p.clientX-a.x,y:p.clientY-a.y},p.target.setPointerCapture(p.pointerId);},[a]),m=useCallback(p=>{x.current&&(w.current=true,v({x:p.clientX-g.current.x,y:p.clientY-g.current.y}));},[]),f=useCallback(()=>{x.current=false;},[]);return {pos:a,onPointerDown:S,onPointerMove:m,onPointerUp:f,didDrag:w}}function ae(n,o){let a={apikey:n.anonKey};return o?a.Authorization=`Bearer ${o}`:n.apiKey?a.Authorization=`Bearer ${n.apiKey}`:a.Authorization=`Bearer ${n.anonKey}`,a}async function lt(n){if(n)return n;try{let o=await fetch("/.botbuddy-token",{cache:"no-store"});if(o.ok){let a=(await o.text()).trim();if(a.startsWith("public_"))return a}}catch{}try{let o=import.meta?.env?.VITE_BOTBUDDY_TEST_RUN_TOKEN;if(o&&typeof o=="string"&&o.startsWith("public_"))return o}catch{}return null}function be(n){let[o,a]=useState(null),[v,x]=useState("loading"),g=useCallback(async()=>{try{let f=await lt(n.testRunToken);if(!f){x("no-match"),a(null);return}if(!n.ticketId){x("no-match"),a(null);return}let p=new URLSearchParams;p.set("token",f),p.set("ticket_id",n.ticketId),p.set("app_slug",n.appSlug),n.environment&&p.set("environment",n.environment),n.testRunId&&p.set("test_run_id",n.testRunId),n.targetUrl&&p.set("target_url",n.targetUrl),n.version&&p.set("version",n.version),n.commitSha&&p.set("commit_sha",n.commitSha),n.prNumber&&p.set("pr_number",String(n.prNumber)),n.branchName&&p.set("branch_name",n.branchName);let _=await fetch(`${n.config.serverUrl}/widget/test-run?${p.toString()}`,{headers:ae(n.config,n.authToken)});if(_.status===404){x("no-match"),a(null);return}if(_.status===401||_.status===403){x("error");return}if(!_.ok){x("error");return}let T=await _.json();a(T),x(T.status==="completed"?"completed":"ready");}catch{x("error");}},[n.config.serverUrl,n.config.anonKey,n.config.apiKey,n.authToken,n.appSlug,n.environment,n.ticketId,n.testRunId,n.testRunToken,n.targetUrl,n.version,n.commitSha,n.branchName,n.prNumber]);return useEffect(()=>{g();},[g]),{run:o,widgetState:v,fetchRun:g,setVerdict:async(f,p,_,T="human")=>(a(B=>{if(!B)return null;let z=B.test_cases.map(l=>l.id===f?{...l,verdict:p,fail_reason:p==="fail"&&_||null,verdict_by_display_name:T,verdict_at:new Date().toISOString()}:l),t={total:z.length,pending:0,pass:0,fail:0,skip:0};return z.forEach(l=>{l.verdict in t&&t[l.verdict]++;}),{...B,test_cases:z,summary:t}}),(await fetch(`${n.config.serverUrl}/widget/test-cases/${f}/verdict`,{method:"POST",headers:{"Content-Type":"application/json",...ae(n.config,n.authToken)},body:JSON.stringify({verdict:p,fail_reason:_,display_name:T})})).ok),markComplete:async()=>o?(a(p=>p?{...p,status:"completed"}:null),x("completed"),(await fetch(`${n.config.serverUrl}/widget/test-runs/${o.id}/complete`,{method:"POST",headers:{"Content-Type":"application/json",...ae(n.config,n.authToken)}})).ok):false,resetRun:async()=>{if(!o)return false;let f=await fetch(`${n.config.serverUrl}/widget/test-runs/${o.id}/reset`,{method:"POST",headers:{"Content-Type":"application/json",...ae(n.config,n.authToken)}});return f.ok&&g(),f.ok},setRun:a}}var me="botbuddy-widget-auth-token",ye="botbuddy-widget-auth-name";function he(n){let[o,a]=useState(()=>{try{return localStorage.getItem(me)}catch{return null}}),[v,x]=useState(()=>{try{return localStorage.getItem(ye)}catch{return null}});useEffect(()=>{let S=m=>{if(m.data?.type==="botbuddy-widget-auth"&&m.data.token){let{token:f,displayName:p}=m.data;a(f),x(p||"human");try{localStorage.setItem(me,f),p&&localStorage.setItem(ye,p);}catch{}}};return window.addEventListener("message",S),()=>window.removeEventListener("message",S)},[]);let g=useCallback(()=>{let S=`${n}/widget-auth`,m=420,f=520,p=window.screenX+(window.innerWidth-m)/2,_=window.screenY+(window.innerHeight-f)/2;window.open(S,"botbuddy-auth",`width=${m},height=${f},left=${p},top=${_},popup=yes`);},[n]),w=useCallback(()=>{a(null),x(null);try{localStorage.removeItem(me),localStorage.removeItem(ye);}catch{}},[]);return {token:o,displayName:v,isAuthenticated:!!o,openLogin:g,logout:w}}var u=({d:n,className:o,size:a=14})=>jsx("svg",{className:o,width:a,height:a,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:n})}),c={clipboard:"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2",check:"M22 11.08V12a10 10 0 1 1-5.93-9.14M22 4 12 14.01l-3-3",x:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20M15 9l-6 6M9 9l6 6",circle:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20",skip:"M5 4l10 8-10 8V4M19 5v14",grip:"M9 5h.01M15 5h.01M9 12h.01M15 12h.01M9 19h.01M15 19h.01",minus:"M5 12h14",chevronUp:"M18 15l-6-6-6 6",chevronDown:"M6 9l6 6 6-6",externalLink:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3",pr:"M6 3v18M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6M6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6M18 9a9 9 0 0 1-9 9",ticket:"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z",loader:"M21 12a9 9 0 1 1-6.219-8.56",checkAll:"M18 6L7 17l-5-5M22 10l-7.5 7.5L13 16",alert:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0M12 9v4M12 17h.01",user:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2M12 3a4 4 0 1 0 0 8 4 4 0 0 0 0-8",bot:"M12 8V4H8M2 14h2M20 14h2M15 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M9 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M18 10a6 6 0 0 0-12 0v4a6 6 0 0 0 12 0Z",terminal:"M4 17l6-6-6-6M12 19h8",key:"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4",shield:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10",copy:"M20 9h-9a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-9a2 2 0 0 0-2-2ZM5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1",search:"M11 17.25a6.25 6.25 0 1 1 0-12.5 6.25 6.25 0 0 1 0 12.5ZM16 16l4.5 4.5"};function pt(){let[n,o]=useState(()=>typeof window>"u"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return useEffect(()=>{if(typeof window>"u")return;let a=document.documentElement,v=()=>a.classList.contains("dark")?"dark":a.classList.contains("light")?"light":null,x=v();x&&o(x);let g=window.matchMedia("(prefers-color-scheme: dark)"),w=m=>{let f=v();o(f||(m.matches?"dark":"light"));};g.addEventListener("change",w);let S=new MutationObserver(()=>{let m=v();o(m||(g.matches?"dark":"light"));});return S.observe(a,{attributes:true,attributeFilter:["class"]}),()=>{g.removeEventListener("change",w),S.disconnect();}},[]),n}function ct(n){let o=n==="dark";return {bg:o?"rgb(30,30,30)":"rgb(255,255,255)",bgSoft:o?"rgba(255,255,255,0.02)":"rgba(0,0,0,0.02)",text:o?"#e5e5e5":"#1a1a1a",textMuted:o?"rgba(255,255,255,0.4)":"rgba(0,0,0,0.45)",textFaint:o?"#555":"#999",border:o?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.12)",borderSubtle:o?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",shadow:o?"rgba(0,0,0,0.4)":"rgba(0,0,0,0.12)",inputBg:o?"rgba(0,0,0,0.3)":"rgba(0,0,0,0.04)",inputBorder:o?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.12)",green:"#34d399",greenBg:o?"rgba(52,211,153,0.05)":"rgba(52,211,153,0.08)",greenBorder:o?"rgba(52,211,153,0.6)":"rgba(52,211,153,0.5)",greenBorderSubtle:o?"rgba(52,211,153,0.2)":"rgba(52,211,153,0.15)",red:"#f87171",amber:"#f59e0b",blue:"#60a5fa",purple:"#a78bfa",versionText:o?"rgba(255,255,255,0.5)":"rgba(0,0,0,0.35)",versionNum:o?"rgba(255,255,255,0.3)":"rgba(0,0,0,0.2)",gripColor:o?"#888":"#aaa",btnHover:o?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.06)"}}var ut={pending:"#888",pass:"#34d399",fail:"#f87171",skip:"#f59e0b"},gt={pending:c.circle,pass:c.check,fail:c.x,skip:c.skip},He={local:{bg:"rgba(59,130,246,0.15)",text:"#60a5fa",border:"rgba(59,130,246,0.3)"},preview:{bg:"rgba(168,85,247,0.15)",text:"#c084fc",border:"rgba(168,85,247,0.3)"},staging:{bg:"rgba(245,158,11,0.15)",text:"#fbbf24",border:"rgba(245,158,11,0.3)"},production:{bg:"rgba(239,68,68,0.15)",text:"#f87171",border:"rgba(239,68,68,0.3)"},custom:{bg:"rgba(128,128,128,0.15)",text:"#888",border:"rgba(128,128,128,0.3)"}},ft=n=>({root:{position:"fixed",zIndex:9999,userSelect:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},pill:o=>({display:"inline-flex",alignItems:"center",gap:"6px",padding:"4px 8px",borderRadius:"9999px",background:n.bg,border:o?`1px solid ${n.greenBorder}`:`1px solid ${n.border}`,boxShadow:o?`0 4px 12px ${n.shadow}, 0 0 0 1px ${n.greenBorderSubtle}`:`0 4px 12px ${n.shadow}`,cursor:"pointer",fontSize:"9px",color:n.text}),card:(o,a)=>({width:`${o}px`,borderRadius:"8px",background:n.bg,border:a?`1px solid ${n.greenBorder}`:`1px solid ${n.border}`,boxShadow:a?`0 8px 24px ${n.shadow}, 0 0 0 1px ${n.greenBorderSubtle}`:`0 8px 24px ${n.shadow}`,overflow:"hidden",display:"flex",flexDirection:"column"}),handle:{padding:"8px 12px",display:"flex",alignItems:"center",gap:"8px",cursor:"grab",borderBottom:`1px solid ${n.borderSubtle}`},title:{fontSize:"10px",fontWeight:600,color:n.text,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},sub:{fontSize:"9px",color:n.textMuted,display:"flex",alignItems:"center",gap:"6px"},btn:{padding:"2px",borderRadius:"4px",background:"transparent",border:"none",cursor:"pointer",color:n.gripColor,display:"flex",flexShrink:0},stats:{padding:"4px 12px",display:"flex",alignItems:"center",gap:"8px",fontSize:"9px",borderBottom:`1px solid ${n.borderSubtle}`},badge:o=>{let a=He[o]||He.custom;return {fontSize:"8px",padding:"0 4px",borderRadius:"4px",background:a.bg,color:a.text,border:`1px solid ${a.border}`,lineHeight:"14px"}},progress:{height:"2px",background:n.borderSubtle,flexShrink:0},progressBar:o=>({height:"100%",width:`${o}%`,background:"linear-gradient(to right, #34d399, #3b82f6)",transition:"width 0.5s"}),link:o=>({display:"inline-flex",alignItems:"center",gap:"4px",fontSize:"9px",padding:"2px 6px",borderRadius:"4px",background:`${o}15`,color:o,textDecoration:"none",border:"none",cursor:"pointer"}),caseRow:{padding:"6px 12px",borderBottom:`1px solid ${n.borderSubtle}`,transition:"background 0.15s"},verdictBtn:(o,a)=>({fontSize:"8px",padding:"2px 6px",borderRadius:"4px",border:"none",cursor:"pointer",background:o?`${a}33`:"transparent",color:o?a:n.gripColor,transition:"all 0.15s"}),input:{flex:1,fontSize:"9px",background:n.inputBg,border:`1px solid ${n.inputBorder}`,borderRadius:"4px",padding:"2px 6px",color:n.text,outline:"none"},humanBanner:{padding:"6px 12px",fontSize:"11px",fontWeight:600,color:n.green,borderBottom:`1px solid ${n.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",background:n.greenBg,cursor:"pointer",textDecoration:"none"}});function xt({config:n,appSlug:o,environment:a,seedUserSlug:v,authToken:x,tk:g}){let[w,S]=useState(null),[m,f]=useState(0),[p,_]=useState(false),[T,L]=useState(null),[B,z]=useState(false),t=useRef(null),l=useMemo(()=>v.split("/")[0].trim(),[v]),K=useCallback(async()=>{_(true),L(null);try{let C=new URLSearchParams({app_slug:o,seed_user_slug:l,environment:a}),N={apikey:n.anonKey};x?N.Authorization=`Bearer ${x}`:N.Authorization=`Bearer ${n.anonKey}`;let W=await fetch(`${n.serverUrl}/widget/totp-code?${C}`,{headers:N});if(!W.ok){let h=await W.json().catch(()=>({error:"Failed"}));if(W.status===404){L("No 2FA seed registered");return}L(h.error||"Failed to get code");return}let E=await W.json();S(E.code),f(E.remaining_seconds);try{await navigator.clipboard.writeText(E.code),z(!0),setTimeout(()=>z(!1),2e3);}catch{}t.current&&clearInterval(t.current);let O=E.remaining_seconds;t.current=setInterval(()=>{O--,O<=0?(t.current&&clearInterval(t.current),K()):f(O);},1e3);}catch{L("Network error");}finally{_(false);}},[n.serverUrl,n.anonKey,x,o,l,a]);return useEffect(()=>()=>{t.current&&clearInterval(t.current);},[]),T==="No 2FA seed registered"?null:w?jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"3px"},children:[jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:"6px",padding:"3px 8px",borderRadius:"4px",background:`${g.purple}15`,border:`1px solid ${g.purple}40`,fontSize:"12px",fontFamily:"ui-monospace, monospace",fontWeight:700,color:g.purple,letterSpacing:"0.15em"},children:[jsx(u,{d:c.shield,size:11}),jsx("span",{children:w}),jsxs("span",{style:{fontSize:"8px",fontWeight:400,color:g.textMuted,letterSpacing:"0"},children:[m,"s"]})]}),jsx("button",{onClick:C=>{C.stopPropagation(),navigator.clipboard.writeText(w).then(()=>{z(true),setTimeout(()=>z(false),1500);});},style:{padding:"2px",background:"none",border:"none",cursor:"pointer",color:B?g.green:g.gripColor,fontSize:"8px"},title:"Copy code",children:B?jsx(u,{d:c.check,size:10}):jsx(u,{d:c.copy,size:10})})]}):jsxs("button",{onClick:C=>{C.stopPropagation(),K();},disabled:p,style:{display:"inline-flex",alignItems:"center",gap:"4px",marginTop:"3px",fontSize:"8px",padding:"2px 6px",borderRadius:"4px",background:`${g.purple}12`,color:g.purple,border:`1px solid ${g.purple}30`,cursor:p?"wait":"pointer",opacity:p?.6:1},children:[jsx(u,{d:c.shield,size:9}),p?"generating...":T||"Get 2FA code"]})}var Ve="botbuddy-widget-state";function bt({config:n,appSlug:o,environment:a,ticketId:v,testRunId:x,testRunToken:g,targetUrl:w,version:S,commitSha:m,prNumber:f,branchName:p,onNavigate:_,displayName:T="human",defaultMode:L="mini",defaultPosition:B}){let z=pt(),t=useMemo(()=>ct(z),[z]),l=useMemo(()=>ft(t),[t]),[K,C]=useState(false),[N,W]=useState(false),E=useRef(false),O=n.dashboardUrl||"https://botbuddy.lovable.app",h=he(O),le=(()=>{try{let e=typeof window<"u"?localStorage.getItem(Ve):null;if(e)return JSON.parse(e)}catch{}return null})(),[Y,j]=useState(le?.mode||L),[de,re]=useState(""),[Ke,G]=useState(null),[ve,Se]=useState(null),[Oe,Ye]=useState(new Set),[U,_e]=useState(""),je=useCallback(e=>{Ye(d=>{let b=new Set(d);return b.has(e)?b.delete(e):b.add(e),b});},[]),Ge=le?.x??B?.x??16,Xe=le?.y??B?.y??(typeof window<"u"?window.innerHeight-56:600),{pos:R,onPointerDown:X,onPointerMove:J,onPointerUp:Z,didDrag:pe}=xe(Ge,Xe);useEffect(()=>{try{localStorage.setItem(Ve,JSON.stringify({mode:Y,x:R.x,y:R.y}));}catch{}},[Y,R.x,R.y]);let ke=useRef(h.isAuthenticated);useEffect(()=>{!ke.current&&h.isAuthenticated&&j("max"),ke.current=h.isAuthenticated;},[h.isAuthenticated]);let we="botbuddy-widget-max-size",Je=()=>{try{let e=localStorage.getItem(we);if(e)return JSON.parse(e)}catch{}return {w:340,h:500}},[Q,Me]=useState(Je),q=useRef(false),ee=useRef({x:0,y:0,w:0,h:0}),Ze=useCallback(e=>{e.stopPropagation(),q.current=true,ee.current={x:e.clientX,y:e.clientY,w:Q.w,h:Q.h},e.target.setPointerCapture(e.pointerId);},[Q]),Qe=useCallback(e=>{if(!q.current)return;let d=Math.max(280,Math.min(600,ee.current.w+(e.clientX-ee.current.x))),b=Math.max(300,Math.min(window.innerHeight*.9,ee.current.h+(e.clientY-ee.current.y)));Me({w:d,h:b});},[]),qe=useCallback(()=>{q.current&&(q.current=false,Me(e=>(localStorage.setItem(we,JSON.stringify(e)),e)));},[]),oe=w??(typeof window<"u"?window.location.href:void 0),ze=h.displayName||T,[I,Ce]=useState(null);useEffect(()=>{if(h.isAuthenticated)return;let e=new URLSearchParams;g&&e.set("token",g),v&&e.set("ticket_id",v),e.set("app_slug",o),a&&e.set("environment",a),x&&e.set("test_run_id",x),oe&&e.set("target_url",oe),S&&e.set("version",S),m&&e.set("commit_sha",m),f&&e.set("pr_number",String(f)),p&&e.set("branch_name",p),fetch(`${n.serverUrl}/widget/preview?${e}`,{headers:{apikey:n.anonKey}}).then(d=>d.json()).then(d=>Ce(d)).catch(()=>Ce(null));},[h.isAuthenticated,n.serverUrl,n.anonKey,o,a,v,x,g,oe,S,m,f,p]);let{run:s,widgetState:D,fetchRun:et,setVerdict:Te,markComplete:tt,resetRun:nt}=be({config:n,appSlug:o,environment:a,ticketId:v,testRunId:x,testRunToken:g,targetUrl:oe,version:S,commitSha:m,prNumber:f?String(f):void 0,branchName:p,authToken:h.token}),ie=useCallback(async(e,d,b)=>{Se(e);try{await Te(e,d,b,ze);}finally{Se(null),G(null),re("");}},[Te,ze]),y=s?.summary||{total:0,pending:0,pass:0,fail:0,skip:0},rt=y.total>0&&y.pending===0,A=D==="completed",se=useMemo(()=>{let e=s?.test_cases||[];if(!U.trim())return e;let d=U.toLowerCase();return e.filter(b=>b.title.toLowerCase().includes(d)||b.description&&b.description.toLowerCase().includes(d)||b.url_path&&b.url_path.toLowerCase().includes(d)||b.seed_user&&b.seed_user.toLowerCase().includes(d))},[s?.test_cases,U]),Re=useMemo(()=>{let e=se,d=s?.test_cases||[];if(new Set(d.map(M=>M.source_pr_number)).size<=1)return null;let $=[],te=new Map;e.forEach(M=>{let P=M.source_pr_number;te.has(P)||te.set(P,[]),te.get(P).push(M);});let ot=[...te.keys()].sort((M,P)=>M===null?1:P===null?-1:P-M);for(let M of ot){let P=te.get(M),ue={total:P.length,pass:0,fail:0,skip:0,pending:0};P.forEach(Ne=>{Ne.verdict in ue&&ue[Ne.verdict]++;}),$.push({key:M!=null?`pr-${M}`:"general",label:M!=null?`PR #${M}`:"General",cases:P,summary:ue});}return $.filter(M=>M.cases.length>0)},[se,s?.test_cases]),$e=y.total>0?(y.pass+y.fail)/y.total*100:0,ce=useMemo(()=>{let e=s?.auto_tooltip_seconds??I?.auto_tooltip_seconds;return e!=null&&e>0?e*1e3:5e3},[s,I]),Pe=D==="ready"||D==="completed"||I?.enabled&&I.run;useEffect(()=>{if(!Pe||E.current||ce<=0)return;E.current=true,W(true);let e=window.setTimeout(()=>W(false),ce);return ()=>window.clearTimeout(e)},[Pe,ce]);let Be=e=>jsxs("div",{style:l.caseRow,children:[jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"8px"},children:[jsx("div",{style:{marginTop:"2px",flexShrink:0,color:ut[e.verdict]},children:ve===e.id?jsx(u,{d:c.loader,className:""}):jsx(u,{d:gt[e.verdict],className:""})}),jsxs("div",{style:{minWidth:0,flex:1},children:[jsx("div",{style:{fontSize:"10px",color:t.text,lineHeight:1.3},children:e.title}),e.description&&jsx("div",{style:{fontSize:"9px",color:t.gripColor,marginTop:"2px"},children:e.description}),e.seed_user&&jsxs("div",{children:[jsxs("div",{style:{fontSize:"9px",color:t.amber,marginTop:"3px",display:"flex",alignItems:"center",gap:"4px",padding:"2px 6px",borderRadius:"4px",background:`${t.amber}12`,border:`1px solid ${t.amber}30`},children:[jsx(u,{d:c.key,size:10}),jsx("span",{children:e.seed_user})]}),(a??s?.environment)!=="production"&&(a??s?.environment)&&jsx(xt,{config:n,appSlug:o,environment:a??s?.environment,seedUserSlug:e.seed_user,authToken:h.token,tk:t})]}),e.url_path&&jsxs("a",{href:e.url_path,target:"_blank",rel:"noopener noreferrer",onClick:d=>{d.stopPropagation(),_&&(d.preventDefault(),_(e.url_path));},style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",padding:"2px 0",marginTop:"2px",display:"inline-flex",alignItems:"center",gap:"2px",textDecoration:"none",position:"relative",zIndex:1,pointerEvents:"auto"},children:[jsx(u,{d:c.externalLink,size:10}),e.url_path]}),e.verdict==="fail"&&e.fail_reason&&jsxs("div",{style:{fontSize:"9px",color:t.red,marginTop:"2px"},children:["\u2717 ",e.fail_reason]})]})]}),jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"4px",marginLeft:"22px"},children:[["pass","fail","skip"].map(d=>jsx("button",{onClick:()=>{if(e.verdict===d){ie(e.id,"pending"),G(null);return}if(d==="fail"){G(e.id),re("");return}G(null),ie(e.id,d);},disabled:ve!==null,style:l.verdictBtn(e.verdict===d,d==="pass"?t.green:d==="fail"?t.red:t.amber),children:d.toUpperCase()},d)),e.verdict_by_display_name&&jsx("span",{style:{fontSize:"8px",color:t.textFaint,marginLeft:"auto"},children:e.verdict_by_display_name})]}),Ke===e.id&&jsxs("div",{style:{marginLeft:"22px",marginTop:"4px",display:"flex",gap:"4px"},children:[jsx("input",{autoFocus:true,value:de,onChange:d=>re(d.target.value),onKeyDown:d=>{d.key==="Enter"&&ie(e.id,"fail",de.trim()||void 0),d.key==="Escape"&&(G(null),re(""));},placeholder:"Reason (optional)...",style:l.input}),jsx("button",{onClick:()=>{ie(e.id,"fail",de.trim()||void 0);},style:l.verdictBtn(true,t.red),children:"\u2713"})]})]},e.id);if((D==="no-match"||D==="loading")&&!(!h.isAuthenticated&&I?.enabled&&I.run))return null;if(!h.isAuthenticated&&I?.enabled&&I.run){let e=I.run,d=e.summary,b=e.status==="completed";return jsx("div",{style:{...l.root,left:R.x,top:R.y},children:jsxs("div",{style:{position:"relative"},onMouseEnter:()=>C(true),onMouseLeave:()=>C(false),children:[jsxs("div",{style:{...l.pill(b),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:X,onPointerMove:J,onPointerUp:()=>{Z();},children:[jsx(u,{d:c.grip,size:10,className:""}),e.ticket_id&&e.ticket_url?jsx("a",{href:e.ticket_url,target:"_blank",rel:"noopener noreferrer",onClick:$=>$.stopPropagation(),style:{color:t.amber,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:e.ticket_id}):null,e.pr_url?jsxs("a",{href:e.pr_url,target:"_blank",rel:"noopener noreferrer",onClick:$=>$.stopPropagation(),style:{color:t.blue,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:["PR#",e.pr_number??e.pr_id]}):null,e.created_by_agent_name?e.codex_thread_id?jsxs("a",{href:`codex://threads/${e.codex_thread_id}`,onClick:$=>$.stopPropagation(),style:{color:t.purple,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsx(u,{d:c.terminal,size:10}),e.created_by_agent_name]}):jsxs("span",{style:{color:t.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsx(u,{d:c.bot,size:10}),e.created_by_agent_name]}):null,jsxs("span",{style:b?{color:t.green}:void 0,children:[d.pass,"/",d.total]}),d.fail>0&&jsxs("span",{style:{color:t.red},children:[d.fail,"\u2717"]}),jsx("span",{onClick:$=>{$.stopPropagation(),h.openLogin();},style:{color:t.textMuted,fontWeight:400,cursor:"pointer",textDecoration:"underline",textUnderlineOffset:"2px"},children:"Sign in"})]}),(K||N)&&e.title&&jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:t.bg,border:`1px solid ${t.border}`,boxShadow:`0 8px 24px ${t.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsx("div",{style:{fontSize:"13px",fontWeight:700,color:t.text,lineHeight:1.3},children:e.title}),(e.description||e.intro_notes)&&jsx("div",{style:{fontSize:"11px",color:t.textMuted,marginTop:"6px",lineHeight:1.4},children:e.description||e.intro_notes}),jsx("div",{style:{marginTop:"6px",fontSize:"9px",color:t.textFaint},children:'Click "Sign in" to start testing'})]})]})})}if(!h.isAuthenticated)return jsxs("div",{style:{...l.root,left:R.x,top:R.y,width:220,minHeight:0,cursor:"move",userSelect:"none",borderRadius:"8px",background:t.bg,border:`1px solid ${t.border}`,boxShadow:`0 8px 24px ${t.shadow}`},onPointerDown:X,onPointerMove:J,onPointerUp:Z,children:[jsx("div",{style:{...l.handle,borderBottom:"none"},children:jsxs("div",{style:l.sub,children:[jsx(u,{d:c.grip,size:10,className:""}),jsx(u,{d:c.clipboard,size:12,className:""}),jsx("span",{style:{fontWeight:600},children:"BotBuddy"})]})}),jsxs("div",{style:{padding:"12px 14px",textAlign:"center"},children:[jsx("div",{style:{fontSize:"9px",color:t.textMuted,marginBottom:"8px"},children:"Sign in to access test cases"}),jsx("button",{onClick:e=>{e.stopPropagation(),h.openLogin();},style:{fontSize:"10px",fontWeight:600,padding:"6px 16px",borderRadius:"6px",border:`1px solid ${t.green}`,background:`${t.green}22`,color:t.green,cursor:"pointer",width:"100%"},children:"Sign in to test"})]})]});let Ie=()=>{pe.current||(W(false),j(e=>e==="mini"?"max":"mini"));},We=({icon:e,onClick:d})=>jsx("button",{style:l.btn,onClick:b=>{b.stopPropagation(),d(b);},children:jsx(u,{d:e,className:""})}),Le=()=>{if(!s?.assigned_human_display_name)return null;let e=jsxs(Fragment,{children:[jsx("span",{style:{width:7,height:7,borderRadius:"50%",background:t.green,display:"inline-block",flexShrink:0,boxShadow:`0 0 6px ${t.green}66`}}),jsx(u,{d:c.user,size:13}),jsx("span",{style:{flex:1},children:s.assigned_human_display_name}),s.codex_thread_id&&jsx(u,{d:c.externalLink,size:10})]});return s.codex_thread_id?jsx("a",{href:`codex://threads/${s.codex_thread_id}`,style:l.humanBanner,children:e}):jsx("div",{style:l.humanBanner,children:e})},Ee=()=>jsxs("div",{style:{padding:"6px 12px",display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center",borderTop:`1px solid ${t.borderSubtle}`,flexShrink:0},children:[s?.pr_url&&jsxs("a",{href:s.pr_url,target:"_blank",rel:"noopener noreferrer",style:{...l.link(t.blue),textDecoration:"none"},children:[jsx(u,{d:c.pr,size:12}),s.pr_id||"PR",jsx(u,{d:c.externalLink,size:8})]}),s?.ticket_url&&jsxs("a",{href:s.ticket_url,target:"_blank",rel:"noopener noreferrer",style:{...l.link(t.amber),textDecoration:"none"},children:[jsx(u,{d:c.ticket,size:12}),s.ticket_id||"Ticket",jsx(u,{d:c.externalLink,size:8})]}),s?.created_by_agent_name&&(s.codex_thread_id?jsxs("a",{href:`codex://threads/${s.codex_thread_id}`,style:{...l.link(t.purple),textDecoration:"none"},children:[jsx(u,{d:c.bot,size:12}),s.created_by_agent_name,jsx(u,{d:c.externalLink,size:8})]}):jsxs("span",{style:{...l.link(t.purple)},children:[jsx(u,{d:c.bot,size:12}),s.created_by_agent_name]})),jsx("span",{style:{...l.badge(s?.environment||"custom"),marginLeft:"auto"},children:s?.environment})]}),De=()=>jsxs("div",{style:{padding:"4px 12px",display:"flex",alignItems:"center",justifyContent:"center",borderTop:`1px solid ${t.borderSubtle}`,background:t.bgSoft,flexShrink:0},children:[jsxs("button",{onClick:()=>{navigator.clipboard.writeText("0.5.10");},style:{fontSize:"9px",fontWeight:600,color:t.versionText,letterSpacing:"0.08em",background:"none",border:"none",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"4px",padding:0},title:"Copy version",children:["BotBuddy ",jsx("span",{style:{color:t.versionNum},children:"v0.5.10"})]}),h.isAuthenticated&&jsx("button",{onClick:e=>{e.stopPropagation(),h.logout();},style:{fontSize:"8px",color:t.textFaint,background:"none",border:"none",cursor:"pointer",marginLeft:"8px",padding:"0 4px",textDecoration:"underline"},title:"Sign out of widget",children:"sign out"})]});return jsxs("div",{style:{...l.root,left:R.x,top:R.y},children:[Y==="mini"&&jsxs("div",{style:{position:"relative"},onMouseEnter:()=>C(true),onMouseLeave:()=>C(false),children:[jsxs("div",{style:{...l.pill(A),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:X,onPointerMove:J,onPointerUp:()=>{Z(),pe.current||Ie();},children:[jsx(u,{d:c.grip,size:10,className:""}),s?.ticket_id&&jsx("span",{style:{color:t.amber,fontWeight:600},children:s.ticket_id}),s?.pr_number&&jsxs("span",{style:{color:t.blue,fontWeight:600},children:["PR#",s.pr_number]}),s?.created_by_agent_name&&jsxs("span",{style:{color:t.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsx(u,{d:c.bot,size:10}),s.created_by_agent_name]}),jsxs("span",{style:A?{color:t.green}:void 0,children:[y.pass,"/",y.total]}),y.fail>0&&jsxs("span",{style:{color:t.red},children:[y.fail,"\u2717"]})]}),(K||N)&&s?.title&&jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:t.bg,border:`1px solid ${t.border}`,boxShadow:`0 8px 24px ${t.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsx("div",{style:{fontSize:"13px",fontWeight:700,color:t.text,lineHeight:1.3},children:s.title}),(s.description||s.intro_notes)&&jsx("div",{style:{fontSize:"11px",color:t.textMuted,marginTop:"6px",lineHeight:1.4},children:s.description||s.intro_notes})]})]}),Y==="expanded"&&jsxs("div",{style:l.card(300,A),children:[jsx(Le,{}),jsxs("div",{style:l.handle,onPointerDown:X,onPointerMove:J,onPointerUp:Z,onClick:Ie,children:[jsx(u,{d:c.grip,className:""}),jsxs("div",{style:{flex:1,minWidth:0},children:[jsx("div",{style:l.title,children:s?.title}),jsx("div",{style:l.sub,children:s?.branch_name&&jsxs("span",{children:["\u2387 ",s.branch_name]})})]}),jsx(u,{d:c.chevronUp,className:""}),jsx(We,{icon:c.minus,onClick:()=>j("mini")})]}),jsxs("div",{style:l.stats,children:[jsxs("span",{style:{color:t.green},children:[y.pass,"\u2713"]}),jsxs("span",{style:{color:t.red},children:[y.fail,"\u2717"]}),jsxs("span",{style:{color:t.amber},children:[y.skip,"\u23ED"]}),jsxs("span",{style:{color:t.gripColor},children:[y.pending,"\u25CC"]}),jsx("span",{style:{color:t.textFaint,marginLeft:"auto"},children:y.total})]}),s?.description&&jsx("div",{style:{padding:"6px 12px",fontSize:"10px",color:t.gripColor,borderBottom:`1px solid ${t.borderSubtle}`,flexShrink:0},children:s.description}),jsx(Ee,{}),jsx(De,{}),jsx("div",{style:l.progress,children:jsx("div",{style:l.progressBar($e)})})]}),Y==="max"&&jsxs("div",{style:{...l.card(Q.w,A),height:Q.h,position:"relative"},children:[jsx(Le,{}),jsxs("div",{style:l.handle,onPointerDown:X,onPointerMove:J,onPointerUp:Z,onClick:()=>{pe.current||j("expanded");},children:[jsx(u,{d:c.grip,className:""}),jsxs("div",{style:{flex:1,minWidth:0},children:[jsx("div",{style:l.title,children:s?.title}),jsx("div",{style:l.sub,children:s?.branch_name&&jsxs("span",{children:["\u2387 ",s.branch_name]})})]}),jsx(u,{d:c.chevronDown,className:""}),jsx(We,{icon:c.minus,onClick:()=>j("mini")})]}),jsxs("div",{style:l.stats,children:[jsxs("span",{style:{color:t.green},children:[y.pass,"\u2713"]}),jsxs("span",{style:{color:t.red},children:[y.fail,"\u2717"]}),jsxs("span",{style:{color:t.amber},children:[y.skip,"\u23ED"]}),jsxs("span",{style:{color:t.gripColor},children:[y.pending,"\u25CC"]}),jsx("span",{style:{color:t.textFaint,marginLeft:"auto"},children:y.total})]}),(s?.test_cases||[]).length>5&&jsxs("div",{style:{padding:"4px 12px",borderBottom:`1px solid ${t.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",flexShrink:0},children:[jsx(u,{d:c.search,size:11,className:""}),jsx("input",{value:U,onChange:e=>_e(e.target.value),placeholder:"Filter test cases...",style:{flex:1,fontSize:"10px",background:"transparent",border:"none",outline:"none",color:t.text,fontFamily:"monospace"}}),U&&jsx("button",{onClick:()=>_e(""),style:{background:"none",border:"none",cursor:"pointer",color:t.textFaint,fontSize:"10px",padding:0},children:"\u2715"})]}),D==="error"&&jsxs("div",{style:{padding:"12px",textAlign:"center"},children:[jsx(u,{d:c.alert,className:""}),jsx("div",{style:{fontSize:"10px",color:t.red},children:"Failed to load"}),jsx("button",{onClick:et,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",marginTop:"4px"},children:"Retry"})]}),A&&jsxs("div",{style:{padding:"6px 12px",display:"flex",alignItems:"center",gap:"8px",borderBottom:`1px solid ${t.greenBorderSubtle}`,background:t.greenBg},children:[jsx(u,{d:c.checkAll,className:""}),jsx("span",{style:{fontSize:"10px",color:t.green,flex:1},children:"Run completed"}),jsx("button",{onClick:nt,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer"},children:"Reset"})]}),s?.intro_notes&&jsx("div",{style:{padding:"6px 12px",borderBottom:`1px solid ${t.borderSubtle}`,fontSize:"10px",color:t.textMuted,fontStyle:"italic",flexShrink:0},children:s.intro_notes}),D!=="error"&&jsx("div",{style:{flex:1,overflowY:"auto",minHeight:0},children:(s?.test_cases||[]).length===0?jsx("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:t.gripColor},children:"No test cases"}):se.length===0?jsxs("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:t.gripColor},children:['No matches for "',U,'"']}):Re?Re.map(e=>{let d=Oe.has(e.key);return jsxs("div",{children:[jsxs("button",{onClick:()=>je(e.key),style:{width:"100%",display:"flex",alignItems:"center",gap:"6px",padding:"5px 12px",background:t.bgSoft,cursor:"pointer",border:"none",borderLeft:"none",borderRight:"none",borderBottomStyle:"solid",borderTopStyle:"solid",borderBottomWidth:"1px",borderTopWidth:"1px",borderBottomColor:t.borderSubtle,borderTopColor:t.borderSubtle,backgroundColor:t.bgSoft},children:[jsx(u,{d:d?c.chevronDown:c.chevronUp,size:10,className:""}),jsx("span",{style:{fontSize:"10px",fontWeight:700,color:t.blue,flex:1,textAlign:"left"},children:e.label}),jsxs("span",{style:{fontSize:"9px",color:t.green},children:[e.summary.pass,"\u2713"]}),jsxs("span",{style:{fontSize:"9px",color:t.red},children:[e.summary.fail,"\u2717"]}),jsxs("span",{style:{fontSize:"9px",color:t.gripColor},children:[e.summary.pending,"\u25CC"]}),jsx("span",{style:{fontSize:"9px",color:t.textFaint},children:e.summary.total})]}),!d&&e.cases.map(b=>Be(b))]},e.key)}):se.map(e=>Be(e))}),rt&&!A&&jsxs("div",{style:{padding:"6px 12px",borderTop:`1px solid ${t.greenBorderSubtle}`,background:t.greenBg,display:"flex",alignItems:"center",justifyContent:"space-between",flexShrink:0},children:[jsx("span",{style:{fontSize:"9px",color:t.green},children:"All resolved"}),jsx("button",{onClick:tt,style:{fontSize:"8px",padding:"2px 8px",borderRadius:"4px",background:"rgba(52,211,153,0.15)",color:t.green,border:`1px solid ${t.greenBorderSubtle}`,cursor:"pointer"},children:"COMPLETE"})]}),jsx(Ee,{}),jsx(De,{}),jsx("div",{style:l.progress,children:jsx("div",{style:l.progressBar($e)})}),jsx("div",{style:{position:"absolute",bottom:0,right:0,width:16,height:16,cursor:"se-resize",zIndex:10,display:"flex",alignItems:"flex-end",justifyContent:"flex-end",padding:"2px",opacity:.3},onPointerDown:Ze,onPointerMove:Qe,onPointerUp:qe,onPointerEnter:e=>e.currentTarget.style.opacity="0.7",onPointerLeave:e=>{q.current||(e.currentTarget.style.opacity="0.3");},children:jsx("svg",{width:"8",height:"8",viewBox:"0 0 8 8",children:jsx("path",{d:"M7 1v6H1",fill:"none",stroke:t.gripColor,strokeWidth:"1.5",strokeLinecap:"round"})})})]})]})}
2
- export{bt as TestRunWidget,xe as useDraggable,be as useTestRun,he as useWidgetAuth};
1
+ import {useState,useRef,useCallback,useEffect,useMemo}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';function xe(t,o){let[s,b]=useState({x:t,y:o}),m=useRef(false),f=useRef({x:0,y:0}),x=useRef(false),y=useCallback(l=>{m.current=true,x.current=false,f.current={x:l.clientX-s.x,y:l.clientY-s.y},l.target.setPointerCapture(l.pointerId);},[s]),v=useCallback(l=>{m.current&&(x.current=true,b({x:l.clientX-f.current.x,y:l.clientY-f.current.y}));},[]),u=useCallback(()=>{m.current=false;},[]);return {pos:s,onPointerDown:y,onPointerMove:v,onPointerUp:u,didDrag:x}}function me(t,o,s){let b=useRef(s);b.current=s,useEffect(()=>{if(!o)return;if(t.supabaseUrl){let f=t.supabaseUrl.replace(/^https:\/\//,"wss://").replace(/^http:\/\//,"ws://"),x=null,y=null,v=null,u=false,l=0,_=()=>{if(!u){try{x=new WebSocket(`${f}/realtime/v1/websocket?apikey=${t.anonKey}&vsn=1.0.0`);}catch{R();return}x.onopen=()=>{if(u||!x)return;let T={topic:`realtime:public:test_run_cases:test_run_id=eq.${o}`,event:"phx_join",payload:{config:{postgres_changes:[{event:"*",schema:"public",table:"test_run_cases",filter:`test_run_id=eq.${o}`}]}},ref:String(++l)};x.send(JSON.stringify(T));let n={topic:`realtime:public:test_runs:id=eq.${o}`,event:"phx_join",payload:{config:{postgres_changes:[{event:"*",schema:"public",table:"test_runs",filter:`id=eq.${o}`}]}},ref:String(++l)};x.send(JSON.stringify(n)),y=setInterval(()=>{x?.readyState===WebSocket.OPEN&&x.send(JSON.stringify({topic:"phoenix",event:"heartbeat",payload:{},ref:String(++l)}));},3e4);},x.onmessage=T=>{try{JSON.parse(T.data).event==="postgres_changes"&&b.current();}catch{}},x.onclose=()=>{M(),u||(v=setTimeout(_,3e3));},x.onerror=()=>{x?.close();};}},M=()=>{y&&(clearInterval(y),y=null);},C=null,R=()=>{u||(C=setInterval(()=>b.current(),15e3));};return _(),()=>{u=true,M(),v&&clearTimeout(v),C&&clearInterval(C),x&&(x.onclose=null,x.onerror=null,x.close());}}let m=setInterval(()=>b.current(),15e3);return ()=>clearInterval(m)},[t.supabaseUrl,t.anonKey,o]);}function se(t,o){let s={apikey:t.anonKey};return o?s.Authorization=`Bearer ${o}`:t.apiKey?s.Authorization=`Bearer ${t.apiKey}`:s.Authorization=`Bearer ${t.anonKey}`,s}async function ct(t){if(t)return t;try{let o=await fetch("/.botbuddy-token",{cache:"no-store"});if(o.ok){let s=(await o.text()).trim();if(s.startsWith("public_"))return s}}catch{}try{let o=import.meta?.env?.VITE_BOTBUDDY_TEST_RUN_TOKEN;if(o&&typeof o=="string"&&o.startsWith("public_"))return o}catch{}return null}function be(t){let[o,s]=useState(null),[b,m]=useState("loading"),f=useCallback(async()=>{try{let u=await ct(t.testRunToken);if(!u){m("no-match"),s(null);return}if(!t.ticketId){m("no-match"),s(null);return}let l=new URLSearchParams;l.set("token",u),l.set("ticket_id",t.ticketId),l.set("app_slug",t.appSlug),t.environment&&l.set("environment",t.environment),t.testRunId&&l.set("test_run_id",t.testRunId),t.targetUrl&&l.set("target_url",t.targetUrl),t.version&&l.set("version",t.version),t.commitSha&&l.set("commit_sha",t.commitSha),t.prNumber&&l.set("pr_number",String(t.prNumber)),t.branchName&&l.set("branch_name",t.branchName);let _=await fetch(`${t.config.serverUrl}/widget/test-run?${l.toString()}`,{headers:se(t.config,t.authToken)});if(_.status===404){m("no-match"),s(null);return}if(_.status===401||_.status===403){m("error");return}if(!_.ok){m("error");return}let M=await _.json();s(M),m(M.status==="completed"?"completed":"ready");}catch{m("error");}},[t.config.serverUrl,t.config.anonKey,t.config.apiKey,t.authToken,t.appSlug,t.environment,t.ticketId,t.testRunId,t.testRunToken,t.targetUrl,t.version,t.commitSha,t.branchName,t.prNumber]);return useEffect(()=>{f();},[f]),me(t.config,o?.id,f),{run:o,widgetState:b,fetchRun:f,setVerdict:async(u,l,_,M="human")=>(s(R=>{if(!R)return null;let T=R.test_cases.map(d=>d.id===u?{...d,verdict:l,fail_reason:l==="fail"&&_||null,verdict_by_display_name:M,verdict_at:new Date().toISOString()}:d),n={total:T.length,pending:0,pass:0,fail:0,skip:0};return T.forEach(d=>{d.verdict in n&&n[d.verdict]++;}),{...R,test_cases:T,summary:n}}),(await fetch(`${t.config.serverUrl}/widget/test-cases/${u}/verdict`,{method:"POST",headers:{"Content-Type":"application/json",...se(t.config,t.authToken)},body:JSON.stringify({verdict:l,fail_reason:_,display_name:M})})).ok),markComplete:async()=>o?(s(l=>l?{...l,status:"completed"}:null),m("completed"),(await fetch(`${t.config.serverUrl}/widget/test-runs/${o.id}/complete`,{method:"POST",headers:{"Content-Type":"application/json",...se(t.config,t.authToken)}})).ok):false,resetRun:async()=>{if(!o)return false;let u=await fetch(`${t.config.serverUrl}/widget/test-runs/${o.id}/reset`,{method:"POST",headers:{"Content-Type":"application/json",...se(t.config,t.authToken)}});return u.ok&&f(),u.ok},setRun:s}}var ye="botbuddy-widget-auth-token",he="botbuddy-widget-auth-name";function ve(t){let[o,s]=useState(()=>{try{return localStorage.getItem(ye)}catch(y){return console.warn("Unable to read BotBuddy widget auth token",y),null}}),[b,m]=useState(()=>{try{return localStorage.getItem(he)}catch(y){return console.warn("Unable to read BotBuddy widget display name",y),null}});useEffect(()=>{let y=new URL(t).origin,v=u=>{if(u.origin===y&&u.data?.type==="botbuddy-widget-auth"&&u.data.token){let{token:l,displayName:_}=u.data;s(l),m(_||"human");try{localStorage.setItem(ye,l),_&&localStorage.setItem(he,_);}catch(M){console.warn("Unable to persist BotBuddy widget auth token",M);}}};return window.addEventListener("message",v),()=>window.removeEventListener("message",v)},[t]);let f=useCallback(()=>{let y=new URL("/widget-auth",t);y.searchParams.set("origin",window.location.origin);let v=420,u=520,l=window.screenX+(window.innerWidth-v)/2,_=window.screenY+(window.innerHeight-u)/2;window.open(y.toString(),"botbuddy-auth",`width=${v},height=${u},left=${l},top=${_},popup=yes`);},[t]),x=useCallback(()=>{s(null),m(null);try{localStorage.removeItem(ye),localStorage.removeItem(he);}catch(y){console.warn("Unable to clear BotBuddy widget auth token",y);}},[]);return {token:o,displayName:b,isAuthenticated:!!o,openLogin:f,logout:x}}function gt(t){let o=new Date(t),b=Date.now()-o.getTime();if(b<6e4)return "just now";if(b<36e5)return `${Math.floor(b/6e4)}m ago`;if(b<864e5)return `${Math.floor(b/36e5)}h ago`;let m=o.getDate(),f=o.toLocaleString("en",{month:"short"}),x=o.toLocaleString("en",{hour:"numeric",minute:"2-digit",hour12:true});return `${f} ${m}, ${x}`}var g=({d:t,className:o,size:s=14})=>jsx("svg",{className:o,width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:t})}),c={clipboard:"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2",check:"M22 11.08V12a10 10 0 1 1-5.93-9.14M22 4 12 14.01l-3-3",x:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20M15 9l-6 6M9 9l6 6",circle:"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20",skip:"M5 4l10 8-10 8V4M19 5v14",grip:"M9 5h.01M15 5h.01M9 12h.01M15 12h.01M9 19h.01M15 19h.01",minus:"M5 12h14",chevronUp:"M18 15l-6-6-6 6",chevronDown:"M6 9l6 6 6-6",externalLink:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6M15 3h6v6M10 14L21 3",pr:"M6 3v18M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6M6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6M18 9a9 9 0 0 1-9 9",ticket:"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z",loader:"M21 12a9 9 0 1 1-6.219-8.56",checkAll:"M18 6L7 17l-5-5M22 10l-7.5 7.5L13 16",alert:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0M12 9v4M12 17h.01",user:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2M12 3a4 4 0 1 0 0 8 4 4 0 0 0 0-8",bot:"M12 8V4H8M2 14h2M20 14h2M15 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M9 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2M18 10a6 6 0 0 0-12 0v4a6 6 0 0 0 12 0Z",terminal:"M4 17l6-6-6-6M12 19h8",key:"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4",shield:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10",copy:"M20 9h-9a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-9a2 2 0 0 0-2-2ZM5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1",search:"M11 17.25a6.25 6.25 0 1 1 0-12.5 6.25 6.25 0 0 1 0 12.5ZM16 16l4.5 4.5"};function ft(){let[t,o]=useState(()=>typeof window>"u"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return useEffect(()=>{if(typeof window>"u")return;let s=document.documentElement,b=()=>s.classList.contains("dark")?"dark":s.classList.contains("light")?"light":null,m=b();m&&o(m);let f=window.matchMedia("(prefers-color-scheme: dark)"),x=v=>{let u=b();o(u||(v.matches?"dark":"light"));};f.addEventListener("change",x);let y=new MutationObserver(()=>{let v=b();o(v||(f.matches?"dark":"light"));});return y.observe(s,{attributes:true,attributeFilter:["class"]}),()=>{f.removeEventListener("change",x),y.disconnect();}},[]),t}function xt(t){let o=t==="dark";return {bg:o?"rgb(30,30,30)":"rgb(255,255,255)",bgSoft:o?"rgba(255,255,255,0.02)":"rgba(0,0,0,0.02)",text:o?"#e5e5e5":"#1a1a1a",textMuted:o?"rgba(255,255,255,0.4)":"rgba(0,0,0,0.45)",textFaint:o?"#555":"#999",border:o?"rgba(255,255,255,0.15)":"rgba(0,0,0,0.12)",borderSubtle:o?"rgba(255,255,255,0.06)":"rgba(0,0,0,0.06)",shadow:o?"rgba(0,0,0,0.4)":"rgba(0,0,0,0.12)",inputBg:o?"rgba(0,0,0,0.3)":"rgba(0,0,0,0.04)",inputBorder:o?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.12)",green:"#34d399",greenBg:o?"rgba(52,211,153,0.05)":"rgba(52,211,153,0.08)",greenBorder:o?"rgba(52,211,153,0.6)":"rgba(52,211,153,0.5)",greenBorderSubtle:o?"rgba(52,211,153,0.2)":"rgba(52,211,153,0.15)",red:"#f87171",amber:"#f59e0b",blue:"#60a5fa",purple:"#a78bfa",versionText:o?"rgba(255,255,255,0.5)":"rgba(0,0,0,0.35)",versionNum:o?"rgba(255,255,255,0.3)":"rgba(0,0,0,0.2)",gripColor:o?"#888":"#aaa",btnHover:o?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.06)"}}var mt={pending:"#888",pass:"#34d399",fail:"#f87171",skip:"#f59e0b"},bt={pending:c.circle,pass:c.check,fail:c.x,skip:c.skip},Oe={local:{bg:"rgba(59,130,246,0.15)",text:"#60a5fa",border:"rgba(59,130,246,0.3)"},preview:{bg:"rgba(168,85,247,0.15)",text:"#c084fc",border:"rgba(168,85,247,0.3)"},staging:{bg:"rgba(245,158,11,0.15)",text:"#fbbf24",border:"rgba(245,158,11,0.3)"},production:{bg:"rgba(239,68,68,0.15)",text:"#f87171",border:"rgba(239,68,68,0.3)"},custom:{bg:"rgba(128,128,128,0.15)",text:"#888",border:"rgba(128,128,128,0.3)"}},yt=t=>({root:{position:"fixed",zIndex:9999,userSelect:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},pill:o=>({display:"inline-flex",alignItems:"center",gap:"6px",padding:"4px 8px",borderRadius:"9999px",background:t.bg,border:o?`1px solid ${t.greenBorder}`:`1px solid ${t.border}`,boxShadow:o?`0 4px 12px ${t.shadow}, 0 0 0 1px ${t.greenBorderSubtle}`:`0 4px 12px ${t.shadow}`,cursor:"pointer",fontSize:"9px",color:t.text}),card:(o,s)=>({width:`${o}px`,borderRadius:"8px",background:t.bg,border:s?`1px solid ${t.greenBorder}`:`1px solid ${t.border}`,boxShadow:s?`0 8px 24px ${t.shadow}, 0 0 0 1px ${t.greenBorderSubtle}`:`0 8px 24px ${t.shadow}`,overflow:"hidden",display:"flex",flexDirection:"column"}),handle:{padding:"8px 12px",display:"flex",alignItems:"center",gap:"8px",cursor:"grab",borderBottom:`1px solid ${t.borderSubtle}`},title:{fontSize:"10px",fontWeight:600,color:t.text,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},sub:{fontSize:"9px",color:t.textMuted,display:"flex",alignItems:"center",gap:"6px"},btn:{padding:"2px",borderRadius:"4px",background:"transparent",border:"none",cursor:"pointer",color:t.gripColor,display:"flex",flexShrink:0},stats:{padding:"4px 12px",display:"flex",alignItems:"center",gap:"8px",fontSize:"9px",borderBottom:`1px solid ${t.borderSubtle}`},badge:o=>{let s=Oe[o]||Oe.custom;return {fontSize:"8px",padding:"0 4px",borderRadius:"4px",background:s.bg,color:s.text,border:`1px solid ${s.border}`,lineHeight:"14px"}},progress:{height:"2px",background:t.borderSubtle,flexShrink:0},progressBar:o=>({height:"100%",width:`${o}%`,background:"linear-gradient(to right, #34d399, #3b82f6)",transition:"width 0.5s"}),link:o=>({display:"inline-flex",alignItems:"center",gap:"4px",fontSize:"9px",padding:"2px 6px",borderRadius:"4px",background:`${o}15`,color:o,textDecoration:"none",border:"none",cursor:"pointer"}),caseRow:{padding:"6px 12px",borderBottom:`1px solid ${t.borderSubtle}`,transition:"background 0.15s"},verdictBtn:(o,s)=>({fontSize:"8px",padding:"2px 6px",borderRadius:"4px",border:"none",cursor:"pointer",background:o?`${s}33`:"transparent",color:o?s:t.gripColor,transition:"all 0.15s"}),input:{flex:1,fontSize:"9px",background:t.inputBg,border:`1px solid ${t.inputBorder}`,borderRadius:"4px",padding:"2px 6px",color:t.text,outline:"none"},humanBanner:{padding:"6px 12px",fontSize:"11px",fontWeight:600,color:t.green,borderBottom:`1px solid ${t.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",background:t.greenBg,cursor:"pointer",textDecoration:"none"}});function ht({config:t,appSlug:o,environment:s,seedUserSlug:b,authToken:m,tk:f}){let[x,y]=useState(null),[v,u]=useState(0),[l,_]=useState(false),[M,C]=useState(null),[R,T]=useState(false),n=useRef(null),d=useMemo(()=>b.split("/")[0].trim(),[b]),K=useCallback(async()=>{_(true),C(null);try{let $=new URLSearchParams({app_slug:o,seed_user_slug:d,environment:s}),E={apikey:t.anonKey};m?E.Authorization=`Bearer ${m}`:E.Authorization=`Bearer ${t.anonKey}`;let B=await fetch(`${t.serverUrl}/widget/totp-code?${$}`,{headers:E});if(!B.ok){let w=await B.json().catch(()=>({error:"Failed"}));if(B.status===404){C("No 2FA seed registered");return}C(w.error||"Failed to get code");return}let U=await B.json();y(U.code),u(U.remaining_seconds);try{await navigator.clipboard.writeText(U.code),T(!0),setTimeout(()=>T(!1),2e3);}catch{}n.current&&clearInterval(n.current);let V=U.remaining_seconds;n.current=setInterval(()=>{V--,V<=0?(n.current&&clearInterval(n.current),K()):u(V);},1e3);}catch{C("Network error");}finally{_(false);}},[t.serverUrl,t.anonKey,m,o,d,s]);return useEffect(()=>()=>{n.current&&clearInterval(n.current);},[]),M==="No 2FA seed registered"?null:x?jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"3px"},children:[jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:"6px",padding:"3px 8px",borderRadius:"4px",background:`${f.purple}15`,border:`1px solid ${f.purple}40`,fontSize:"12px",fontFamily:"ui-monospace, monospace",fontWeight:700,color:f.purple,letterSpacing:"0.15em"},children:[jsx(g,{d:c.shield,size:11}),jsx("span",{children:x}),jsxs("span",{style:{fontSize:"8px",fontWeight:400,color:f.textMuted,letterSpacing:"0"},children:[v,"s"]})]}),jsx("button",{onClick:$=>{$.stopPropagation(),navigator.clipboard.writeText(x).then(()=>{T(true),setTimeout(()=>T(false),1500);});},style:{padding:"2px",background:"none",border:"none",cursor:"pointer",color:R?f.green:f.gripColor,fontSize:"8px"},title:"Copy code",children:R?jsx(g,{d:c.check,size:10}):jsx(g,{d:c.copy,size:10})})]}):jsxs("button",{onClick:$=>{$.stopPropagation(),K();},disabled:l,style:{display:"inline-flex",alignItems:"center",gap:"4px",marginTop:"3px",fontSize:"8px",padding:"2px 6px",borderRadius:"4px",background:`${f.purple}12`,color:f.purple,border:`1px solid ${f.purple}30`,cursor:l?"wait":"pointer",opacity:l?.6:1},children:[jsx(g,{d:c.shield,size:9}),l?"generating...":M||"Get 2FA code"]})}var Ke="botbuddy-widget-state";function vt({config:t,appSlug:o,environment:s,ticketId:b,testRunId:m,testRunToken:f,targetUrl:x,version:y,commitSha:v,prNumber:u,branchName:l,onNavigate:_,displayName:M="human",defaultMode:C="mini",defaultPosition:R}){let T=ft(),n=useMemo(()=>xt(T),[T]),d=useMemo(()=>yt(n),[n]),[K,$]=useState(false),[E,B]=useState(false),U=useRef(false),V=t.dashboardUrl||"https://botbuddy.lovable.app",w=ve(V),le=(()=>{try{let e=typeof window<"u"?localStorage.getItem(Ke):null;if(e)return JSON.parse(e)}catch{}return null})(),[j,Y]=useState(le?.mode||C),[de,re]=useState(""),[Ve,J]=useState(null),[_e,Se]=useState(null),[je,Ye]=useState(new Set),[N,we]=useState(""),Je=useCallback(e=>{Ye(p=>{let h=new Set(p);return h.has(e)?h.delete(e):h.add(e),h});},[]),Ge=le?.x??R?.x??16,qe=le?.y??R?.y??(typeof window<"u"?window.innerHeight-56:600),{pos:P,onPointerDown:G,onPointerMove:q,onPointerUp:X,didDrag:pe}=xe(Ge,qe);useEffect(()=>{try{localStorage.setItem(Ke,JSON.stringify({mode:j,x:P.x,y:P.y}));}catch{}},[j,P.x,P.y]);let ke=useRef(w.isAuthenticated);useEffect(()=>{!ke.current&&w.isAuthenticated&&Y("max"),ke.current=w.isAuthenticated;},[w.isAuthenticated]);let Me="botbuddy-widget-max-size",Xe=()=>{try{let e=localStorage.getItem(Me);if(e)return JSON.parse(e)}catch{}return {w:340,h:500}},[Z,Te]=useState(Xe),Q=useRef(false),ee=useRef({x:0,y:0,w:0,h:0}),Ze=useCallback(e=>{e.stopPropagation(),Q.current=true,ee.current={x:e.clientX,y:e.clientY,w:Z.w,h:Z.h},e.target.setPointerCapture(e.pointerId);},[Z]),Qe=useCallback(e=>{if(!Q.current)return;let p=Math.max(280,Math.min(600,ee.current.w+(e.clientX-ee.current.x))),h=Math.max(300,Math.min(window.innerHeight*.9,ee.current.h+(e.clientY-ee.current.y)));Te({w:p,h});},[]),et=useCallback(()=>{Q.current&&(Q.current=false,Te(e=>(localStorage.setItem(Me,JSON.stringify(e)),e)));},[]),oe=x??(typeof window<"u"?window.location.href:void 0),ze=w.displayName||M,[W,Ce]=useState(null);useEffect(()=>{if(w.isAuthenticated)return;let e=new URLSearchParams;f&&e.set("token",f),b&&e.set("ticket_id",b),e.set("app_slug",o),s&&e.set("environment",s),m&&e.set("test_run_id",m),oe&&e.set("target_url",oe),y&&e.set("version",y),v&&e.set("commit_sha",v),u&&e.set("pr_number",String(u)),l&&e.set("branch_name",l),fetch(`${t.serverUrl}/widget/preview?${e}`,{headers:{apikey:t.anonKey}}).then(p=>p.json()).then(p=>Ce(p)).catch(()=>Ce(null));},[w.isAuthenticated,t.serverUrl,t.anonKey,o,s,b,m,f,oe,y,v,u,l]);let{run:a,widgetState:D,fetchRun:tt,setVerdict:Re,markComplete:nt,resetRun:rt}=be({config:t,appSlug:o,environment:s,ticketId:b,testRunId:m,testRunToken:f,targetUrl:oe,version:y,commitSha:v,prNumber:u?String(u):void 0,branchName:l,authToken:w.token}),ie=useCallback(async(e,p,h)=>{Se(e);try{await Re(e,p,h,ze);}finally{Se(null),J(null),re("");}},[Re,ze]),S=a?.summary||{total:0,pending:0,pass:0,fail:0,skip:0},ot=S.total>0&&S.pending===0,A=D==="completed",ae=useMemo(()=>{let e=a?.test_cases||[];if(!N.trim())return e;let p=N.toLowerCase();return e.filter(h=>h.title.toLowerCase().includes(p)||h.description&&h.description.toLowerCase().includes(p)||h.url_path&&h.url_path.toLowerCase().includes(p)||h.seed_user&&h.seed_user.toLowerCase().includes(p))},[a?.test_cases,N]),$e=useMemo(()=>{let e=ae,p=a?.test_cases||[];if(new Set(p.map(z=>z.source_pr_number)).size<=1)return null;let I=[],te=new Map;e.forEach(z=>{let L=z.source_pr_number;te.has(L)||te.set(L,[]),te.get(L).push(z);});let it=[...te.keys()].sort((z,L)=>z===null?1:L===null?-1:L-z);for(let z of it){let L=te.get(z),ue={total:L.length,pass:0,fail:0,skip:0,pending:0};L.forEach(Ne=>{Ne.verdict in ue&&ue[Ne.verdict]++;}),I.push({key:z!=null?`pr-${z}`:"general",label:z!=null?`PR #${z}`:"General",cases:L,summary:ue});}return I.filter(z=>z.cases.length>0)},[ae,a?.test_cases]),Be=S.total>0?(S.pass+S.fail)/S.total*100:0,ce=useMemo(()=>{let e=a?.auto_tooltip_seconds??W?.auto_tooltip_seconds;return e!=null&&e>0?e*1e3:5e3},[a,W]),Pe=D==="ready"||D==="completed"||W?.enabled&&W.run;useEffect(()=>{if(!Pe||U.current||ce<=0)return;U.current=true,B(true);let e=window.setTimeout(()=>B(false),ce);return ()=>window.clearTimeout(e)},[Pe,ce]);let Ie=e=>jsxs("div",{style:d.caseRow,children:[jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"8px"},children:[jsx("div",{style:{marginTop:"2px",flexShrink:0,color:mt[e.verdict]},children:_e===e.id?jsx(g,{d:c.loader,className:""}):jsx(g,{d:bt[e.verdict],className:""})}),jsxs("div",{style:{minWidth:0,flex:1},children:[jsx("div",{style:{fontSize:"10px",color:n.text,lineHeight:1.3},children:e.title}),e.description&&jsx("div",{style:{fontSize:"9px",color:n.gripColor,marginTop:"2px"},children:e.description}),e.seed_user&&jsxs("div",{children:[jsxs("div",{style:{fontSize:"9px",color:n.amber,marginTop:"3px",display:"flex",alignItems:"center",gap:"4px",padding:"2px 6px",borderRadius:"4px",background:`${n.amber}12`,border:`1px solid ${n.amber}30`},children:[jsx(g,{d:c.key,size:10}),jsx("span",{children:e.seed_user})]}),(s??a?.environment)!=="production"&&(s??a?.environment)&&jsx(ht,{config:t,appSlug:o,environment:s??a?.environment,seedUserSlug:e.seed_user,authToken:w.token,tk:n})]}),e.url_path&&jsxs("a",{href:e.url_path,target:"_blank",rel:"noopener noreferrer",onClick:p=>{p.stopPropagation(),_&&(p.preventDefault(),_(e.url_path));},style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",padding:"2px 0",marginTop:"2px",display:"inline-flex",alignItems:"center",gap:"2px",textDecoration:"none",position:"relative",zIndex:1,pointerEvents:"auto"},children:[jsx(g,{d:c.externalLink,size:10}),e.url_path]}),e.verdict==="fail"&&e.fail_reason&&jsxs("div",{style:{fontSize:"9px",color:n.red,marginTop:"2px"},children:["\u2717 ",e.fail_reason]})]})]}),jsxs("div",{style:{display:"flex",alignItems:"center",gap:"4px",marginTop:"4px",marginLeft:"22px"},children:[["pass","fail","skip"].map(p=>jsx("button",{onClick:()=>{if(e.verdict===p){ie(e.id,"pending"),J(null);return}if(p==="fail"){J(e.id),re("");return}J(null),ie(e.id,p);},disabled:_e!==null,style:d.verdictBtn(e.verdict===p,p==="pass"?n.green:p==="fail"?n.red:n.amber),children:p.toUpperCase()},p)),e.created_by_agent_name&&jsxs("span",{style:{fontSize:"8px",color:n.purple,marginLeft:"4px",display:"inline-flex",alignItems:"center",gap:"2px"},children:[jsx(g,{d:c.bot,size:8}),e.created_by_agent_name]}),e.verdict_by_display_name&&jsxs("span",{style:{fontSize:"8px",color:n.textFaint,marginLeft:"auto",display:"inline-flex",alignItems:"center",gap:"3px"},children:[e.verdict_by_display_name,e.verdict_at&&jsx("span",{style:{opacity:.7},children:gt(e.verdict_at)})]})]}),Ve===e.id&&jsxs("div",{style:{marginLeft:"22px",marginTop:"4px",display:"flex",gap:"4px"},children:[jsx("input",{autoFocus:true,value:de,onChange:p=>re(p.target.value),onKeyDown:p=>{p.key==="Enter"&&ie(e.id,"fail",de.trim()||void 0),p.key==="Escape"&&(J(null),re(""));},placeholder:"Reason (optional)...",style:d.input}),jsx("button",{onClick:()=>{ie(e.id,"fail",de.trim()||void 0);},style:d.verdictBtn(true,n.red),children:"\u2713"})]})]},e.id);if((D==="no-match"||D==="loading")&&!(!w.isAuthenticated&&W?.enabled&&W.run))return null;if(!w.isAuthenticated&&W?.enabled&&W.run){let e=W.run,p=e.summary,h=e.status==="completed";return jsx("div",{style:{...d.root,left:P.x,top:P.y},children:jsxs("div",{style:{position:"relative"},onMouseEnter:()=>$(true),onMouseLeave:()=>$(false),children:[jsxs("div",{style:{...d.pill(h),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:G,onPointerMove:q,onPointerUp:()=>{X();},children:[jsx(g,{d:c.grip,size:10,className:""}),e.ticket_id&&e.ticket_url?jsx("a",{href:e.ticket_url,target:"_blank",rel:"noopener noreferrer",onClick:I=>I.stopPropagation(),style:{color:n.amber,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:e.ticket_id}):null,e.pr_url?jsxs("a",{href:e.pr_url,target:"_blank",rel:"noopener noreferrer",onClick:I=>I.stopPropagation(),style:{color:n.blue,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:["PR#",e.pr_number??e.pr_id]}):null,e.created_by_agent_name?e.codex_thread_id?jsxs("a",{href:`codex://threads/${e.codex_thread_id}`,onClick:I=>I.stopPropagation(),style:{color:n.purple,textDecoration:"none",fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsx(g,{d:c.terminal,size:10}),e.created_by_agent_name]}):jsxs("span",{style:{color:n.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsx(g,{d:c.bot,size:10}),e.created_by_agent_name]}):null,jsxs("span",{style:h?{color:n.green}:void 0,children:[p.pass,"/",p.total]}),p.fail>0&&jsxs("span",{style:{color:n.red},children:[p.fail,"\u2717"]}),jsx("span",{onClick:I=>{I.stopPropagation(),w.openLogin();},style:{color:n.textMuted,fontWeight:400,cursor:"pointer",textDecoration:"underline",textUnderlineOffset:"2px"},children:"Sign in"})]}),(K||E)&&e.title&&jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:n.bg,border:`1px solid ${n.border}`,boxShadow:`0 8px 24px ${n.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsx("div",{style:{fontSize:"13px",fontWeight:700,color:n.text,lineHeight:1.3},children:e.title}),(e.description||e.intro_notes)&&jsx("div",{style:{fontSize:"11px",color:n.textMuted,marginTop:"6px",lineHeight:1.4},children:e.description||e.intro_notes}),jsx("div",{style:{marginTop:"6px",fontSize:"9px",color:n.textFaint},children:'Click "Sign in" to start testing'})]})]})})}if(!w.isAuthenticated)return jsxs("div",{style:{...d.root,left:P.x,top:P.y,width:220,minHeight:0,cursor:"move",userSelect:"none",borderRadius:"8px",background:n.bg,border:`1px solid ${n.border}`,boxShadow:`0 8px 24px ${n.shadow}`},onPointerDown:G,onPointerMove:q,onPointerUp:X,children:[jsx("div",{style:{...d.handle,borderBottom:"none"},children:jsxs("div",{style:d.sub,children:[jsx(g,{d:c.grip,size:10,className:""}),jsx(g,{d:c.clipboard,size:12,className:""}),jsx("span",{style:{fontWeight:600},children:"BotBuddy"})]})}),jsxs("div",{style:{padding:"12px 14px",textAlign:"center"},children:[jsx("div",{style:{fontSize:"9px",color:n.textMuted,marginBottom:"8px"},children:"Sign in to access test cases"}),jsx("button",{onClick:e=>{e.stopPropagation(),w.openLogin();},style:{fontSize:"10px",fontWeight:600,padding:"6px 16px",borderRadius:"6px",border:`1px solid ${n.green}`,background:`${n.green}22`,color:n.green,cursor:"pointer",width:"100%"},children:"Sign in to test"})]})]});let Le=()=>{pe.current||(B(false),Y(e=>e==="mini"?"max":"mini"));},We=({icon:e,onClick:p})=>jsx("button",{style:d.btn,onClick:h=>{h.stopPropagation(),p(h);},children:jsx(g,{d:e,className:""})}),Ue=()=>{if(!a?.assigned_human_display_name)return null;let e=jsxs(Fragment,{children:[jsx("span",{style:{width:7,height:7,borderRadius:"50%",background:n.green,display:"inline-block",flexShrink:0,boxShadow:`0 0 6px ${n.green}66`}}),jsx(g,{d:c.user,size:13}),jsx("span",{style:{flex:1},children:a.assigned_human_display_name}),a.codex_thread_id&&jsx(g,{d:c.externalLink,size:10})]});return a.codex_thread_id?jsx("a",{href:`codex://threads/${a.codex_thread_id}`,style:d.humanBanner,children:e}):jsx("div",{style:d.humanBanner,children:e})},De=()=>jsxs("div",{style:{padding:"6px 12px",display:"flex",gap:"8px",flexWrap:"wrap",alignItems:"center",borderTop:`1px solid ${n.borderSubtle}`,flexShrink:0},children:[a?.pr_url&&jsxs("a",{href:a.pr_url,target:"_blank",rel:"noopener noreferrer",style:{...d.link(n.blue),textDecoration:"none"},children:[jsx(g,{d:c.pr,size:12}),a.pr_number?`PR#${a.pr_number}`:a.pr_id||"PR",jsx(g,{d:c.externalLink,size:8})]}),a?.ticket_url&&jsxs("a",{href:a.ticket_url,target:"_blank",rel:"noopener noreferrer",style:{...d.link(n.amber),textDecoration:"none"},children:[jsx(g,{d:c.ticket,size:12}),a.ticket_id||"Ticket",jsx(g,{d:c.externalLink,size:8})]}),a?.created_by_agent_name&&(a.codex_thread_id?jsxs("a",{href:`codex://threads/${a.codex_thread_id}`,style:{...d.link(n.purple),textDecoration:"none"},children:[jsx(g,{d:c.bot,size:12}),a.created_by_agent_name,jsx(g,{d:c.externalLink,size:8})]}):jsxs("span",{style:{...d.link(n.purple)},children:[jsx(g,{d:c.bot,size:12}),a.created_by_agent_name]})),jsx("span",{style:{...d.badge(a?.environment||"custom"),marginLeft:"auto"},children:a?.environment})]}),Ee=()=>jsxs("div",{style:{padding:"4px 12px",display:"flex",alignItems:"center",justifyContent:"center",borderTop:`1px solid ${n.borderSubtle}`,background:n.bgSoft,flexShrink:0},children:[jsxs("button",{onClick:()=>{navigator.clipboard.writeText("0.5.10");},style:{fontSize:"9px",fontWeight:600,color:n.versionText,letterSpacing:"0.08em",background:"none",border:"none",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"4px",padding:0},title:"Copy version",children:["BotBuddy ",jsx("span",{style:{color:n.versionNum},children:"v0.5.10"})]}),w.isAuthenticated&&jsx("button",{onClick:e=>{e.stopPropagation(),w.logout();},style:{fontSize:"8px",color:n.textFaint,background:"none",border:"none",cursor:"pointer",marginLeft:"8px",padding:"0 4px",textDecoration:"underline"},title:"Sign out of widget",children:"sign out"})]});return jsxs("div",{style:{...d.root,left:P.x,top:P.y},children:[j==="mini"&&jsxs("div",{style:{position:"relative"},onMouseEnter:()=>$(true),onMouseLeave:()=>$(false),children:[jsxs("div",{style:{...d.pill(A),gap:"8px",padding:"5px 10px",fontSize:"10px"},onPointerDown:G,onPointerMove:q,onPointerUp:()=>{X(),pe.current||Le();},children:[jsx(g,{d:c.grip,size:10,className:""}),a?.ticket_id&&jsx("span",{style:{color:n.amber,fontWeight:600},children:a.ticket_id}),a?.pr_number&&jsxs("span",{style:{color:n.blue,fontWeight:600},children:["PR#",a.pr_number]}),a?.created_by_agent_name&&(a.codex_thread_id?jsxs("a",{href:`codex://threads/${a.codex_thread_id}`,onClick:e=>e.stopPropagation(),style:{color:n.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px",textDecoration:"none",cursor:"pointer"},children:[jsx(g,{d:c.terminal,size:10}),a.created_by_agent_name,jsx(g,{d:c.externalLink,size:8})]}):jsxs("span",{style:{color:n.purple,fontWeight:600,display:"inline-flex",alignItems:"center",gap:"3px"},children:[jsx(g,{d:c.bot,size:10}),a.created_by_agent_name]})),jsxs("span",{style:A?{color:n.green}:void 0,children:[S.pass,"/",S.total]}),S.fail>0&&jsxs("span",{style:{color:n.red},children:[S.fail,"\u2717"]})]}),(K||E)&&a?.title&&jsxs("div",{style:{position:"absolute",top:"calc(100% + 6px)",left:0,minWidth:"220px",maxWidth:"320px",padding:"10px 14px",borderRadius:"8px",background:n.bg,border:`1px solid ${n.border}`,boxShadow:`0 8px 24px ${n.shadow}`,pointerEvents:"none",fontFamily:"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"},children:[jsx("div",{style:{fontSize:"13px",fontWeight:700,color:n.text,lineHeight:1.3},children:a.title}),(a.description||a.intro_notes)&&jsx("div",{style:{fontSize:"11px",color:n.textMuted,marginTop:"6px",lineHeight:1.4},children:a.description||a.intro_notes})]})]}),j==="expanded"&&jsxs("div",{style:d.card(300,A),children:[jsx(Ue,{}),jsxs("div",{style:d.handle,onPointerDown:G,onPointerMove:q,onPointerUp:X,onClick:Le,children:[jsx(g,{d:c.grip,className:""}),jsxs("div",{style:{flex:1,minWidth:0},children:[jsx("div",{style:d.title,children:a?.title}),jsx("div",{style:d.sub,children:a?.branch_name&&jsxs("span",{children:["\u2387 ",a.branch_name]})})]}),jsx(g,{d:c.chevronUp,className:""}),jsx(We,{icon:c.minus,onClick:()=>{B(false),Y("mini");}})]}),jsxs("div",{style:d.stats,children:[jsxs("span",{style:{color:n.green},children:[S.pass,"\u2713"]}),jsxs("span",{style:{color:n.red},children:[S.fail,"\u2717"]}),jsxs("span",{style:{color:n.amber},children:[S.skip,"\u23ED"]}),jsxs("span",{style:{color:n.gripColor},children:[S.pending,"\u25CC"]}),jsx("span",{style:{color:n.textFaint,marginLeft:"auto"},children:S.total})]}),a?.description&&jsx("div",{style:{padding:"6px 12px",fontSize:"10px",color:n.gripColor,borderBottom:`1px solid ${n.borderSubtle}`,flexShrink:0},children:a.description}),jsx(De,{}),jsx(Ee,{}),jsx("div",{style:d.progress,children:jsx("div",{style:d.progressBar(Be)})})]}),j==="max"&&jsxs("div",{style:{...d.card(Z.w,A),height:Z.h,position:"relative"},children:[jsx(Ue,{}),jsxs("div",{style:d.handle,onPointerDown:G,onPointerMove:q,onPointerUp:X,onClick:()=>{pe.current||Y("expanded");},children:[jsx(g,{d:c.grip,className:""}),jsxs("div",{style:{flex:1,minWidth:0},children:[jsx("div",{style:d.title,children:a?.title}),jsx("div",{style:d.sub,children:a?.branch_name&&jsxs("span",{children:["\u2387 ",a.branch_name]})})]}),jsx(g,{d:c.chevronDown,className:""}),jsx(We,{icon:c.minus,onClick:()=>{B(false),Y("mini");}})]}),jsxs("div",{style:d.stats,children:[jsxs("span",{style:{color:n.green},children:[S.pass,"\u2713"]}),jsxs("span",{style:{color:n.red},children:[S.fail,"\u2717"]}),jsxs("span",{style:{color:n.amber},children:[S.skip,"\u23ED"]}),jsxs("span",{style:{color:n.gripColor},children:[S.pending,"\u25CC"]}),jsx("span",{style:{color:n.textFaint,marginLeft:"auto"},children:S.total})]}),(a?.test_cases||[]).length>5&&jsxs("div",{style:{padding:"4px 12px",borderBottom:`1px solid ${n.borderSubtle}`,display:"flex",alignItems:"center",gap:"6px",flexShrink:0},children:[jsx(g,{d:c.search,size:11,className:""}),jsx("input",{value:N,onChange:e=>we(e.target.value),placeholder:"Filter test cases...",style:{flex:1,fontSize:"10px",background:"transparent",border:"none",outline:"none",color:n.text,fontFamily:"monospace"}}),N&&jsx("button",{onClick:()=>we(""),style:{background:"none",border:"none",cursor:"pointer",color:n.textFaint,fontSize:"10px",padding:0},children:"\u2715"})]}),D==="error"&&jsxs("div",{style:{padding:"12px",textAlign:"center"},children:[jsx(g,{d:c.alert,className:""}),jsx("div",{style:{fontSize:"10px",color:n.red},children:"Failed to load"}),jsx("button",{onClick:tt,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer",marginTop:"4px"},children:"Retry"})]}),A&&jsxs("div",{style:{padding:"6px 12px",display:"flex",alignItems:"center",gap:"8px",borderBottom:`1px solid ${n.greenBorderSubtle}`,background:n.greenBg},children:[jsx(g,{d:c.checkAll,className:""}),jsx("span",{style:{fontSize:"10px",color:n.green,flex:1},children:"Run completed"}),jsx("button",{onClick:rt,style:{fontSize:"9px",color:"#3b82f6",background:"none",border:"none",cursor:"pointer"},children:"Reset"})]}),a?.intro_notes&&jsx("div",{style:{padding:"6px 12px",borderBottom:`1px solid ${n.borderSubtle}`,fontSize:"10px",color:n.textMuted,fontStyle:"italic",flexShrink:0},children:a.intro_notes}),D!=="error"&&jsx("div",{style:{flex:1,overflowY:"auto",minHeight:0},children:(a?.test_cases||[]).length===0?jsx("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:n.gripColor},children:"No test cases"}):ae.length===0?jsxs("div",{style:{padding:"16px 12px",textAlign:"center",fontSize:"10px",color:n.gripColor},children:['No matches for "',N,'"']}):$e?$e.map(e=>{let p=je.has(e.key);return jsxs("div",{children:[jsxs("button",{onClick:()=>Je(e.key),style:{width:"100%",display:"flex",alignItems:"center",gap:"6px",padding:"5px 12px",background:n.bgSoft,cursor:"pointer",border:"none",borderLeft:"none",borderRight:"none",borderBottomStyle:"solid",borderTopStyle:"solid",borderBottomWidth:"1px",borderTopWidth:"1px",borderBottomColor:n.borderSubtle,borderTopColor:n.borderSubtle,backgroundColor:n.bgSoft},children:[jsx(g,{d:p?c.chevronDown:c.chevronUp,size:10,className:""}),jsx("span",{style:{fontSize:"10px",fontWeight:700,color:n.blue,flex:1,textAlign:"left"},children:e.label}),jsxs("span",{style:{fontSize:"9px",color:n.green},children:[e.summary.pass,"\u2713"]}),jsxs("span",{style:{fontSize:"9px",color:n.red},children:[e.summary.fail,"\u2717"]}),jsxs("span",{style:{fontSize:"9px",color:n.gripColor},children:[e.summary.pending,"\u25CC"]}),jsx("span",{style:{fontSize:"9px",color:n.textFaint},children:e.summary.total})]}),!p&&e.cases.map(h=>Ie(h))]},e.key)}):ae.map(e=>Ie(e))}),ot&&!A&&jsxs("div",{style:{padding:"6px 12px",borderTop:`1px solid ${n.greenBorderSubtle}`,background:n.greenBg,display:"flex",alignItems:"center",justifyContent:"space-between",flexShrink:0},children:[jsx("span",{style:{fontSize:"9px",color:n.green},children:"All resolved"}),jsx("button",{onClick:nt,style:{fontSize:"8px",padding:"2px 8px",borderRadius:"4px",background:"rgba(52,211,153,0.15)",color:n.green,border:`1px solid ${n.greenBorderSubtle}`,cursor:"pointer"},children:"COMPLETE"})]}),jsx(De,{}),jsx(Ee,{}),jsx("div",{style:d.progress,children:jsx("div",{style:d.progressBar(Be)})}),jsx("div",{style:{position:"absolute",bottom:0,right:0,width:16,height:16,cursor:"se-resize",zIndex:10,display:"flex",alignItems:"flex-end",justifyContent:"flex-end",padding:"2px",opacity:.3},onPointerDown:Ze,onPointerMove:Qe,onPointerUp:et,onPointerEnter:e=>e.currentTarget.style.opacity="0.7",onPointerLeave:e=>{Q.current||(e.currentTarget.style.opacity="0.3");},children:jsx("svg",{width:"8",height:"8",viewBox:"0 0 8 8",children:jsx("path",{d:"M7 1v6H1",fill:"none",stroke:n.gripColor,strokeWidth:"1.5",strokeLinecap:"round"})})})]})]})}
2
+ export{vt as TestRunWidget,xe as useDraggable,me as useRealtimeRefresh,be as useTestRun,ve as useWidgetAuth};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botbuddy/react",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "BotBuddy test coordination widgets for React — draggable, translucent overlays for human-in-the-loop QA",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",