ripplo 0.7.16 → 0.7.17
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.
|
@@ -76,7 +76,7 @@ ${w}`),m.pop(),`{${N}}`}case"number":return isFinite(p)?String(p):t?t(p):"null";
|
|
|
76
76
|
`);case"gitdir-unrecognized":return`Unrecognized .git file at ${e.marker} \u2014 expected a directory or a "gitdir:" pointer (worktree). Is the repo corrupted?`;case"gitdir-empty":return`Empty gitdir pointer at ${e.marker} \u2014 the worktree's .git file points nowhere. Re-create the worktree.`;case"oauth-device-code-failed":return[`Could not start sign-in (device-code request failed): ${e.description}`,"Is the Ripplo server reachable? Check RIPPLO_SERVER_URL and retry."].join(`
|
|
77
77
|
`);case"oauth-authorization-failed":return[`Sign-in failed (${e.code}): ${e.description}`,e.code==="expired_token"?"The approval window expired \u2014 run `npx ripplo auth login` again.":"Run `npx ripplo auth login` to retry."].join(`
|
|
78
78
|
`);case"compilation-failed":return fo(e.error)}}function dC(e){let t=e.missingEnvFiles.length===0?[]:["Declared env files not found:",...e.missingEnvFiles.map(n=>` ${n}`),"In a git worktree? Env files aren't copied from the main checkout \u2014 recreate them, or symlink to a shared file outside the working tree."];return["Env config invalid:",...e.issues.map(n=>` ${n}`),"Add the missing values to the env files declared in .ripplo/project.json.",...t].join(`
|
|
79
|
-
`)}import{err as hC,ok as mC}from"neverthrow";import{z as dl}from"zod";var fC="https://ripplo.ai";function Qp(){return th().RIPPLO_SERVER_URL}function eh(){return th().RIPPLO_PROJECT_ID}var pC=dl.object({RIPPLO_PROJECT_ID:dl.string().min(1).optional(),RIPPLO_SERVER_URL:dl.string().min(1).default(fC)}),Zp;function th(){return Zp??=pC.parse(process.env),Zp}import nh from"fs";import fl from"path";function rh(e){let t=nh.realpathSync(e),n=t,r=fl.dirname(n);for(;r!==n;){if(nh.existsSync(fl.join(n,".git")))return n;n=r,r=fl.dirname(n)}return t}function JW(e){return La(e).andThen(t=>Ji().andThen(n=>{let r=Qp(),i=Ia(r);return i==null?hC({kind:"not-authenticated"}):mC({appUrl:n.appUrl,cwd:rh(e),engineUrl:n.engineUrl,projectId:eh()??t.projectId,ripploServerUrl:r,token:i,webhookSecret:n.webhookSecret})}))}import ih from"fs";import{checkSync as gC,lockSync as yC}from"proper-lockfile";var bC="dev.pid",oh=15e3;function sh(e){return Gt(e,bC)}function ah(e){try{return gC(sh(e),{realpath:!1,stale:oh})}catch{return!1}}var pl=class extends Error{pid;cwd;constructor({cwd:t,pid:n}){super("dev-lock-held"),this.name="DevLockHeldError",this.pid=n,this.cwd=t}};function tz({cwd:e,onCompromised:t}){Ea(e);let n=sh(e),r=SC({cwd:e,onCompromised:t,path:n});return ih.writeFileSync(n,String(process.pid)),()=>{try{r()}catch{}}}function SC({cwd:e,onCompromised:t,path:n}){try{return yC(n,{realpath:!1,stale:oh,onCompromised:()=>{t()}})}catch(r){throw wC(r)?new pl({cwd:e,pid:xC(n)}):r}}function wC(e){if(!(e instanceof Error)||!("code"in e))return!1;let{code:t}=e;return t==="ELOCKED"}function xC(e){try{let t=ih.readFileSync(e,"utf8").trim(),n=Number.parseInt(t,10);return Number.isFinite(n)&&n>0?n:null}catch{return null}}import{createServer as AC}from"http";import{mkdir as IC,rm as PC,writeFile as TC}from"fs/promises";import MC from"path";import{z as ee}from"zod";import vC from"path";import{z as Mr}from"zod";var RC=["unspecified","internal","server","client","producer","consumer"],kC=["unset","ok","error"];function lh(e){return RC[e]??"unspecified"}function uh(e){return kC[e]??"unset"}var oz=Mr.looseObject({data:Mr.looseObject({source:Mr.number().optional()}).optional(),timestamp:Mr.number(),type:Mr.number()});function ch({debugDir:e,runId:t,worker:n}){let r=vC.join(e,t,"behavior.jsonl");return n.open({file:r,runId:t}),{close:i=>n.close({noticeLineIfNoRrweb:i?.noticeIfNoRrweb==null?"":JSON.stringify(CC(i.noticeIfNoRrweb)),runId:t}),emit:i=>{let o={...i,timestamp:EC(i.timeNanos)};n.line({line:JSON.stringify(o),runId:t,timeNanos:i.timeNanos})},emitRrwebBatch:i=>{n.rrwebBatch({data:i,runId:t})}}}function Dn(e){return String(BigInt(Math.round(e))*1000000n)}function CC(e){return{kind:"notice",message:e,source:"capture",timeNanos:"0"}}function EC(e){return Number(BigInt(e)/1000000n)}var OC="otlp-port",fh=ee.object({key:ee.string(),value:ee.object({boolValue:ee.boolean().optional(),doubleValue:ee.number().optional(),intValue:ee.union([ee.string(),ee.number()]).optional(),stringValue:ee.string().optional()})}),NC=ee.object({attributes:ee.array(fh).default([]),endTimeUnixNano:ee.string(),kind:ee.number().default(0),name:ee.string(),parentSpanId:ee.string().optional(),spanId:ee.string(),startTimeUnixNano:ee.string(),status:ee.object({code:ee.number(),message:ee.string().optional()}).optional(),traceId:ee.string()}),$C=ee.object({resourceSpans:ee.array(ee.object({resource:ee.object({attributes:ee.array(fh).default([])}).optional(),scopeSpans:ee.array(ee.object({spans:ee.array(NC).default([])})).default([])})).default([])});async function hl({localDir:e,onRrwebBatch:t,onSpan:n,writePortFile:r}){let{port:i,server:o}=await LC({onRrwebBatch:t,onSpan:n}),s=MC.join(e,OC);return r&&(await IC(e,{recursive:!0}),await TC(s,String(i),{encoding:"utf8"})),{port:i,stop:async()=>{r&&await PC(s,{force:!0}),await BC(o)}}}function LC(e){return new Promise((t,n)=>{let r=AC((i,o)=>{_C(i,o,e)});r.on("error",n),r.listen(0,()=>{let i=r.address();if(i==null||typeof i=="string"){n(new Error("otlp_receiver_no_port"));return}t({port:i.port,server:r})})})}function _C(e,t,n){let r=DC(e.url);if(r!=null){dh(e).then(i=>{n.onRrwebBatch(r,i),ho(t)}).catch(()=>{ho(t)});return}dh(e).then(i=>{jC($C.parse(JSON.parse(i.toString("utf8"))),n.onSpan),ho(t)}).catch(()=>{ho(t)})}function DC(e){if(e==null||!e.startsWith("/rrweb/"))return;let t=decodeURIComponent(e.slice(7));return t.length===0?void 0:t}function dh(e){return new Promise((t,n)=>{let r=[];e.on("data",i=>{r.push(i)}),e.on("end",()=>{t(Buffer.concat(r))}),e.on("error",n)})}function ho(e){e.writeHead(200,{"content-type":"application/json"}),e.end("{}")}function jC(e,t){e.resourceSpans.flatMap(n=>n.scopeSpans).flatMap(n=>n.spans).forEach(n=>{t({attributes:FC(n.attributes),durationMs:Number((BigInt(n.endTimeUnixNano)-BigInt(n.startTimeUnixNano))/1000000n),kind:"span",name:n.name,parentSpanId:n.parentSpanId,source:"server",spanId:n.spanId,spanKind:lh(n.kind),status:{code:uh(n.status?.code??0),message:n.status?.message},timeNanos:n.startTimeUnixNano,traceId:n.traceId})})}function FC(e){return Object.fromEntries(e.map(({key:t,value:n})=>[t,String(n.stringValue??n.intValue??n.doubleValue??n.boolValue??"")]))}function BC(e){return new Promise((t,n)=>{e.close(r=>{if(r==null){t();return}n(r)}),e.closeAllConnections()})}function It(e){let t=new URL(e,"https://ripplo.invalid"),n=[...t.searchParams.entries()].toSorted(([r],[i])=>r.localeCompare(i)).map(([r,i])=>`${r}=${i}`).join("&");return n.length===0?t.pathname:`${t.pathname}?${n}`}function jn(e,t){return e==="url"?It(t):t}function ml(e,t,n){return jn(e,String(t))===jn(e,String(n))}function hh(e,t,n){return e!=="url"?ml(e,t,n):ph(String(t))===ph(String(n))}function ph(e){return new URL(e,"https://ripplo.invalid").pathname}function gl({actual:e,canon:t,pre:n,predicted:r}){return[...[...new Set([...r.entities.keys(),...e.entities.keys()])].flatMap(s=>VC({actual:e.entities.get(s),canon:t,entity:s,pre:n.entities.get(s),predicted:r.entities.get(s)})),...WC(n.singletons,r.singletons,e.singletons)]}function VC({actual:e,canon:t,entity:n,pre:r,predicted:i}){return[...new Set([...i?.keys()??[],...e?.keys()??[]])].flatMap(s=>UC({actual:e?.get(s),canon:t,entity:n,key:s,predicted:i?.get(s),preHadKey:r?.has(s)??!1,preRow:r?.get(s)}))}function UC({actual:e,canon:t,entity:n,key:r,predicted:i,preHadKey:o,preRow:s}){if(i==null)return[{mismatch:{entity:n,key:r,kind:"unexpected-row"},pending:o}];if(e==null)return[{mismatch:{entity:n,key:r,kind:"missing-row"},pending:!o}];let a=(u,c,d)=>yh(t(n,u,c),t(n,u,d));return[...new Set([...Object.keys(i),...Object.keys(e)])].filter(u=>!a(u,i[u],e[u])).map(u=>({mismatch:{entity:n,field:u,key:r,kind:"wrong-value",snapshot:i[u],sut:e[u]},pending:s==null?e[u]===void 0:a(u,s[u],e[u])}))}function yh(e,t){return mh(e)===mh(t)}function mh(e){return e==null?"\u2205":JSON.stringify(e)}function WC(e,t,n){return[...new Set([...Object.keys(t),...Object.keys(n)])].flatMap(i=>{let o=t[i],s=n[i];return o===void 0||s===void 0||gh(i,o,s)?[]:[{mismatch:{kind:"singleton-mismatch",singleton:i,snapshot:o,sut:s},pending:e[i]!==void 0&&gh(i,e[i],s)}]})}function gh(e,t,n){let r=At.safeParse(e);return r.success?hh(r.data,t,n):yh(t,n)}function yl(e){let t=zC(e.entities),n=GC(e.singletons);return r=>HC(r,t,n)}function zC(e){return new Map(e.flatMap(t=>Object.entries(t.props).map(([n,r])=>[bh(t.name,n),r.consistency])))}function bh(e,t){return`${e}.${t}`}function GC(e){return new Map(e.map(t=>[t.name,t.consistency]))}function HC(e,t,n){return e.kind==="singleton-mismatch"?qC(e.singleton,n):e.kind==="unexpected-row"||e.kind==="missing-row"?"strict":t.get(bh(e.entity,e.field))??"strict"}function qC(e,t){return At.safeParse(e).success?t.get(e)??"eventual":t.get(e)??"strict"}function bl(e){let t=new Set(e.valueSpaces.filter(n=>n.generator==="date.iso").map(n=>n.name));return(n,r,i)=>{if(!t.has(`${n}.${r}`)||typeof i!="string")return i;let o=Date.parse(i);return Number.isNaN(o)?i:new Date(o).toISOString()}}function Sl({onlyFirst:e=!1}={}){let i="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(i,e?void 0:"g")}var KC=Sl();function wl(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return!e.includes("\x1B")&&!e.includes("\x9B")?e:e.replace(KC,"")}function wh(e,t,n){return{detail:n.slice(0,500),kind:"engine-http",path:e,status:t}}function Or(e,t){return{code:Oh(t),kind:"engine-network",message:$r(t),path:e}}function xh(e){return{kind:"client-mount-missing",mountKey:e}}function vh(e,t){return{kind:"engine-decode",message:$r(t),path:e}}function Rh(e,t){return{entity:e,field:t,kind:"state-identity"}}function kh(e){return{as:e,kind:"setup-missing-row"}}function Ch(e){return{count:e,kind:"conflicting-sessions"}}function Nr(e){return{kind:"driver-launch",message:$r(e)}}function Eh(e){return{kind:"engine-unreachable",url:e}}function Ah(e,t){return{action:e,kind:"action-failed",message:$r(t)}}function Ih(e){return{kind:"check-failed",message:$r(e)}}function Ph(){return{kind:"aborted"}}var Sh=300;function Pt(e){switch(e.kind){case"engine-http":return`engine ${e.path} returned ${String(e.status)}: ${Mh(e.detail)}${YC(e.status)}`;case"engine-network":return`engine ${e.path} request failed: ${e.message}`;case"client-mount-missing":return`client bridge "${e.mountKey}" never mounted; client singletons unreadable`;case"engine-decode":return`engine ${e.path} response did not match schema: ${e.message}`;case"state-identity":return`row of "${e.entity}" is missing identity field "${e.field}"`;case"setup-missing-row":return`setup returned no row for "${e.as}"`;case"conflicting-sessions":return`world established ${String(e.count)} distinct auth sessions in one browser context; sessions are exclusive \u2014 a single context holds one signed-in user`;case"engine-unreachable":return`the engine at ${e.url} did not respond in time \u2014 the dev server may still be recompiling. Re-run once it settles.`;case"driver-launch":return`browser driver failed to launch: ${e.message}`;case"action-failed":return`action "${e.action}" failed: ${e.message}`;case"check-failed":return`check failed: ${e.message}`;case"aborted":return"run aborted"}}function Th(e){throw new Error(Pt(e))}function mo(){}function Mh(e){let t=e.replaceAll(/\s+/gu," ").trim();return t.length<=Sh?t:`${t.slice(0,Sh)}\u2026 [truncated]`}function YC(e){return e===404?" \u2014 the engine adapter is not mounted at RIPPLO_ENGINE_URL (or the mount path differs). Verify the adapter is wired into the app server and ENABLE_RIPPLO_TESTING=true; `ripplo doctor` checks the endpoint.":e===403||e===401?" \u2014 the adapter rejected the request: ENABLE_RIPPLO_TESTING is not true in the app's env, or RIPPLO_WEBHOOK_SECRET differs between the app and .ripplo env.":""}function Oh(e){if(!(typeof e!="object"||e==null))return"code"in e&&typeof e.code=="string"?e.code:"cause"in e?Oh(e.cause):void 0}function $r(e){let t=e instanceof Error?e.message:String(e);return Mh(wl(t))}var Cl=Fi(_h(),1),Cz=Cl.default.configure,go=Cl.default;function G(e){return go(e)??""}function Tt(e,t){return[...new Map(e.map(n=>[t(n),n])).values()]}function El(e){return Tt(e,G)}function Dh(e){return G(e)}var _r=class extends Error{name="AbortError";constructor(){super("aborted")}};function jh(e){return e instanceof Error&&e.name==="AbortError"}function Kt(e){if(e.aborted)throw new _r}function Al(e,t){return t.aborted?Promise.reject(new _r):new Promise((n,r)=>{let i=()=>{clearTimeout(o),r(new _r)},o=setTimeout(()=>{t.removeEventListener("abort",i),n()},e);t.addEventListener("abort",i,{once:!0})})}var rE={check:"Check",clear:"Clear",click:"Click",dblclick:"Double-click",fill:"Fill",goto:"Go to",hover:"Hover",press:"Press",select:"Select",uncheck:"Uncheck",upload:"Upload"};function Fh(e){let t=rE[e.kind]??e.kind;return e.kind==="press"&&e.key!=null?`${t}: ${e.key}`:t}function Bh(e){return e.kind==="data-rule"?"data rule":Vh(e.check)}function Vh(e){return e.kind==="not"?`not ${Vh(e.inner)}`:e.kind==="browser"?e.name:`${Uh(e.locator)} ${e.kind}`}function Uh(e){return e.by==="testId"?"element":e.by==="inside"?Uh(e.target):e.role}function Kh(e){return e.includes("async")?"async":e.includes("slow")?"slow":"fast"}var iE=()=>[];async function Ml({canon:e,classify:t,initialSnapshot:n,observe:r,onAssertion:i,onStep:o,pageRulePendingChecks:s,steps:a},l){return Yh({acc:[],canon:e,classify:t,index:0,observe:r,onAssertion:i,onStep:o,pageRulePendingChecks:s??iE,signal:l,snapshot:n,steps:a})}async function Yh({acc:e,canon:t,classify:n,index:r,observe:i,onAssertion:o,onStep:s,pageRulePendingChecks:a,signal:l,snapshot:u,steps:c}){Kt(l);let d=c[r];if(d==null)return{finalModel:u,findings:e};let f=Date.now(),h=await d.targetIds(),p=Fh(d.step.action);if(!d.requiredState(u)){let m={kind:"impossible-action",step:d.step};return Pl(s,{annotations:[Il({actionLabel:p,outcome:"failed",rrwebIds:h,startMs:f})],endMs:Date.now(),findings:[m],index:r,post:u,pre:u,startMs:f,url:Tl(u)}),{finalModel:u,findings:[...e,m]}}return d.perform().match(()=>oE({acc:e,actionLabel:p,canon:t,classify:n,index:r,observe:i,onAssertion:o,onStep:s,pageRulePendingChecks:a,rrwebIds:h,signal:l,snapshot:u,startMs:f,step:d,steps:c}),m=>{let g=yo(m,d);return Pl(s,{annotations:[Il({actionLabel:p,outcome:"failed",rrwebIds:h,startMs:f})],endMs:Date.now(),findings:[g],index:r,post:u,pre:u,startMs:f,url:Tl(u)}),Promise.resolve({finalModel:u,findings:[...e,g]})})}function Il({actionLabel:e,outcome:t,rrwebIds:n,startMs:r}){return{atMs:r,kind:"action",label:e,outcome:t,rrwebIds:n}}async function oE({acc:e,actionLabel:t,canon:n,classify:r,index:i,observe:o,onAssertion:s,onStep:a,pageRulePendingChecks:l,rrwebIds:u,signal:c,snapshot:d,startMs:f,step:h,steps:p}){let m=h.effect(d),g=await dE({canon:n,classify:r,observe:o,pre:d,predicted:m,signal:c,step:h}),S=[...h.pendingChecks,...l(d,g.snapshot)],w=await sE({onAssertion:s,pendingChecks:S,signal:c,step:h}),y=[...w.findings,...g.findings];Pl(a,{annotations:[Il({actionLabel:t,outcome:y.length>0?"failed":"passed",rrwebIds:u,startMs:f}),...w.annotations],endMs:Date.now(),findings:y,index:i,post:g.snapshot,pre:d,startMs:f,url:Tl(g.snapshot)});let v=[...e,...y];return y.length>0?{finalModel:g.snapshot,findings:v}:Yh({acc:v,canon:n,classify:r,index:i+1,observe:o,onAssertion:s,onStep:a,pageRulePendingChecks:l,signal:c,snapshot:g.snapshot,steps:p})}async function sE({onAssertion:e,pendingChecks:t,signal:n,step:r}){let i=[...new Map(t.map(s=>[Dh(s.source),s])).values()],o=await Promise.all(i.map(async s=>{let a=await aE(s,n),l=Date.now(),u=await s.targetIds();return{atMs:l,outcome:a,pendingCheck:s,rrwebIds:u}}));return o.forEach(s=>{lE(e,s.pendingCheck,s.outcome,r)}),{annotations:o.filter(s=>s.pendingCheck.source.kind==="step").map(s=>({atMs:s.atMs,kind:"assertion",label:Bh(s.pendingCheck.source),outcome:Jh(s.outcome),rrwebIds:s.rrwebIds})),findings:o.flatMap(s=>uE(s.pendingCheck,s.outcome,r))}}function aE(e,t){if(e.check.kind==="decided"){let n=e.check.passed?"passed":"failed";return Promise.resolve({kind:n})}return fE(e.budget,e.check.run,t)}function lE(e,t,n,r){e?.({outcome:Jh(n),source:t.source,step:r.step})}function Jh(e){return e.kind==="passed"?"passed":e.kind==="error"?"error":"failed"}function uE(e,t,n){return t.kind==="error"?[yo(t.error,n)]:t.kind==="failed"?[{budget:e.budget,kind:"pending-check",source:e.source,step:n.step}]:[]}function yo(e,t){return{error:e,kind:"driver-error",step:t.step}}function Pl(e,t){e?.(t)}function Tl(e){let t=e.singletons.url;return typeof t=="string"?t:null}var Dr={async:12e4,fast:5e3,slow:3e4},Xh={async:{backoffMs:[500,1e3,2e3,5e3],timeoutMs:Dr.async},fast:{backoffMs:[100,250,500,1e3],timeoutMs:Dr.fast},slow:{backoffMs:[250,500,1e3,2e3],timeoutMs:Dr.slow}};function Zh(e,t){return e.backoffMs[Math.min(t,e.backoffMs.length-1)]??0}function Wh(e){return e().match(t=>({observed:t,ok:!0}),t=>({error:t,ok:!1}))}function cE(e,t,n){return n.reconcile==null?e:n.reconcile(e,t)}function zh({canon:e,pre:t,predicted:n,step:r},i){let o=r.verifyChanges==null?[]:r.verifyChanges(n,i),s=cE(n,i,r),a=o.map(l=>({mismatch:l,pending:!0}));return{adopted:s,probed:[...a,...gl({actual:i.snapshot,canon:e,pre:t,predicted:s})]}}function Qh(e,t){return{budget:t.sync,kind:"consistency",mismatch:e.mismatch,pending:e.pending,step:t.step}}function Gh(e,t,n){let r=e.probed.filter(i=>!i.pending&&n(i.mismatch)==="strict");return r.length>0?{findings:r.map(i=>Qh(i,t)),snapshot:e.adopted}:e.probed.length===0?{findings:[],snapshot:e.adopted}:null}function Hh(e,t,n){return{findings:[...e.probed.map(r=>Qh(r,t)),...n],snapshot:e.adopted}}async function dE({canon:e,classify:t,observe:n,pre:r,predicted:i,signal:o,step:s}){let a=Xh[s.sync],l=Date.now()+a.timeoutMs,u=await Wh(n);if(!u.ok)return{findings:[yo(u.error,s)],snapshot:i};let c=zh({canon:e,pre:r,predicted:i,step:s},u.observed),d=0;for(;Date.now()<l;){Kt(o);let f=Gh(c,s,t);if(f!=null)return f;await Al(Zh(a,d),o),d+=1;let h=await Wh(n);if(!h.ok)return Hh(c,s,[yo(h.error,s)]);c=zh({canon:e,pre:r,predicted:i,step:s},h.observed)}return Gh(c,s,t)??Hh(c,s,[])}async function fE(e,t,n){let r=Xh[e],i=Date.now()+r.timeoutMs,o=await qh(t),s=0;for(;o.kind==="pending"&&Date.now()<i;)Kt(n),await Al(Zh(r,s),n),s+=1,o=await qh(t);return o.kind==="pending"?{kind:"failed"}:o}function qh(e){return e().match(t=>t?{kind:"passed"}:{kind:"pending"},t=>({error:t,kind:"error"}))}import{z as pE}from"zod";var Nl=pE.string().brand(),Q=Nl.parse("");function Mt(e){return Nl.parse(e)}function Ke(e,t){return Nl.parse(e.length===0?t:`${e}.${t}`)}function me(e){return On.safeParse(e).success}function pn(e){let t=e.lastIndexOf(".");return t===-1?void 0:{alias:e.slice(0,t),field:e.slice(t+1)}}function et(e){return typeof e=="object"&&e!==null&&"template"in e}function Ol(e,t,n){let r=Ke(t,e.ref);if(!n.has(r))throw new Error(`unresolved binding ref "${r}"`);return n.get(r)??null}function em(e,t,n){return hE(e).every(r=>n.has(Ke(t,r)))}function st(e,t,n){return typeof e=="string"?e:me(e)?String(Ol(e,t,n)):e.template.map(r=>typeof r=="string"?r:String(Ol(r,t,n))).join("")}function tt(e,t,n){return e===null||typeof e=="number"||typeof e=="boolean"?e:me(e)?Ol(e,t,n):st(e,t,n)}function tm(e,t){return tt(e,Q,t)}function jr(e){return go(e)}function Fn(e,t,n){return Object.fromEntries(Object.entries(e).map(([r,i])=>[r,tt(i,t,n)]))}function hE(e){return e==null||typeof e!="object"?[]:et(e)?e.template.flatMap(t=>typeof t=="string"?[]:[t.ref]):[e.ref]}function Yt(e){return typeof e=="object"&&e!==null&&"kind"in e}function hn(e){return Object.fromEntries(Object.entries(e).filter(t=>!Yt(t[1])))}function So(e,t,n){return t.reduce((r,i)=>mE(r,i,n,e),e)}function nm(e,t){return Object.keys(t).length===0?e:{...e,singletons:{...e.singletons,...t}}}function mE(e,t,n,r){if(!gE(t,n))return e;if(t.assertion.kind==="created"){let o=Fn(t.assertion.props,Q,n);return yE(e,t.entity,jr(o),o)}if(t.assertion.kind==="deleted")return $l(e,t.entity,xE(t.key,n,r));let i=Fn(hn(t.assertion.props),Q,n);return $l(e,t.entity,vE(t.key,i,n,r))}function gE(e,t){return("props"in e.assertion?[e.key,hn(e.assertion.props)]:[e.key]).every(r=>Object.values(r).every(i=>om(i)||!me(i)||t.has(Mt(i.ref))))}function yE(e,t,n,r){let i=new Map([...e.entities.get(t)??[],[n,r]]);return{...e,entities:new Map([...e.entities,[t,i]])}}function $l(e,t,n){let r=n(e.entities.get(t)??new Map);return{...e,entities:new Map([...e.entities,[t,r]])}}function mn(e,t,n,r){let i={env:r,key:n,snapshot:e};return[...(e.entities.get(t)??new Map).values()].filter(o=>wo(o,i))}function rm(e,t,n,r,i){let o={env:r,key:n,snapshot:e};return $l(e,t,s=>new Map([...s].map(([a,l])=>[a,wo(l,o)?i(l):l])))}function wo(e,t){return Object.entries(t.key).every(([n,r])=>im(e[n],r,t))}function im(e,t,n){return om(t)?bE(t,n).has(bo(e)):bo(e)===bo(wE(t,n.env))}function om(e){return typeof e=="object"&&e!==null&&"kind"in e}function bE(e,t){let n=t.snapshot.entities.get(e.selection.entity);return n==null?new Set:new Set([...n.values()].filter(r=>SE(r,e.selection.where,t)).map(r=>bo(r[e.field])))}function SE(e,t,n){return Object.entries(t).every(([r,i])=>im(e[r],i,n))}function bo(e){return e==null?"\u2205":e instanceof Date?e.toISOString():JSON.stringify(e)}function wE(e,t){return tt(e,Q,t)}function xE(e,t,n){let r={env:t,key:e,snapshot:n};return i=>new Map([...i].filter(([,o])=>!wo(o,r)))}function vE(e,t,n,r){let i={env:n,key:e,snapshot:r};return o=>new Map([...o].map(([s,a])=>wo(a,i)?[s,{...a,...t}]:[s,a]))}function lm(e){let t=e.predicates.filter(o=>fm(o)),n=t.filter(o=>o.assertion.kind==="created"),r=dm(t);if(n.length===0&&r.length===0&&e.deferred.length===0&&e.adopt.length===0)return;let i=t.filter(o=>o.assertion.kind==="updated");return(o,s)=>{let a=n.reduce((c,d)=>PE(c,s,d,e.env),{env:e.env,snapshot:o}),l=r.reduce((c,d)=>IE(c,s,d,e.env),a.snapshot),u=i.reduce((c,d)=>kE(c,s,d),a.env);return RE(OE(l,e.deferred,u),s,e.adopt)}}function RE(e,t,n){if(n.length===0)return e;let r=n.reduce((i,o)=>{let s=t.snapshot.singletons[o];return s===void 0?i:{...i,[o]:s}},e.singletons);return{...e,singletons:r}}function um(e,t,n){return new Map([...e,...Object.entries(n).map(([r,i])=>[Ke(Q,`${t}.${r}`),i])])}function kE(e,t,n){let r=mn(t.snapshot,n.entity,n.key,e).at(0);return r==null?e:um(e,n.assertion.as,r)}function cm(e){let t=dm(e.predicates.filter(n=>fm(n)));if(t.length!==0)return(n,r)=>t.flatMap(i=>CE(i,n,r,e.env))}function dm(e){return e.filter(t=>t.assertion.kind==="updated"&&Ll(t.assertion.props).length>0)}function Ll(e){return Object.entries(e).filter(([,t])=>Yt(t)).map(([t])=>t)}function fm(e){return e.assertion.kind==="created"||e.assertion.kind==="updated"}function CE(e,t,n,r){let i=mn(t,e.entity,e.key,r).at(0),o=mn(n.snapshot,e.entity,e.key,r).at(0);if(i==null||o==null)return[];let s=jr(EE(e.key,r));return Ll(e.assertion.props).flatMap(a=>sm(i[a])===sm(o[a])?[{entity:e.entity,field:a,key:s,kind:"expected-change",value:o[a]}]:[])}function EE(e,t){let n=Object.fromEntries(Object.entries(e).filter(r=>!AE(r[1])));return Fn(n,Q,t)}function AE(e){return typeof e=="object"&&e!==null&&"kind"in e}function sm(e){return e==null?"\u2205":JSON.stringify(e)}function IE(e,t,n,r){let i=Ll(n.assertion.props),o=mn(t.snapshot,n.entity,n.key,r).at(0);return o==null?e:rm(e,n.entity,n.key,r,s=>({...s,...Object.fromEntries(i.flatMap(a=>{let l=o[a];return l===void 0?[]:[[a,l]]}))}))}function PE(e,t,n,r){if(n.assertion.kind!=="created")return e;let i=Fn(n.assertion.props,Q,r),o=jr(i),s=e.snapshot.entities.get(n.entity);if(s==null||!s.has(o))return e;let a=TE(t.snapshot.entities.get(n.entity),s,i);if(a==null)return e;let[l,u]=a,c=new Map(s);return c.delete(o),c.set(l,{...u,...i}),{env:um(e.env,n.assertion.as,u),snapshot:{...e.snapshot,entities:new Map(e.snapshot.entities).set(n.entity,c)}}}function TE(e,t,n){if(e==null)return;let r=Object.entries(n),i=[...e].filter(([o])=>!t.has(o)).map(([o,s])=>({entry:[o,s],score:r.filter(([a,l])=>am(s[a])===am(l)).length}));return ME(i,r.length)}function am(e){return e==null?"\u2205":JSON.stringify(e)}function ME(e,t){let n=e.reduce((i,o)=>Math.max(i,o.score),0);if(n===0)return;let r=e.filter(i=>i.score===n);if(!(n<t&&r.length!==1))return r[0]?.entry}function OE(e,t,n){let r=t.reduce((i,o)=>{let s=NE(o.value,n);return s==null?i:{...i,[o.name]:jn(o.name,s)}},e.singletons);return{...e,singletons:r}}function NE(e,t){try{return st(e,Q,t)}catch{return}}function xo(e,t){if(e.kind==="visible"||e.kind==="disabled"||e.kind==="enabled"||e.kind==="focused"||e.kind==="checked")return{kind:e.kind,locator:Fr(e.locator,t)};if(e.kind==="not"){let n=xo(e.predicate,t);return n==null?null:{inner:n,kind:"not"}}return e.kind==="value"||e.kind==="text"?{kind:e.kind,locator:Fr(e.locator,t),value:st(e.value,Q,t)}:e.kind!=="browser"?null:{kind:"browser",name:e.name,value:st(e.value,Q,t)}}function Br(e,t){let n=e.expect.filter(a=>a.kind==="state"),r=FE(n),{adopt:i,deferred:o,immediate:s}=$E(e,t,r);return{action:BE(e.action,t),label:e.action.kind,pendingChecks:e.expect.flatMap(a=>UE(a,t)),reconcile:lm({adopt:i,deferred:o,env:t,predicates:n}),verifyChanges:cm({adopt:i,deferred:o,env:t,predicates:n}),effect:a=>nm(So(a,n,t),s)}}function Fr(e,t){return e.by==="role"?{by:"role",name:e.name==null?void 0:st(e.name,Q,t),role:e.role}:e.by==="inside"?{by:"inside",scope:Fr(e.scope,t),target:Fr(e.target,t)}:{by:"testId",value:st(e.value,Q,t)}}function $E(e,t,n){let r=e.action.kind==="goto"&&!e.expect.some(s=>s.kind==="browser"&&s.name==="url"),i=e.action.kind==="goto"&&!r?{url:It(st(e.action.url,Q,t))}:{},o=r?["url"]:[];return e.expect.reduce((s,a)=>a.kind==="browser"&&LE(a.value,n)?{...s,deferred:[...s.deferred,{name:a.name,value:a.value}]}:a.kind==="browser"||a.kind==="singleton"?{...s,immediate:{...s.immediate,...DE(a,t)}}:s,{adopt:o,deferred:[],immediate:i})}function LE(e,t){return _E(e).some(n=>t.has(n.split(".")[0]??n))}function _E(e){return typeof e=="string"?[]:me(e)?[e.ref]:e.template.filter(t=>typeof t!="string").map(t=>t.ref)}function DE(e,t){if(e.kind==="browser")return{[e.name]:jE(e,t)};if(e.kind==="singleton")return{[e.singleton]:tt(e.assertion.value,Q,t)};throw new Error("when() consequence must be a url (browser) or singleton assertion")}function jE(e,t){return jn(e.name,st(e.value,Q,t))}function FE(e){return new Set(e.flatMap(t=>t.assertion.kind==="created"||t.assertion.kind==="updated"?[t.assertion.as]:[]))}function BE(e,t){return{files:e.kind==="upload"?e.files:void 0,key:e.kind==="press"?e.key:void 0,kind:e.kind,locator:VE(e,t),url:e.kind==="goto"?st(e.url,Q,t):void 0,value:"value"in e?tm(e.value,t):void 0}}function VE(e,t){if(!(!("locator"in e)||e.locator==null))return Fr(e.locator,t)}function UE(e,t){if(e.kind==="browser"||e.kind==="singleton")return[];let n=xo(e,t),r="wait"in e?e.wait??"fast":"fast";return n==null?[]:[{budget:r,check:n}]}import{err as pm,ok as Dl,okAsync as WE,Result as zE}from"neverthrow";function Vr(e,t,n){let r=XE(e),i={env:new Map,generate:n.generate,generatedParams:new Set,indexed:r,overrides:new Map(Object.entries(n.params??{}).map(([s,a])=>[Mt(s),a]))};ZE(t.params,Q,i);let o=t.world.map(s=>QE(s,Q,i));return n.materialize(o).andThen(s=>rA(s,i.env,r).map(a=>GE({base:a,generatedParams:i.generatedParams,lockfile:e,test:t})))}function jl(e,t){let n=new Map(t.map(r=>[r.name,r]));return r=>WE(KE(r,e,n).rows)}function Fl(e){return t=>{let n=t.map(r=>({as:r.as,entity:r.entity,fields:r.fields}));return e(n).andThen(r=>qE(t,r))}}function hm(e,t){let n=vo(t);return Object.fromEntries(Object.entries(e).filter(([r,i])=>n.includes(r)&&i!=null))}function vo(e){return Object.keys(e.props)}function GE({base:e,generatedParams:t,lockfile:n,test:r}){let i=Object.fromEntries(n.singletons.map(c=>[c.name,c.default])),o=Object.fromEntries(Object.entries(r.singletons).map(([c,d])=>[c,tt(d,Q,e.env)])),s=Object.entries(r.singletons).filter(([,c])=>HE(c,t)).map(([c])=>c),a={...i,...o},l=new Set(n.singletons.filter(c=>c.source==="client").map(c=>c.name)),u=Object.fromEntries(Object.entries(a).filter(([c])=>l.has(c)));return{...e,clientState:u,generatedSingletons:s,snapshot:{...e.snapshot,singletons:a}}}function HE(e,t){return me(e)?t.has(Ke(Q,e.ref)):et(e)?e.template.some(n=>typeof n!="string"&&t.has(Ke(Q,n.ref))):!1}function qE(e,t){let n=new Map(t.map(r=>[r.as,r]));return zE.combine(e.map(r=>{let i=n.get(r.as);return i==null?pm(kh(r.as)):Dl({as:r.as,entity:r.entity,generatedFields:r.generatedFields,row:i.row,session:i.session})}))}function KE(e,t,n){return e.reduce((r,i)=>{let o=YE(i.fields,r.env),s=oA({generate:t,model:i.model,seedPrefix:i.seedPrefix,set:o,valueSpaces:n}),a=Object.entries(s).map(([u,c])=>[`${i.as}.${u}`,c]),l=Object.keys(s).filter(u=>!(u in o));return{env:new Map([...r.env,...a]),rows:[...r.rows,{as:i.as,entity:i.entity,generatedFields:[...new Set([...i.generatedFields,...l])],row:s,session:void 0}]}},{env:new Map,rows:[]})}function YE(e,t){return Object.fromEntries(Object.entries(e).map(([n,r])=>{if(me(r))return[n,JE(t,r.ref)];if(et(r))throw new Error(`template value not allowed in entity field "${n}"`);return[n,r]}))}function JE(e,t){let n=e.get(t);if(n==null)throw new Error(`setup ref "${t}" was not produced by an earlier entity`);return n}function XE(e){return{models:new Map(e.entities.map(t=>[t.name,t])),valueSpaces:new Map(e.valueSpaces.map(t=>[t.name,t]))}}function ZE(e,t,n){Object.entries(e).forEach(([r,i])=>{let o=Ke(t,r),s=n.indexed.valueSpaces.get(i.valueSpace);if(s==null)throw new Error(`unknown valueSpace "${i.valueSpace}" for param "${o}"`);let a=n.overrides.get(o);a==null&&n.generatedParams.add(o);let l=a??n.generate.value({anchor:void 0,constraints:s.constraints,generator:s.generator,nullable:!1,seed:o,type:s.type,values:s.values,valueSpace:i.valueSpace});n.env.set(o,l)})}function QE(e,t,n){let r=n.indexed.models.get(e.entity);if(r==null)throw new Error(`model "${e.entity}" not found for setup "${e.as}"`);let i=Ke(t,e.as),o=eA(e.set,t,n.env),s=nA(r,o,i,n),a=Object.entries(e.set).filter(([,l])=>me(l)&&n.generatedParams.has(Ke(t,l.ref))).map(([l])=>l);return{as:i,entity:e.entity,fields:{...s,...o},generatedFields:[...Object.keys(s),...a],model:r,seedPrefix:i}}function eA(e,t,n){return Object.fromEntries(Object.entries(e).map(([r,i])=>[r,tA(i,t,n)]))}function tA(e,t,n){if(!me(e))return e;let r=Ke(t,e.ref);return n.get(r)??{ref:r}}function nA(e,t,n,r){return Object.fromEntries(Object.entries(e.props).filter(([i,o])=>!o.optional&&!e.identity.includes(i)&&!(i in t)).map(([i,o])=>[i,mm({field:i,generate:r.generate,model:e,seedPrefix:n,spec:o,valueSpaces:r.indexed.valueSpaces})]))}function rA(e,t,n){let r=new Map,i=e.flatMap(a=>{let l=n.models.get(a.entity);if(l==null)throw new Error(`model "${a.entity}" not found for setup "${a.as}"`);Object.entries(a.row).forEach(([c,d])=>t.set(Ke(Mt(a.as),c),d));let u=r.get(a.entity)??new Map;return u.set(_l(a.row,l),hm(a.row,l)),r.set(a.entity,u),a.session==null?[]:[a.session]}),o=e.flatMap(a=>{let l=n.models.get(a.entity);return l==null?[]:[{alias:a.as,entity:a.entity,key:_l(a.row,l)}]}),s=e.flatMap(a=>{let l=n.models.get(a.entity);if(l==null)return[];let u=_l(a.row,l);return a.generatedFields.map(c=>({entity:a.entity,field:c,key:u}))});return iA(i).map(a=>({aliases:o,auth:a,env:t,generated:s,snapshot:{entities:sA(r),singletons:{}}}))}function iA(e){if(e.length===0)return Dl(void 0);let t=new Set(e.map(r=>JSON.stringify(r.cookies))).size;if(t>1)return pm(Ch(t));let n=e.flatMap(r=>Object.entries(r.headers??{}));return Dl({cookies:e.flatMap(r=>r.cookies),headers:n.length===0?void 0:Object.fromEntries(n),origins:e.flatMap(r=>r.origins)})}function oA({generate:e,model:t,seedPrefix:n,set:r,valueSpaces:i}){return{...Object.fromEntries(Object.entries(t.props).filter(([s])=>!(s in r)).map(([s,a])=>[s,mm({field:s,generate:e,model:t,seedPrefix:n,spec:a,valueSpaces:i})])),...r}}function mm({field:e,generate:t,model:n,seedPrefix:r,spec:i,valueSpaces:o}){let s=`${n.name}.${e}`;return t.value({anchor:void 0,constraints:o.get(s)?.constraints,generator:o.get(s)?.generator??"lorem.word",nullable:i.optional,seed:Ke(r,e),type:i.type,values:o.get(s)?.values,valueSpace:s})}function _l(e,t){return t.identity.map(n=>String(e[n])).join(":")}function sA(e){return new Map([...e].map(([t,n])=>[t,new Map(n)]))}function Ye(e){return`${e.workflow}/${e.slug}`}function nt(e){return e.workflows.flatMap(t=>t.tests.map(n=>({ref:Ye(n),test:n,workflow:t})))}function wt(e){return`${e.test}#${String(e.index)}`}function Bn(e){let t=nt(e).flatMap(n=>Ro(e,n.test));return Tt(t,n=>`${n.test}:${G(n.steps)}`)}function Ro(e,t){let n=bm(t),r=gm(n,t.singletons),i=TA(t,PA(e)),o=aA(e,t);return lA(r,MA(t.steps),n).reduce((a,{chunk:l,requiredState:u},c)=>({offset:a.offset+l.length,transitions:[...a.transitions,AA({chunk:l,index:c,intent:t.intent,namespace:n.namespace,paramSpaceOf:i,requiredState:u,testRef:Ye(t),whenChunk:o.slice(a.offset,a.offset+l.length)})]}),{offset:0,transitions:[]}).transitions}function gm(e,t){return{absences:kA(e),entities:EA(e),exclusives:e.exclusives,singletons:Object.fromEntries(Object.entries(t).filter(([,n])=>!me(n)&&!et(n)))}}function aA(e,t){let n=e.workflows.find(r=>r.name===t.workflow);return n==null||n.steps.length!==t.steps.length?t.steps:n.steps}function ko(e,t,n){return Object.values(e).flatMap(r=>me(r)?Vl(r.ref,n):[]).find(r=>r.entity===t)?.aliasPath}function lA(e,t,n){return t.reduce((r,i)=>({requiredState:uA(r.requiredState,i,n),withRequiredState:[...r.withRequiredState,{chunk:i,requiredState:xA(r.requiredState,i)}]}),{requiredState:e,withRequiredState:[]}).withRequiredState}function uA(e,t,n){let r=t.flatMap(i=>i.expect.filter(o=>o.kind==="state")).reduce((i,o)=>cA(i,o,n),e);return{...r,singletons:{...r.singletons,...bA(t)}}}function cA(e,t,n){return t.assertion.kind==="deleted"?dA(e,t,n):t.assertion.kind==="created"?hA(e,t.entity,t.assertion.as,t.assertion.props,n):gA(e,t,n)}function dA(e,t,n){let r=ko(t.key,t.entity,n.namespace),i=e.entities.find(a=>a.alias===r),o=Ur(fA(t.key),n),s=i==null?{entity:t.entity,...o}:{entity:i.entity,...pA(i,o)};return{...e,absences:[...e.absences,s],entities:e.entities.filter(a=>a.alias!==r)}}function fA(e){return Object.fromEntries(Object.entries(e).flatMap(t=>{let n=t[1];return wm(n)?[]:[[t[0],n]]}))}function pA(e,t){return{literals:{...e.literals,...t.literals},relations:[...e.relations.filter(n=>!t.relations.some(r=>r.field===n.field)),...t.relations]}}function hA(e,t,n,r,i){let o=Ur(r,i);return{...e,absences:e.absences.filter(s=>s.entity!==t||!mA(o,s)),entities:[...e.entities,{alias:n,entity:t,...o}]}}function mA(e,t){return Object.entries(t.literals).every(([r,i])=>e.literals[r]===i)&&t.relations.every(r=>e.relations.some(i=>i.field===r.field&&i.targetAlias===r.targetAlias&&i.targetField===r.targetField))}function gA(e,t,n){if(t.assertion.kind!=="updated")return e;let r=ko(t.key,t.entity,n.namespace);if(r==null)return e;let i=Ur(hn(t.assertion.props),n),o=Object.entries(t.assertion.props).filter(([,a])=>Yt(a)).map(([a])=>a),s=a=>a.alias===r?yA(a,i,o):a;return{...e,entities:e.entities.map(a=>s(a))}}function yA(e,t,n){let r=Object.entries(e.literals).filter(([i])=>!n.includes(i)&&!(i in t.literals));return{...e,literals:{...Object.fromEntries(r),...t.literals},relations:[...e.relations.filter(i=>!t.relations.some(o=>o.field===i.field)),...t.relations]}}function bA(e){return e.reduce((t,n)=>({...t,...SA(n),...wA(n)}),{})}function SA(e){return e.action.kind==="goto"?{url:e.action.url}:{}}function wA(e){return Object.fromEntries(e.expect.flatMap(t=>t.kind==="browser"?[[t.name,t.value]]:t.kind==="singleton"?[[t.singleton,t.assertion.value]]:[]))}function xA(e,t){return t[0]?.action.kind!=="goto"?e:{...e,singletons:Object.fromEntries(Object.entries(e.singletons).filter(([n])=>n!=="url"))}}function Co(e,t){let n=bm(t);return{namespace:n.namespace,requiredState:gm(n,t.singletons)}}function ym(e,t){return[...new Set(e)].flatMap(n=>Vl(n,t))}function at(e){return me(e)?[e.ref]:et(e)?e.template.flatMap(t=>me(t)?[t.ref]:[]):[]}function gn(e){switch(e.kind){case"visible":case"disabled":case"enabled":case"focused":case"checked":return Jt(e.locator);case"value":case"text":return[...Jt(e.locator),...at(e.value)];case"singleton":return at(e.assertion.value);case"browser":return at(e.value);case"state":return[...e.assertion.kind==="deleted"?[]:Object.values(hn(e.assertion.props)).flatMap(t=>at(t)),...Object.values(e.key).flatMap(t=>Sm(t))];case"not":return gn(e.predicate);case"when":return e.branches.flatMap(t=>t.consequence.flatMap(n=>gn(n)));case"and":return e.predicates.flatMap(t=>gn(t));case"count":return[]}}function bm(e){return{absences:e.absent,exclusives:e.exclusive,namespace:new Map(e.world.map(t=>[t.as,t.entity])),setups:e.world}}function Jt(e){return e.by==="inside"?[...Jt(e.scope),...Jt(e.target)]:e.by==="role"?e.name==null?[]:at(e.name):at(e.value)}function Sm(e){return wm(e)?Object.values(e.selection.where).flatMap(t=>Sm(t)):at(e)}function wm(e){return typeof e=="object"&&e!==null&&"kind"in e}function vA(e){return e.kind==="goto"?at(e.url):e.kind==="fill"||e.kind==="select"?[...Jt(e.locator),...at(e.value)]:e.kind==="press"?e.locator==null?[]:Jt(e.locator):(e.kind==="upload",Jt(e.locator))}function RA(e){return[...vA(e.action),...e.expect.flatMap(t=>gn(t))]}function kA(e){return e.absences.map(t=>({entity:t.entity,...Ur(t.where,e)}))}function Ur(e,t){let n=Object.entries(e),r=Object.fromEntries(n.flatMap(([o,s])=>me(s)||et(s)?[]:[[o,s]])),i=n.flatMap(o=>{let s=o[1];if(!me(s))return[];let a=Vl(s.ref,t.namespace).at(0);return a==null?[]:[{entity:a.entity,field:o[0],targetAlias:a.aliasPath,targetField:a.field}]});return{literals:r,relations:i}}function CA(e,t){return e.map(n=>({alias:n.as,entity:n.entity,...Ur(n.set,t)}))}function EA(e){return CA(e.setups,e)}function AA(e){let t=e.chunk.findIndex(s=>s.action.kind!=="goto"),n=t===-1?e.chunk:e.chunk.slice(0,t),r=e.chunk.slice(n.length),i=r.at(-1)??e.chunk.at(-1);if(i==null)throw new Error("empty transition chunk");let o=[...new Set(e.chunk.flatMap(s=>RA(s)))];return{effectStep:i,index:e.index,intent:e.intent,namespace:e.namespace,nav:n,paramSpaces:Object.fromEntries(o.filter(s=>e.paramSpaceOf.has(s)).map(s=>[s,e.paramSpaceOf.get(s)])),requiredState:e.requiredState,steps:r,test:e.testRef,wait:Kh(r.flatMap(s=>IA(s))),whenSteps:e.whenChunk}}function IA(e){return e.expect.flatMap(t=>t.kind==="state"&&t.wait!=null?[t.wait]:[])}function Vl(e,t){let n=pn(e);if(n==null)return[];let r=t.get(n.alias);return r==null?[]:[{aliasPath:n.alias,entity:r,field:n.field,ref:e}]}function PA(e){return new Map(e.valueSpaces.map(t=>[t.name,t]))}function TA(e,t){return new Map(Object.entries(e.params).map(([n,r])=>[n,t.get(r.valueSpace)]))}function MA(e){return Bl(e,0,[],[])}function Bl(e,t,n,r){let i=e[t];if(i==null)return n.length===0?r:[...r,n];let o=[...n,i];return OA(i)?Bl(e,t+1,[],[...r,o]):Bl(e,t+1,o,r)}function OA(e){return e.expect.some(t=>t.kind==="state")}function xm(e){return vm(e,new Map)}function NA(e,t){return e.reduce((n,r)=>n??t(r),null)}function vm(e,t){let n=e.variables.find(r=>!t.has(r));return n==null?t:NA(e.domain(n),r=>{let i=new Map([...t,[n,r]]);return e.consistent(i)?vm(e,i):null})}function xt(e,t){let n=$A(e,t);if(n==null)return null;let r=UA(n);return WA(e.singletons,t,r)?r:null}function $A(e,t){let{absences:n,entities:r,exclusives:i}=e,o=new Map(r.map(a=>[a.alias,a])),s=xm({variables:r.map(a=>a.alias),consistent:a=>LA(a)&&_A(r,a)&&jA(n,a,t),domain:a=>BA(o.get(a),t)});return s==null?null:VA(i,r,s,t)?s:null}function LA(e){let t=[...e.values()];return new Set(t).size===t.length}function _A(e,t){return e.every(n=>t.has(n.alias)?n.relations.every(r=>DA(n,r,t)):!0)}function DA(e,t,n){if(!n.has(t.targetAlias))return!0;let r=n.get(t.targetAlias)?.[t.targetField];return r==null?!0:n.get(e.alias)?.[t.field]===r}function jA(e,t,n){return e.every(r=>![...n.entities.get(r.entity)?.values()??[]].some(i=>FA(i,r,t)))}function FA(e,t,n){return Rm(e,t)?t.relations.every(r=>{if(!n.has(r.targetAlias))return!1;let i=n.get(r.targetAlias)?.[r.targetField];return i!=null&&e[r.field]===i}):!1}function Rm(e,t){return Object.entries(t.literals).every(([n,r])=>r===null?e[n]==null:e[n]===r)}function BA(e,t){return e==null?[]:[...t.entities.get(e.entity)?.values()??[]].filter(n=>Rm(n,e))}function VA(e,t,n,r){return e.every(i=>{let o=t.filter(a=>a.entity===i&&n.has(a.alias)).length;return(r.entities.get(i)?.size??0)===o})}function UA(e){return new Map([...e].flatMap(([t,n])=>Object.entries(n).flatMap(r=>{let i=r[1];return typeof i=="string"||typeof i=="number"||typeof i=="boolean"?[[Mt(`${t}.${r[0]}`),i]]:[]})))}function WA(e,t,n){return Object.entries(e).every(([r,i])=>{if(!em(i,Q,n))return!1;let o=tt(i,Q,n),s=t.singletons[r],a=At.safeParse(r);return a.success?ml(a.data,o,s):s===o})}function Cm(e,t,n){return e.reduce((r,i)=>{let o=So(r.snapshot,zA(i),n);return{resolved:[...r.resolved,GA(i,o,n)],snapshot:o}},{resolved:[],snapshot:t}).resolved}function zA(e){return e.expect.filter(t=>t.kind==="state")}function GA(e,t,n){return e.expect.some(r=>r.kind==="when")?{...e,expect:e.expect.flatMap(r=>Em(r,{env:n,snapshot:t}))}:e}function Em(e,t){if(e.kind!=="when")return[e];let n=HA(e,t);return n==null?[]:n.flatMap(r=>Em(r,t))}function HA(e,t){return e.branches.find(n=>n.condition==null||Ul(n.condition,t))?.consequence}function Ul(e,t){if(e.kind==="count")return mn(t.snapshot,e.entity,{},t.env).length===e.value;if(e.kind==="singleton"){let n=tt(e.assertion.value,Q,t.env);return km(t.snapshot.singletons[e.singleton])===km(n)}return e.kind==="not"?!Ul(e.predicate,t):e.predicates.every(n=>Ul(n,t))}function km(e){return e==null?"\u2205":JSON.stringify(e)}function Eo(e,t,n){let r=xt(e.requiredState,t);return r==null?null:new Map([...r,...Object.entries(n).map(([i,o])=>[Mt(i),o])])}function Ao(e,t,n){let r=Cm(e.whenSteps,n,t),i=r.at(-1)??e.effectStep,o=Br(i,t),s=YA(e,t),a=r.map(l=>Br(l,t));return{effect:JA(o.effect,s),steps:a.map(l=>({action:l.action,effect:l.effect,pendingChecks:l.pendingChecks,reconcile:l.reconcile,verifyChanges:l.verifyChanges}))}}function Wl(e,t,n){return xt(e.requiredState,n)==null?!1:yn(t(n))!==yn(n)||XA(e)||qA(e)}function qA(e){return[...e.nav,...e.steps].every(t=>t.expect.every(n=>n.kind!=="state"))}var Am=new WeakMap;function yn(e){let t=Am.get(e);if(t!=null)return t;let n=G({entities:[...e.entities].map(([r,i])=>[r,[...i]]),singletons:KA(e.singletons)});return Am.set(e,n),n}function KA(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>t==="url"&&typeof n=="string"?[t,It(n)]:[t,n]))}function YA(e,t){let n=e.nav.at(-1);return n==null?void 0:Br(n,t).action.url}function JA(e,t){if(t==null)return e;let n=It(t);return r=>{let i=e(r);return{...i,singletons:{...i.singletons,url:n}}}}function XA(e){return e.effectStep.expect.some(t=>t.kind==="state"&&t.assertion.kind==="updated"&&Object.values(t.assertion.props).some(n=>Yt(n)))}function Wr(e,t,n){let r=Eo(e,t.snapshot,n);if(r==null)return null;let i=ZA(e,r,t.snapshot);return i==null||!Wl(e,i.effect,t.snapshot)?null:{next:{snapshot:i.effect(t.snapshot)},resolved:i}}function Im(e,t,n){let r=Eo(e,t.snapshot,n);if(r==null)return"required-state-unsatisfied";try{return Ao(e,r,t.snapshot),"no-effect"}catch{return"unresolvable"}}function ZA(e,t,n){try{return Ao(e,t,n)}catch{return null}}function Vn(e,t,n){return e.flatMap((r,i)=>{let o=n(r),s=Wr(r,t,o);return s==null?[]:[{idx:i,label:wt(r),params:o,stepRun:s}]})}var QA={absences:[],entities:[],exclusives:[],singletons:{}};function zr(e){return{...QA,...e}}function Gr(e,t){if(e==null)return new Set;if(e.by==="inside")return new Set([...Gr(e.scope,t),...Gr(e.target,t)]);let n=e.by==="role"?e.name:e.value;return new Set(t(n))}function zl(e){return eI(e).flatMap(t=>tI(t))}function eI(e){return[...e.reduce((n,r)=>{let i=G([r.when.singletons,r.consequence]);return new Map([...n,[i,[...n.get(i)??[],r]]])},new Map).values()]}function tI(e){if(e.length<2)return[];let t=e.map(o=>new Set(o.when.entities.map(s=>Gl(s)))),[n]=t;if(n==null)return[];let r=[...n].filter(o=>t.every(s=>s.has(o))),i=e.toSorted((o,s)=>o.when.entities.length-s.when.entities.length)[0];return i==null||r.length===i.when.entities.length?[]:nI(e,r)?[]:sI(i,r,lI(e))}function Gl(e){return G([e.entity,e.literals])}function nI(e,t){return e.some(n=>{let r=Pm(n.consequence),i=rI(r),o=iI(r);return n.when.entities.some(s=>!t.includes(Gl(s))&&(oI(s,i)||o.has(s.alias)))})}function Pm(e){return e.kind==="not"?Pm(e.predicate):"locator"in e?e.locator:void 0}function rI(e){return Gr(e,t=>t==null||me(t)||et(t)?[]:[t])}function iI(e){return Gr(e,t=>{if(t==null||!me(t))return[];let n=pn(t.ref);return n==null?[]:[n.alias]})}function oI(e,t){return Object.values(e.literals).some(n=>typeof n=="string"&&t.has(n))}function sI(e,t,n){let r=e.when.entities.filter(l=>t.includes(Gl(l))),i=e.when.entities.filter(l=>!r.includes(l)).filter(l=>e.when.exclusives.includes(l.entity)).map(l=>({...l,literals:{},relations:[]})),o=[...r,...i],s=new Set(o.map(l=>l.alias));if(![...e.refs].every(l=>s.has(l)))return[];let a=zr({entities:o.map(l=>aI(l,s)),exclusives:e.when.exclusives.filter(l=>o.some(u=>u.entity===l)),singletons:e.when.singletons});return[{consequence:e.consequence,origin:{kind:"generalized",tests:n},refs:e.refs,when:a}]}function aI(e,t){return{...e,relations:e.relations.filter(n=>t.has(n.targetAlias))}}function lI(e){return[...new Set(e.flatMap(t=>t.origin==null?[]:t.origin.kind==="generalized"?t.origin.tests:[t.origin.test]))]}function uI(e){return e.flatMap((t,n)=>e.slice(n+1).flatMap(r=>$m(t,r)))}function Nm(e,t){return $m(e,t).length>0}function $m(e,t){let n=Tm(e.when,t.when);return!n&&!Tm(t.when,e.when)||!dI(e.consequence,t.consequence)?[]:[{a:e.consequence,b:t.consequence,when:n?t.when:e.when}]}function Tm(e,t){return Mm(e.entities,t.entities)&&Mm(e.absences,t.absences)&&e.exclusives.every(n=>t.exclusives.includes(n))&&cI(e.singletons,t.singletons)}function Mm(e,t){let n=new Set(t.map(r=>G(r)));return e.every(r=>n.has(G(r)))}function cI(e,t){return Object.entries(e).every(([n,r])=>G(t[n])===G(r))}function dI(e,t){return e.kind==="not"?Hl(e.predicate,t):t.kind==="not"?Hl(e,t.predicate):fI(e,t)||pI(e,t)}function Hl(e,t){return e.kind===t.kind&&"locator"in e&&"locator"in t&&Lm(e,t)}function Lm(e,t){return"locator"in t&&G(e.locator)===G(t.locator)}function fI(e,t){let n=new Set([e.kind,t.kind]);return n.has("enabled")&&n.has("disabled")&&"locator"in e&&"locator"in t?Lm(e,t):!1}function pI(e,t){let n=Om(e),r=Om(t);return n==null||r==null||e.kind!==t.kind?!1:Hl(e,t)&&G(n)!==G(r)}function Om(e){return e.kind==="value"||e.kind==="text"?e.value:null}function hI(e,t){return e.flatMap(n=>{let r=mI(n),i=new Set(n.requiredState.absences.map(o=>o.entity));return t.flatMap(o=>gI(n,o,r,i))})}function mI(e){return new Set(e.steps.flatMap(t=>t.expect.flatMap(n=>n.kind==="state"&&n.assertion.kind==="deleted"?[n.entity]:[])))}function gI(e,t,n,r){let{source:i,target:o}=t.reference;return!n.has(o)||n.has(i)||r.has(i)?[]:[{dataRule:t,source:i,target:o,transition:wt(e)}]}function ql(e){return G({consequence:e.consequence,when:e.when})}function Kl(e){let t=[...yI(e),...TI(e)],n=zl(t).reduce((r,i)=>[...t,...r].some(s=>Nm(i,s))?r:[...r,i],[]);return Tt([...t,...n],ql)}function Dm(e,t){return e.filter(n=>!bI(n)||SI(n)===t)}function Yl(e){return e.kind==="not"?Yl(e.predicate):e.kind==="visible"||e.kind==="disabled"||e.kind==="enabled"||e.kind==="focused"||e.kind==="checked"||e.kind==="value"||e.kind==="text"}function Jl(e,t,n){if(xt(e.when,t)!=null)return null;let r=xt(e.when,n);return r==null?null:OI(e,r)}function yI(e){return Tt(nt(e).flatMap(t=>wI(e,t)),ql)}function bI(e){return e.origin==null||e.origin.kind==="generalized"?!1:gn(e.consequence).some(t=>pn(t)!=null)}function SI(e){let{origin:t}=e;if(!(t==null||t.kind==="generalized"))return t.test}function wI(e,{test:t,workflow:n}){let r=Co(e,t),i=xI(n.steps);return t.steps.reduce((o,s)=>({pageRules:[...o.pageRules,...PI({branchScoped:i,namespace:r.namespace,origin:{kind:"test",test:Ye(t)},requiredState:o.requiredState,step:s})],requiredState:vI(o.requiredState,s,r)}),{pageRules:[],requiredState:r.requiredState}).pageRules}function xI(e){let t=e.flatMap(n=>n.expect).flatMap(n=>Io(n)).map(n=>G(n));return new Set(t)}function Io(e){return e.kind==="not"?Io(e.predicate):e.kind==="and"?e.predicates.flatMap(t=>Io(t)):e.kind!=="when"?[]:e.branches.flatMap(t=>t.consequence.flatMap(n=>[n,...Io(n)]))}function vI(e,t,n){return t.expect.reduce((r,i)=>i.kind==="state"?RI(r,i,n):r,e)}function RI(e,t,n){if(t.assertion.kind==="created"){let o=kI(t.assertion.as,t.entity,t.assertion.props,n);return{...e,entities:[...e.entities,o]}}let r=ko(t.key,t.entity,n.namespace);if(r==null)return e;if(t.assertion.kind==="deleted")return AI(e,r);let i=hn(t.assertion.props);return{...e,entities:e.entities.map(o=>o.alias===r?jm(o,i,n):o)}}function kI(e,t,n,r){return jm({alias:e,entity:t,literals:{},relations:[]},n,r)}function jm(e,t,n){return Object.entries(t).reduce((r,[i,o])=>{if(et(o))return r;if(me(o)){let s=CI(o.ref,i,n.namespace);return{...r,literals:EI(r.literals,i),relations:s==null?r.relations:[..._m(r.relations,i),s]}}return{...r,literals:{...r.literals,[i]:o},relations:_m(r.relations,i)}},e)}function CI(e,t,n){let r=pn(e);if(r==null)return;let i=n.get(r.alias);return i==null?void 0:{entity:i,field:t,targetAlias:r.alias,targetField:r.field}}function EI(e,t){return Object.fromEntries(Object.entries(e).filter(([n])=>n!==t))}function _m(e,t){return e.filter(n=>n.field!==t)}function AI(e,t){let n=e.entities.find(i=>i.alias===t),r=II(e,t);return n==null?r:{...r,absences:[...r.absences,{entity:n.entity,literals:n.literals,relations:n.relations}]}}function II(e,t){return{...e,entities:e.entities.filter(n=>n.alias!==t)}}function PI({branchScoped:e,namespace:t,origin:n,requiredState:r,step:i}){if(i.action.kind!=="goto")return[];let o=i.action.url;return i.expect.filter(s=>Yl(s)).filter(s=>!e.has(G(s))).map(s=>Fm({consequence:s,namespace:t,origin:n,requiredState:r,url:o}))}function Fm({consequence:e,namespace:t,origin:n,requiredState:r,url:i}){return{consequence:e,origin:n,refs:new Set(ym([...at(i),...gn(e)],t).map(o=>o.aliasPath)),when:{...r,singletons:{...r.singletons,url:i}}}}function TI(e){return Tt(Bn(e).flatMap(t=>MI(t)),ql)}function MI(e){let t=e.nav.at(-1),n=e.steps[0]?.action,r=n!=null&&"locator"in n?n.locator:void 0;return t==null||t.action.kind!=="goto"||r==null?[]:[Fm({consequence:{kind:"enabled",locator:r,wait:void 0},namespace:e.namespace,origin:{intent:e.intent,kind:"trigger",test:e.test},requiredState:e.requiredState,url:t.action.url})]}function OI(e,t){try{let n=xo(e.consequence,t);return n==null?null:{check:n}}catch{return null}}function Xl(e){return El(nt(e).flatMap(t=>NI(e,t.test)))}function Zl(e,t){return xt(e.when,t)==null?!1:xt(e.holds,t)==null}function NI(e,t){let n=Co(e,t);return n.requiredState.entities.flatMap(r=>r.relations.flatMap(i=>$I(e,r,i,n.namespace)?DI(r,i,n.namespace):[]))}function $I(e,t,n,r){let i=r.get(n.targetAlias);return i!=null&&!LI(e,t.entity,n.field)&&_I(e,i,n.targetField)}function LI(e,t,n){return e.entities.find(r=>r.name===t)?.props[n]?.optional===!0}function _I(e,t,n){return e.entities.find(r=>r.name===t)?.identity.includes(n)===!0}function DI(e,t,n){let r=n.get(t.targetAlias);if(r==null)return[];let i=Bm(e.alias,e.entity),o=Bm(t.targetAlias,r);return[{holds:zr({entities:[{...i,relations:[t]},o]}),reference:{field:t.field,source:e.entity,target:r,targetField:t.targetField},when:zr({entities:[i]})}]}function Bm(e,t){return{alias:e,entity:t,literals:{},relations:[]}}function Vm(e,t){let n=[...t.entities].flatMap(([o,s])=>[...s].map(([a,l])=>jI({entity:o,key:a,pre:e,row:l}))),r=[...e.entities].flatMap(([o,s])=>[...s].flatMap(([a,l])=>FI({entity:o,key:a,post:t,row:l}))),i=Object.entries(t.singletons).map(([o,s])=>({changed:e.singletons[o]!==s,name:o,value:s}));return{rows:[...n,...r],singletons:i}}function jI({entity:e,key:t,pre:n,row:r}){let i=BI(n.entities.get(e),t),o=Object.entries(r).map(([s,a])=>({changed:i==null||i[s]!==a,field:s,value:a}));return{changed:i==null||o.some(s=>s.changed),entity:e,fields:o,key:t,status:i==null?"created":"present"}}function FI({entity:e,key:t,post:n,row:r}){if(n.entities.get(e)?.has(t)===!0)return[];let i=Object.entries(r).map(([o,s])=>({changed:!1,field:o,value:s}));return[{changed:!0,entity:e,fields:i,key:t,status:"deleted"}]}function BI(e,t){return e?.get(t)}function Ql(e,t,n){return t.steps.map(r=>({effect:r.effect,pendingChecks:r.pendingChecks.map(i=>({budget:i.budget,check:{kind:"poll",run:()=>n.evaluate(i.check)},source:{check:i.check,kind:"step"},targetIds:()=>n.locateIds(Po(i.check))})),reconcile:r.reconcile,step:{action:r.action,intent:e.intent,test:e.test},sync:e.wait,verifyChanges:r.verifyChanges,perform:()=>n.perform(r.action),requiredState:()=>!0,targetIds:()=>n.locateIds(r.action.locator)}))}function Po(e){if(e.kind==="not")return Po(e.inner);if(e.kind!=="browser")return e.locator}async function Um(e,t){let{params:n,transition:r}=e.stepRun,i=Wr(r,e.state,n);if(i==null){let s={intent:r.intent,kind:"unrunnable",reason:Im(r,e.state,n),test:r.test};return{label:wt(r),next:e.state,result:{finalModel:e.state.snapshot,findings:[s]}}}let o=await Ml({canon:e.canon,classify:e.classify,initialSnapshot:e.state.snapshot,observe:e.driver.observe,onAssertion:e.onAssertion,onStep:e.onStep,pageRulePendingChecks:UI(e.pageRules,e.dataRules,e.driver),steps:Ql(e.stepRun.transition,i.resolved,e.driver)},t);return{label:wt(e.stepRun.transition),next:{snapshot:o.finalModel},result:o}}function VI(e,t){return Zl(e,t)?[{budget:"fast",check:{kind:"decided",passed:!1},source:{dataRule:e,kind:"data-rule"},targetIds:()=>Promise.resolve([])}]:[]}function UI(e,t,n){return(r,i)=>[...e.flatMap(o=>WI(o,r,i,n)),...t.flatMap(o=>VI(o,i))]}function WI(e,t,n,r){let i=Jl(e,t,n);return i==null?[]:[{budget:"fast",check:{kind:"poll",run:()=>r.evaluate(i.check)},source:{check:i.check,kind:"page-rule",origin:e.origin},targetIds:()=>r.locateIds(Po(i.check))}]}function tu(e,t){return eu({acc:{findings:[],ran:[]},index:0,params:e,signal:t,state:e.initialState,stepBase:0})}async function eu({acc:e,index:t,params:n,signal:r,state:i,stepBase:o}){Kt(r);let s=n.sequence[t];if(s==null)return e;let a=Date.now(),l=[],u=await Um({canon:n.canon,classify:n.classify,dataRules:n.dataRules,driver:n.driver,onAssertion:n.onAssertion,pageRules:n.pageRules,state:i,stepRun:s,onStep:d=>{l.push(d.index),n.onEvent({annotations:d.annotations,endMs:d.endMs,findings:d.findings,index:o+d.index,kind:"step",startMs:d.startMs,state:Vm(d.pre,d.post),url:d.url})}},r);if(u==null)return eu({acc:e,index:t+1,params:n,signal:r,state:i,stepBase:o});n.onEvent({endMs:Date.now(),intent:s.transition.intent,kind:"ran",startMs:a}),u.result.findings.forEach(d=>{n.onEvent({finding:d,kind:"finding"})});let c={findings:[...e.findings,...u.result.findings],ran:[...e.ran,u.label]};return u.result.findings.length>0?c:eu({acc:c,index:t+1,params:n,signal:r,state:u.next,stepBase:o+l.length})}var Un={value:e=>zI(e)};function ru(e,t){return{value:n=>e.value({...n,seed:`${t}:${n.seed}`})}}function iu(e,t){return{value:n=>e.value({...n,anchor:t})}}function zI({anchor:e,constraints:t,generator:n,nullable:r,seed:i,type:o,values:s,valueSpace:a}){let l=nu(`${a}:${i}`);return r&&l%4===0?null:s!=null&&s.length>0?s[l%s.length]??s[0]??null:n==="date.iso"?GI({anchor:e,constraints:t,n:l,timeHash:nu(`${a}:${i}#tod`)}):o==="number"?HI(l,t):o==="boolean"?l%2===0:XI(n,l)}var To=864e5;function GI({anchor:e,constraints:t,n,timeHash:r}){if(t?.kind!=="datetime")throw new Error("datetime value space requires offsetDays constraints");if(e==null)throw new Error("datetime value space requires a run anchor timestamp");let i=Date.parse(e);if(Number.isNaN(i))throw new TypeError(`datetime anchor "${e}" is not a valid ISO timestamp`);let o=t.maxOffsetDays-t.minOffsetDays+1,s=o<=0?t.minOffsetDays:t.minOffsetDays+n%o,a=Math.floor(i/To)*To;return new Date(a+s*To+r%To).toISOString()}function nu(e,t=0,n=7){return t>=e.length?n>>>0:nu(e,t+1,n*31+(e.codePointAt(t)??0)>>>0)}function HI(e,t){if(t?.kind!=="number"||t.min==null||t.max==null)throw new Error("number value space requires min and max constraints");let n=t.max-t.min+1;return n<=0?t.min:t.min+e%n}var qI=["ada","bruno","carmen","dario","elena","felix","greta","hugo","iris","jonas","kira","lena","mateo","nadia","oscar","petra","quinn","rosa","stefan","tara","ugo","vera","wim","yara"],KI=["abreu","berg","costa","duval","eriksen","fischer","garza","holm","ito","jansen","kovac","laurent","moreau","novak","okafor","petrov","quist","rossi","sato","tanaka","ueda","vargas","weber","zhang"],YI=["amber","brisk","calm","deep","early","fond","glad","hazel","ivory","jade","keen","lush","mauve","noble","opal","plum","quiet","rapid","sage","teal","umber","vivid","warm","zesty"],JI=["aspen","brook","cedar","dune","ember","fjord","grove","harbor","isle","juniper","knoll","lagoon","meadow","nimbus","orchid","prairie","quartz","ridge","summit","thicket","umbra","vale","willow","zephyr"];function Mo(e,t){let n=e[t%e.length];if(n==null)throw new Error("empty word list");return n}function Oo(e){return`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function XI(e,t){let n=Mo(qI,t),r=Mo(KI,Math.floor(t/31)),i=Mo(YI,t),o=Mo(JI,Math.floor(t/29));return e==="internet.email"?`${n}.${r}${String(t%100)}@test.ripplo.ai`:e==="internet.url"?`https://${i}-${o}.example.com`:e==="person.fullName"?`${Oo(n)} ${Oo(r)}`:e==="company.name"?`${Oo(i)} ${Oo(o)}`:e==="lorem.slug"?`${i}-${o}`:`${o}-${String(t%1e3)}`}import{ResultAsync as su}from"neverthrow";var Hr=class extends Error{mountKey;constructor(t){super("client-mount-unmounted"),this.mountKey=t}};function ou(e){return{read:t=>ZI(t,e),seedScript:t=>`globalThis[${JSON.stringify(Ja)}] = ${JSON.stringify(t)};`}}async function ZI(e,t){let n={title:await e.title(),url:It(e.url()),viewport:tP(e.viewportSize())};if(t.length===0)return n;let r=await e.evaluate(eP,{mountKey:oo,names:t,timeoutMs:QI});if(r.kind==="unmounted")throw new Hr(oo);return{...n,...r.values}}var QI=5e3;async function eP(e){let t=Date.now()+e.timeoutMs;for(;Reflect.get(globalThis,e.mountKey)==null&&Date.now()<t;)await new Promise(r=>setTimeout(r,25));let n=Reflect.get(globalThis,e.mountKey);return n==null?{kind:"unmounted"}:{kind:"values",values:Object.fromEntries(e.names.map(r=>[r,n.readSingleton(r)??null]))}}function tP(e){return e==null?"":`${String(e.width)}x${String(e.height)}`}function au(e,t,n){return{evaluate:r=>su.fromPromise(Gm(nP(e,n,r),`check ${r.kind}`),Wm),locateIds:r=>lP(e,r),observe:()=>t.read().andThen(r=>su.fromPromise(Gm(Hm(e,n,0),"observe"),Wm).map(i=>({snapshot:{...r,singletons:{...r.singletons,...i}}}))),perform:r=>su.fromPromise(Km(e,r,0),i=>Ah(r.kind,i))}}async function nP(e,t,n){try{return await Zm(e,t,n)}catch(r){if(qm(r))return!1;throw r}}function Wm(e){return e instanceof Hr?xh(e.mountKey):Ih(e)}var rP=[100,250,500];async function Hm(e,t,n){try{return await t.read(e)}catch(r){let i=rP[n];if(i==null||!qm(r))throw r;return await Xm(i),Hm(e,t,n+1)}}function qm(e){let t=e instanceof Error?e.message:String(e);return/Execution context was destroyed|Cannot find context with specified id|[Ff]rame was detached|frame got detached/.test(t)}var zm=35e3;function Gm(e,t){let n,r=new Promise((i,o)=>{n=setTimeout(()=>{o(new Error(`driver op "${t}" exceeded ${String(zm)}ms`))},zm)});return Promise.race([e,r]).finally(()=>{clearTimeout(n)})}var iP=[250,750,2e3];async function Km(e,t,n){try{await oP(e,t)}catch(r){let i=iP[n];if(i==null||!cP(r))throw r;await Xm(i),await Km(e,t,n+1)}}async function oP(e,t){if(t.kind==="goto"){await e.goto(Wn(t.url,t,"url"));return}if(t.kind==="press"&&t.locator==null){await e.keyboard.press(Wn(t.key,t,"key"));return}let n=t.kind!=="upload";await sP(e,Ym(e,t.locator,{visibleOnly:n}),t)}function Wn(e,t,n){if(e==null)throw new Error(`action "${t.kind}" requires ${n}`);return e}function sP(e,t,n){switch(n.kind){case"goto":throw new Error("goto must not be located");case"fill":return t.fill(String(Wn(n.value,n,"value")));case"clear":return t.clear();case"click":return t.click();case"dblclick":return t.dblclick();case"check":return t.check();case"uncheck":return t.uncheck();case"hover":return t.hover();case"select":return aP(e,t,String(Wn(n.value,n,"value")));case"upload":return t.setInputFiles(Wn(n.files,n,"files"));case"press":return t.press(Wn(n.key,n,"key"))}}async function aP(e,t,n){if(await t.evaluate(i=>i.tagName==="SELECT")){await t.selectOption(n);return}await t.click(),await t.fill(n),await e.locator(Jm("option",n)).filter({visible:!0}).click()}async function lP(e,t){if(t==null)return[];try{let n=await No(e,t,{visibleOnly:!1}).evaluate(uP);return n>0?[n]:[]}catch{return[]}}function uP(e){return globalThis.__ripploRrwebMirror?.getId(e)??-1}function Ym(e,t,n){if(t==null)throw new Error("action requires a locator");return No(e,t,n)}function No(e,t,n){if(t.by==="inside"){let i=No(e,t.scope,n);return No(i,t.target,n)}let r=t.by==="testId"?e.getByTestId(t.value):e.locator(Jm(t.role,t.name));return n.visibleOnly?r.filter({visible:!0}):r}function Jm(e,t){return t==null?`role=${e}`:`role=${e}[name=${JSON.stringify(t)}i]`}function cP(e){let t=e instanceof Error?e.message:String(e);return/net::ERR_|ERR_HTTP_RESPONSE_CODE_FAILURE|ECONNREFUSED|ECONNRESET|socket hang up|fetch failed|page\.goto: Timeout/.test(t)}function Xm(e){return new Promise(t=>{setTimeout(t,e)})}async function Zm(e,t,n){if(n.kind==="browser")return fP(e,t,n.name,n.value);if(n.kind==="not")return!await Zm(e,t,n.inner);let r=Ym(e,n.locator,{visibleOnly:!0});return n.kind==="value"?await r.inputValue()===n.value:n.kind==="text"?(await r.textContent()??"").includes(n.value):dP(r,n.kind)}function dP(e,t){return t==="visible"?e.isVisible():t==="disabled"?e.isDisabled():t==="enabled"?e.isEnabled():t==="checked"?e.isChecked():e.evaluate(n=>n===n.ownerDocument.activeElement)}async function fP(e,t,n,r){let o=(await t.read(e))[n];return typeof o=="string"&&o.includes(r)}import pP from"path";async function lu({baseUrl:e,browser:t,capture:n,clientState:r,engine:i,fixturesDir:o,reader:s,session:a}){let l=await t.newContext({baseURL:e,reducedMotion:"reduce",storageState:a==null?void 0:{cookies:hP(a.cookies,e),origins:a.origins}});a?.headers!=null&&await l.setExtraHTTPHeaders(a.headers),await l.addInitScript(i.seedScript(r));let u=n==null?mP():await n.hub.attach(l,n.runId),c=await l.newPage();return u.onPage(c),{driver:bP(gP(au(c,s,i),o),u),emitAssertion:u.emitAssertion,close:()=>SP({context:l,handle:u})}}async function uu(e,t){let n=await eg(e);try{return await t(n)}finally{await n.close()}}function hP(e,t){let n=new URL(t).hostname;return e.map(r=>({...r,domain:n}))}function mP(){return{emitAction:()=>{},emitAssertion:()=>{},finish:()=>Promise.resolve(),onPage:()=>{}}}async function eg(e){let{chromium:t}=await import("playwright");return t.launch({headless:!e})}function tg({headed:e}){let t;return{acquire:async()=>{let i=t;if(i!=null){let o=await i.catch(()=>{});if(o?.isConnected()===!0)return o;t===i&&(t=void 0)}return t??=eg(e),t},close:async()=>{let i=t;t=void 0,i!=null&&await i.then(o=>o.close()).catch(()=>{})}}}function gP(e,t){return{evaluate:e.evaluate,locateIds:e.locateIds,observe:e.observe,perform:n=>e.perform(yP(n,t))}}function yP(e,t){return e.kind!=="upload"||e.files==null?e:{...e,files:e.files.map(n=>pP.join(t,n))}}function bP(e,t){return{evaluate:e.evaluate,locateIds:e.locateIds,observe:e.observe,perform:n=>(t.emitAction(n),e.perform(n))}}async function SP({context:e,handle:t}){await Qm(t.finish()),await Qm(e.close())}var wP=15e3;async function Qm(e){let t,n=new Promise(r=>{t=setTimeout(r,wP)});await Promise.race([e.catch(()=>{}),n]).finally(()=>{clearTimeout(t)})}import{err as xP,ok as vP,Result as cu}from"neverthrow";function du(e,t,n){return{read:()=>n.read(e.map(r=>r.name),t).andThen(r=>RP(e,r))}}function RP(e,t){return cu.combine(e.map(n=>kP(n,t.entities[n.name]??[]).map(r=>[n.name,r]))).map(n=>({entities:new Map(n),singletons:t.singletons}))}function kP(e,t){let n=vo(e);return cu.combine(t.map(r=>CP(r,e).map(i=>[i,EP(r,n)]))).map(r=>new Map(r))}function CP(e,t){return cu.combine(t.identity.map(n=>{let r=e[n];return r==null?xP(Rh(t.name,n)):vP(String(r))})).map(n=>n.join(":"))}function EP(e,t){let n=t.map(r=>[r,e[r]]).filter(r=>r[1]!=null);return Object.fromEntries(n)}var ng=Fi(Ma(),1);import AP from"crypto";import{err as IP,errAsync as fu,ok as PP,ResultAsync as zn}from"neverthrow";var TP=3e4,MP=[250,750,2e3],OP=[500,1e3,2e3,3e3];function pu({baseUrl:e,runId:t,secret:n},r){let i=new ng.Webhook(n),o=(s,a,l)=>NP({baseUrl:e,body:a,path:s,retry:l.retry,schema:l.schema,signal:l.signal,webhook:i});return{query:{read:(s,a)=>o("/state",{entities:s,runId:t,singletons:a},{retry:"transient",schema:rl,signal:r}).map(l=>({entities:l.entities,singletons:l.singletons}))},ready:()=>ig(e,r,0),setupWorld:s=>o("/setup",{entities:s,runId:t},{retry:"connection",schema:nl,signal:r}).map(a=>a.rows),teardown:()=>o("/teardown",{runId:t},{retry:"connection",schema:il,signal:void 0}).map(()=>{})}}function NP(e){return rg(e.retry,()=>DP(e),0)}function rg(e,t,n){return t().orElse(r=>{let i=MP[n];return i==null||!LP(r,e)?fu(r):zn.fromSafePromise(og(i)).andThen(()=>rg(e,t,n+1))})}function ig(e,t,n){return zn.fromPromise(fetch(e,{method:"HEAD",signal:sg(t)}),r=>Or("",r)).map(()=>{}).orElse(()=>{let r=OP[n];return r==null||t.aborted?fu(Eh(e)):zn.fromSafePromise(og(r)).andThen(()=>ig(e,t,n+1))})}var $P=new Set(["EAI_AGAIN","ECONNREFUSED","ENOTFOUND"]);function LP(e,t){return e.kind==="aborted"?!1:_P(e)?!0:t==="connection"?!1:e.kind==="engine-network"||e.kind==="engine-http"&&e.status>=500}function _P(e){return e.kind==="engine-network"&&e.code!=null&&$P.has(e.code)}function og(e){return new Promise(t=>{setTimeout(t,e)})}function DP({baseUrl:e,body:t,path:n,schema:r,signal:i,webhook:o}){let s=JSON.stringify(t);return zn.fromPromise(fetch(`${e}${n}`,{body:s,headers:{"Content-Type":"application/json",...jP(o,s)},method:"PUT",signal:sg(i)}),a=>Or(n,a)).andThen(a=>FP(a,n)).andThen(a=>BP(r,a,n)).mapErr(a=>i?.aborted===!0?Ph():a)}function jP(e,t){let n=`msg_${AP.randomUUID()}`,r=new Date;return{"webhook-id":n,"webhook-signature":e.sign(n,r,t),"webhook-timestamp":String(Math.floor(r.getTime()/1e3))}}function sg(e){let t=AbortSignal.timeout(TP);return e==null?t:AbortSignal.any([e,t])}function FP(e,t){return e.ok?zn.fromPromise(e.json(),n=>Or(t,n)):zn.fromPromise(e.text().catch(()=>""),n=>Or(t,n)).andThen(n=>fu(wh(t,e.status,n)))}function BP(e,t,n){let r=e.safeParse(t);return r.success?PP(r.data):IP(vh(n,r.error))}var oe=Fi(ug(),1),Le={actual:e=>oe.default.red(e),bad:e=>oe.default.red(oe.default.bold(e)),bold:e=>oe.default.bold(e),dim:e=>oe.default.dim(e),expected:e=>oe.default.green(e),good:e=>oe.default.green(oe.default.bold(e)),heading:e=>oe.default.bold(oe.default.cyan(e)),path:e=>oe.default.cyan(oe.default.underline(e)),warn:e=>oe.default.yellow(oe.default.bold(e))},zP={assertion:oe.default.yellow,consistency:oe.default.magenta,"data rule":oe.default.yellow,driver:oe.default.red,"impossible action":oe.default.cyan,"page rule":oe.default.yellow,skipped:oe.default.red};function lt(e){return`${oe.default.red(oe.default.bold("\u2717"))} ${zP[e](oe.default.bold(e))}`}var GP=oe.default.red("\u2717"),DH=oe.default.green("\u2713"),HP=oe.default.dim("\u203A"),qP=8;function cg(e,t,n){let r=n==null?"":` ${Le.dim(n)}`;return` ${Le.dim(e.padStart(qP))} ${t}${r}`}function Hn(e){return e.by==="testId"?`testId=${e.value}`:e.by==="inside"?`${Hn(e.scope)} \u25B8 ${Hn(e.target)}`:e.name==null?e.role:`${e.role} "${e.name}"`}function gu(e){return e.url!=null?`${e.kind} ${e.url}`:e.locator!=null?`${e.kind} ${Hn(e.locator)}`:e.kind}function qn(e){return e.kind==="not"?`not ${qn(e.inner)}`:e.kind==="browser"?`${e.name}="${e.value}"`:e.kind==="value"||e.kind==="text"?`${e.kind} ${Hn(e.locator)}="${e.value}"`:`${e.kind} ${Hn(e.locator)}`}function qr(e){let{field:t,source:n,target:r,targetField:i}=e.reference;return`${n}.${t} \u2192 ${r}.${i}`}function fg(e){return`${e.intent} \u203A ${gu(e.action)}`}function pg(e){return e.kind==="data-rule"?`data rule ${qr(e.dataRule)}`:`${e.kind} ${qn(e.check)}`}function _e(e){return e==null?"\u2205":JSON.stringify(e)}function hg(e){return e.kind==="unexpected-row"?`${e.entity} "${e.key}" present in the app but the test expected none`:e.kind==="missing-row"?`${e.entity} "${e.key}" expected by the test but missing in the app`:e.kind==="wrong-value"?`${e.entity}.${e.field} [${e.key}] expected=${_e(e.snapshot)} actual=${_e(e.sut)}`:e.kind==="expected-change"?`${e.entity}.${e.field} [${e.key}] expected to change but stayed ${_e(e.value)}`:`${e.singleton} expected=${_e(e.snapshot)} actual=${_e(e.sut)}`}function yu(e){return{label:pg(e.source),step:fg(e.step)}}function bu({evidencePath:e,finding:t}){let n=KP(t);return e==null?n:`${n} Evidence: ${Le.path(e)}`}function mg(e){return JP(XP(e))}function KP(e){return e.kind==="consistency"?sT(e):e.kind==="pending-check"?uT(e.source,e.step,e.budget):e.kind==="impossible-action"?`${lt("impossible action")} The step "${e.step.intent}" ran ${gu(e.step.action)} from a state the test says can't happen. Either the test's required state is stricter than the app really is, or the app exposes this action somewhere it shouldn't \u2014 check which before loosening the test.`:e.kind==="unrunnable"?`${lt("skipped")} The planned step "${e.intent}" could not run \u2014 ${gg(e.reason)}. A planned move was skipped, so this run proved less than it claims \u2014 fix the plan or the starting state rather than ignoring the skip.`:`${lt("driver")} The browser failed while running "${e.step.intent}" \u2014 ${Pt(e.error)}. This is an environment failure (daemon, dev server, ports), not an app or test bug \u2014 fix the run environment and rerun.`}var YP=new RegExp(`${String.fromCodePoint(27)}\\[[0-9;]*m`,"g");function JP(e){return e.replaceAll(YP,"").replaceAll(/\s+/g," ").trim()}function XP(e){if(e.kind==="consistency"){let t=e.step==null?"":` after "${e.step.intent}"`;return`${hg(e.mismatch)}${t}`}return e.kind==="pending-check"?`${dT(e.source)} failed at "${e.step.intent}": ${fT(e.source)}`:e.kind==="impossible-action"?`"${e.step.intent}" ran from a state the test says can't happen`:e.kind==="unrunnable"?`planned step "${e.intent}" could not run \u2014 ${gg(e.reason)}`:`driver failed at "${e.step.intent}": ${Pt(e.error)}`}var ZP={"no-effect":"the action has no observable effect from this state","required-state-unsatisfied":"the live state doesn't satisfy the step's required state",unresolvable:"a step references a value that doesn't exist yet (e.g. a not-yet-created id)"};function gg(e){return ZP[e]}function QP({debugDir:e,runId:t}){let n=`${e}/${t}`;return cg("behavior",Le.path(`${n}/behavior.jsonl`),void 0)}function eT(e){if(e.kind==="cascade-gap"){let{gap:n}=e;return`${lt("data rule")} ${n.transition} deletes ${n.target} but leaves ${n.source} rows pointing at the deleted row. That breaks the data rule ${qr(n.dataRule)} \u2014 cascade the delete in the app or declare the cleanup on the deleting step.`}if(e.kind==="create-gap"){let{gap:n}=e,r=n.missing.length===1?"field":"fields",i=n.missing.length===1?"it":"them";return`${lt("data rule")} ${n.transition} creates ${n.entity} without setting the required ${r} ${n.missing.join(", ")}. Set ${i} on the creating step or drop the requirement from the entity.`}let{conflict:t}=e;return`${lt("page rule")} Two page rules contradict each other \u2014 ${t.a.kind} vs ${t.b.kind} when ${JSON.stringify(t.when.singletons)}. They were learned from different tests asserting opposite things about the same page \u2014 one of those tests is wrong, fix it before trusting either rule.`}function tT(e){return"locator"in e&&e.locator!=null?`${e.kind} ${mu(e.locator)}`:"url"in e?`${e.kind} ${nT(e.url)}`:e.kind}function nT(e){return typeof e=="string"?e:"ref"in e?`{${e.ref}}`:yg(e)}function mu(e){return e.by==="role"?e.name==null?e.role:`${e.role} ${dg(e.name)}`:e.by==="inside"?`${mu(e.scope)} \u25B8 ${mu(e.target)}`:dg(e.value)}function dg(e){return e===null?"\u2205":typeof e=="string"?`"${e}"`:typeof e!="object"?String(e):"ref"in e?`{${e.ref}}`:yg(e)}function yg(e){return e.template.map(t=>typeof t=="string"?t:":id").join("")}function _o(e){return e==null?"At the end of the run":`After ${iT(e.action)} in ${e.intent}`}var rT={click:"clicking",fill:"filling",goto:"opening",hover:"hovering over",press:"pressing",select:"selecting",upload:"uploading to"};function iT(e){return e.url!=null?`opening ${e.url}`:e.locator!=null?`${rT[e.kind]??e.kind} ${Gn(e.locator)}`:e.kind}function Gn(e){return e.by==="testId"?`the element with testId "${e.value}"`:e.by==="inside"?`${Gn(e.target)} inside ${Gn(e.scope)}`:e.name==null?`the ${e.role}`:`the "${e.name}" ${e.role}`}function oT(e){return e.kind==="not"&&e.inner.kind==="visible"?`${Gn(e.inner.locator)} never disappeared`:e.kind==="visible"?`${Gn(e.locator)} never appeared`:e.kind==="value"||e.kind==="text"?`${Gn(e.locator)} never showed "${e.value}"`:`the check ${qn(e)} never held`}function sT(e){let t=e.pending?aT(e):lT(e.mismatch,e.step);return`${lt("consistency")} ${t}`}function aT(e){let t=`${bg(e.budget)} wait window`,n="If this write is legitimately slow, declare wait: on the expectation or move it to a slower tier.",{mismatch:r}=e,i=_o(e.step);return r.kind==="wrong-value"?`${i}, ${r.entity}.${r.field} on row "${r.key}" never changed within the ${t} \u2014 it still showed ${Le.actual(_e(r.sut))} instead of ${Le.expected(_e(r.snapshot))}, so the write may not have landed at all. ${n}`:r.kind==="unexpected-row"?`${i}, the ${r.entity} row "${r.key}" was still there at the end of the ${t} \u2014 the delete may not have landed. ${n}`:r.kind==="missing-row"?`${i}, the ${r.entity} row "${r.key}" never appeared within the ${t} \u2014 the create may not have landed. ${n}`:r.kind==="expected-change"?`${i}, ${r.entity}.${r.field} on row "${r.key}" was expected to change but stayed ${Le.actual(_e(r.value))} through the ${t}, so the write may not have landed at all. ${n}`:`${i}, ${r.singleton} never changed within the ${t} \u2014 it still showed ${Le.actual(_e(r.sut))} instead of ${Le.expected(_e(r.snapshot))}, so the write may not have landed at all. ${n}`}function bg(e){return`${String(Dr[e]/1e3)}s`}function lT(e,t){let n=_o(t);return e.kind==="wrong-value"?`${n}, ${e.entity}.${e.field} on row "${e.key}" showed ${Le.actual(_e(e.sut))} but the test expected ${Le.expected(_e(e.snapshot))}. This is an app bug if the expected value is the promised behavior \u2014 if the app legitimately owns this value, assert changed() instead.`:e.kind==="singleton-mismatch"?`${n}, ${e.singleton} showed ${Le.actual(_e(e.sut))} but the test expected ${Le.expected(_e(e.snapshot))}. This is an app bug if the expected value is the promised behavior \u2014 otherwise correct the expected value at the step that sets it.`:e.kind==="unexpected-row"?`${n}, the app held a ${e.entity} row "${e.key}" the test never expected. Some step writes this row without declaring it \u2014 declare the effect on the acting step (${e.entity}.created, updated, or deleted), or if this write belongs to a different flow, cover it in that flow's test.`:e.kind==="missing-row"?`${n}, the test expected a ${e.entity} row "${e.key}" but the app had none. This is an app bug if the write was promised \u2014 if it only happens from a different starting state, restrict this test's given and cover that state in its own test.`:`${n}, ${e.entity}.${e.field} on row "${e.key}" was expected to change but stayed ${Le.actual(_e(e.value))}. This is an app bug if this action should change it \u2014 if the change needs other preconditions, split that case into its own test with the right given.`}function uT(e,t,n){let r=`${bg(n)} wait window`;return e.kind==="data-rule"?`${lt("data rule")} ${_o(t)}, the data rule ${qr(e.dataRule)} stopped holding \u2014 a referenced row went missing. This is an app bug if the reference should survive this action \u2014 confirm in behavior.jsonl before relaxing the rule.`:e.kind==="page-rule"?`${lt("page rule")} A page rule learned from ${cT(e.origin)} says ${qn(e.check)} at this URL \u2014 it never held here within the ${r}. Either the rule is broader than the app guarantees or this page regressed \u2014 confirm in behavior.jsonl before narrowing the rule.`:`${lt("assertion")} ${_o(t)}, ${oT(e.check)} within the ${r}. This is usually a wrong accessible name, a UI regression, or a starting state this page doesn't have \u2014 confirm in behavior.jsonl before changing the test.`}function cT(e){return e==null?"another workflow":e.kind==="test"?`an assertion in test "${e.test}"`:e.kind==="trigger"?`the trigger of "${e.intent}" in test "${e.test}"`:`tests ${e.tests.map(n=>JSON.stringify(n)).join(", ")}`}function dT(e){return e.kind==="data-rule"?"data rule":e.kind==="page-rule"?"page rule":"assertion"}function fT(e){return e.kind==="data-rule"?qr(e.dataRule):qn(e.check)}import{err as E5,ok as A5,ResultAsync as I5}from"neverthrow";import vS from"path";import{z as ft}from"zod";import{existsSync as pT}from"fs";import{createRequire as hT}from"module";import{fileURLToPath as mT}from"url";import{Worker as gT}from"worker_threads";var yT=hT(import.meta.url);function Sg(e){let t=new gT(bT(),{workerData:e});t.unref();let n=new Map,r={next:0};t.on("message",o=>{let s=n.get(o.seq);s!=null&&(n.delete(o.seq),s())});let i=o=>{t.postMessage(o)};return{close:({noticeLineIfNoRrweb:o,runId:s})=>{let a=r.next;return r.next+=1,new Promise(l=>{n.set(a,l),i({noticeLineIfNoRrweb:o,runId:s,seq:a,t:"close"})})},line:({line:o,runId:s,timeNanos:a})=>{i({line:o,runId:s,t:"line",timeNanos:a})},open:({file:o,runId:s})=>{i({file:o,runId:s,t:"open"})},rrwebBatch:({data:o,runId:s})=>{i({data:o,runId:s,t:"rrweb-batch"})},terminate:async()=>{await t.terminate()}}}function bT(){try{return yT.resolve("@ripplo/runtime/capture-worker")}catch{let e=["../../dist/capture-worker.js","./capture-worker.js"].map(n=>mT(new URL(n,import.meta.url))),t=e.find(n=>pT(n));if(t==null)throw new Error(`capture-worker.js not found; looked at: ${e.join(", ")}`);return t}}import{readFile as ST}from"fs/promises";import{createRequire as wT}from"module";import{fileURLToPath as xT}from"url";var vT=wT(import.meta.url);function Su(e,t){try{return vT.resolve(e)}catch{return xT(new URL(`assets/${t}`,import.meta.url))}}var RT=Su("@ripplo/browser-trace/bundle","browser-trace.js");async function xg(e,t){await e.addInitScript(`globalThis.__ripploRunId = ${JSON.stringify(t)};`),await e.addInitScript(await kT())}var wg;function kT(){return wg??=ST(RT,{encoding:"utf8"}),wg}import{readFile as qN}from"fs/promises";var CT=Object.defineProperty,ET=(e,t,n)=>t in e?CT(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,C=(e,t,n)=>ET(e,typeof t!="symbol"?t+"":t,n),vg,AT=Object.defineProperty,IT=(e,t,n)=>t in e?AT(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Rg=(e,t,n)=>IT(e,typeof t!="symbol"?t+"":t,n),Ie=(e=>(e[e.Document=0]="Document",e[e.DocumentType=1]="DocumentType",e[e.Element=2]="Element",e[e.Text=3]="Text",e[e.CDATA=4]="CDATA",e[e.Comment=5]="Comment",e))(Ie||{}),kg={Node:["childNodes","parentNode","parentElement","textContent","ownerDocument"],ShadowRoot:["host","styleSheets"],Element:["shadowRoot","querySelector","querySelectorAll"],MutationObserver:[]},Cg={Node:["contains","getRootNode"],ShadowRoot:["getSelection"],Element:[],MutationObserver:["constructor"]},Do={},PT=()=>!!globalThis.Zone;function Rc(e){if(Do[e])return Do[e];let t=globalThis[e],n=t.prototype,r=e in kg?kg[e]:void 0,i=!!(r&&r.every(a=>{var l,u;return!!((u=(l=Object.getOwnPropertyDescriptor(n,a))==null?void 0:l.get)!=null&&u.toString().includes("[native code]"))})),o=e in Cg?Cg[e]:void 0,s=!!(o&&o.every(a=>{var l;return typeof n[a]=="function"&&((l=n[a])==null?void 0:l.toString().includes("[native code]"))}));if(i&&s&&!PT())return Do[e]=t.prototype,t.prototype;try{let a=document.createElement("iframe");document.body.appendChild(a);let l=a.contentWindow;if(!l)return t.prototype;let u=l[e].prototype;return document.body.removeChild(a),u?Do[e]=u:n}catch{return n}}var wu={};function Lt(e,t,n){var r;let i=`${e}.${String(n)}`;if(wu[i])return wu[i].call(t);let o=Rc(e),s=(r=Object.getOwnPropertyDescriptor(o,n))==null?void 0:r.get;return s?(wu[i]=s,s.call(t)):t[n]}var xu={};function vy(e,t,n){let r=`${e}.${String(n)}`;if(xu[r])return xu[r].bind(t);let o=Rc(e)[n];return typeof o!="function"?t[n]:(xu[r]=o,o.bind(t))}function TT(e){return Lt("Node",e,"ownerDocument")}function MT(e){return Lt("Node",e,"childNodes")}function OT(e){return Lt("Node",e,"parentNode")}function NT(e){return Lt("Node",e,"parentElement")}function $T(e){return Lt("Node",e,"textContent")}function LT(e,t){return vy("Node",e,"contains")(t)}function _T(e){return vy("Node",e,"getRootNode")()}function DT(e){return!e||!("host"in e)?null:Lt("ShadowRoot",e,"host")}function jT(e){return e.styleSheets}function FT(e){return!e||!("shadowRoot"in e)?null:Lt("Element",e,"shadowRoot")}function BT(e,t){return Lt("Element",e,"querySelector")(t)}function VT(e,t){return Lt("Element",e,"querySelectorAll")(t)}function UT(){return Rc("MutationObserver").constructor}function WT(e,t,n){try{if(!(t in e))return()=>{};let r=e[t],i=n(r);return typeof i=="function"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:r}})),e[t]=i,()=>{e[t]=r}}catch{return()=>{}}}var De={ownerDocument:TT,childNodes:MT,parentNode:OT,parentElement:NT,textContent:$T,contains:LT,getRootNode:_T,host:DT,styleSheets:jT,shadowRoot:FT,querySelector:BT,querySelectorAll:VT,mutationObserver:UT,patch:WT};function Ry(e){return e.nodeType===e.ELEMENT_NODE}function Qr(e){let t=e&&"host"in e&&"mode"in e&&De.host(e)||null;return!!(t&&"shadowRoot"in t&&De.shadowRoot(t)===e)}function ei(e){return Object.prototype.toString.call(e)==="[object ShadowRoot]"}function zT(e){return e.includes(" background-clip: text;")&&!e.includes(" -webkit-background-clip: text;")&&(e=e.replace(/\sbackground-clip:\s*text;/g," -webkit-background-clip: text; background-clip: text;")),e}function GT(e){let{cssText:t}=e;if(t.split('"').length<3)return t;let n=["@import",`url(${JSON.stringify(e.href)})`];return e.layerName===""?n.push("layer"):e.layerName&&n.push(`layer(${e.layerName})`),e.supportsText&&n.push(`supports(${e.supportsText})`),e.media.length&&n.push(e.media.mediaText),n.join(" ")+";"}function $u(e){try{let t=e.rules||e.cssRules;if(!t)return null;let n=e.href;!n&&e.ownerNode&&(n=e.ownerNode.baseURI);let r=Array.from(t,i=>ky(i,n)).join("");return zT(r)}catch{return null}}function ky(e,t){if(qT(e)){let n;try{n=$u(e.styleSheet)||GT(e)}catch{n=e.cssText}return e.styleSheet.href?ms(n,e.styleSheet.href):n}else{let n=e.cssText;return KT(e)&&e.selectorText.includes(":")&&(n=HT(n)),t?ms(n,t):n}}function HT(e){let t=/(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;return e.replace(t,"$1\\$2")}function qT(e){return"styleSheet"in e}function KT(e){return"selectorText"in e}var fs=class{constructor(){Rg(this,"idNodeMap",new Map),Rg(this,"nodeMetaMap",new WeakMap)}getId(t){var n;return t?((n=this.getMeta(t))==null?void 0:n.id)??-1:-1}getNode(t){return this.idNodeMap.get(t)||null}getIds(){return Array.from(this.idNodeMap.keys())}getMeta(t){return this.nodeMetaMap.get(t)||null}removeNodeFromMap(t){let n=this.getId(t);this.idNodeMap.delete(n),t.childNodes&&t.childNodes.forEach(r=>this.removeNodeFromMap(r))}has(t){return this.idNodeMap.has(t)}hasNode(t){return this.nodeMetaMap.has(t)}add(t,n){let r=n.id;this.idNodeMap.set(r,t),this.nodeMetaMap.set(t,n)}replace(t,n){let r=this.getNode(t);if(r){let i=this.nodeMetaMap.get(r);i&&this.nodeMetaMap.set(n,i)}this.idNodeMap.set(t,n)}reset(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}};function YT(){return new fs}function ps({element:e,maskInputOptions:t,tagName:n,type:r,value:i,maskInputFn:o}){let s=i||"",a=r&&Sn(r);return(t[n.toLowerCase()]||a&&t[a])&&(o?s=o(s,e):s="*".repeat(s.length)),s}function Sn(e){return e.toLowerCase()}var Eg="__rrweb_original__";function JT(e){let t=e.getContext("2d");if(!t)return!0;let n=50;for(let r=0;r<e.width;r+=n)for(let i=0;i<e.height;i+=n){let o=t.getImageData,s=Eg in o?o[Eg]:o;if(new Uint32Array(s.call(t,r,i,Math.min(n,e.width-r),Math.min(n,e.height-i)).data.buffer).some(l=>l!==0))return!1}return!0}function hs(e){let t=e.type;return e.hasAttribute("data-rr-is-password")?"password":t?Sn(t):null}function Cy(e,t){let n;try{n=new URL(e,t??window.location.href)}catch{return null}let r=/\.([0-9a-z]+)(?:$)/i,i=n.pathname.match(r);return i?.[1]??null}function XT(e){let t="";return e.indexOf("//")>-1?t=e.split("/").slice(0,3).join("/"):t=e.split("/")[0],t=t.split("?")[0],t}var ZT=/url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm,QT=/^(?:[a-z+]+:)?\/\//i,eM=/^www\..*/i,tM=/^(data:)([^,]*),(.*)/i;function ms(e,t){return(e||"").replace(ZT,(n,r,i,o,s,a)=>{let l=i||s||a,u=r||o||"";if(!l)return n;if(QT.test(l)||eM.test(l))return`url(${u}${l}${u})`;if(tM.test(l))return`url(${u}${l}${u})`;if(l[0]==="/")return`url(${u}${XT(t)+l}${u})`;let c=t.split("/"),d=l.split("/");c.pop();for(let f of d)f!=="."&&(f===".."?c.pop():c.push(f));return`url(${u}${c.join("/")}${u})`})}function jo(e,t=!1){return t?e.replace(/(\/\*[^*]*\*\/)|[\s;]/g,""):e.replace(/(\/\*[^*]*\*\/)|[\s;]/g,"").replace(/0px/g,"0")}function nM(e,t,n=!1){let r=Array.from(t.childNodes),i=[],o=0;if(r.length>1&&e&&typeof e=="string"){let s=jo(e,n),a=s.length/e.length;for(let l=1;l<r.length;l++)if(r[l].textContent&&typeof r[l].textContent=="string"){let u=jo(r[l].textContent,n),c=100,d=3;for(;d<u.length&&(u[d].match(/[a-zA-Z0-9]/)||u.indexOf(u.substring(0,d),1)!==-1);d++);for(;d<u.length;d++){let f=u.substring(0,d),h=s.split(f),p=-1;if(h.length===2)p=h[0].length;else if(h.length>2&&h[0]===""&&r[l-1].textContent!=="")p=s.indexOf(f,1);else if(h.length===1){if(f=f.substring(0,f.length-1),h=s.split(f),h.length<=1)return i.push(e),i;d=c+1}else d===u.length-1&&(p=s.indexOf(f));if(h.length>=2&&d>c){let m=r[l-1].textContent;if(m&&typeof m=="string"){let g=jo(m).length;p=s.indexOf(f,g)}p===-1&&(p=h[0].length)}if(p!==-1){let m=Math.floor(p/a);for(;m>0&&m<e.length;){if(o+=1,o>50*r.length)return i.push(e),i;let g=jo(e.substring(0,m),n);if(g.length===p){i.push(e.substring(0,m)),e=e.substring(m),s=s.substring(p);break}else g.length<p?m+=Math.max(1,Math.floor((p-g.length)/a)):m-=Math.max(1,Math.floor((g.length-p)*a))}break}}}}return i.push(e),i}function rM(e,t){return nM(e,t).join("/* rr_split */")}var iM=1,oM=new RegExp("[^a-z0-9-_:]"),ni=-2;function Ey(){return iM++}function sM(e){if(e instanceof HTMLFormElement)return"form";let t=Sn(e.tagName);return oM.test(t)?"div":t}var Kn,Ag,aM=/^[^ \t\n\r\u000c]+/,lM=/^[, \t\n\r\u000c]+/;function uM(e,t){if(t.trim()==="")return t;let n=0;function r(o){let s,a=o.exec(t.substring(n));return a?(s=a[0],n+=s.length,s):""}let i=[];for(;r(lM),!(n>=t.length);){let o=r(aM);if(o.slice(-1)===",")o=Xn(e,o.substring(0,o.length-1)),i.push(o);else{let s="";o=Xn(e,o);let a=!1;for(;;){let l=t.charAt(n);if(l===""){i.push((o+s).trim());break}else if(a)l===")"&&(a=!1);else if(l===","){n+=1,i.push((o+s).trim());break}else l==="("&&(a=!0);s+=l,n+=1}}}return i.join(", ")}var Ig=new WeakMap;function Xn(e,t){return!t||t.trim()===""?t:kc(e,t)}function cM(e){return!!(e.tagName==="svg"||e.ownerSVGElement)}function kc(e,t){let n=Ig.get(e);if(n||(n=e.createElement("a"),Ig.set(e,n)),!t)t="";else if(t.startsWith("blob:")||t.startsWith("data:"))return t;return n.setAttribute("href",t),n.href}function Ay(e,t,n,r){return r&&(n==="src"||n==="href"&&!(t==="use"&&r[0]==="#")||n==="xlink:href"&&r[0]!=="#"||n==="background"&&["table","td","th"].includes(t)?Xn(e,r):n==="srcset"?uM(e,r):n==="style"?ms(r,kc(e)):t==="object"&&n==="data"?Xn(e,r):r)}function Iy(e,t,n){return["video","audio"].includes(e)&&t==="autoplay"}function dM(e,t,n){try{if(typeof t=="string"){if(e.classList.contains(t))return!0}else for(let r=e.classList.length;r--;){let i=e.classList[r];if(t.test(i))return!0}if(n)return e.matches(n)}catch{}return!1}function gs(e,t,n){if(!e)return!1;if(e.nodeType!==e.ELEMENT_NODE)return n?gs(De.parentNode(e),t,n):!1;for(let r=e.classList.length;r--;){let i=e.classList[r];if(t.test(i))return!0}return n?gs(De.parentNode(e),t,n):!1}function Py(e,t,n,r){let i;if(Ry(e)){if(i=e,!De.childNodes(i).length)return!1}else{if(De.parentElement(e)===null)return!1;i=De.parentElement(e)}try{if(typeof t=="string"){if(r){if(i.closest(`.${t}`))return!0}else if(i.classList.contains(t))return!0}else if(gs(i,t,r))return!0;if(n){if(r){if(i.closest(n))return!0}else if(i.matches(n))return!0}}catch{}return!1}function fM(e,t,n){let r=e.contentWindow;if(!r)return;let i=!1,o;try{o=r.document.readyState}catch{return}if(o!=="complete"){let a=setTimeout(()=>{i||(t(),i=!0)},n);e.addEventListener("load",()=>{clearTimeout(a),i=!0,t()});return}let s="about:blank";if(r.location.href!==s||e.src===s||e.src==="")return setTimeout(t,0),e.addEventListener("load",t);e.addEventListener("load",t)}function pM(e,t,n){let r=!1,i;try{i=e.sheet}catch{return}if(i)return;let o=setTimeout(()=>{r||(t(),r=!0)},n);e.addEventListener("load",()=>{clearTimeout(o),r=!0,t()})}function hM(e,t){let{doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:s,inlineStylesheet:a,maskInputOptions:l={},maskTextFn:u,maskInputFn:c,dataURLOptions:d={},inlineImages:f,recordCanvas:h,keepIframeSrcFn:p,newlyAddedElement:m=!1,cssCaptured:g=!1}=t,S=mM(n,r);switch(e.nodeType){case e.DOCUMENT_NODE:return e.compatMode!=="CSS1Compat"?{type:Ie.Document,childNodes:[],compatMode:e.compatMode}:{type:Ie.Document,childNodes:[]};case e.DOCUMENT_TYPE_NODE:return{type:Ie.DocumentType,name:e.name,publicId:e.publicId,systemId:e.systemId,rootId:S};case e.ELEMENT_NODE:return yM(e,{doc:n,blockClass:i,blockSelector:o,inlineStylesheet:a,maskInputOptions:l,maskInputFn:c,dataURLOptions:d,inlineImages:f,recordCanvas:h,keepIframeSrcFn:p,newlyAddedElement:m,rootId:S});case e.TEXT_NODE:return gM(e,{doc:n,needsMask:s,maskTextFn:u,rootId:S,cssCaptured:g});case e.CDATA_SECTION_NODE:return{type:Ie.CDATA,textContent:"",rootId:S};case e.COMMENT_NODE:return{type:Ie.Comment,textContent:De.textContent(e)||"",rootId:S};default:return!1}}function mM(e,t){if(!t.hasNode(e))return;let n=t.getId(e);return n===1?void 0:n}function gM(e,t){let{needsMask:n,maskTextFn:r,rootId:i,cssCaptured:o}=t,s=De.parentNode(e),a=s&&s.tagName,l="",u=a==="STYLE"?!0:void 0,c=a==="SCRIPT"?!0:void 0;return c?l="SCRIPT_PLACEHOLDER":o||(l=De.textContent(e),u&&l&&(l=ms(l,kc(t.doc)))),!u&&!c&&l&&n&&(l=r?r(l,De.parentElement(e)):l.replace(/[\S]/g,"*")),{type:Ie.Text,textContent:l||"",rootId:i}}function yM(e,t){let{doc:n,blockClass:r,blockSelector:i,inlineStylesheet:o,maskInputOptions:s={},maskInputFn:a,dataURLOptions:l={},inlineImages:u,recordCanvas:c,keepIframeSrcFn:d,newlyAddedElement:f=!1,rootId:h}=t,p=dM(e,r,i),m=sM(e),g={},S=e.attributes.length;for(let y=0;y<S;y++){let v=e.attributes[y];Iy(m,v.name,v.value)||(g[v.name]=Ay(n,m,Sn(v.name),v.value))}if(m==="link"&&o){let y=Array.from(n.styleSheets).find(A=>A.href===e.href),v=null;y&&(v=$u(y)),v&&(delete g.rel,delete g.href,g._cssText=v)}if(m==="style"&&e.sheet){let y=$u(e.sheet);y&&(e.childNodes.length>1&&(y=rM(y,e)),g._cssText=y)}if(["input","textarea","select"].includes(m)){let y=e.value,v=e.checked;g.type!=="radio"&&g.type!=="checkbox"&&g.type!=="submit"&&g.type!=="button"&&y?g.value=ps({element:e,type:hs(e),tagName:m,value:y,maskInputOptions:s,maskInputFn:a}):v&&(g.checked=v)}if(m==="option"&&(e.selected&&!s.select?g.selected=!0:delete g.selected),m==="dialog"&&e.open&&(g.rr_open_mode=e.matches("dialog:modal")?"modal":"non-modal"),m==="canvas"&&c){if(e.__context==="2d")JT(e)||(g.rr_dataURL=e.toDataURL(l.type,l.quality));else if(!("__context"in e)){let y=e.toDataURL(l.type,l.quality),v=n.createElement("canvas");v.width=e.width,v.height=e.height;let A=v.toDataURL(l.type,l.quality);y!==A&&(g.rr_dataURL=y)}}if(m==="img"&&u){Kn||(Kn=n.createElement("canvas"),Ag=Kn.getContext("2d"));let y=e,v=y.currentSrc||y.getAttribute("src")||"<unknown-src>",A=y.crossOrigin,N=()=>{y.removeEventListener("load",N);try{Kn.width=y.naturalWidth,Kn.height=y.naturalHeight,Ag.drawImage(y,0,0),g.rr_dataURL=Kn.toDataURL(l.type,l.quality)}catch(T){if(y.crossOrigin!=="anonymous"){y.crossOrigin="anonymous",y.complete&&y.naturalWidth!==0?N():y.addEventListener("load",N);return}else console.warn(`Cannot inline img src=${v}! Error: ${T}`)}y.crossOrigin==="anonymous"&&(A?g.crossOrigin=A:y.removeAttribute("crossorigin"))};y.complete&&y.naturalWidth!==0?N():y.addEventListener("load",N)}if(["audio","video"].includes(m)){let y=g;y.rr_mediaState=e.paused?"paused":"played",y.rr_mediaCurrentTime=e.currentTime,y.rr_mediaPlaybackRate=e.playbackRate,y.rr_mediaMuted=e.muted,y.rr_mediaLoop=e.loop,y.rr_mediaVolume=e.volume}if(f||(e.scrollLeft&&(g.rr_scrollLeft=e.scrollLeft),e.scrollTop&&(g.rr_scrollTop=e.scrollTop)),p){let{width:y,height:v}=e.getBoundingClientRect();g={class:g.class,rr_width:`${y}px`,rr_height:`${v}px`}}m==="iframe"&&!d(g.src)&&(e.contentDocument||(g.rr_src=g.src),delete g.src);let w;try{customElements.get(m)&&(w=!0)}catch{}return{type:Ie.Element,tagName:m,attributes:g,childNodes:[],isSVG:cM(e)||void 0,needBlock:p,rootId:h,isCustom:w}}function ae(e){return e==null?"":e.toLowerCase()}function Ty(e){return e===!0||e==="all"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaVerification:!0,headMetaAuthorship:e==="all",headMetaDescKeywords:e==="all",headTitleMutations:e==="all"}:e||{}}function bM(e,t){if(t.comment&&e.type===Ie.Comment)return!0;if(e.type===Ie.Element){if(t.script&&(e.tagName==="script"||e.tagName==="link"&&(e.attributes.rel==="preload"&&e.attributes.as==="script"||e.attributes.rel==="modulepreload")||e.tagName==="link"&&e.attributes.rel==="prefetch"&&typeof e.attributes.href=="string"&&Cy(e.attributes.href)==="js"))return!0;if(t.headFavicon&&(e.tagName==="link"&&e.attributes.rel==="shortcut icon"||e.tagName==="meta"&&(ae(e.attributes.name).match(/^msapplication-tile(image|color)$/)||ae(e.attributes.name)==="application-name"||ae(e.attributes.rel)==="icon"||ae(e.attributes.rel)==="apple-touch-icon"||ae(e.attributes.rel)==="shortcut icon")))return!0;if(e.tagName==="meta"){if(t.headMetaDescKeywords&&ae(e.attributes.name).match(/^description|keywords$/))return!0;if(t.headMetaSocial&&(ae(e.attributes.property).match(/^(og|twitter|fb):/)||ae(e.attributes.name).match(/^(og|twitter):/)||ae(e.attributes.name)==="pinterest"))return!0;if(t.headMetaRobots&&(ae(e.attributes.name)==="robots"||ae(e.attributes.name)==="googlebot"||ae(e.attributes.name)==="bingbot"))return!0;if(t.headMetaHttpEquiv&&e.attributes["http-equiv"]!==void 0)return!0;if(t.headMetaAuthorship&&(ae(e.attributes.name)==="author"||ae(e.attributes.name)==="generator"||ae(e.attributes.name)==="framework"||ae(e.attributes.name)==="publisher"||ae(e.attributes.name)==="progid"||ae(e.attributes.property).match(/^article:/)||ae(e.attributes.property).match(/^product:/)))return!0;if(t.headMetaVerification&&(ae(e.attributes.name)==="google-site-verification"||ae(e.attributes.name)==="yandex-verification"||ae(e.attributes.name)==="csrf-token"||ae(e.attributes.name)==="p:domain_verify"||ae(e.attributes.name)==="verify-v1"||ae(e.attributes.name)==="verification"||ae(e.attributes.name)==="shopify-checkout-api-token"))return!0}}return!1}function Zn(e,t){let{doc:n,mirror:r,blockClass:i,blockSelector:o,maskTextClass:s,maskTextSelector:a,skipChild:l=!1,inlineStylesheet:u=!0,maskInputOptions:c={},maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p={},inlineImages:m=!1,recordCanvas:g=!1,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y=5e3,onStylesheetLoad:v,stylesheetLoadTimeout:A=5e3,keepIframeSrcFn:N=()=>!1,newlyAddedElement:T=!1,cssCaptured:M=!1}=t,{needsMask:I}=t,{preserveWhiteSpace:B=!0}=t;I||(I=Py(e,s,a,I===void 0));let J=hM(e,{doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:I,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,dataURLOptions:p,inlineImages:m,recordCanvas:g,keepIframeSrcFn:N,newlyAddedElement:T,cssCaptured:M});if(!J)return console.warn(e,"not serialized"),null;let X;r.hasNode(e)?X=r.getId(e):bM(J,h)||!B&&J.type===Ie.Text&&!J.textContent.replace(/^\s+|\s+$/gm,"").length?X=ni:X=Ey();let j=Object.assign(J,{id:X});if(r.add(e,j),X===ni)return null;S&&S(e);let $e=!l;if(j.type===Ie.Element){$e=$e&&!j.needBlock,delete j.needBlock;let Ae=De.shadowRoot(e);Ae&&ei(Ae)&&(j.isShadowHost=!0)}if((j.type===Ie.Document||j.type===Ie.Element)&&$e){h.headWhitespace&&j.type===Ie.Element&&j.tagName==="head"&&(B=!1);let Ae={doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:I,maskTextClass:s,maskTextSelector:a,skipChild:l,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p,inlineImages:m,recordCanvas:g,preserveWhiteSpace:B,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y,onStylesheetLoad:v,stylesheetLoadTimeout:A,keepIframeSrcFn:N,cssCaptured:!1};if(!(j.type===Ie.Element&&j.tagName==="textarea"&&j.attributes.value!==void 0)){j.type===Ie.Element&&j.attributes._cssText!==void 0&&typeof j.attributes._cssText=="string"&&(Ae.cssCaptured=!0);for(let sn of Array.from(De.childNodes(e))){let yt=Zn(sn,Ae);yt&&j.childNodes.push(yt)}}let Qe=null;if(Ry(e)&&(Qe=De.shadowRoot(e)))for(let sn of Array.from(De.childNodes(Qe))){let yt=Zn(sn,Ae);yt&&(ei(Qe)&&(yt.isShadow=!0),j.childNodes.push(yt))}}let gt=De.parentNode(e);return gt&&Qr(gt)&&ei(gt)&&(j.isShadow=!0),j.type===Ie.Element&&j.tagName==="iframe"&&fM(e,()=>{let Ae=e.contentDocument;if(Ae&&w){let Qe=Zn(Ae,{doc:Ae,mirror:r,blockClass:i,blockSelector:o,needsMask:I,maskTextClass:s,maskTextSelector:a,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p,inlineImages:m,recordCanvas:g,preserveWhiteSpace:B,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y,onStylesheetLoad:v,stylesheetLoadTimeout:A,keepIframeSrcFn:N});Qe&&w(e,Qe)}},y),j.type===Ie.Element&&j.tagName==="link"&&typeof j.attributes.rel=="string"&&(j.attributes.rel==="stylesheet"||j.attributes.rel==="preload"&&typeof j.attributes.href=="string"&&Cy(j.attributes.href)==="css")&&pM(e,()=>{if(v){let Ae=Zn(e,{doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:I,maskTextClass:s,maskTextSelector:a,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p,inlineImages:m,recordCanvas:g,preserveWhiteSpace:B,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y,onStylesheetLoad:v,stylesheetLoadTimeout:A,keepIframeSrcFn:N});Ae&&v(e,Ae)}},A),j}function SM(e,t){let{mirror:n=new fs,blockClass:r="rr-block",blockSelector:i=null,maskTextClass:o="rr-mask",maskTextSelector:s=null,inlineStylesheet:a=!0,inlineImages:l=!1,recordCanvas:u=!1,maskAllInputs:c=!1,maskTextFn:d,maskInputFn:f,slimDOM:h=!1,dataURLOptions:p,preserveWhiteSpace:m,onSerialize:g,onIframeLoad:S,iframeLoadTimeout:w,onStylesheetLoad:y,stylesheetLoadTimeout:v,keepIframeSrcFn:A=()=>!1}=t||{},N=c===!0?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,password:!0}:c===!1?{password:!0}:c,T=Ty(h);return Zn(e,{doc:e,mirror:n,blockClass:r,blockSelector:i,maskTextClass:o,maskTextSelector:s,skipChild:!1,inlineStylesheet:a,maskInputOptions:N,maskTextFn:d,maskInputFn:f,slimDOMOptions:T,dataURLOptions:p,inlineImages:l,recordCanvas:u,preserveWhiteSpace:m,onSerialize:g,onIframeLoad:S,iframeLoadTimeout:w,onStylesheetLoad:y,stylesheetLoadTimeout:v,keepIframeSrcFn:A,newlyAddedElement:!1})}var wM=/(max|min)-device-(width|height)/,QH=new RegExp(wM.source,"g");function xM(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function vM(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}),n}var Cc={exports:{}},ce=String,My=function(){return{isColorSupported:!1,reset:ce,bold:ce,dim:ce,italic:ce,underline:ce,inverse:ce,hidden:ce,strikethrough:ce,black:ce,red:ce,green:ce,yellow:ce,blue:ce,magenta:ce,cyan:ce,white:ce,gray:ce,bgBlack:ce,bgRed:ce,bgGreen:ce,bgYellow:ce,bgBlue:ce,bgMagenta:ce,bgCyan:ce,bgWhite:ce}};Cc.exports=My();Cc.exports.createColors=My;var RM=Cc.exports,kM={},CM=Object.freeze(Object.defineProperty({__proto__:null,default:kM},Symbol.toStringTag,{value:"Module"})),ct=vM(CM),Pg=RM,Tg=ct,Lu=class Oy extends Error{constructor(t,n,r,i,o,s){super(t),this.name="CssSyntaxError",this.reason=t,o&&(this.file=o),i&&(this.source=i),s&&(this.plugin=s),typeof n<"u"&&typeof r<"u"&&(typeof n=="number"?(this.line=n,this.column=r):(this.line=n.line,this.column=n.column,this.endLine=r.line,this.endColumn=r.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,Oy)}setMessage(){this.message=this.plugin?this.plugin+": ":"",this.message+=this.file?this.file:"<css input>",typeof this.line<"u"&&(this.message+=":"+this.line+":"+this.column),this.message+=": "+this.reason}showSourceCode(t){if(!this.source)return"";let n=this.source;t==null&&(t=Pg.isColorSupported),Tg&&t&&(n=Tg(n));let r=n.split(/\r?\n/),i=Math.max(this.line-3,0),o=Math.min(this.line+2,r.length),s=String(o).length,a,l;if(t){let{bold:u,gray:c,red:d}=Pg.createColors(!0);a=f=>u(d(f)),l=f=>c(f)}else a=l=u=>u;return r.slice(i,o).map((u,c)=>{let d=i+1+c,f=" "+(" "+d).slice(-s)+" | ";if(d===this.line){let h=l(f.replace(/\d/g," "))+u.slice(0,this.column-1).replace(/[^\t]/g," ");return a(">")+l(f)+u+`
|
|
79
|
+
`)}import{err as hC,ok as mC}from"neverthrow";import{z as dl}from"zod";var fC="https://ripplo.ai";function Qp(){return th().RIPPLO_SERVER_URL}function eh(){return th().RIPPLO_PROJECT_ID}var pC=dl.object({RIPPLO_PROJECT_ID:dl.string().min(1).optional(),RIPPLO_SERVER_URL:dl.string().min(1).default(fC)}),Zp;function th(){return Zp??=pC.parse(process.env),Zp}import nh from"fs";import fl from"path";function rh(e){let t=nh.realpathSync(e),n=t,r=fl.dirname(n);for(;r!==n;){if(nh.existsSync(fl.join(n,".git")))return n;n=r,r=fl.dirname(n)}return t}function JW(e){return La(e).andThen(t=>Ji().andThen(n=>{let r=Qp(),i=Ia(r);return i==null?hC({kind:"not-authenticated"}):mC({appUrl:n.appUrl,cwd:rh(e),engineUrl:n.engineUrl,projectId:eh()??t.projectId,ripploServerUrl:r,token:i,webhookSecret:n.webhookSecret})}))}import ih from"fs";import{checkSync as gC,lockSync as yC}from"proper-lockfile";var bC="dev.pid",oh=15e3;function sh(e){return Gt(e,bC)}function ah(e){try{return gC(sh(e),{realpath:!1,stale:oh})}catch{return!1}}var pl=class extends Error{pid;cwd;constructor({cwd:t,pid:n}){super("dev-lock-held"),this.name="DevLockHeldError",this.pid=n,this.cwd=t}};function tz({cwd:e,onCompromised:t}){Ea(e);let n=sh(e),r=SC({cwd:e,onCompromised:t,path:n});return ih.writeFileSync(n,String(process.pid)),()=>{try{r()}catch{}}}function SC({cwd:e,onCompromised:t,path:n}){try{return yC(n,{realpath:!1,stale:oh,onCompromised:()=>{t()}})}catch(r){throw wC(r)?new pl({cwd:e,pid:xC(n)}):r}}function wC(e){if(!(e instanceof Error)||!("code"in e))return!1;let{code:t}=e;return t==="ELOCKED"}function xC(e){try{let t=ih.readFileSync(e,"utf8").trim(),n=Number.parseInt(t,10);return Number.isFinite(n)&&n>0?n:null}catch{return null}}import{createServer as AC}from"http";import{mkdir as IC,rm as PC,writeFile as TC}from"fs/promises";import MC from"path";import{z as ee}from"zod";import vC from"path";import{z as Mr}from"zod";var RC=["unspecified","internal","server","client","producer","consumer"],kC=["unset","ok","error"];function lh(e){return RC[e]??"unspecified"}function uh(e){return kC[e]??"unset"}var oz=Mr.looseObject({data:Mr.looseObject({source:Mr.number().optional()}).optional(),timestamp:Mr.number(),type:Mr.number()});function ch({debugDir:e,runId:t,worker:n}){let r=vC.join(e,t,"behavior.jsonl");return n.open({file:r,runId:t}),{close:i=>n.close({noticeLineIfNoRrweb:i?.noticeIfNoRrweb==null?"":JSON.stringify(CC(i.noticeIfNoRrweb)),runId:t}),emit:i=>{let o={...i,timestamp:EC(i.timeNanos)};n.line({line:JSON.stringify(o),runId:t,timeNanos:i.timeNanos})},emitRrwebBatch:i=>{n.rrwebBatch({data:i,runId:t})}}}function Dn(e){return String(BigInt(Math.round(e))*1000000n)}function CC(e){return{kind:"notice",message:e,source:"capture",timeNanos:"0"}}function EC(e){return Number(BigInt(e)/1000000n)}var OC="otlp-port",fh=ee.object({key:ee.string(),value:ee.object({boolValue:ee.boolean().optional(),doubleValue:ee.number().optional(),intValue:ee.union([ee.string(),ee.number()]).optional(),stringValue:ee.string().optional()})}),NC=ee.object({attributes:ee.array(fh).default([]),endTimeUnixNano:ee.string(),kind:ee.number().default(0),name:ee.string(),parentSpanId:ee.string().optional(),spanId:ee.string(),startTimeUnixNano:ee.string(),status:ee.object({code:ee.number(),message:ee.string().optional()}).optional(),traceId:ee.string()}),$C=ee.object({resourceSpans:ee.array(ee.object({resource:ee.object({attributes:ee.array(fh).default([])}).optional(),scopeSpans:ee.array(ee.object({spans:ee.array(NC).default([])})).default([])})).default([])});async function hl({localDir:e,onRrwebBatch:t,onSpan:n,writePortFile:r}){let{port:i,server:o}=await LC({onRrwebBatch:t,onSpan:n}),s=MC.join(e,OC);return r&&(await IC(e,{recursive:!0}),await TC(s,String(i),{encoding:"utf8"})),{port:i,stop:async()=>{r&&await PC(s,{force:!0}),await BC(o)}}}function LC(e){return new Promise((t,n)=>{let r=AC((i,o)=>{_C(i,o,e)});r.on("error",n),r.listen(0,()=>{let i=r.address();if(i==null||typeof i=="string"){n(new Error("otlp_receiver_no_port"));return}t({port:i.port,server:r})})})}function _C(e,t,n){let r=DC(e.url);if(r!=null){dh(e).then(i=>{n.onRrwebBatch(r,i),ho(t)}).catch(()=>{ho(t)});return}dh(e).then(i=>{jC($C.parse(JSON.parse(i.toString("utf8"))),n.onSpan),ho(t)}).catch(()=>{ho(t)})}function DC(e){if(e==null||!e.startsWith("/rrweb/"))return;let t=decodeURIComponent(e.slice(7));return t.length===0?void 0:t}function dh(e){return new Promise((t,n)=>{let r=[];e.on("data",i=>{r.push(i)}),e.on("end",()=>{t(Buffer.concat(r))}),e.on("error",n)})}function ho(e){e.writeHead(200,{"content-type":"application/json"}),e.end("{}")}function jC(e,t){e.resourceSpans.flatMap(n=>n.scopeSpans).flatMap(n=>n.spans).forEach(n=>{t({attributes:FC(n.attributes),durationMs:Number((BigInt(n.endTimeUnixNano)-BigInt(n.startTimeUnixNano))/1000000n),kind:"span",name:n.name,parentSpanId:n.parentSpanId,source:"server",spanId:n.spanId,spanKind:lh(n.kind),status:{code:uh(n.status?.code??0),message:n.status?.message},timeNanos:n.startTimeUnixNano,traceId:n.traceId})})}function FC(e){return Object.fromEntries(e.map(({key:t,value:n})=>[t,String(n.stringValue??n.intValue??n.doubleValue??n.boolValue??"")]))}function BC(e){return new Promise((t,n)=>{e.close(r=>{if(r==null){t();return}n(r)}),e.closeAllConnections()})}function It(e){let t=new URL(e,"https://ripplo.invalid"),n=[...t.searchParams.entries()].toSorted(([r],[i])=>r.localeCompare(i)).map(([r,i])=>`${r}=${i}`).join("&");return n.length===0?t.pathname:`${t.pathname}?${n}`}function jn(e,t){return e==="url"?It(t):t}function ml(e,t,n){return jn(e,String(t))===jn(e,String(n))}function hh(e,t,n){return e!=="url"?ml(e,t,n):ph(String(t))===ph(String(n))}function ph(e){return new URL(e,"https://ripplo.invalid").pathname}function gl({actual:e,canon:t,pre:n,predicted:r}){return[...[...new Set([...r.entities.keys(),...e.entities.keys()])].flatMap(s=>VC({actual:e.entities.get(s),canon:t,entity:s,pre:n.entities.get(s),predicted:r.entities.get(s)})),...WC(n.singletons,r.singletons,e.singletons)]}function VC({actual:e,canon:t,entity:n,pre:r,predicted:i}){return[...new Set([...i?.keys()??[],...e?.keys()??[]])].flatMap(s=>UC({actual:e?.get(s),canon:t,entity:n,key:s,predicted:i?.get(s),preHadKey:r?.has(s)??!1,preRow:r?.get(s)}))}function UC({actual:e,canon:t,entity:n,key:r,predicted:i,preHadKey:o,preRow:s}){if(i==null)return[{mismatch:{entity:n,key:r,kind:"unexpected-row"},pending:o}];if(e==null)return[{mismatch:{entity:n,key:r,kind:"missing-row"},pending:!o}];let a=(u,c,d)=>yh(t(n,u,c),t(n,u,d));return[...new Set([...Object.keys(i),...Object.keys(e)])].filter(u=>!a(u,i[u],e[u])).map(u=>({mismatch:{entity:n,field:u,key:r,kind:"wrong-value",snapshot:i[u],sut:e[u]},pending:s==null?e[u]===void 0:a(u,s[u],e[u])}))}function yh(e,t){return mh(e)===mh(t)}function mh(e){return e==null?"\u2205":JSON.stringify(e)}function WC(e,t,n){return[...new Set([...Object.keys(t),...Object.keys(n)])].flatMap(i=>{let o=t[i],s=n[i];return o===void 0||s===void 0||gh(i,o,s)?[]:[{mismatch:{kind:"singleton-mismatch",singleton:i,snapshot:o,sut:s},pending:e[i]!==void 0&&gh(i,e[i],s)}]})}function gh(e,t,n){let r=At.safeParse(e);return r.success?hh(r.data,t,n):yh(t,n)}function yl(e){let t=zC(e.entities),n=GC(e.singletons);return r=>HC(r,t,n)}function zC(e){return new Map(e.flatMap(t=>Object.entries(t.props).map(([n,r])=>[bh(t.name,n),r.consistency])))}function bh(e,t){return`${e}.${t}`}function GC(e){return new Map(e.map(t=>[t.name,t.consistency]))}function HC(e,t,n){return e.kind==="singleton-mismatch"?qC(e.singleton,n):e.kind==="unexpected-row"||e.kind==="missing-row"?"strict":t.get(bh(e.entity,e.field))??"strict"}function qC(e,t){return At.safeParse(e).success?t.get(e)??"eventual":t.get(e)??"strict"}function bl(e){let t=new Set(e.valueSpaces.filter(n=>n.generator==="date.iso").map(n=>n.name));return(n,r,i)=>{if(!t.has(`${n}.${r}`)||typeof i!="string")return i;let o=Date.parse(i);return Number.isNaN(o)?i:new Date(o).toISOString()}}function Sl({onlyFirst:e=!1}={}){let i="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(i,e?void 0:"g")}var KC=Sl();function wl(e){if(typeof e!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof e}\``);return!e.includes("\x1B")&&!e.includes("\x9B")?e:e.replace(KC,"")}function wh(e,t,n){return{detail:n.slice(0,500),kind:"engine-http",path:e,status:t}}function Or(e,t){return{code:Oh(t),kind:"engine-network",message:$r(t),path:e}}function xh(e){return{kind:"client-mount-missing",mountKey:e}}function vh(e,t){return{kind:"engine-decode",message:$r(t),path:e}}function Rh(e,t){return{entity:e,field:t,kind:"state-identity"}}function kh(e){return{as:e,kind:"setup-missing-row"}}function Ch(e){return{count:e,kind:"conflicting-sessions"}}function Nr(e){return{kind:"driver-launch",message:$r(e)}}function Eh(e){return{kind:"engine-unreachable",url:e}}function Ah(e,t){return{action:e,kind:"action-failed",message:$r(t)}}function Ih(e){return{kind:"check-failed",message:$r(e)}}function Ph(){return{kind:"aborted"}}var Sh=300;function Pt(e){switch(e.kind){case"engine-http":return`engine ${e.path} returned ${String(e.status)}: ${Mh(e.detail)}${YC(e.status)}`;case"engine-network":return`engine ${e.path} request failed: ${e.message}`;case"client-mount-missing":return`client bridge "${e.mountKey}" never mounted; client singletons unreadable`;case"engine-decode":return`engine ${e.path} response did not match schema: ${e.message}`;case"state-identity":return`row of "${e.entity}" is missing identity field "${e.field}"`;case"setup-missing-row":return`setup returned no row for "${e.as}"`;case"conflicting-sessions":return`world established ${String(e.count)} distinct auth sessions in one browser context; sessions are exclusive \u2014 a single context holds one signed-in user`;case"engine-unreachable":return`the engine at ${e.url} did not respond in time \u2014 the dev server may still be recompiling. Re-run once it settles.`;case"driver-launch":return`browser driver failed to launch: ${e.message}`;case"action-failed":return`action "${e.action}" failed: ${e.message}`;case"check-failed":return`check failed: ${e.message}`;case"aborted":return"run aborted"}}function Th(e){throw new Error(Pt(e))}function mo(){}function Mh(e){let t=e.replaceAll(/\s+/gu," ").trim();return t.length<=Sh?t:`${t.slice(0,Sh)}\u2026 [truncated]`}function YC(e){return e===404?" \u2014 the engine adapter is not mounted at RIPPLO_ENGINE_URL (or the mount path differs). Verify the adapter is wired into the app server and ENABLE_RIPPLO_TESTING=true; `ripplo doctor` checks the endpoint.":e===403||e===401?" \u2014 the adapter rejected the request: ENABLE_RIPPLO_TESTING is not true in the app's env, or RIPPLO_WEBHOOK_SECRET differs between the app and .ripplo env.":""}function Oh(e){if(!(typeof e!="object"||e==null))return"code"in e&&typeof e.code=="string"?e.code:"cause"in e?Oh(e.cause):void 0}function $r(e){let t=e instanceof Error?e.message:String(e);return Mh(wl(t))}var Cl=Fi(_h(),1),Cz=Cl.default.configure,go=Cl.default;function G(e){return go(e)??""}function Tt(e,t){return[...new Map(e.map(n=>[t(n),n])).values()]}function El(e){return Tt(e,G)}function Dh(e){return G(e)}var _r=class extends Error{name="AbortError";constructor(){super("aborted")}};function jh(e){return e instanceof Error&&e.name==="AbortError"}function Kt(e){if(e.aborted)throw new _r}function Al(e,t){return t.aborted?Promise.reject(new _r):new Promise((n,r)=>{let i=()=>{clearTimeout(o),r(new _r)},o=setTimeout(()=>{t.removeEventListener("abort",i),n()},e);t.addEventListener("abort",i,{once:!0})})}var rE={check:"Check",clear:"Clear",click:"Click",dblclick:"Double-click",fill:"Fill",goto:"Go to",hover:"Hover",press:"Press",select:"Select",uncheck:"Uncheck",upload:"Upload"};function Fh(e){let t=rE[e.kind]??e.kind;return e.kind==="press"&&e.key!=null?`${t}: ${e.key}`:t}function Bh(e){return e.kind==="data-rule"?"data rule":Vh(e.check)}function Vh(e){return e.kind==="not"?`not ${Vh(e.inner)}`:e.kind==="browser"?e.name:`${Uh(e.locator)} ${e.kind}`}function Uh(e){return e.by==="testId"?"element":e.by==="inside"?Uh(e.target):e.role}function Kh(e){return e.includes("async")?"async":e.includes("slow")?"slow":"fast"}var iE=()=>[];async function Ml({canon:e,classify:t,initialSnapshot:n,observe:r,onAssertion:i,onStep:o,pageRulePendingChecks:s,steps:a},l){return Yh({acc:[],canon:e,classify:t,index:0,observe:r,onAssertion:i,onStep:o,pageRulePendingChecks:s??iE,signal:l,snapshot:n,steps:a})}async function Yh({acc:e,canon:t,classify:n,index:r,observe:i,onAssertion:o,onStep:s,pageRulePendingChecks:a,signal:l,snapshot:u,steps:c}){Kt(l);let d=c[r];if(d==null)return{finalModel:u,findings:e};let f=Date.now(),h=await d.targetIds(),p=Fh(d.step.action);if(!d.requiredState(u)){let m={kind:"impossible-action",step:d.step};return Pl(s,{annotations:[Il({actionLabel:p,outcome:"failed",rrwebIds:h,startMs:f})],endMs:Date.now(),findings:[m],index:r,post:u,pre:u,startMs:f,url:Tl(u)}),{finalModel:u,findings:[...e,m]}}return d.perform().match(()=>oE({acc:e,actionLabel:p,canon:t,classify:n,index:r,observe:i,onAssertion:o,onStep:s,pageRulePendingChecks:a,rrwebIds:h,signal:l,snapshot:u,startMs:f,step:d,steps:c}),m=>{let g=yo(m,d);return Pl(s,{annotations:[Il({actionLabel:p,outcome:"failed",rrwebIds:h,startMs:f})],endMs:Date.now(),findings:[g],index:r,post:u,pre:u,startMs:f,url:Tl(u)}),Promise.resolve({finalModel:u,findings:[...e,g]})})}function Il({actionLabel:e,outcome:t,rrwebIds:n,startMs:r}){return{atMs:r,kind:"action",label:e,outcome:t,rrwebIds:n}}async function oE({acc:e,actionLabel:t,canon:n,classify:r,index:i,observe:o,onAssertion:s,onStep:a,pageRulePendingChecks:l,rrwebIds:u,signal:c,snapshot:d,startMs:f,step:h,steps:p}){let m=h.effect(d),g=await dE({canon:n,classify:r,observe:o,pre:d,predicted:m,signal:c,step:h}),S=[...h.pendingChecks,...l(d,g.snapshot)],w=await sE({onAssertion:s,pendingChecks:S,signal:c,step:h}),y=[...w.findings,...g.findings];Pl(a,{annotations:[Il({actionLabel:t,outcome:y.length>0?"failed":"passed",rrwebIds:u,startMs:f}),...w.annotations],endMs:Date.now(),findings:y,index:i,post:g.snapshot,pre:d,startMs:f,url:Tl(g.snapshot)});let v=[...e,...y];return y.length>0?{finalModel:g.snapshot,findings:v}:Yh({acc:v,canon:n,classify:r,index:i+1,observe:o,onAssertion:s,onStep:a,pageRulePendingChecks:l,signal:c,snapshot:g.snapshot,steps:p})}async function sE({onAssertion:e,pendingChecks:t,signal:n,step:r}){let i=[...new Map(t.map(s=>[Dh(s.source),s])).values()],o=await Promise.all(i.map(async s=>{let a=await aE(s,n),l=Date.now(),u=await s.targetIds();return{atMs:l,outcome:a,pendingCheck:s,rrwebIds:u}}));return o.forEach(s=>{lE(e,s.pendingCheck,s.outcome,r)}),{annotations:o.filter(s=>s.pendingCheck.source.kind==="step").map(s=>({atMs:s.atMs,kind:"assertion",label:Bh(s.pendingCheck.source),outcome:Jh(s.outcome),rrwebIds:s.rrwebIds})),findings:o.flatMap(s=>uE(s.pendingCheck,s.outcome,r))}}function aE(e,t){if(e.check.kind==="decided"){let n=e.check.passed?"passed":"failed";return Promise.resolve({kind:n})}return fE(e.budget,e.check.run,t)}function lE(e,t,n,r){e?.({outcome:Jh(n),source:t.source,step:r.step})}function Jh(e){return e.kind==="passed"?"passed":e.kind==="error"?"error":"failed"}function uE(e,t,n){return t.kind==="error"?[yo(t.error,n)]:t.kind==="failed"?[{budget:e.budget,kind:"pending-check",source:e.source,step:n.step}]:[]}function yo(e,t){return{error:e,kind:"driver-error",step:t.step}}function Pl(e,t){e?.(t)}function Tl(e){let t=e.singletons.url;return typeof t=="string"?t:null}var Dr={async:12e4,fast:5e3,slow:3e4},Xh={async:{backoffMs:[500,1e3,2e3,5e3],timeoutMs:Dr.async},fast:{backoffMs:[100,250,500,1e3],timeoutMs:Dr.fast},slow:{backoffMs:[250,500,1e3,2e3],timeoutMs:Dr.slow}};function Zh(e,t){return e.backoffMs[Math.min(t,e.backoffMs.length-1)]??0}function Wh(e){return e().match(t=>({observed:t,ok:!0}),t=>({error:t,ok:!1}))}function cE(e,t,n){return n.reconcile==null?e:n.reconcile(e,t)}function zh({canon:e,pre:t,predicted:n,step:r},i){let o=r.verifyChanges==null?[]:r.verifyChanges(n,i),s=cE(n,i,r),a=o.map(l=>({mismatch:l,pending:!0}));return{adopted:s,probed:[...a,...gl({actual:i.snapshot,canon:e,pre:t,predicted:s})]}}function Qh(e,t){return{budget:t.sync,kind:"consistency",mismatch:e.mismatch,pending:e.pending,step:t.step}}function Gh(e,t,n){let r=e.probed.filter(i=>!i.pending&&n(i.mismatch)==="strict");return r.length>0?{findings:r.map(i=>Qh(i,t)),snapshot:e.adopted}:e.probed.length===0?{findings:[],snapshot:e.adopted}:null}function Hh(e,t,n){return{findings:[...e.probed.map(r=>Qh(r,t)),...n],snapshot:e.adopted}}async function dE({canon:e,classify:t,observe:n,pre:r,predicted:i,signal:o,step:s}){let a=Xh[s.sync],l=Date.now()+a.timeoutMs,u=await Wh(n);if(!u.ok)return{findings:[yo(u.error,s)],snapshot:i};let c=zh({canon:e,pre:r,predicted:i,step:s},u.observed),d=0;for(;Date.now()<l;){Kt(o);let f=Gh(c,s,t);if(f!=null)return f;await Al(Zh(a,d),o),d+=1;let h=await Wh(n);if(!h.ok)return Hh(c,s,[yo(h.error,s)]);c=zh({canon:e,pre:r,predicted:i,step:s},h.observed)}return Gh(c,s,t)??Hh(c,s,[])}async function fE(e,t,n){let r=Xh[e],i=Date.now()+r.timeoutMs,o=await qh(t),s=0;for(;o.kind==="pending"&&Date.now()<i;)Kt(n),await Al(Zh(r,s),n),s+=1,o=await qh(t);return o.kind==="pending"?{kind:"failed"}:o}function qh(e){return e().match(t=>t?{kind:"passed"}:{kind:"pending"},t=>({error:t,kind:"error"}))}import{z as pE}from"zod";var Nl=pE.string().brand(),Q=Nl.parse("");function Mt(e){return Nl.parse(e)}function Ke(e,t){return Nl.parse(e.length===0?t:`${e}.${t}`)}function me(e){return On.safeParse(e).success}function pn(e){let t=e.lastIndexOf(".");return t===-1?void 0:{alias:e.slice(0,t),field:e.slice(t+1)}}function et(e){return typeof e=="object"&&e!==null&&"template"in e}function Ol(e,t,n){let r=Ke(t,e.ref);if(!n.has(r))throw new Error(`unresolved binding ref "${r}"`);return n.get(r)??null}function em(e,t,n){return hE(e).every(r=>n.has(Ke(t,r)))}function st(e,t,n){return typeof e=="string"?e:me(e)?String(Ol(e,t,n)):e.template.map(r=>typeof r=="string"?r:String(Ol(r,t,n))).join("")}function tt(e,t,n){return e===null||typeof e=="number"||typeof e=="boolean"?e:me(e)?Ol(e,t,n):st(e,t,n)}function tm(e,t){return tt(e,Q,t)}function jr(e){return go(e)}function Fn(e,t,n){return Object.fromEntries(Object.entries(e).map(([r,i])=>[r,tt(i,t,n)]))}function hE(e){return e==null||typeof e!="object"?[]:et(e)?e.template.flatMap(t=>typeof t=="string"?[]:[t.ref]):[e.ref]}function Yt(e){return typeof e=="object"&&e!==null&&"kind"in e}function hn(e){return Object.fromEntries(Object.entries(e).filter(t=>!Yt(t[1])))}function So(e,t,n){return t.reduce((r,i)=>mE(r,i,n,e),e)}function nm(e,t){return Object.keys(t).length===0?e:{...e,singletons:{...e.singletons,...t}}}function mE(e,t,n,r){if(!gE(t,n))return e;if(t.assertion.kind==="created"){let o=Fn(t.assertion.props,Q,n);return yE(e,t.entity,jr(o),o)}if(t.assertion.kind==="deleted")return $l(e,t.entity,xE(t.key,n,r));let i=Fn(hn(t.assertion.props),Q,n);return $l(e,t.entity,vE(t.key,i,n,r))}function gE(e,t){return("props"in e.assertion?[e.key,hn(e.assertion.props)]:[e.key]).every(r=>Object.values(r).every(i=>om(i)||!me(i)||t.has(Mt(i.ref))))}function yE(e,t,n,r){let i=new Map([...e.entities.get(t)??[],[n,r]]);return{...e,entities:new Map([...e.entities,[t,i]])}}function $l(e,t,n){let r=n(e.entities.get(t)??new Map);return{...e,entities:new Map([...e.entities,[t,r]])}}function mn(e,t,n,r){let i={env:r,key:n,snapshot:e};return[...(e.entities.get(t)??new Map).values()].filter(o=>wo(o,i))}function rm(e,t,n,r,i){let o={env:r,key:n,snapshot:e};return $l(e,t,s=>new Map([...s].map(([a,l])=>[a,wo(l,o)?i(l):l])))}function wo(e,t){return Object.entries(t.key).every(([n,r])=>im(e[n],r,t))}function im(e,t,n){return om(t)?bE(t,n).has(bo(e)):bo(e)===bo(wE(t,n.env))}function om(e){return typeof e=="object"&&e!==null&&"kind"in e}function bE(e,t){let n=t.snapshot.entities.get(e.selection.entity);return n==null?new Set:new Set([...n.values()].filter(r=>SE(r,e.selection.where,t)).map(r=>bo(r[e.field])))}function SE(e,t,n){return Object.entries(t).every(([r,i])=>im(e[r],i,n))}function bo(e){return e==null?"\u2205":e instanceof Date?e.toISOString():JSON.stringify(e)}function wE(e,t){return tt(e,Q,t)}function xE(e,t,n){let r={env:t,key:e,snapshot:n};return i=>new Map([...i].filter(([,o])=>!wo(o,r)))}function vE(e,t,n,r){let i={env:n,key:e,snapshot:r};return o=>new Map([...o].map(([s,a])=>wo(a,i)?[s,{...a,...t}]:[s,a]))}function lm(e){let t=e.predicates.filter(o=>fm(o)),n=t.filter(o=>o.assertion.kind==="created"),r=dm(t);if(n.length===0&&r.length===0&&e.deferred.length===0&&e.adopt.length===0)return;let i=t.filter(o=>o.assertion.kind==="updated");return(o,s)=>{let a=n.reduce((c,d)=>PE(c,s,d,e.env),{env:e.env,snapshot:o}),l=r.reduce((c,d)=>IE(c,s,d,e.env),a.snapshot),u=i.reduce((c,d)=>kE(c,s,d),a.env);return RE(OE(l,e.deferred,u),s,e.adopt)}}function RE(e,t,n){if(n.length===0)return e;let r=n.reduce((i,o)=>{let s=t.snapshot.singletons[o];return s===void 0?i:{...i,[o]:s}},e.singletons);return{...e,singletons:r}}function um(e,t,n){return new Map([...e,...Object.entries(n).map(([r,i])=>[Ke(Q,`${t}.${r}`),i])])}function kE(e,t,n){let r=mn(t.snapshot,n.entity,n.key,e).at(0);return r==null?e:um(e,n.assertion.as,r)}function cm(e){let t=dm(e.predicates.filter(n=>fm(n)));if(t.length!==0)return(n,r)=>t.flatMap(i=>CE(i,n,r,e.env))}function dm(e){return e.filter(t=>t.assertion.kind==="updated"&&Ll(t.assertion.props).length>0)}function Ll(e){return Object.entries(e).filter(([,t])=>Yt(t)).map(([t])=>t)}function fm(e){return e.assertion.kind==="created"||e.assertion.kind==="updated"}function CE(e,t,n,r){let i=mn(t,e.entity,e.key,r).at(0),o=mn(n.snapshot,e.entity,e.key,r).at(0);if(i==null||o==null)return[];let s=jr(EE(e.key,r));return Ll(e.assertion.props).flatMap(a=>sm(i[a])===sm(o[a])?[{entity:e.entity,field:a,key:s,kind:"expected-change",value:o[a]}]:[])}function EE(e,t){let n=Object.fromEntries(Object.entries(e).filter(r=>!AE(r[1])));return Fn(n,Q,t)}function AE(e){return typeof e=="object"&&e!==null&&"kind"in e}function sm(e){return e==null?"\u2205":JSON.stringify(e)}function IE(e,t,n,r){let i=Ll(n.assertion.props),o=mn(t.snapshot,n.entity,n.key,r).at(0);return o==null?e:rm(e,n.entity,n.key,r,s=>({...s,...Object.fromEntries(i.flatMap(a=>{let l=o[a];return l===void 0?[]:[[a,l]]}))}))}function PE(e,t,n,r){if(n.assertion.kind!=="created")return e;let i=Fn(n.assertion.props,Q,r),o=jr(i),s=e.snapshot.entities.get(n.entity);if(s==null||!s.has(o))return e;let a=TE(t.snapshot.entities.get(n.entity),s,i);if(a==null)return e;let[l,u]=a,c=new Map(s);return c.delete(o),c.set(l,{...u,...i}),{env:um(e.env,n.assertion.as,u),snapshot:{...e.snapshot,entities:new Map(e.snapshot.entities).set(n.entity,c)}}}function TE(e,t,n){if(e==null)return;let r=Object.entries(n),i=[...e].filter(([o])=>!t.has(o)).map(([o,s])=>({entry:[o,s],score:r.filter(([a,l])=>am(s[a])===am(l)).length}));return ME(i,r.length)}function am(e){return e==null?"\u2205":JSON.stringify(e)}function ME(e,t){let n=e.reduce((i,o)=>Math.max(i,o.score),0);if(n===0)return;let r=e.filter(i=>i.score===n);if(!(n<t&&r.length!==1))return r[0]?.entry}function OE(e,t,n){let r=t.reduce((i,o)=>{let s=NE(o.value,n);return s==null?i:{...i,[o.name]:jn(o.name,s)}},e.singletons);return{...e,singletons:r}}function NE(e,t){try{return st(e,Q,t)}catch{return}}function xo(e,t){if(e.kind==="visible"||e.kind==="disabled"||e.kind==="enabled"||e.kind==="focused"||e.kind==="checked")return{kind:e.kind,locator:Fr(e.locator,t)};if(e.kind==="not"){let n=xo(e.predicate,t);return n==null?null:{inner:n,kind:"not"}}return e.kind==="value"||e.kind==="text"?{kind:e.kind,locator:Fr(e.locator,t),value:st(e.value,Q,t)}:e.kind!=="browser"?null:{kind:"browser",name:e.name,value:st(e.value,Q,t)}}function Br(e,t){let n=e.expect.filter(a=>a.kind==="state"),r=FE(n),{adopt:i,deferred:o,immediate:s}=$E(e,t,r);return{action:BE(e.action,t),label:e.action.kind,pendingChecks:e.expect.flatMap(a=>UE(a,t)),reconcile:lm({adopt:i,deferred:o,env:t,predicates:n}),verifyChanges:cm({adopt:i,deferred:o,env:t,predicates:n}),effect:a=>nm(So(a,n,t),s)}}function Fr(e,t){return e.by==="role"?{by:"role",name:e.name==null?void 0:st(e.name,Q,t),role:e.role}:e.by==="inside"?{by:"inside",scope:Fr(e.scope,t),target:Fr(e.target,t)}:{by:"testId",value:st(e.value,Q,t)}}function $E(e,t,n){let r=e.action.kind==="goto"&&!e.expect.some(s=>s.kind==="browser"&&s.name==="url"),i=e.action.kind==="goto"&&!r?{url:It(st(e.action.url,Q,t))}:{},o=r?["url"]:[];return e.expect.reduce((s,a)=>a.kind==="browser"&&LE(a.value,n)?{...s,deferred:[...s.deferred,{name:a.name,value:a.value}]}:a.kind==="browser"||a.kind==="singleton"?{...s,immediate:{...s.immediate,...DE(a,t)}}:s,{adopt:o,deferred:[],immediate:i})}function LE(e,t){return _E(e).some(n=>t.has(n.split(".")[0]??n))}function _E(e){return typeof e=="string"?[]:me(e)?[e.ref]:e.template.filter(t=>typeof t!="string").map(t=>t.ref)}function DE(e,t){if(e.kind==="browser")return{[e.name]:jE(e,t)};if(e.kind==="singleton")return{[e.singleton]:tt(e.assertion.value,Q,t)};throw new Error("when() consequence must be a url (browser) or singleton assertion")}function jE(e,t){return jn(e.name,st(e.value,Q,t))}function FE(e){return new Set(e.flatMap(t=>t.assertion.kind==="created"||t.assertion.kind==="updated"?[t.assertion.as]:[]))}function BE(e,t){return{files:e.kind==="upload"?e.files:void 0,key:e.kind==="press"?e.key:void 0,kind:e.kind,locator:VE(e,t),url:e.kind==="goto"?st(e.url,Q,t):void 0,value:"value"in e?tm(e.value,t):void 0}}function VE(e,t){if(!(!("locator"in e)||e.locator==null))return Fr(e.locator,t)}function UE(e,t){if(e.kind==="browser"||e.kind==="singleton")return[];let n=xo(e,t),r="wait"in e?e.wait??"fast":"fast";return n==null?[]:[{budget:r,check:n}]}import{err as pm,ok as Dl,okAsync as WE,Result as zE}from"neverthrow";function Vr(e,t,n){let r=XE(e),i={env:new Map,generate:n.generate,generatedParams:new Set,indexed:r,overrides:new Map(Object.entries(n.params??{}).map(([s,a])=>[Mt(s),a]))};ZE(t.params,Q,i);let o=t.world.map(s=>QE(s,Q,i));return n.materialize(o).andThen(s=>rA(s,i.env,r).map(a=>GE({base:a,generatedParams:i.generatedParams,lockfile:e,test:t})))}function jl(e,t){let n=new Map(t.map(r=>[r.name,r]));return r=>WE(KE(r,e,n).rows)}function Fl(e){return t=>{let n=t.map(r=>({as:r.as,entity:r.entity,fields:r.fields}));return e(n).andThen(r=>qE(t,r))}}function hm(e,t){let n=vo(t);return Object.fromEntries(Object.entries(e).filter(([r,i])=>n.includes(r)&&i!=null))}function vo(e){return Object.keys(e.props)}function GE({base:e,generatedParams:t,lockfile:n,test:r}){let i=Object.fromEntries(n.singletons.map(c=>[c.name,c.default])),o=Object.fromEntries(Object.entries(r.singletons).map(([c,d])=>[c,tt(d,Q,e.env)])),s=Object.entries(r.singletons).filter(([,c])=>HE(c,t)).map(([c])=>c),a={...i,...o},l=new Set(n.singletons.filter(c=>c.source==="client").map(c=>c.name)),u=Object.fromEntries(Object.entries(a).filter(([c])=>l.has(c)));return{...e,clientState:u,generatedSingletons:s,snapshot:{...e.snapshot,singletons:a}}}function HE(e,t){return me(e)?t.has(Ke(Q,e.ref)):et(e)?e.template.some(n=>typeof n!="string"&&t.has(Ke(Q,n.ref))):!1}function qE(e,t){let n=new Map(t.map(r=>[r.as,r]));return zE.combine(e.map(r=>{let i=n.get(r.as);return i==null?pm(kh(r.as)):Dl({as:r.as,entity:r.entity,generatedFields:r.generatedFields,row:i.row,session:i.session})}))}function KE(e,t,n){return e.reduce((r,i)=>{let o=YE(i.fields,r.env),s=oA({generate:t,model:i.model,seedPrefix:i.seedPrefix,set:o,valueSpaces:n}),a=Object.entries(s).map(([u,c])=>[`${i.as}.${u}`,c]),l=Object.keys(s).filter(u=>!(u in o));return{env:new Map([...r.env,...a]),rows:[...r.rows,{as:i.as,entity:i.entity,generatedFields:[...new Set([...i.generatedFields,...l])],row:s,session:void 0}]}},{env:new Map,rows:[]})}function YE(e,t){return Object.fromEntries(Object.entries(e).map(([n,r])=>{if(me(r))return[n,JE(t,r.ref)];if(et(r))throw new Error(`template value not allowed in entity field "${n}"`);return[n,r]}))}function JE(e,t){let n=e.get(t);if(n==null)throw new Error(`setup ref "${t}" was not produced by an earlier entity`);return n}function XE(e){return{models:new Map(e.entities.map(t=>[t.name,t])),valueSpaces:new Map(e.valueSpaces.map(t=>[t.name,t]))}}function ZE(e,t,n){Object.entries(e).forEach(([r,i])=>{let o=Ke(t,r),s=n.indexed.valueSpaces.get(i.valueSpace);if(s==null)throw new Error(`unknown valueSpace "${i.valueSpace}" for param "${o}"`);let a=n.overrides.get(o);a==null&&n.generatedParams.add(o);let l=a??n.generate.value({anchor:void 0,constraints:s.constraints,generator:s.generator,nullable:!1,seed:o,type:s.type,values:s.values,valueSpace:i.valueSpace});n.env.set(o,l)})}function QE(e,t,n){let r=n.indexed.models.get(e.entity);if(r==null)throw new Error(`model "${e.entity}" not found for setup "${e.as}"`);let i=Ke(t,e.as),o=eA(e.set,t,n.env),s=nA(r,o,i,n),a=Object.entries(e.set).filter(([,l])=>me(l)&&n.generatedParams.has(Ke(t,l.ref))).map(([l])=>l);return{as:i,entity:e.entity,fields:{...s,...o},generatedFields:[...Object.keys(s),...a],model:r,seedPrefix:i}}function eA(e,t,n){return Object.fromEntries(Object.entries(e).map(([r,i])=>[r,tA(i,t,n)]))}function tA(e,t,n){if(!me(e))return e;let r=Ke(t,e.ref);return n.get(r)??{ref:r}}function nA(e,t,n,r){return Object.fromEntries(Object.entries(e.props).filter(([i,o])=>!o.optional&&!e.identity.includes(i)&&!(i in t)).map(([i,o])=>[i,mm({field:i,generate:r.generate,model:e,seedPrefix:n,spec:o,valueSpaces:r.indexed.valueSpaces})]))}function rA(e,t,n){let r=new Map,i=e.flatMap(a=>{let l=n.models.get(a.entity);if(l==null)throw new Error(`model "${a.entity}" not found for setup "${a.as}"`);Object.entries(a.row).forEach(([c,d])=>t.set(Ke(Mt(a.as),c),d));let u=r.get(a.entity)??new Map;return u.set(_l(a.row,l),hm(a.row,l)),r.set(a.entity,u),a.session==null?[]:[a.session]}),o=e.flatMap(a=>{let l=n.models.get(a.entity);return l==null?[]:[{alias:a.as,entity:a.entity,key:_l(a.row,l)}]}),s=e.flatMap(a=>{let l=n.models.get(a.entity);if(l==null)return[];let u=_l(a.row,l);return a.generatedFields.map(c=>({entity:a.entity,field:c,key:u}))});return iA(i).map(a=>({aliases:o,auth:a,env:t,generated:s,snapshot:{entities:sA(r),singletons:{}}}))}function iA(e){if(e.length===0)return Dl(void 0);let t=new Set(e.map(r=>JSON.stringify(r.cookies))).size;if(t>1)return pm(Ch(t));let n=e.flatMap(r=>Object.entries(r.headers??{}));return Dl({cookies:e.flatMap(r=>r.cookies),headers:n.length===0?void 0:Object.fromEntries(n),origins:e.flatMap(r=>r.origins)})}function oA({generate:e,model:t,seedPrefix:n,set:r,valueSpaces:i}){return{...Object.fromEntries(Object.entries(t.props).filter(([s])=>!(s in r)).map(([s,a])=>[s,mm({field:s,generate:e,model:t,seedPrefix:n,spec:a,valueSpaces:i})])),...r}}function mm({field:e,generate:t,model:n,seedPrefix:r,spec:i,valueSpaces:o}){let s=`${n.name}.${e}`;return t.value({anchor:void 0,constraints:o.get(s)?.constraints,generator:o.get(s)?.generator??"lorem.word",nullable:i.optional,seed:Ke(r,e),type:i.type,values:o.get(s)?.values,valueSpace:s})}function _l(e,t){return t.identity.map(n=>String(e[n])).join(":")}function sA(e){return new Map([...e].map(([t,n])=>[t,new Map(n)]))}function Ye(e){return`${e.workflow}/${e.slug}`}function nt(e){return e.workflows.flatMap(t=>t.tests.map(n=>({ref:Ye(n),test:n,workflow:t})))}function wt(e){return`${e.test}#${String(e.index)}`}function Bn(e){let t=nt(e).flatMap(n=>Ro(e,n.test));return Tt(t,n=>`${n.test}:${G(n.steps)}`)}function Ro(e,t){let n=bm(t),r=gm(n,t.singletons),i=TA(t,PA(e)),o=aA(e,t);return lA(r,MA(t.steps),n).reduce((a,{chunk:l,requiredState:u},c)=>({offset:a.offset+l.length,transitions:[...a.transitions,AA({chunk:l,index:c,intent:t.intent,namespace:n.namespace,paramSpaceOf:i,requiredState:u,testRef:Ye(t),whenChunk:o.slice(a.offset,a.offset+l.length)})]}),{offset:0,transitions:[]}).transitions}function gm(e,t){return{absences:kA(e),entities:EA(e),exclusives:e.exclusives,singletons:Object.fromEntries(Object.entries(t).filter(([,n])=>!me(n)&&!et(n)))}}function aA(e,t){let n=e.workflows.find(r=>r.name===t.workflow);return n==null||n.steps.length!==t.steps.length?t.steps:n.steps}function ko(e,t,n){return Object.values(e).flatMap(r=>me(r)?Vl(r.ref,n):[]).find(r=>r.entity===t)?.aliasPath}function lA(e,t,n){return t.reduce((r,i)=>({requiredState:uA(r.requiredState,i,n),withRequiredState:[...r.withRequiredState,{chunk:i,requiredState:xA(r.requiredState,i)}]}),{requiredState:e,withRequiredState:[]}).withRequiredState}function uA(e,t,n){let r=t.flatMap(i=>i.expect.filter(o=>o.kind==="state")).reduce((i,o)=>cA(i,o,n),e);return{...r,singletons:{...r.singletons,...bA(t)}}}function cA(e,t,n){return t.assertion.kind==="deleted"?dA(e,t,n):t.assertion.kind==="created"?hA(e,t.entity,t.assertion.as,t.assertion.props,n):gA(e,t,n)}function dA(e,t,n){let r=ko(t.key,t.entity,n.namespace),i=e.entities.find(a=>a.alias===r),o=Ur(fA(t.key),n),s=i==null?{entity:t.entity,...o}:{entity:i.entity,...pA(i,o)};return{...e,absences:[...e.absences,s],entities:e.entities.filter(a=>a.alias!==r)}}function fA(e){return Object.fromEntries(Object.entries(e).flatMap(t=>{let n=t[1];return wm(n)?[]:[[t[0],n]]}))}function pA(e,t){return{literals:{...e.literals,...t.literals},relations:[...e.relations.filter(n=>!t.relations.some(r=>r.field===n.field)),...t.relations]}}function hA(e,t,n,r,i){let o=Ur(r,i);return{...e,absences:e.absences.filter(s=>s.entity!==t||!mA(o,s)),entities:[...e.entities,{alias:n,entity:t,...o}]}}function mA(e,t){return Object.entries(t.literals).every(([r,i])=>e.literals[r]===i)&&t.relations.every(r=>e.relations.some(i=>i.field===r.field&&i.targetAlias===r.targetAlias&&i.targetField===r.targetField))}function gA(e,t,n){if(t.assertion.kind!=="updated")return e;let r=ko(t.key,t.entity,n.namespace);if(r==null)return e;let i=Ur(hn(t.assertion.props),n),o=Object.entries(t.assertion.props).filter(([,a])=>Yt(a)).map(([a])=>a),s=a=>a.alias===r?yA(a,i,o):a;return{...e,entities:e.entities.map(a=>s(a))}}function yA(e,t,n){let r=Object.entries(e.literals).filter(([i])=>!n.includes(i)&&!(i in t.literals));return{...e,literals:{...Object.fromEntries(r),...t.literals},relations:[...e.relations.filter(i=>!t.relations.some(o=>o.field===i.field)),...t.relations]}}function bA(e){return e.reduce((t,n)=>({...t,...SA(n),...wA(n)}),{})}function SA(e){return e.action.kind==="goto"?{url:e.action.url}:{}}function wA(e){return Object.fromEntries(e.expect.flatMap(t=>t.kind==="browser"?[[t.name,t.value]]:t.kind==="singleton"?[[t.singleton,t.assertion.value]]:[]))}function xA(e,t){return t[0]?.action.kind!=="goto"?e:{...e,singletons:Object.fromEntries(Object.entries(e.singletons).filter(([n])=>n!=="url"))}}function Co(e,t){let n=bm(t);return{namespace:n.namespace,requiredState:gm(n,t.singletons)}}function ym(e,t){return[...new Set(e)].flatMap(n=>Vl(n,t))}function at(e){return me(e)?[e.ref]:et(e)?e.template.flatMap(t=>me(t)?[t.ref]:[]):[]}function gn(e){switch(e.kind){case"visible":case"disabled":case"enabled":case"focused":case"checked":return Jt(e.locator);case"value":case"text":return[...Jt(e.locator),...at(e.value)];case"singleton":return at(e.assertion.value);case"browser":return at(e.value);case"state":return[...e.assertion.kind==="deleted"?[]:Object.values(hn(e.assertion.props)).flatMap(t=>at(t)),...Object.values(e.key).flatMap(t=>Sm(t))];case"not":return gn(e.predicate);case"when":return e.branches.flatMap(t=>t.consequence.flatMap(n=>gn(n)));case"and":return e.predicates.flatMap(t=>gn(t));case"count":return[]}}function bm(e){return{absences:e.absent,exclusives:e.exclusive,namespace:new Map(e.world.map(t=>[t.as,t.entity])),setups:e.world}}function Jt(e){return e.by==="inside"?[...Jt(e.scope),...Jt(e.target)]:e.by==="role"?e.name==null?[]:at(e.name):at(e.value)}function Sm(e){return wm(e)?Object.values(e.selection.where).flatMap(t=>Sm(t)):at(e)}function wm(e){return typeof e=="object"&&e!==null&&"kind"in e}function vA(e){return e.kind==="goto"?at(e.url):e.kind==="fill"||e.kind==="select"?[...Jt(e.locator),...at(e.value)]:e.kind==="press"?e.locator==null?[]:Jt(e.locator):(e.kind==="upload",Jt(e.locator))}function RA(e){return[...vA(e.action),...e.expect.flatMap(t=>gn(t))]}function kA(e){return e.absences.map(t=>({entity:t.entity,...Ur(t.where,e)}))}function Ur(e,t){let n=Object.entries(e),r=Object.fromEntries(n.flatMap(([o,s])=>me(s)||et(s)?[]:[[o,s]])),i=n.flatMap(o=>{let s=o[1];if(!me(s))return[];let a=Vl(s.ref,t.namespace).at(0);return a==null?[]:[{entity:a.entity,field:o[0],targetAlias:a.aliasPath,targetField:a.field}]});return{literals:r,relations:i}}function CA(e,t){return e.map(n=>({alias:n.as,entity:n.entity,...Ur(n.set,t)}))}function EA(e){return CA(e.setups,e)}function AA(e){let t=e.chunk.findIndex(s=>s.action.kind!=="goto"),n=t===-1?e.chunk:e.chunk.slice(0,t),r=e.chunk.slice(n.length),i=r.at(-1)??e.chunk.at(-1);if(i==null)throw new Error("empty transition chunk");let o=[...new Set(e.chunk.flatMap(s=>RA(s)))];return{effectStep:i,index:e.index,intent:e.intent,namespace:e.namespace,nav:n,paramSpaces:Object.fromEntries(o.filter(s=>e.paramSpaceOf.has(s)).map(s=>[s,e.paramSpaceOf.get(s)])),requiredState:e.requiredState,steps:r,test:e.testRef,wait:Kh(r.flatMap(s=>IA(s))),whenSteps:e.whenChunk}}function IA(e){return e.expect.flatMap(t=>t.kind==="state"&&t.wait!=null?[t.wait]:[])}function Vl(e,t){let n=pn(e);if(n==null)return[];let r=t.get(n.alias);return r==null?[]:[{aliasPath:n.alias,entity:r,field:n.field,ref:e}]}function PA(e){return new Map(e.valueSpaces.map(t=>[t.name,t]))}function TA(e,t){return new Map(Object.entries(e.params).map(([n,r])=>[n,t.get(r.valueSpace)]))}function MA(e){return Bl(e,0,[],[])}function Bl(e,t,n,r){let i=e[t];if(i==null)return n.length===0?r:[...r,n];let o=[...n,i];return OA(i)?Bl(e,t+1,[],[...r,o]):Bl(e,t+1,o,r)}function OA(e){return e.expect.some(t=>t.kind==="state")}function xm(e){return vm(e,new Map)}function NA(e,t){return e.reduce((n,r)=>n??t(r),null)}function vm(e,t){let n=e.variables.find(r=>!t.has(r));return n==null?t:NA(e.domain(n),r=>{let i=new Map([...t,[n,r]]);return e.consistent(i)?vm(e,i):null})}function xt(e,t){let n=$A(e,t);if(n==null)return null;let r=UA(n);return WA(e.singletons,t,r)?r:null}function $A(e,t){let{absences:n,entities:r,exclusives:i}=e,o=new Map(r.map(a=>[a.alias,a])),s=xm({variables:r.map(a=>a.alias),consistent:a=>LA(a)&&_A(r,a)&&jA(n,a,t),domain:a=>BA(o.get(a),t)});return s==null?null:VA(i,r,s,t)?s:null}function LA(e){let t=[...e.values()];return new Set(t).size===t.length}function _A(e,t){return e.every(n=>t.has(n.alias)?n.relations.every(r=>DA(n,r,t)):!0)}function DA(e,t,n){if(!n.has(t.targetAlias))return!0;let r=n.get(t.targetAlias)?.[t.targetField];return r==null?!0:n.get(e.alias)?.[t.field]===r}function jA(e,t,n){return e.every(r=>![...n.entities.get(r.entity)?.values()??[]].some(i=>FA(i,r,t)))}function FA(e,t,n){return Rm(e,t)?t.relations.every(r=>{if(!n.has(r.targetAlias))return!1;let i=n.get(r.targetAlias)?.[r.targetField];return i!=null&&e[r.field]===i}):!1}function Rm(e,t){return Object.entries(t.literals).every(([n,r])=>r===null?e[n]==null:e[n]===r)}function BA(e,t){return e==null?[]:[...t.entities.get(e.entity)?.values()??[]].filter(n=>Rm(n,e))}function VA(e,t,n,r){return e.every(i=>{let o=t.filter(a=>a.entity===i&&n.has(a.alias)).length;return(r.entities.get(i)?.size??0)===o})}function UA(e){return new Map([...e].flatMap(([t,n])=>Object.entries(n).flatMap(r=>{let i=r[1];return typeof i=="string"||typeof i=="number"||typeof i=="boolean"?[[Mt(`${t}.${r[0]}`),i]]:[]})))}function WA(e,t,n){return Object.entries(e).every(([r,i])=>{if(!em(i,Q,n))return!1;let o=tt(i,Q,n),s=t.singletons[r],a=At.safeParse(r);return a.success?ml(a.data,o,s):s===o})}function Cm(e,t,n){return e.reduce((r,i)=>{let o=So(r.snapshot,zA(i),n);return{resolved:[...r.resolved,GA(i,o,n)],snapshot:o}},{resolved:[],snapshot:t}).resolved}function zA(e){return e.expect.filter(t=>t.kind==="state")}function GA(e,t,n){return e.expect.some(r=>r.kind==="when")?{...e,expect:e.expect.flatMap(r=>Em(r,{env:n,snapshot:t}))}:e}function Em(e,t){if(e.kind!=="when")return[e];let n=HA(e,t);return n==null?[]:n.flatMap(r=>Em(r,t))}function HA(e,t){return e.branches.find(n=>n.condition==null||Ul(n.condition,t))?.consequence}function Ul(e,t){if(e.kind==="count")return mn(t.snapshot,e.entity,{},t.env).length===e.value;if(e.kind==="singleton"){let n=tt(e.assertion.value,Q,t.env);return km(t.snapshot.singletons[e.singleton])===km(n)}return e.kind==="not"?!Ul(e.predicate,t):e.predicates.every(n=>Ul(n,t))}function km(e){return e==null?"\u2205":JSON.stringify(e)}function Eo(e,t,n){let r=xt(e.requiredState,t);return r==null?null:new Map([...r,...Object.entries(n).map(([i,o])=>[Mt(i),o])])}function Ao(e,t,n){let r=Cm(e.whenSteps,n,t),i=r.at(-1)??e.effectStep,o=Br(i,t),s=YA(e,t),a=r.map(l=>Br(l,t));return{effect:JA(o.effect,s),steps:a.map(l=>({action:l.action,effect:l.effect,pendingChecks:l.pendingChecks,reconcile:l.reconcile,verifyChanges:l.verifyChanges}))}}function Wl(e,t,n){return xt(e.requiredState,n)==null?!1:yn(t(n))!==yn(n)||XA(e)||qA(e)}function qA(e){return[...e.nav,...e.steps].every(t=>t.expect.every(n=>n.kind!=="state"))}var Am=new WeakMap;function yn(e){let t=Am.get(e);if(t!=null)return t;let n=G({entities:[...e.entities].map(([r,i])=>[r,[...i]]),singletons:KA(e.singletons)});return Am.set(e,n),n}function KA(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>t==="url"&&typeof n=="string"?[t,It(n)]:[t,n]))}function YA(e,t){let n=e.nav.at(-1);return n==null?void 0:Br(n,t).action.url}function JA(e,t){if(t==null)return e;let n=It(t);return r=>{let i=e(r);return{...i,singletons:{...i.singletons,url:n}}}}function XA(e){return e.effectStep.expect.some(t=>t.kind==="state"&&t.assertion.kind==="updated"&&Object.values(t.assertion.props).some(n=>Yt(n)))}function Wr(e,t,n){let r=Eo(e,t.snapshot,n);if(r==null)return null;let i=ZA(e,r,t.snapshot);return i==null||!Wl(e,i.effect,t.snapshot)?null:{next:{snapshot:i.effect(t.snapshot)},resolved:i}}function Im(e,t,n){let r=Eo(e,t.snapshot,n);if(r==null)return"required-state-unsatisfied";try{return Ao(e,r,t.snapshot),"no-effect"}catch{return"unresolvable"}}function ZA(e,t,n){try{return Ao(e,t,n)}catch{return null}}function Vn(e,t,n){return e.flatMap((r,i)=>{let o=n(r),s=Wr(r,t,o);return s==null?[]:[{idx:i,label:wt(r),params:o,stepRun:s}]})}var QA={absences:[],entities:[],exclusives:[],singletons:{}};function zr(e){return{...QA,...e}}function Gr(e,t){if(e==null)return new Set;if(e.by==="inside")return new Set([...Gr(e.scope,t),...Gr(e.target,t)]);let n=e.by==="role"?e.name:e.value;return new Set(t(n))}function zl(e){return eI(e).flatMap(t=>tI(t))}function eI(e){return[...e.reduce((n,r)=>{let i=G([r.when.singletons,r.consequence]);return new Map([...n,[i,[...n.get(i)??[],r]]])},new Map).values()]}function tI(e){if(e.length<2)return[];let t=e.map(o=>new Set(o.when.entities.map(s=>Gl(s)))),[n]=t;if(n==null)return[];let r=[...n].filter(o=>t.every(s=>s.has(o))),i=e.toSorted((o,s)=>o.when.entities.length-s.when.entities.length)[0];return i==null||r.length===i.when.entities.length?[]:nI(e,r)?[]:sI(i,r,lI(e))}function Gl(e){return G([e.entity,e.literals])}function nI(e,t){return e.some(n=>{let r=Pm(n.consequence),i=rI(r),o=iI(r);return n.when.entities.some(s=>!t.includes(Gl(s))&&(oI(s,i)||o.has(s.alias)))})}function Pm(e){return e.kind==="not"?Pm(e.predicate):"locator"in e?e.locator:void 0}function rI(e){return Gr(e,t=>t==null||me(t)||et(t)?[]:[t])}function iI(e){return Gr(e,t=>{if(t==null||!me(t))return[];let n=pn(t.ref);return n==null?[]:[n.alias]})}function oI(e,t){return Object.values(e.literals).some(n=>typeof n=="string"&&t.has(n))}function sI(e,t,n){let r=e.when.entities.filter(l=>t.includes(Gl(l))),i=e.when.entities.filter(l=>!r.includes(l)).filter(l=>e.when.exclusives.includes(l.entity)).map(l=>({...l,literals:{},relations:[]})),o=[...r,...i],s=new Set(o.map(l=>l.alias));if(![...e.refs].every(l=>s.has(l)))return[];let a=zr({entities:o.map(l=>aI(l,s)),exclusives:e.when.exclusives.filter(l=>o.some(u=>u.entity===l)),singletons:e.when.singletons});return[{consequence:e.consequence,origin:{kind:"generalized",tests:n},refs:e.refs,when:a}]}function aI(e,t){return{...e,relations:e.relations.filter(n=>t.has(n.targetAlias))}}function lI(e){return[...new Set(e.flatMap(t=>t.origin==null?[]:t.origin.kind==="generalized"?t.origin.tests:[t.origin.test]))]}function uI(e){return e.flatMap((t,n)=>e.slice(n+1).flatMap(r=>$m(t,r)))}function Nm(e,t){return $m(e,t).length>0}function $m(e,t){let n=Tm(e.when,t.when);return!n&&!Tm(t.when,e.when)||!dI(e.consequence,t.consequence)?[]:[{a:e.consequence,b:t.consequence,when:n?t.when:e.when}]}function Tm(e,t){return Mm(e.entities,t.entities)&&Mm(e.absences,t.absences)&&e.exclusives.every(n=>t.exclusives.includes(n))&&cI(e.singletons,t.singletons)}function Mm(e,t){let n=new Set(t.map(r=>G(r)));return e.every(r=>n.has(G(r)))}function cI(e,t){return Object.entries(e).every(([n,r])=>G(t[n])===G(r))}function dI(e,t){return e.kind==="not"?Hl(e.predicate,t):t.kind==="not"?Hl(e,t.predicate):fI(e,t)||pI(e,t)}function Hl(e,t){return e.kind===t.kind&&"locator"in e&&"locator"in t&&Lm(e,t)}function Lm(e,t){return"locator"in t&&G(e.locator)===G(t.locator)}function fI(e,t){let n=new Set([e.kind,t.kind]);return n.has("enabled")&&n.has("disabled")&&"locator"in e&&"locator"in t?Lm(e,t):!1}function pI(e,t){let n=Om(e),r=Om(t);return n==null||r==null||e.kind!==t.kind?!1:Hl(e,t)&&G(n)!==G(r)}function Om(e){return e.kind==="value"||e.kind==="text"?e.value:null}function hI(e,t){return e.flatMap(n=>{let r=mI(n),i=new Set(n.requiredState.absences.map(o=>o.entity));return t.flatMap(o=>gI(n,o,r,i))})}function mI(e){return new Set(e.steps.flatMap(t=>t.expect.flatMap(n=>n.kind==="state"&&n.assertion.kind==="deleted"?[n.entity]:[])))}function gI(e,t,n,r){let{source:i,target:o}=t.reference;return!n.has(o)||n.has(i)||r.has(i)?[]:[{dataRule:t,source:i,target:o,transition:wt(e)}]}function ql(e){return G({consequence:e.consequence,when:e.when})}function Kl(e){let t=[...yI(e),...TI(e)],n=zl(t).reduce((r,i)=>[...t,...r].some(s=>Nm(i,s))?r:[...r,i],[]);return Tt([...t,...n],ql)}function Dm(e,t){return e.filter(n=>!bI(n)||SI(n)===t)}function Yl(e){return e.kind==="not"?Yl(e.predicate):e.kind==="visible"||e.kind==="disabled"||e.kind==="enabled"||e.kind==="focused"||e.kind==="checked"||e.kind==="value"||e.kind==="text"}function Jl(e,t,n){if(xt(e.when,t)!=null)return null;let r=xt(e.when,n);return r==null?null:OI(e,r)}function yI(e){return Tt(nt(e).flatMap(t=>wI(e,t)),ql)}function bI(e){return e.origin==null||e.origin.kind==="generalized"?!1:gn(e.consequence).some(t=>pn(t)!=null)}function SI(e){let{origin:t}=e;if(!(t==null||t.kind==="generalized"))return t.test}function wI(e,{test:t,workflow:n}){let r=Co(e,t),i=xI(n.steps);return t.steps.reduce((o,s)=>({pageRules:[...o.pageRules,...PI({branchScoped:i,namespace:r.namespace,origin:{kind:"test",test:Ye(t)},requiredState:o.requiredState,step:s})],requiredState:vI(o.requiredState,s,r)}),{pageRules:[],requiredState:r.requiredState}).pageRules}function xI(e){let t=e.flatMap(n=>n.expect).flatMap(n=>Io(n)).map(n=>G(n));return new Set(t)}function Io(e){return e.kind==="not"?Io(e.predicate):e.kind==="and"?e.predicates.flatMap(t=>Io(t)):e.kind!=="when"?[]:e.branches.flatMap(t=>t.consequence.flatMap(n=>[n,...Io(n)]))}function vI(e,t,n){return t.expect.reduce((r,i)=>i.kind==="state"?RI(r,i,n):r,e)}function RI(e,t,n){if(t.assertion.kind==="created"){let o=kI(t.assertion.as,t.entity,t.assertion.props,n);return{...e,entities:[...e.entities,o]}}let r=ko(t.key,t.entity,n.namespace);if(r==null)return e;if(t.assertion.kind==="deleted")return AI(e,r);let i=hn(t.assertion.props);return{...e,entities:e.entities.map(o=>o.alias===r?jm(o,i,n):o)}}function kI(e,t,n,r){return jm({alias:e,entity:t,literals:{},relations:[]},n,r)}function jm(e,t,n){return Object.entries(t).reduce((r,[i,o])=>{if(et(o))return r;if(me(o)){let s=CI(o.ref,i,n.namespace);return{...r,literals:EI(r.literals,i),relations:s==null?r.relations:[..._m(r.relations,i),s]}}return{...r,literals:{...r.literals,[i]:o},relations:_m(r.relations,i)}},e)}function CI(e,t,n){let r=pn(e);if(r==null)return;let i=n.get(r.alias);return i==null?void 0:{entity:i,field:t,targetAlias:r.alias,targetField:r.field}}function EI(e,t){return Object.fromEntries(Object.entries(e).filter(([n])=>n!==t))}function _m(e,t){return e.filter(n=>n.field!==t)}function AI(e,t){let n=e.entities.find(i=>i.alias===t),r=II(e,t);return n==null?r:{...r,absences:[...r.absences,{entity:n.entity,literals:n.literals,relations:n.relations}]}}function II(e,t){return{...e,entities:e.entities.filter(n=>n.alias!==t)}}function PI({branchScoped:e,namespace:t,origin:n,requiredState:r,step:i}){if(i.action.kind!=="goto")return[];let o=i.action.url;return i.expect.filter(s=>Yl(s)).filter(s=>!e.has(G(s))).map(s=>Fm({consequence:s,namespace:t,origin:n,requiredState:r,url:o}))}function Fm({consequence:e,namespace:t,origin:n,requiredState:r,url:i}){return{consequence:e,origin:n,refs:new Set(ym([...at(i),...gn(e)],t).map(o=>o.aliasPath)),when:{...r,singletons:{...r.singletons,url:i}}}}function TI(e){return Tt(Bn(e).flatMap(t=>MI(t)),ql)}function MI(e){let t=e.nav.at(-1),n=e.steps[0]?.action,r=n!=null&&"locator"in n?n.locator:void 0;return t==null||t.action.kind!=="goto"||r==null?[]:[Fm({consequence:{kind:"enabled",locator:r,wait:void 0},namespace:e.namespace,origin:{intent:e.intent,kind:"trigger",test:e.test},requiredState:e.requiredState,url:t.action.url})]}function OI(e,t){try{let n=xo(e.consequence,t);return n==null?null:{check:n}}catch{return null}}function Xl(e){return El(nt(e).flatMap(t=>NI(e,t.test)))}function Zl(e,t){return xt(e.when,t)==null?!1:xt(e.holds,t)==null}function NI(e,t){let n=Co(e,t);return n.requiredState.entities.flatMap(r=>r.relations.flatMap(i=>$I(e,r,i,n.namespace)?DI(r,i,n.namespace):[]))}function $I(e,t,n,r){let i=r.get(n.targetAlias);return i!=null&&!LI(e,t.entity,n.field)&&_I(e,i,n.targetField)}function LI(e,t,n){return e.entities.find(r=>r.name===t)?.props[n]?.optional===!0}function _I(e,t,n){return e.entities.find(r=>r.name===t)?.identity.includes(n)===!0}function DI(e,t,n){let r=n.get(t.targetAlias);if(r==null)return[];let i=Bm(e.alias,e.entity),o=Bm(t.targetAlias,r);return[{holds:zr({entities:[{...i,relations:[t]},o]}),reference:{field:t.field,source:e.entity,target:r,targetField:t.targetField},when:zr({entities:[i]})}]}function Bm(e,t){return{alias:e,entity:t,literals:{},relations:[]}}function Vm(e,t){let n=[...t.entities].flatMap(([o,s])=>[...s].map(([a,l])=>jI({entity:o,key:a,pre:e,row:l}))),r=[...e.entities].flatMap(([o,s])=>[...s].flatMap(([a,l])=>FI({entity:o,key:a,post:t,row:l}))),i=Object.entries(t.singletons).map(([o,s])=>({changed:e.singletons[o]!==s,name:o,value:s}));return{rows:[...n,...r],singletons:i}}function jI({entity:e,key:t,pre:n,row:r}){let i=BI(n.entities.get(e),t),o=Object.entries(r).map(([s,a])=>({changed:i==null||i[s]!==a,field:s,value:a}));return{changed:i==null||o.some(s=>s.changed),entity:e,fields:o,key:t,status:i==null?"created":"present"}}function FI({entity:e,key:t,post:n,row:r}){if(n.entities.get(e)?.has(t)===!0)return[];let i=Object.entries(r).map(([o,s])=>({changed:!1,field:o,value:s}));return[{changed:!0,entity:e,fields:i,key:t,status:"deleted"}]}function BI(e,t){return e?.get(t)}function Ql(e,t,n){return t.steps.map(r=>({effect:r.effect,pendingChecks:r.pendingChecks.map(i=>({budget:i.budget,check:{kind:"poll",run:()=>n.evaluate(i.check)},source:{check:i.check,kind:"step"},targetIds:()=>n.locateIds(Po(i.check))})),reconcile:r.reconcile,step:{action:r.action,intent:e.intent,test:e.test},sync:e.wait,verifyChanges:r.verifyChanges,perform:()=>n.perform(r.action),requiredState:()=>!0,targetIds:()=>n.locateIds(r.action.locator)}))}function Po(e){if(e.kind==="not")return Po(e.inner);if(e.kind!=="browser")return e.locator}async function Um(e,t){let{params:n,transition:r}=e.stepRun,i=Wr(r,e.state,n);if(i==null){let s={intent:r.intent,kind:"unrunnable",reason:Im(r,e.state,n),test:r.test};return{label:wt(r),next:e.state,result:{finalModel:e.state.snapshot,findings:[s]}}}let o=await Ml({canon:e.canon,classify:e.classify,initialSnapshot:e.state.snapshot,observe:e.driver.observe,onAssertion:e.onAssertion,onStep:e.onStep,pageRulePendingChecks:UI(e.pageRules,e.dataRules,e.driver),steps:Ql(e.stepRun.transition,i.resolved,e.driver)},t);return{label:wt(e.stepRun.transition),next:{snapshot:o.finalModel},result:o}}function VI(e,t){return Zl(e,t)?[{budget:"fast",check:{kind:"decided",passed:!1},source:{dataRule:e,kind:"data-rule"},targetIds:()=>Promise.resolve([])}]:[]}function UI(e,t,n){return(r,i)=>[...e.flatMap(o=>WI(o,r,i,n)),...t.flatMap(o=>VI(o,i))]}function WI(e,t,n,r){let i=Jl(e,t,n);return i==null?[]:[{budget:"fast",check:{kind:"poll",run:()=>r.evaluate(i.check)},source:{check:i.check,kind:"page-rule",origin:e.origin},targetIds:()=>r.locateIds(Po(i.check))}]}function tu(e,t){return eu({acc:{findings:[],ran:[]},index:0,params:e,signal:t,state:e.initialState,stepBase:0})}async function eu({acc:e,index:t,params:n,signal:r,state:i,stepBase:o}){Kt(r);let s=n.sequence[t];if(s==null)return e;let a=Date.now(),l=[],u=await Um({canon:n.canon,classify:n.classify,dataRules:n.dataRules,driver:n.driver,onAssertion:n.onAssertion,pageRules:n.pageRules,state:i,stepRun:s,onStep:d=>{l.push(d.index),n.onEvent({annotations:d.annotations,endMs:d.endMs,findings:d.findings,index:o+d.index,kind:"step",startMs:d.startMs,state:Vm(d.pre,d.post),url:d.url})}},r);if(u==null)return eu({acc:e,index:t+1,params:n,signal:r,state:i,stepBase:o});n.onEvent({endMs:Date.now(),intent:s.transition.intent,kind:"ran",startMs:a}),u.result.findings.forEach(d=>{n.onEvent({finding:d,kind:"finding"})});let c={findings:[...e.findings,...u.result.findings],ran:[...e.ran,u.label]};return u.result.findings.length>0?c:eu({acc:c,index:t+1,params:n,signal:r,state:u.next,stepBase:o+l.length})}var Un={value:e=>zI(e)};function ru(e,t){return{value:n=>e.value({...n,seed:`${t}:${n.seed}`})}}function iu(e,t){return{value:n=>e.value({...n,anchor:t})}}function zI({anchor:e,constraints:t,generator:n,nullable:r,seed:i,type:o,values:s,valueSpace:a}){let l=nu(`${a}:${i}`);return r&&l%4===0?null:s!=null&&s.length>0?s[l%s.length]??s[0]??null:n==="date.iso"?GI({anchor:e,constraints:t,n:l,timeHash:nu(`${a}:${i}#tod`)}):o==="number"?HI(l,t):o==="boolean"?l%2===0:XI(n,l)}var To=864e5;function GI({anchor:e,constraints:t,n,timeHash:r}){if(t?.kind!=="datetime")throw new Error("datetime value space requires offsetDays constraints");if(e==null)throw new Error("datetime value space requires a run anchor timestamp");let i=Date.parse(e);if(Number.isNaN(i))throw new TypeError(`datetime anchor "${e}" is not a valid ISO timestamp`);let o=t.maxOffsetDays-t.minOffsetDays+1,s=o<=0?t.minOffsetDays:t.minOffsetDays+n%o,a=Math.floor(i/To)*To;return new Date(a+s*To+r%To).toISOString()}function nu(e,t=0,n=7){return t>=e.length?n>>>0:nu(e,t+1,n*31+(e.codePointAt(t)??0)>>>0)}function HI(e,t){if(t?.kind!=="number"||t.min==null||t.max==null)throw new Error("number value space requires min and max constraints");let n=t.max-t.min+1;return n<=0?t.min:t.min+e%n}var qI=["ada","bruno","carmen","dario","elena","felix","greta","hugo","iris","jonas","kira","lena","mateo","nadia","oscar","petra","quinn","rosa","stefan","tara","ugo","vera","wim","yara"],KI=["abreu","berg","costa","duval","eriksen","fischer","garza","holm","ito","jansen","kovac","laurent","moreau","novak","okafor","petrov","quist","rossi","sato","tanaka","ueda","vargas","weber","zhang"],YI=["amber","brisk","calm","deep","early","fond","glad","hazel","ivory","jade","keen","lush","mauve","noble","opal","plum","quiet","rapid","sage","teal","umber","vivid","warm","zesty"],JI=["aspen","brook","cedar","dune","ember","fjord","grove","harbor","isle","juniper","knoll","lagoon","meadow","nimbus","orchid","prairie","quartz","ridge","summit","thicket","umbra","vale","willow","zephyr"];function Mo(e,t){let n=e[t%e.length];if(n==null)throw new Error("empty word list");return n}function Oo(e){return`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function XI(e,t){let n=Mo(qI,t),r=Mo(KI,Math.floor(t/31)),i=Mo(YI,t),o=Mo(JI,Math.floor(t/29));return e==="internet.email"?`${n}.${r}${String(t%100)}@test.ripplo.ai`:e==="internet.url"?`https://${i}-${o}.example.com`:e==="person.fullName"?`${Oo(n)} ${Oo(r)}`:e==="company.name"?`${Oo(i)} ${Oo(o)}`:e==="lorem.slug"?`${i}-${o}`:`${o}-${String(t%1e3)}`}import{ResultAsync as su}from"neverthrow";var Hr=class extends Error{mountKey;constructor(t){super("client-mount-unmounted"),this.mountKey=t}};function ou(e){return{read:t=>ZI(t,e),seedScript:t=>`globalThis[${JSON.stringify(Ja)}] = ${JSON.stringify(t)};`}}async function ZI(e,t){let n={title:await e.title(),url:It(e.url()),viewport:tP(e.viewportSize())};if(t.length===0)return n;let r=await e.evaluate(eP,{mountKey:oo,names:t,timeoutMs:QI});if(r.kind==="unmounted")throw new Hr(oo);return{...n,...r.values}}var QI=5e3;async function eP(e){let t=Date.now()+e.timeoutMs;for(;Reflect.get(globalThis,e.mountKey)==null&&Date.now()<t;)await new Promise(r=>setTimeout(r,25));let n=Reflect.get(globalThis,e.mountKey);return n==null?{kind:"unmounted"}:{kind:"values",values:Object.fromEntries(e.names.map(r=>[r,n.readSingleton(r)??null]))}}function tP(e){return e==null?"":`${String(e.width)}x${String(e.height)}`}function au(e,t,n){return{evaluate:r=>su.fromPromise(Gm(nP(e,n,r),`check ${r.kind}`),Wm),locateIds:r=>lP(e,r),observe:()=>t.read().andThen(r=>su.fromPromise(Gm(Hm(e,n,0),"observe"),Wm).map(i=>({snapshot:{...r,singletons:{...r.singletons,...i}}}))),perform:r=>su.fromPromise(Km(e,r,0),i=>Ah(r.kind,i))}}async function nP(e,t,n){try{return await Zm(e,t,n)}catch(r){if(qm(r))return!1;throw r}}function Wm(e){return e instanceof Hr?xh(e.mountKey):Ih(e)}var rP=[100,250,500];async function Hm(e,t,n){try{return await t.read(e)}catch(r){let i=rP[n];if(i==null||!qm(r))throw r;return await Xm(i),Hm(e,t,n+1)}}function qm(e){let t=e instanceof Error?e.message:String(e);return/Execution context was destroyed|Cannot find context with specified id|[Ff]rame was detached|frame got detached/.test(t)}var zm=35e3;function Gm(e,t){let n,r=new Promise((i,o)=>{n=setTimeout(()=>{o(new Error(`driver op "${t}" exceeded ${String(zm)}ms`))},zm)});return Promise.race([e,r]).finally(()=>{clearTimeout(n)})}var iP=[250,750,2e3];async function Km(e,t,n){try{await oP(e,t)}catch(r){let i=iP[n];if(i==null||!cP(r))throw r;await Xm(i),await Km(e,t,n+1)}}async function oP(e,t){if(t.kind==="goto"){await e.goto(Wn(t.url,t,"url"));return}if(t.kind==="press"&&t.locator==null){await e.keyboard.press(Wn(t.key,t,"key"));return}let n=t.kind!=="upload";await sP(e,Ym(e,t.locator,{visibleOnly:n}),t)}function Wn(e,t,n){if(e==null)throw new Error(`action "${t.kind}" requires ${n}`);return e}function sP(e,t,n){switch(n.kind){case"goto":throw new Error("goto must not be located");case"fill":return t.fill(String(Wn(n.value,n,"value")));case"clear":return t.clear();case"click":return t.click();case"dblclick":return t.dblclick();case"check":return t.check();case"uncheck":return t.uncheck();case"hover":return t.hover();case"select":return aP(e,t,String(Wn(n.value,n,"value")));case"upload":return t.setInputFiles(Wn(n.files,n,"files"));case"press":return t.press(Wn(n.key,n,"key"))}}async function aP(e,t,n){if(await t.evaluate(i=>i.tagName==="SELECT")){await t.selectOption(n);return}await t.click(),await t.fill(n),await e.locator(Jm("option",n)).filter({visible:!0}).click()}async function lP(e,t){if(t==null)return[];try{let n=No(e,t,{visibleOnly:!1});if(await n.count()===0)return[];let r=await n.first().evaluate(uP);return r>0?[r]:[]}catch{return[]}}function uP(e){return globalThis.__ripploRrwebMirror?.getId(e)??-1}function Ym(e,t,n){if(t==null)throw new Error("action requires a locator");return No(e,t,n)}function No(e,t,n){if(t.by==="inside"){let i=No(e,t.scope,n);return No(i,t.target,n)}let r=t.by==="testId"?e.getByTestId(t.value):e.locator(Jm(t.role,t.name));return n.visibleOnly?r.filter({visible:!0}):r}function Jm(e,t){return t==null?`role=${e}`:`role=${e}[name=${JSON.stringify(t)}i]`}function cP(e){let t=e instanceof Error?e.message:String(e);return/net::ERR_|ERR_HTTP_RESPONSE_CODE_FAILURE|ECONNREFUSED|ECONNRESET|socket hang up|fetch failed|page\.goto: Timeout/.test(t)}function Xm(e){return new Promise(t=>{setTimeout(t,e)})}async function Zm(e,t,n){if(n.kind==="browser")return fP(e,t,n.name,n.value);if(n.kind==="not")return!await Zm(e,t,n.inner);let r=Ym(e,n.locator,{visibleOnly:!0});return n.kind==="value"?await r.inputValue()===n.value:n.kind==="text"?(await r.textContent()??"").includes(n.value):dP(r,n.kind)}function dP(e,t){return t==="visible"?e.isVisible():t==="disabled"?e.isDisabled():t==="enabled"?e.isEnabled():t==="checked"?e.isChecked():e.evaluate(n=>n===n.ownerDocument.activeElement)}async function fP(e,t,n,r){let o=(await t.read(e))[n];return typeof o=="string"&&o.includes(r)}import pP from"path";async function lu({baseUrl:e,browser:t,capture:n,clientState:r,engine:i,fixturesDir:o,reader:s,session:a}){let l=await t.newContext({baseURL:e,reducedMotion:"reduce",storageState:a==null?void 0:{cookies:hP(a.cookies,e),origins:a.origins}});a?.headers!=null&&await l.setExtraHTTPHeaders(a.headers),await l.addInitScript(i.seedScript(r));let u=n==null?mP():await n.hub.attach(l,n.runId),c=await l.newPage();return u.onPage(c),{driver:bP(gP(au(c,s,i),o),u),emitAssertion:u.emitAssertion,close:()=>SP({context:l,handle:u})}}async function uu(e,t){let n=await eg(e);try{return await t(n)}finally{await n.close()}}function hP(e,t){let n=new URL(t).hostname;return e.map(r=>({...r,domain:n}))}function mP(){return{emitAction:()=>{},emitAssertion:()=>{},finish:()=>Promise.resolve(),onPage:()=>{}}}async function eg(e){let{chromium:t}=await import("playwright");return t.launch({headless:!e})}function tg({headed:e}){let t;return{acquire:async()=>{let i=t;if(i!=null){let o=await i.catch(()=>{});if(o?.isConnected()===!0)return o;t===i&&(t=void 0)}return t??=eg(e),t},close:async()=>{let i=t;t=void 0,i!=null&&await i.then(o=>o.close()).catch(()=>{})}}}function gP(e,t){return{evaluate:e.evaluate,locateIds:e.locateIds,observe:e.observe,perform:n=>e.perform(yP(n,t))}}function yP(e,t){return e.kind!=="upload"||e.files==null?e:{...e,files:e.files.map(n=>pP.join(t,n))}}function bP(e,t){return{evaluate:e.evaluate,locateIds:e.locateIds,observe:e.observe,perform:n=>(t.emitAction(n),e.perform(n))}}async function SP({context:e,handle:t}){await Qm(t.finish()),await Qm(e.close())}var wP=15e3;async function Qm(e){let t,n=new Promise(r=>{t=setTimeout(r,wP)});await Promise.race([e.catch(()=>{}),n]).finally(()=>{clearTimeout(t)})}import{err as xP,ok as vP,Result as cu}from"neverthrow";function du(e,t,n){return{read:()=>n.read(e.map(r=>r.name),t).andThen(r=>RP(e,r))}}function RP(e,t){return cu.combine(e.map(n=>kP(n,t.entities[n.name]??[]).map(r=>[n.name,r]))).map(n=>({entities:new Map(n),singletons:t.singletons}))}function kP(e,t){let n=vo(e);return cu.combine(t.map(r=>CP(r,e).map(i=>[i,EP(r,n)]))).map(r=>new Map(r))}function CP(e,t){return cu.combine(t.identity.map(n=>{let r=e[n];return r==null?xP(Rh(t.name,n)):vP(String(r))})).map(n=>n.join(":"))}function EP(e,t){let n=t.map(r=>[r,e[r]]).filter(r=>r[1]!=null);return Object.fromEntries(n)}var ng=Fi(Ma(),1);import AP from"crypto";import{err as IP,errAsync as fu,ok as PP,ResultAsync as zn}from"neverthrow";var TP=3e4,MP=[250,750,2e3],OP=[500,1e3,2e3,3e3];function pu({baseUrl:e,runId:t,secret:n},r){let i=new ng.Webhook(n),o=(s,a,l)=>NP({baseUrl:e,body:a,path:s,retry:l.retry,schema:l.schema,signal:l.signal,webhook:i});return{query:{read:(s,a)=>o("/state",{entities:s,runId:t,singletons:a},{retry:"transient",schema:rl,signal:r}).map(l=>({entities:l.entities,singletons:l.singletons}))},ready:()=>ig(e,r,0),setupWorld:s=>o("/setup",{entities:s,runId:t},{retry:"connection",schema:nl,signal:r}).map(a=>a.rows),teardown:()=>o("/teardown",{runId:t},{retry:"connection",schema:il,signal:void 0}).map(()=>{})}}function NP(e){return rg(e.retry,()=>DP(e),0)}function rg(e,t,n){return t().orElse(r=>{let i=MP[n];return i==null||!LP(r,e)?fu(r):zn.fromSafePromise(og(i)).andThen(()=>rg(e,t,n+1))})}function ig(e,t,n){return zn.fromPromise(fetch(e,{method:"HEAD",signal:sg(t)}),r=>Or("",r)).map(()=>{}).orElse(()=>{let r=OP[n];return r==null||t.aborted?fu(Eh(e)):zn.fromSafePromise(og(r)).andThen(()=>ig(e,t,n+1))})}var $P=new Set(["EAI_AGAIN","ECONNREFUSED","ENOTFOUND"]);function LP(e,t){return e.kind==="aborted"?!1:_P(e)?!0:t==="connection"?!1:e.kind==="engine-network"||e.kind==="engine-http"&&e.status>=500}function _P(e){return e.kind==="engine-network"&&e.code!=null&&$P.has(e.code)}function og(e){return new Promise(t=>{setTimeout(t,e)})}function DP({baseUrl:e,body:t,path:n,schema:r,signal:i,webhook:o}){let s=JSON.stringify(t);return zn.fromPromise(fetch(`${e}${n}`,{body:s,headers:{"Content-Type":"application/json",...jP(o,s)},method:"PUT",signal:sg(i)}),a=>Or(n,a)).andThen(a=>FP(a,n)).andThen(a=>BP(r,a,n)).mapErr(a=>i?.aborted===!0?Ph():a)}function jP(e,t){let n=`msg_${AP.randomUUID()}`,r=new Date;return{"webhook-id":n,"webhook-signature":e.sign(n,r,t),"webhook-timestamp":String(Math.floor(r.getTime()/1e3))}}function sg(e){let t=AbortSignal.timeout(TP);return e==null?t:AbortSignal.any([e,t])}function FP(e,t){return e.ok?zn.fromPromise(e.json(),n=>Or(t,n)):zn.fromPromise(e.text().catch(()=>""),n=>Or(t,n)).andThen(n=>fu(wh(t,e.status,n)))}function BP(e,t,n){let r=e.safeParse(t);return r.success?PP(r.data):IP(vh(n,r.error))}var oe=Fi(ug(),1),Le={actual:e=>oe.default.red(e),bad:e=>oe.default.red(oe.default.bold(e)),bold:e=>oe.default.bold(e),dim:e=>oe.default.dim(e),expected:e=>oe.default.green(e),good:e=>oe.default.green(oe.default.bold(e)),heading:e=>oe.default.bold(oe.default.cyan(e)),path:e=>oe.default.cyan(oe.default.underline(e)),warn:e=>oe.default.yellow(oe.default.bold(e))},zP={assertion:oe.default.yellow,consistency:oe.default.magenta,"data rule":oe.default.yellow,driver:oe.default.red,"impossible action":oe.default.cyan,"page rule":oe.default.yellow,skipped:oe.default.red};function lt(e){return`${oe.default.red(oe.default.bold("\u2717"))} ${zP[e](oe.default.bold(e))}`}var GP=oe.default.red("\u2717"),DH=oe.default.green("\u2713"),HP=oe.default.dim("\u203A"),qP=8;function cg(e,t,n){let r=n==null?"":` ${Le.dim(n)}`;return` ${Le.dim(e.padStart(qP))} ${t}${r}`}function Hn(e){return e.by==="testId"?`testId=${e.value}`:e.by==="inside"?`${Hn(e.scope)} \u25B8 ${Hn(e.target)}`:e.name==null?e.role:`${e.role} "${e.name}"`}function gu(e){return e.url!=null?`${e.kind} ${e.url}`:e.locator!=null?`${e.kind} ${Hn(e.locator)}`:e.kind}function qn(e){return e.kind==="not"?`not ${qn(e.inner)}`:e.kind==="browser"?`${e.name}="${e.value}"`:e.kind==="value"||e.kind==="text"?`${e.kind} ${Hn(e.locator)}="${e.value}"`:`${e.kind} ${Hn(e.locator)}`}function qr(e){let{field:t,source:n,target:r,targetField:i}=e.reference;return`${n}.${t} \u2192 ${r}.${i}`}function fg(e){return`${e.intent} \u203A ${gu(e.action)}`}function pg(e){return e.kind==="data-rule"?`data rule ${qr(e.dataRule)}`:`${e.kind} ${qn(e.check)}`}function _e(e){return e==null?"\u2205":JSON.stringify(e)}function hg(e){return e.kind==="unexpected-row"?`${e.entity} "${e.key}" present in the app but the test expected none`:e.kind==="missing-row"?`${e.entity} "${e.key}" expected by the test but missing in the app`:e.kind==="wrong-value"?`${e.entity}.${e.field} [${e.key}] expected=${_e(e.snapshot)} actual=${_e(e.sut)}`:e.kind==="expected-change"?`${e.entity}.${e.field} [${e.key}] expected to change but stayed ${_e(e.value)}`:`${e.singleton} expected=${_e(e.snapshot)} actual=${_e(e.sut)}`}function yu(e){return{label:pg(e.source),step:fg(e.step)}}function bu({evidencePath:e,finding:t}){let n=KP(t);return e==null?n:`${n} Evidence: ${Le.path(e)}`}function mg(e){return JP(XP(e))}function KP(e){return e.kind==="consistency"?sT(e):e.kind==="pending-check"?uT(e.source,e.step,e.budget):e.kind==="impossible-action"?`${lt("impossible action")} The step "${e.step.intent}" ran ${gu(e.step.action)} from a state the test says can't happen. Either the test's required state is stricter than the app really is, or the app exposes this action somewhere it shouldn't \u2014 check which before loosening the test.`:e.kind==="unrunnable"?`${lt("skipped")} The planned step "${e.intent}" could not run \u2014 ${gg(e.reason)}. A planned move was skipped, so this run proved less than it claims \u2014 fix the plan or the starting state rather than ignoring the skip.`:`${lt("driver")} The browser failed while running "${e.step.intent}" \u2014 ${Pt(e.error)}. This is an environment failure (daemon, dev server, ports), not an app or test bug \u2014 fix the run environment and rerun.`}var YP=new RegExp(`${String.fromCodePoint(27)}\\[[0-9;]*m`,"g");function JP(e){return e.replaceAll(YP,"").replaceAll(/\s+/g," ").trim()}function XP(e){if(e.kind==="consistency"){let t=e.step==null?"":` after "${e.step.intent}"`;return`${hg(e.mismatch)}${t}`}return e.kind==="pending-check"?`${dT(e.source)} failed at "${e.step.intent}": ${fT(e.source)}`:e.kind==="impossible-action"?`"${e.step.intent}" ran from a state the test says can't happen`:e.kind==="unrunnable"?`planned step "${e.intent}" could not run \u2014 ${gg(e.reason)}`:`driver failed at "${e.step.intent}": ${Pt(e.error)}`}var ZP={"no-effect":"the action has no observable effect from this state","required-state-unsatisfied":"the live state doesn't satisfy the step's required state",unresolvable:"a step references a value that doesn't exist yet (e.g. a not-yet-created id)"};function gg(e){return ZP[e]}function QP({debugDir:e,runId:t}){let n=`${e}/${t}`;return cg("behavior",Le.path(`${n}/behavior.jsonl`),void 0)}function eT(e){if(e.kind==="cascade-gap"){let{gap:n}=e;return`${lt("data rule")} ${n.transition} deletes ${n.target} but leaves ${n.source} rows pointing at the deleted row. That breaks the data rule ${qr(n.dataRule)} \u2014 cascade the delete in the app or declare the cleanup on the deleting step.`}if(e.kind==="create-gap"){let{gap:n}=e,r=n.missing.length===1?"field":"fields",i=n.missing.length===1?"it":"them";return`${lt("data rule")} ${n.transition} creates ${n.entity} without setting the required ${r} ${n.missing.join(", ")}. Set ${i} on the creating step or drop the requirement from the entity.`}let{conflict:t}=e;return`${lt("page rule")} Two page rules contradict each other \u2014 ${t.a.kind} vs ${t.b.kind} when ${JSON.stringify(t.when.singletons)}. They were learned from different tests asserting opposite things about the same page \u2014 one of those tests is wrong, fix it before trusting either rule.`}function tT(e){return"locator"in e&&e.locator!=null?`${e.kind} ${mu(e.locator)}`:"url"in e?`${e.kind} ${nT(e.url)}`:e.kind}function nT(e){return typeof e=="string"?e:"ref"in e?`{${e.ref}}`:yg(e)}function mu(e){return e.by==="role"?e.name==null?e.role:`${e.role} ${dg(e.name)}`:e.by==="inside"?`${mu(e.scope)} \u25B8 ${mu(e.target)}`:dg(e.value)}function dg(e){return e===null?"\u2205":typeof e=="string"?`"${e}"`:typeof e!="object"?String(e):"ref"in e?`{${e.ref}}`:yg(e)}function yg(e){return e.template.map(t=>typeof t=="string"?t:":id").join("")}function _o(e){return e==null?"At the end of the run":`After ${iT(e.action)} in ${e.intent}`}var rT={click:"clicking",fill:"filling",goto:"opening",hover:"hovering over",press:"pressing",select:"selecting",upload:"uploading to"};function iT(e){return e.url!=null?`opening ${e.url}`:e.locator!=null?`${rT[e.kind]??e.kind} ${Gn(e.locator)}`:e.kind}function Gn(e){return e.by==="testId"?`the element with testId "${e.value}"`:e.by==="inside"?`${Gn(e.target)} inside ${Gn(e.scope)}`:e.name==null?`the ${e.role}`:`the "${e.name}" ${e.role}`}function oT(e){return e.kind==="not"&&e.inner.kind==="visible"?`${Gn(e.inner.locator)} never disappeared`:e.kind==="visible"?`${Gn(e.locator)} never appeared`:e.kind==="value"||e.kind==="text"?`${Gn(e.locator)} never showed "${e.value}"`:`the check ${qn(e)} never held`}function sT(e){let t=e.pending?aT(e):lT(e.mismatch,e.step);return`${lt("consistency")} ${t}`}function aT(e){let t=`${bg(e.budget)} wait window`,n="If this write is legitimately slow, declare wait: on the expectation or move it to a slower tier.",{mismatch:r}=e,i=_o(e.step);return r.kind==="wrong-value"?`${i}, ${r.entity}.${r.field} on row "${r.key}" never changed within the ${t} \u2014 it still showed ${Le.actual(_e(r.sut))} instead of ${Le.expected(_e(r.snapshot))}, so the write may not have landed at all. ${n}`:r.kind==="unexpected-row"?`${i}, the ${r.entity} row "${r.key}" was still there at the end of the ${t} \u2014 the delete may not have landed. ${n}`:r.kind==="missing-row"?`${i}, the ${r.entity} row "${r.key}" never appeared within the ${t} \u2014 the create may not have landed. ${n}`:r.kind==="expected-change"?`${i}, ${r.entity}.${r.field} on row "${r.key}" was expected to change but stayed ${Le.actual(_e(r.value))} through the ${t}, so the write may not have landed at all. ${n}`:`${i}, ${r.singleton} never changed within the ${t} \u2014 it still showed ${Le.actual(_e(r.sut))} instead of ${Le.expected(_e(r.snapshot))}, so the write may not have landed at all. ${n}`}function bg(e){return`${String(Dr[e]/1e3)}s`}function lT(e,t){let n=_o(t);return e.kind==="wrong-value"?`${n}, ${e.entity}.${e.field} on row "${e.key}" showed ${Le.actual(_e(e.sut))} but the test expected ${Le.expected(_e(e.snapshot))}. This is an app bug if the expected value is the promised behavior \u2014 if the app legitimately owns this value, assert changed() instead.`:e.kind==="singleton-mismatch"?`${n}, ${e.singleton} showed ${Le.actual(_e(e.sut))} but the test expected ${Le.expected(_e(e.snapshot))}. This is an app bug if the expected value is the promised behavior \u2014 otherwise correct the expected value at the step that sets it.`:e.kind==="unexpected-row"?`${n}, the app held a ${e.entity} row "${e.key}" the test never expected. Some step writes this row without declaring it \u2014 declare the effect on the acting step (${e.entity}.created, updated, or deleted), or if this write belongs to a different flow, cover it in that flow's test.`:e.kind==="missing-row"?`${n}, the test expected a ${e.entity} row "${e.key}" but the app had none. This is an app bug if the write was promised \u2014 if it only happens from a different starting state, restrict this test's given and cover that state in its own test.`:`${n}, ${e.entity}.${e.field} on row "${e.key}" was expected to change but stayed ${Le.actual(_e(e.value))}. This is an app bug if this action should change it \u2014 if the change needs other preconditions, split that case into its own test with the right given.`}function uT(e,t,n){let r=`${bg(n)} wait window`;return e.kind==="data-rule"?`${lt("data rule")} ${_o(t)}, the data rule ${qr(e.dataRule)} stopped holding \u2014 a referenced row went missing. This is an app bug if the reference should survive this action \u2014 confirm in behavior.jsonl before relaxing the rule.`:e.kind==="page-rule"?`${lt("page rule")} A page rule learned from ${cT(e.origin)} says ${qn(e.check)} at this URL \u2014 it never held here within the ${r}. Either the rule is broader than the app guarantees or this page regressed \u2014 confirm in behavior.jsonl before narrowing the rule.`:`${lt("assertion")} ${_o(t)}, ${oT(e.check)} within the ${r}. This is usually a wrong accessible name, a UI regression, or a starting state this page doesn't have \u2014 confirm in behavior.jsonl before changing the test.`}function cT(e){return e==null?"another workflow":e.kind==="test"?`an assertion in test "${e.test}"`:e.kind==="trigger"?`the trigger of "${e.intent}" in test "${e.test}"`:`tests ${e.tests.map(n=>JSON.stringify(n)).join(", ")}`}function dT(e){return e.kind==="data-rule"?"data rule":e.kind==="page-rule"?"page rule":"assertion"}function fT(e){return e.kind==="data-rule"?qr(e.dataRule):qn(e.check)}import{err as E5,ok as A5,ResultAsync as I5}from"neverthrow";import vS from"path";import{z as ft}from"zod";import{existsSync as pT}from"fs";import{createRequire as hT}from"module";import{fileURLToPath as mT}from"url";import{Worker as gT}from"worker_threads";var yT=hT(import.meta.url);function Sg(e){let t=new gT(bT(),{workerData:e});t.unref();let n=new Map,r={next:0};t.on("message",o=>{let s=n.get(o.seq);s!=null&&(n.delete(o.seq),s())});let i=o=>{t.postMessage(o)};return{close:({noticeLineIfNoRrweb:o,runId:s})=>{let a=r.next;return r.next+=1,new Promise(l=>{n.set(a,l),i({noticeLineIfNoRrweb:o,runId:s,seq:a,t:"close"})})},line:({line:o,runId:s,timeNanos:a})=>{i({line:o,runId:s,t:"line",timeNanos:a})},open:({file:o,runId:s})=>{i({file:o,runId:s,t:"open"})},rrwebBatch:({data:o,runId:s})=>{i({data:o,runId:s,t:"rrweb-batch"})},terminate:async()=>{await t.terminate()}}}function bT(){try{return yT.resolve("@ripplo/runtime/capture-worker")}catch{let e=["../../dist/capture-worker.js","./capture-worker.js"].map(n=>mT(new URL(n,import.meta.url))),t=e.find(n=>pT(n));if(t==null)throw new Error(`capture-worker.js not found; looked at: ${e.join(", ")}`);return t}}import{readFile as ST}from"fs/promises";import{createRequire as wT}from"module";import{fileURLToPath as xT}from"url";var vT=wT(import.meta.url);function Su(e,t){try{return vT.resolve(e)}catch{return xT(new URL(`assets/${t}`,import.meta.url))}}var RT=Su("@ripplo/browser-trace/bundle","browser-trace.js");async function xg(e,t){await e.addInitScript(`globalThis.__ripploRunId = ${JSON.stringify(t)};`),await e.addInitScript(await kT())}var wg;function kT(){return wg??=ST(RT,{encoding:"utf8"}),wg}import{readFile as qN}from"fs/promises";var CT=Object.defineProperty,ET=(e,t,n)=>t in e?CT(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,C=(e,t,n)=>ET(e,typeof t!="symbol"?t+"":t,n),vg,AT=Object.defineProperty,IT=(e,t,n)=>t in e?AT(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Rg=(e,t,n)=>IT(e,typeof t!="symbol"?t+"":t,n),Ie=(e=>(e[e.Document=0]="Document",e[e.DocumentType=1]="DocumentType",e[e.Element=2]="Element",e[e.Text=3]="Text",e[e.CDATA=4]="CDATA",e[e.Comment=5]="Comment",e))(Ie||{}),kg={Node:["childNodes","parentNode","parentElement","textContent","ownerDocument"],ShadowRoot:["host","styleSheets"],Element:["shadowRoot","querySelector","querySelectorAll"],MutationObserver:[]},Cg={Node:["contains","getRootNode"],ShadowRoot:["getSelection"],Element:[],MutationObserver:["constructor"]},Do={},PT=()=>!!globalThis.Zone;function Rc(e){if(Do[e])return Do[e];let t=globalThis[e],n=t.prototype,r=e in kg?kg[e]:void 0,i=!!(r&&r.every(a=>{var l,u;return!!((u=(l=Object.getOwnPropertyDescriptor(n,a))==null?void 0:l.get)!=null&&u.toString().includes("[native code]"))})),o=e in Cg?Cg[e]:void 0,s=!!(o&&o.every(a=>{var l;return typeof n[a]=="function"&&((l=n[a])==null?void 0:l.toString().includes("[native code]"))}));if(i&&s&&!PT())return Do[e]=t.prototype,t.prototype;try{let a=document.createElement("iframe");document.body.appendChild(a);let l=a.contentWindow;if(!l)return t.prototype;let u=l[e].prototype;return document.body.removeChild(a),u?Do[e]=u:n}catch{return n}}var wu={};function Lt(e,t,n){var r;let i=`${e}.${String(n)}`;if(wu[i])return wu[i].call(t);let o=Rc(e),s=(r=Object.getOwnPropertyDescriptor(o,n))==null?void 0:r.get;return s?(wu[i]=s,s.call(t)):t[n]}var xu={};function vy(e,t,n){let r=`${e}.${String(n)}`;if(xu[r])return xu[r].bind(t);let o=Rc(e)[n];return typeof o!="function"?t[n]:(xu[r]=o,o.bind(t))}function TT(e){return Lt("Node",e,"ownerDocument")}function MT(e){return Lt("Node",e,"childNodes")}function OT(e){return Lt("Node",e,"parentNode")}function NT(e){return Lt("Node",e,"parentElement")}function $T(e){return Lt("Node",e,"textContent")}function LT(e,t){return vy("Node",e,"contains")(t)}function _T(e){return vy("Node",e,"getRootNode")()}function DT(e){return!e||!("host"in e)?null:Lt("ShadowRoot",e,"host")}function jT(e){return e.styleSheets}function FT(e){return!e||!("shadowRoot"in e)?null:Lt("Element",e,"shadowRoot")}function BT(e,t){return Lt("Element",e,"querySelector")(t)}function VT(e,t){return Lt("Element",e,"querySelectorAll")(t)}function UT(){return Rc("MutationObserver").constructor}function WT(e,t,n){try{if(!(t in e))return()=>{};let r=e[t],i=n(r);return typeof i=="function"&&(i.prototype=i.prototype||{},Object.defineProperties(i,{__rrweb_original__:{enumerable:!1,value:r}})),e[t]=i,()=>{e[t]=r}}catch{return()=>{}}}var De={ownerDocument:TT,childNodes:MT,parentNode:OT,parentElement:NT,textContent:$T,contains:LT,getRootNode:_T,host:DT,styleSheets:jT,shadowRoot:FT,querySelector:BT,querySelectorAll:VT,mutationObserver:UT,patch:WT};function Ry(e){return e.nodeType===e.ELEMENT_NODE}function Qr(e){let t=e&&"host"in e&&"mode"in e&&De.host(e)||null;return!!(t&&"shadowRoot"in t&&De.shadowRoot(t)===e)}function ei(e){return Object.prototype.toString.call(e)==="[object ShadowRoot]"}function zT(e){return e.includes(" background-clip: text;")&&!e.includes(" -webkit-background-clip: text;")&&(e=e.replace(/\sbackground-clip:\s*text;/g," -webkit-background-clip: text; background-clip: text;")),e}function GT(e){let{cssText:t}=e;if(t.split('"').length<3)return t;let n=["@import",`url(${JSON.stringify(e.href)})`];return e.layerName===""?n.push("layer"):e.layerName&&n.push(`layer(${e.layerName})`),e.supportsText&&n.push(`supports(${e.supportsText})`),e.media.length&&n.push(e.media.mediaText),n.join(" ")+";"}function $u(e){try{let t=e.rules||e.cssRules;if(!t)return null;let n=e.href;!n&&e.ownerNode&&(n=e.ownerNode.baseURI);let r=Array.from(t,i=>ky(i,n)).join("");return zT(r)}catch{return null}}function ky(e,t){if(qT(e)){let n;try{n=$u(e.styleSheet)||GT(e)}catch{n=e.cssText}return e.styleSheet.href?ms(n,e.styleSheet.href):n}else{let n=e.cssText;return KT(e)&&e.selectorText.includes(":")&&(n=HT(n)),t?ms(n,t):n}}function HT(e){let t=/(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;return e.replace(t,"$1\\$2")}function qT(e){return"styleSheet"in e}function KT(e){return"selectorText"in e}var fs=class{constructor(){Rg(this,"idNodeMap",new Map),Rg(this,"nodeMetaMap",new WeakMap)}getId(t){var n;return t?((n=this.getMeta(t))==null?void 0:n.id)??-1:-1}getNode(t){return this.idNodeMap.get(t)||null}getIds(){return Array.from(this.idNodeMap.keys())}getMeta(t){return this.nodeMetaMap.get(t)||null}removeNodeFromMap(t){let n=this.getId(t);this.idNodeMap.delete(n),t.childNodes&&t.childNodes.forEach(r=>this.removeNodeFromMap(r))}has(t){return this.idNodeMap.has(t)}hasNode(t){return this.nodeMetaMap.has(t)}add(t,n){let r=n.id;this.idNodeMap.set(r,t),this.nodeMetaMap.set(t,n)}replace(t,n){let r=this.getNode(t);if(r){let i=this.nodeMetaMap.get(r);i&&this.nodeMetaMap.set(n,i)}this.idNodeMap.set(t,n)}reset(){this.idNodeMap=new Map,this.nodeMetaMap=new WeakMap}};function YT(){return new fs}function ps({element:e,maskInputOptions:t,tagName:n,type:r,value:i,maskInputFn:o}){let s=i||"",a=r&&Sn(r);return(t[n.toLowerCase()]||a&&t[a])&&(o?s=o(s,e):s="*".repeat(s.length)),s}function Sn(e){return e.toLowerCase()}var Eg="__rrweb_original__";function JT(e){let t=e.getContext("2d");if(!t)return!0;let n=50;for(let r=0;r<e.width;r+=n)for(let i=0;i<e.height;i+=n){let o=t.getImageData,s=Eg in o?o[Eg]:o;if(new Uint32Array(s.call(t,r,i,Math.min(n,e.width-r),Math.min(n,e.height-i)).data.buffer).some(l=>l!==0))return!1}return!0}function hs(e){let t=e.type;return e.hasAttribute("data-rr-is-password")?"password":t?Sn(t):null}function Cy(e,t){let n;try{n=new URL(e,t??window.location.href)}catch{return null}let r=/\.([0-9a-z]+)(?:$)/i,i=n.pathname.match(r);return i?.[1]??null}function XT(e){let t="";return e.indexOf("//")>-1?t=e.split("/").slice(0,3).join("/"):t=e.split("/")[0],t=t.split("?")[0],t}var ZT=/url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm,QT=/^(?:[a-z+]+:)?\/\//i,eM=/^www\..*/i,tM=/^(data:)([^,]*),(.*)/i;function ms(e,t){return(e||"").replace(ZT,(n,r,i,o,s,a)=>{let l=i||s||a,u=r||o||"";if(!l)return n;if(QT.test(l)||eM.test(l))return`url(${u}${l}${u})`;if(tM.test(l))return`url(${u}${l}${u})`;if(l[0]==="/")return`url(${u}${XT(t)+l}${u})`;let c=t.split("/"),d=l.split("/");c.pop();for(let f of d)f!=="."&&(f===".."?c.pop():c.push(f));return`url(${u}${c.join("/")}${u})`})}function jo(e,t=!1){return t?e.replace(/(\/\*[^*]*\*\/)|[\s;]/g,""):e.replace(/(\/\*[^*]*\*\/)|[\s;]/g,"").replace(/0px/g,"0")}function nM(e,t,n=!1){let r=Array.from(t.childNodes),i=[],o=0;if(r.length>1&&e&&typeof e=="string"){let s=jo(e,n),a=s.length/e.length;for(let l=1;l<r.length;l++)if(r[l].textContent&&typeof r[l].textContent=="string"){let u=jo(r[l].textContent,n),c=100,d=3;for(;d<u.length&&(u[d].match(/[a-zA-Z0-9]/)||u.indexOf(u.substring(0,d),1)!==-1);d++);for(;d<u.length;d++){let f=u.substring(0,d),h=s.split(f),p=-1;if(h.length===2)p=h[0].length;else if(h.length>2&&h[0]===""&&r[l-1].textContent!=="")p=s.indexOf(f,1);else if(h.length===1){if(f=f.substring(0,f.length-1),h=s.split(f),h.length<=1)return i.push(e),i;d=c+1}else d===u.length-1&&(p=s.indexOf(f));if(h.length>=2&&d>c){let m=r[l-1].textContent;if(m&&typeof m=="string"){let g=jo(m).length;p=s.indexOf(f,g)}p===-1&&(p=h[0].length)}if(p!==-1){let m=Math.floor(p/a);for(;m>0&&m<e.length;){if(o+=1,o>50*r.length)return i.push(e),i;let g=jo(e.substring(0,m),n);if(g.length===p){i.push(e.substring(0,m)),e=e.substring(m),s=s.substring(p);break}else g.length<p?m+=Math.max(1,Math.floor((p-g.length)/a)):m-=Math.max(1,Math.floor((g.length-p)*a))}break}}}}return i.push(e),i}function rM(e,t){return nM(e,t).join("/* rr_split */")}var iM=1,oM=new RegExp("[^a-z0-9-_:]"),ni=-2;function Ey(){return iM++}function sM(e){if(e instanceof HTMLFormElement)return"form";let t=Sn(e.tagName);return oM.test(t)?"div":t}var Kn,Ag,aM=/^[^ \t\n\r\u000c]+/,lM=/^[, \t\n\r\u000c]+/;function uM(e,t){if(t.trim()==="")return t;let n=0;function r(o){let s,a=o.exec(t.substring(n));return a?(s=a[0],n+=s.length,s):""}let i=[];for(;r(lM),!(n>=t.length);){let o=r(aM);if(o.slice(-1)===",")o=Xn(e,o.substring(0,o.length-1)),i.push(o);else{let s="";o=Xn(e,o);let a=!1;for(;;){let l=t.charAt(n);if(l===""){i.push((o+s).trim());break}else if(a)l===")"&&(a=!1);else if(l===","){n+=1,i.push((o+s).trim());break}else l==="("&&(a=!0);s+=l,n+=1}}}return i.join(", ")}var Ig=new WeakMap;function Xn(e,t){return!t||t.trim()===""?t:kc(e,t)}function cM(e){return!!(e.tagName==="svg"||e.ownerSVGElement)}function kc(e,t){let n=Ig.get(e);if(n||(n=e.createElement("a"),Ig.set(e,n)),!t)t="";else if(t.startsWith("blob:")||t.startsWith("data:"))return t;return n.setAttribute("href",t),n.href}function Ay(e,t,n,r){return r&&(n==="src"||n==="href"&&!(t==="use"&&r[0]==="#")||n==="xlink:href"&&r[0]!=="#"||n==="background"&&["table","td","th"].includes(t)?Xn(e,r):n==="srcset"?uM(e,r):n==="style"?ms(r,kc(e)):t==="object"&&n==="data"?Xn(e,r):r)}function Iy(e,t,n){return["video","audio"].includes(e)&&t==="autoplay"}function dM(e,t,n){try{if(typeof t=="string"){if(e.classList.contains(t))return!0}else for(let r=e.classList.length;r--;){let i=e.classList[r];if(t.test(i))return!0}if(n)return e.matches(n)}catch{}return!1}function gs(e,t,n){if(!e)return!1;if(e.nodeType!==e.ELEMENT_NODE)return n?gs(De.parentNode(e),t,n):!1;for(let r=e.classList.length;r--;){let i=e.classList[r];if(t.test(i))return!0}return n?gs(De.parentNode(e),t,n):!1}function Py(e,t,n,r){let i;if(Ry(e)){if(i=e,!De.childNodes(i).length)return!1}else{if(De.parentElement(e)===null)return!1;i=De.parentElement(e)}try{if(typeof t=="string"){if(r){if(i.closest(`.${t}`))return!0}else if(i.classList.contains(t))return!0}else if(gs(i,t,r))return!0;if(n){if(r){if(i.closest(n))return!0}else if(i.matches(n))return!0}}catch{}return!1}function fM(e,t,n){let r=e.contentWindow;if(!r)return;let i=!1,o;try{o=r.document.readyState}catch{return}if(o!=="complete"){let a=setTimeout(()=>{i||(t(),i=!0)},n);e.addEventListener("load",()=>{clearTimeout(a),i=!0,t()});return}let s="about:blank";if(r.location.href!==s||e.src===s||e.src==="")return setTimeout(t,0),e.addEventListener("load",t);e.addEventListener("load",t)}function pM(e,t,n){let r=!1,i;try{i=e.sheet}catch{return}if(i)return;let o=setTimeout(()=>{r||(t(),r=!0)},n);e.addEventListener("load",()=>{clearTimeout(o),r=!0,t()})}function hM(e,t){let{doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:s,inlineStylesheet:a,maskInputOptions:l={},maskTextFn:u,maskInputFn:c,dataURLOptions:d={},inlineImages:f,recordCanvas:h,keepIframeSrcFn:p,newlyAddedElement:m=!1,cssCaptured:g=!1}=t,S=mM(n,r);switch(e.nodeType){case e.DOCUMENT_NODE:return e.compatMode!=="CSS1Compat"?{type:Ie.Document,childNodes:[],compatMode:e.compatMode}:{type:Ie.Document,childNodes:[]};case e.DOCUMENT_TYPE_NODE:return{type:Ie.DocumentType,name:e.name,publicId:e.publicId,systemId:e.systemId,rootId:S};case e.ELEMENT_NODE:return yM(e,{doc:n,blockClass:i,blockSelector:o,inlineStylesheet:a,maskInputOptions:l,maskInputFn:c,dataURLOptions:d,inlineImages:f,recordCanvas:h,keepIframeSrcFn:p,newlyAddedElement:m,rootId:S});case e.TEXT_NODE:return gM(e,{doc:n,needsMask:s,maskTextFn:u,rootId:S,cssCaptured:g});case e.CDATA_SECTION_NODE:return{type:Ie.CDATA,textContent:"",rootId:S};case e.COMMENT_NODE:return{type:Ie.Comment,textContent:De.textContent(e)||"",rootId:S};default:return!1}}function mM(e,t){if(!t.hasNode(e))return;let n=t.getId(e);return n===1?void 0:n}function gM(e,t){let{needsMask:n,maskTextFn:r,rootId:i,cssCaptured:o}=t,s=De.parentNode(e),a=s&&s.tagName,l="",u=a==="STYLE"?!0:void 0,c=a==="SCRIPT"?!0:void 0;return c?l="SCRIPT_PLACEHOLDER":o||(l=De.textContent(e),u&&l&&(l=ms(l,kc(t.doc)))),!u&&!c&&l&&n&&(l=r?r(l,De.parentElement(e)):l.replace(/[\S]/g,"*")),{type:Ie.Text,textContent:l||"",rootId:i}}function yM(e,t){let{doc:n,blockClass:r,blockSelector:i,inlineStylesheet:o,maskInputOptions:s={},maskInputFn:a,dataURLOptions:l={},inlineImages:u,recordCanvas:c,keepIframeSrcFn:d,newlyAddedElement:f=!1,rootId:h}=t,p=dM(e,r,i),m=sM(e),g={},S=e.attributes.length;for(let y=0;y<S;y++){let v=e.attributes[y];Iy(m,v.name,v.value)||(g[v.name]=Ay(n,m,Sn(v.name),v.value))}if(m==="link"&&o){let y=Array.from(n.styleSheets).find(A=>A.href===e.href),v=null;y&&(v=$u(y)),v&&(delete g.rel,delete g.href,g._cssText=v)}if(m==="style"&&e.sheet){let y=$u(e.sheet);y&&(e.childNodes.length>1&&(y=rM(y,e)),g._cssText=y)}if(["input","textarea","select"].includes(m)){let y=e.value,v=e.checked;g.type!=="radio"&&g.type!=="checkbox"&&g.type!=="submit"&&g.type!=="button"&&y?g.value=ps({element:e,type:hs(e),tagName:m,value:y,maskInputOptions:s,maskInputFn:a}):v&&(g.checked=v)}if(m==="option"&&(e.selected&&!s.select?g.selected=!0:delete g.selected),m==="dialog"&&e.open&&(g.rr_open_mode=e.matches("dialog:modal")?"modal":"non-modal"),m==="canvas"&&c){if(e.__context==="2d")JT(e)||(g.rr_dataURL=e.toDataURL(l.type,l.quality));else if(!("__context"in e)){let y=e.toDataURL(l.type,l.quality),v=n.createElement("canvas");v.width=e.width,v.height=e.height;let A=v.toDataURL(l.type,l.quality);y!==A&&(g.rr_dataURL=y)}}if(m==="img"&&u){Kn||(Kn=n.createElement("canvas"),Ag=Kn.getContext("2d"));let y=e,v=y.currentSrc||y.getAttribute("src")||"<unknown-src>",A=y.crossOrigin,N=()=>{y.removeEventListener("load",N);try{Kn.width=y.naturalWidth,Kn.height=y.naturalHeight,Ag.drawImage(y,0,0),g.rr_dataURL=Kn.toDataURL(l.type,l.quality)}catch(T){if(y.crossOrigin!=="anonymous"){y.crossOrigin="anonymous",y.complete&&y.naturalWidth!==0?N():y.addEventListener("load",N);return}else console.warn(`Cannot inline img src=${v}! Error: ${T}`)}y.crossOrigin==="anonymous"&&(A?g.crossOrigin=A:y.removeAttribute("crossorigin"))};y.complete&&y.naturalWidth!==0?N():y.addEventListener("load",N)}if(["audio","video"].includes(m)){let y=g;y.rr_mediaState=e.paused?"paused":"played",y.rr_mediaCurrentTime=e.currentTime,y.rr_mediaPlaybackRate=e.playbackRate,y.rr_mediaMuted=e.muted,y.rr_mediaLoop=e.loop,y.rr_mediaVolume=e.volume}if(f||(e.scrollLeft&&(g.rr_scrollLeft=e.scrollLeft),e.scrollTop&&(g.rr_scrollTop=e.scrollTop)),p){let{width:y,height:v}=e.getBoundingClientRect();g={class:g.class,rr_width:`${y}px`,rr_height:`${v}px`}}m==="iframe"&&!d(g.src)&&(e.contentDocument||(g.rr_src=g.src),delete g.src);let w;try{customElements.get(m)&&(w=!0)}catch{}return{type:Ie.Element,tagName:m,attributes:g,childNodes:[],isSVG:cM(e)||void 0,needBlock:p,rootId:h,isCustom:w}}function ae(e){return e==null?"":e.toLowerCase()}function Ty(e){return e===!0||e==="all"?{script:!0,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaVerification:!0,headMetaAuthorship:e==="all",headMetaDescKeywords:e==="all",headTitleMutations:e==="all"}:e||{}}function bM(e,t){if(t.comment&&e.type===Ie.Comment)return!0;if(e.type===Ie.Element){if(t.script&&(e.tagName==="script"||e.tagName==="link"&&(e.attributes.rel==="preload"&&e.attributes.as==="script"||e.attributes.rel==="modulepreload")||e.tagName==="link"&&e.attributes.rel==="prefetch"&&typeof e.attributes.href=="string"&&Cy(e.attributes.href)==="js"))return!0;if(t.headFavicon&&(e.tagName==="link"&&e.attributes.rel==="shortcut icon"||e.tagName==="meta"&&(ae(e.attributes.name).match(/^msapplication-tile(image|color)$/)||ae(e.attributes.name)==="application-name"||ae(e.attributes.rel)==="icon"||ae(e.attributes.rel)==="apple-touch-icon"||ae(e.attributes.rel)==="shortcut icon")))return!0;if(e.tagName==="meta"){if(t.headMetaDescKeywords&&ae(e.attributes.name).match(/^description|keywords$/))return!0;if(t.headMetaSocial&&(ae(e.attributes.property).match(/^(og|twitter|fb):/)||ae(e.attributes.name).match(/^(og|twitter):/)||ae(e.attributes.name)==="pinterest"))return!0;if(t.headMetaRobots&&(ae(e.attributes.name)==="robots"||ae(e.attributes.name)==="googlebot"||ae(e.attributes.name)==="bingbot"))return!0;if(t.headMetaHttpEquiv&&e.attributes["http-equiv"]!==void 0)return!0;if(t.headMetaAuthorship&&(ae(e.attributes.name)==="author"||ae(e.attributes.name)==="generator"||ae(e.attributes.name)==="framework"||ae(e.attributes.name)==="publisher"||ae(e.attributes.name)==="progid"||ae(e.attributes.property).match(/^article:/)||ae(e.attributes.property).match(/^product:/)))return!0;if(t.headMetaVerification&&(ae(e.attributes.name)==="google-site-verification"||ae(e.attributes.name)==="yandex-verification"||ae(e.attributes.name)==="csrf-token"||ae(e.attributes.name)==="p:domain_verify"||ae(e.attributes.name)==="verify-v1"||ae(e.attributes.name)==="verification"||ae(e.attributes.name)==="shopify-checkout-api-token"))return!0}}return!1}function Zn(e,t){let{doc:n,mirror:r,blockClass:i,blockSelector:o,maskTextClass:s,maskTextSelector:a,skipChild:l=!1,inlineStylesheet:u=!0,maskInputOptions:c={},maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p={},inlineImages:m=!1,recordCanvas:g=!1,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y=5e3,onStylesheetLoad:v,stylesheetLoadTimeout:A=5e3,keepIframeSrcFn:N=()=>!1,newlyAddedElement:T=!1,cssCaptured:M=!1}=t,{needsMask:I}=t,{preserveWhiteSpace:B=!0}=t;I||(I=Py(e,s,a,I===void 0));let J=hM(e,{doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:I,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,dataURLOptions:p,inlineImages:m,recordCanvas:g,keepIframeSrcFn:N,newlyAddedElement:T,cssCaptured:M});if(!J)return console.warn(e,"not serialized"),null;let X;r.hasNode(e)?X=r.getId(e):bM(J,h)||!B&&J.type===Ie.Text&&!J.textContent.replace(/^\s+|\s+$/gm,"").length?X=ni:X=Ey();let j=Object.assign(J,{id:X});if(r.add(e,j),X===ni)return null;S&&S(e);let $e=!l;if(j.type===Ie.Element){$e=$e&&!j.needBlock,delete j.needBlock;let Ae=De.shadowRoot(e);Ae&&ei(Ae)&&(j.isShadowHost=!0)}if((j.type===Ie.Document||j.type===Ie.Element)&&$e){h.headWhitespace&&j.type===Ie.Element&&j.tagName==="head"&&(B=!1);let Ae={doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:I,maskTextClass:s,maskTextSelector:a,skipChild:l,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p,inlineImages:m,recordCanvas:g,preserveWhiteSpace:B,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y,onStylesheetLoad:v,stylesheetLoadTimeout:A,keepIframeSrcFn:N,cssCaptured:!1};if(!(j.type===Ie.Element&&j.tagName==="textarea"&&j.attributes.value!==void 0)){j.type===Ie.Element&&j.attributes._cssText!==void 0&&typeof j.attributes._cssText=="string"&&(Ae.cssCaptured=!0);for(let sn of Array.from(De.childNodes(e))){let yt=Zn(sn,Ae);yt&&j.childNodes.push(yt)}}let Qe=null;if(Ry(e)&&(Qe=De.shadowRoot(e)))for(let sn of Array.from(De.childNodes(Qe))){let yt=Zn(sn,Ae);yt&&(ei(Qe)&&(yt.isShadow=!0),j.childNodes.push(yt))}}let gt=De.parentNode(e);return gt&&Qr(gt)&&ei(gt)&&(j.isShadow=!0),j.type===Ie.Element&&j.tagName==="iframe"&&fM(e,()=>{let Ae=e.contentDocument;if(Ae&&w){let Qe=Zn(Ae,{doc:Ae,mirror:r,blockClass:i,blockSelector:o,needsMask:I,maskTextClass:s,maskTextSelector:a,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p,inlineImages:m,recordCanvas:g,preserveWhiteSpace:B,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y,onStylesheetLoad:v,stylesheetLoadTimeout:A,keepIframeSrcFn:N});Qe&&w(e,Qe)}},y),j.type===Ie.Element&&j.tagName==="link"&&typeof j.attributes.rel=="string"&&(j.attributes.rel==="stylesheet"||j.attributes.rel==="preload"&&typeof j.attributes.href=="string"&&Cy(j.attributes.href)==="css")&&pM(e,()=>{if(v){let Ae=Zn(e,{doc:n,mirror:r,blockClass:i,blockSelector:o,needsMask:I,maskTextClass:s,maskTextSelector:a,skipChild:!1,inlineStylesheet:u,maskInputOptions:c,maskTextFn:d,maskInputFn:f,slimDOMOptions:h,dataURLOptions:p,inlineImages:m,recordCanvas:g,preserveWhiteSpace:B,onSerialize:S,onIframeLoad:w,iframeLoadTimeout:y,onStylesheetLoad:v,stylesheetLoadTimeout:A,keepIframeSrcFn:N});Ae&&v(e,Ae)}},A),j}function SM(e,t){let{mirror:n=new fs,blockClass:r="rr-block",blockSelector:i=null,maskTextClass:o="rr-mask",maskTextSelector:s=null,inlineStylesheet:a=!0,inlineImages:l=!1,recordCanvas:u=!1,maskAllInputs:c=!1,maskTextFn:d,maskInputFn:f,slimDOM:h=!1,dataURLOptions:p,preserveWhiteSpace:m,onSerialize:g,onIframeLoad:S,iframeLoadTimeout:w,onStylesheetLoad:y,stylesheetLoadTimeout:v,keepIframeSrcFn:A=()=>!1}=t||{},N=c===!0?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0,password:!0}:c===!1?{password:!0}:c,T=Ty(h);return Zn(e,{doc:e,mirror:n,blockClass:r,blockSelector:i,maskTextClass:o,maskTextSelector:s,skipChild:!1,inlineStylesheet:a,maskInputOptions:N,maskTextFn:d,maskInputFn:f,slimDOMOptions:T,dataURLOptions:p,inlineImages:l,recordCanvas:u,preserveWhiteSpace:m,onSerialize:g,onIframeLoad:S,iframeLoadTimeout:w,onStylesheetLoad:y,stylesheetLoadTimeout:v,keepIframeSrcFn:A,newlyAddedElement:!1})}var wM=/(max|min)-device-(width|height)/,QH=new RegExp(wM.source,"g");function xM(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function vM(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}),n}var Cc={exports:{}},ce=String,My=function(){return{isColorSupported:!1,reset:ce,bold:ce,dim:ce,italic:ce,underline:ce,inverse:ce,hidden:ce,strikethrough:ce,black:ce,red:ce,green:ce,yellow:ce,blue:ce,magenta:ce,cyan:ce,white:ce,gray:ce,bgBlack:ce,bgRed:ce,bgGreen:ce,bgYellow:ce,bgBlue:ce,bgMagenta:ce,bgCyan:ce,bgWhite:ce}};Cc.exports=My();Cc.exports.createColors=My;var RM=Cc.exports,kM={},CM=Object.freeze(Object.defineProperty({__proto__:null,default:kM},Symbol.toStringTag,{value:"Module"})),ct=vM(CM),Pg=RM,Tg=ct,Lu=class Oy extends Error{constructor(t,n,r,i,o,s){super(t),this.name="CssSyntaxError",this.reason=t,o&&(this.file=o),i&&(this.source=i),s&&(this.plugin=s),typeof n<"u"&&typeof r<"u"&&(typeof n=="number"?(this.line=n,this.column=r):(this.line=n.line,this.column=n.column,this.endLine=r.line,this.endColumn=r.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,Oy)}setMessage(){this.message=this.plugin?this.plugin+": ":"",this.message+=this.file?this.file:"<css input>",typeof this.line<"u"&&(this.message+=":"+this.line+":"+this.column),this.message+=": "+this.reason}showSourceCode(t){if(!this.source)return"";let n=this.source;t==null&&(t=Pg.isColorSupported),Tg&&t&&(n=Tg(n));let r=n.split(/\r?\n/),i=Math.max(this.line-3,0),o=Math.min(this.line+2,r.length),s=String(o).length,a,l;if(t){let{bold:u,gray:c,red:d}=Pg.createColors(!0);a=f=>u(d(f)),l=f=>c(f)}else a=l=u=>u;return r.slice(i,o).map((u,c)=>{let d=i+1+c,f=" "+(" "+d).slice(-s)+" | ";if(d===this.line){let h=l(f.replace(/\d/g," "))+u.slice(0,this.column-1).replace(/[^\t]/g," ");return a(">")+l(f)+u+`
|
|
80
80
|
`+h+a("^")}return" "+l(f)+u}).join(`
|
|
81
81
|
`)}toString(){let t=this.showSourceCode();return t&&(t=`
|
|
82
82
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{$a as Re,A as m,Aa as h,B as H,Ba as me,Ca as ye,Da as ge,E as A,Ea as ke,Fa as we,J as X,Ka as Se,M as E,O as Z,P as ee,T as re,W as oe,Y as ne,Za as R,_a as C,ab as q,bb as ve,c as z,d as b,db as _,e as l,ea as te,eb as Pe,f as D,fb as he,g as G,ha as ie,hb as I,ia as ae,ja as se,jb as xe,ka as F,lb as be,na as le,nb as Ee,ob as Ce,pa as de,pb as Ie,q as Q,qb as We,rb as Le,sa as ce,sb as Te,t as J,tb as De,u as K,ua as ue,ub as He,w as V,wb as Ae,x as Y,xa as pe,ya as fe}from"./chunk-
|
|
2
|
+
import{$a as Re,A as m,Aa as h,B as H,Ba as me,Ca as ye,Da as ge,E as A,Ea as ke,Fa as we,J as X,Ka as Se,M as E,O as Z,P as ee,T as re,W as oe,Y as ne,Za as R,_a as C,ab as q,bb as ve,c as z,d as b,db as _,e as l,ea as te,eb as Pe,f as D,fb as he,g as G,ha as ie,hb as I,ia as ae,ja as se,jb as xe,ka as F,lb as be,na as le,nb as Ee,ob as Ce,pa as de,pb as Ie,q as Q,qb as We,rb as Le,sa as ce,sb as Te,t as J,tb as De,u as K,ua as ue,ub as He,w as V,wb as Ae,x as Y,xa as pe,ya as fe}from"./chunk-GC4FJP73.js";import Yr from"path";import{createClient as Xr}from"graphql-sse";import Zr,{AbortError as eo}from"p-retry";import{graphql as N}from"gql.tada";import{graphql as kr}from"gql.tada";import{print as wr}from"graphql";async function Fe({config:e,cwd:o,headed:r,pool:n,runId:t,signal:i,testSlug:a,workClass:s,workflowSlug:d}){let{fingerprint:c,result:u}=await m(o);if(u.isErr())return await I(e,t,`lockfile:${u.error.kind}`),{detail:`lockfile:${u.error.kind}`,kind:"dispatch-error"};let p=gr(u.value,{testSlug:a,workflowSlug:d});if(p==null)return await I(e,t,`no-test:${d}/${a}`),{detail:`no-test:${d}/${a}`,kind:"dispatch-error"};let f=await R({headed:r,workClass:s,task:()=>n.execute({headed:r,lockfileFingerprint:c,runId:t,testRef:p},i)});return!f.serverNotified&&f.outcome.kind==="error"&&await I(e,t,f.outcome.detail),f.outcome}function gr(e,{testSlug:o,workflowSlug:r}){let t=e.workflows.find(i=>Y(i.name)===r)?.tests.find(i=>i.slug===o);return t==null?void 0:oe(t)}var Sr=6e4,Rr=kr(`
|
|
3
3
|
subscription RunRequestedWatch($devSessionId: String!) {
|
|
4
4
|
runRequested(devSessionId: $devSessionId) {
|
|
5
5
|
runId
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{$ as be,A as Tr,Aa as rr,B as S,C as c,D as Dr,E as x,F as Or,G as _r,Ga as lt,H as Fr,Ha as de,I as Nr,Ia as dt,J as
|
|
2
|
+
import{$ as be,A as Tr,Aa as rr,B as S,C as c,D as Dr,E as x,F as Or,G as _r,Ga as lt,H as Fr,Ha as de,I as Nr,Ia as dt,J as I,Ja as ct,K as j,Ka as K,L as Ur,La as tr,M as w,Ma as pt,N as ve,Na as ut,Oa as mt,Pa as ft,Q as N,Qa as gt,R as Mr,Ra as ht,S as Hr,Sa as yt,T as ae,Ta as kt,U as Wr,Ua as wt,V as qr,Va as vt,W as Xe,Wa as Re,X as Br,Xa as bt,Y as J,Ya as St,Z as Vr,_ as Gr,a as vr,aa as P,b as br,ba as zr,c as Sr,ca as Jr,cb as ce,d as u,da as Kr,db as xt,e as _,eb as nr,fa as Qr,g as ke,ga as Se,gb as Rt,h as xr,ha as Yr,i as F,ia as Ze,ib as Ct,j as Rr,ja as er,k as Cr,ka as Xr,kb as Pt,l as Ye,la as Zr,m as Pr,ma as xe,mb as Et,n as Er,o as $r,oa as et,ob as $t,p as Ir,pb as It,q as V,qa as rt,qb as jt,r as jr,ra as tt,rb as At,s as Ar,sa as le,sb as Lt,t as C,ta as v,tb as Tt,u as z,ua as nt,v as Lr,va as ot,vb as Dt,w as M,wa as it,x as A,y as we,ya as st,z as D,za as at}from"./chunk-GC4FJP73.js";import Sc from"update-notifier";import xc from"yargs";import{hideBin as Rc}from"yargs/helpers";function Ce({current:e,latest:r}){return r==null?`ripplo v${e} (latest: unknown)`:r===e?`ripplo v${e} (latest)`:`ripplo v${e} (latest: v${r} \u2014 run \`npx ripplo update\`)`}function Ot(){return"Update available {currentVersion} \u2192 {latestVersion}\nRun `npx ripplo update`"}import{graphql as Ei}from"gql.tada";import{exec as hi}from"child_process";import{createAuthClient as fi}from"better-auth/client";import{deviceAuthorizationClient as gi}from"better-auth/client/plugins";function _t({baseURL:e}){return fi({baseURL:e,fetchOptions:{headers:{"User-Agent":"Ripplo CLI"}},plugins:[gi()]})}import{err as Ft,ok as yi}from"neverthrow";var ki=5e3,Nt="ripplo-cli";async function Ut({onDeviceCode:e,url:r}){let t=r??Ur().RIPPLO_SERVER_URL,n=_t({baseURL:t}),o=await n.device.code({client_id:Nt});if(o.error!=null)return Ft({description:o.error.error_description,kind:"oauth-device-code-failed"});let{device_code:i,user_code:a,verification_uri_complete:s}=o.data;return e({userCode:a,verificationUrl:s}),Ri(s),(await wi({authClient:n,deviceCode:i})).map(d=>(Rr({serverUrl:t,token:d}),d))}async function wi({authClient:e,deviceCode:r}){for(;;){await Si(ki);let t=await e.device.token({client_id:Nt,device_code:r,grant_type:"urn:ietf:params:oauth:grant-type:device_code"});if(t.data?.access_token!=null)return yi(t.data.access_token);if(t.error==null)continue;if(!bi(t.error.error))return Ft({code:t.error.error,description:t.error.error_description,kind:"oauth-authorization-failed"})}}var vi=new Set(["authorization_pending","slow_down"]);function bi(e){return vi.has(e)}function Si(e){return new Promise(r=>{setTimeout(r,e)})}function xi(){return process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open"}function Ri(e){let r=xi();hi(`${r} "${e}"`,()=>{})}function H({serverUrl:e,token:r}){return{appUrl:"",cwd:process.cwd(),engineUrl:"",projectId:"",ripploServerUrl:e,token:r,webhookSecret:""}}import Ci from"fs";import Pi from"path";function m(e){return Ci.existsSync(Pi.join(e,".ripplo"))}var $i=Ei(`
|
|
3
3
|
query AuthViewer {
|
|
4
4
|
currentUser {
|
|
5
5
|
name
|
|
@@ -11,7 +11,7 @@ import{$ as be,A as Tr,Aa as rr,B as S,C as c,D as Dr,E as x,F as Or,G as _r,Ga
|
|
|
11
11
|
`),process.stdout.write(`Verification code: ${s.userCode}
|
|
12
12
|
|
|
13
13
|
`),process.stdout.write(`Waiting for approval...
|
|
14
|
-
`)}})).match(s=>s,s=>{process.stderr.write(`${
|
|
14
|
+
`)}})).match(s=>s,s=>{process.stderr.write(`${I(s)}
|
|
15
15
|
`),process.exit(1)}),o=await or({serverUrl:e,token:n}),i=m(process.cwd()),a=i?"Welcome back":"Welcome to Ripplo";process.stdout.write(`
|
|
16
16
|
`),process.stdout.write(o.kind==="ok"?`${a}, ${ji(o.viewer)}.
|
|
17
17
|
`:`${a}.
|
|
@@ -38,7 +38,7 @@ import{$ as be,A as Tr,Aa as rr,B as S,C as c,D as Dr,E as x,F as Or,G as _r,Ga
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
`);function L(){return w(process.cwd()).match(e=>e,e=>{process.stderr.write(`${
|
|
41
|
+
`);function L(){return w(process.cwd()).match(e=>e,e=>{process.stderr.write(`${I(e)}
|
|
42
42
|
`),process.stderr.write(`${c("setup")}
|
|
43
43
|
`),process.exit(1)})}async function pe(e){(await u({config:e,document:Oi,variables:{cwd:e.cwd,projectId:e.projectId}})).project?.devSession==null&&(process.stderr.write("No active dev session. Start `npx ripplo daemon` as a background process (your app's dev server must also be running), then retry. Or run `/ripplo:start` in Claude Code.\n"),process.stderr.write(`${c("setup")}
|
|
44
44
|
`),process.exit(1))}var _i=Bt(`
|
|
@@ -97,13 +97,13 @@ ${r.join(`
|
|
|
97
97
|
`);async function nn(){process.stdin.isTTY||(process.stderr.write("`ripplo hooks pause` only runs interactively from a terminal. Bypassing the gate is a human decision, not an agent decision.\n"),process.exit(1));let e=process.cwd();ke(e);let r=le(e);if($e.existsSync(r)){process.stdout.write("Hooks already paused. Run `npx ripplo hooks resume` to re-enable.\n");return}$e.writeFileSync(r,""),await sn(e,!0),process.stdout.write("Hooks paused. Pre-edit gates and stop enforcement are off until you run `npx ripplo hooks resume`.\n")}async function on(){let e=process.cwd(),r=le(e);if(!$e.existsSync(r)){process.stdout.write(`Hooks already active.
|
|
98
98
|
`);return}$e.unlinkSync(r),await sn(e,!1),process.stdout.write(`Hooks resumed.
|
|
99
99
|
`)}async function sn(e,r){let t=w(e).unwrapOr(void 0);t!=null&&await u({config:t,document:Ss,variables:{paused:r,projectId:t.projectId}}).catch(n=>{process.stderr.write(`Warning: could not push hook-pause state to the server (${n instanceof Error?n.message:String(n)}) \u2014 the dashboard may show stale hook status.
|
|
100
|
-
`)})}import Z from"fs";import ee from"path";import{input as mn,select as fn}from"@inquirer/prompts";import{graphql as Zs}from"gql.tada";import{exec as Cs,execFile as Ps}from"child_process";import{err as Es,ok as an}from"neverthrow";import
|
|
101
|
-
`)[0]??t.message:String(t);return _.warn("Install failed (%s): %s",r,n),{cmd:r,ok:!1,reason:n}}}async function Os(e){try{await Y(e);return}catch(r){return`Couldn't compile initial lockfile: ${r instanceof Error?r.message:String(r)}.`}}function _s(e){let r=g.join(e,".gitattributes"),t=
|
|
100
|
+
`)})}import Z from"fs";import ee from"path";import{input as mn,select as fn}from"@inquirer/prompts";import{graphql as Zs}from"gql.tada";import{exec as Cs,execFile as Ps}from"child_process";import{err as Es,ok as an}from"neverthrow";import k from"fs";import{createRequire as $s}from"module";import g from"path";import{promisify as dn}from"util";import{writeFile as xs}from"fs/promises";import Rs from"path";async function Y(e){let r=await S(e);return r.isOk()&&await xs(Rs.join(e,D),z(M,r.value)),r}function U(e){return e.workflows.filter(r=>r.stub).map(r=>r.name)}var Is=["@ripplo/testing","@ripplo/instrument"],ln=".ripplo/ripplo.lock linguist-generated=true",js=[".ripplo/debug/",".ripplo/.local/"],As=dn(Cs),Ls=dn(Ps);async function cn({cwd:e,onStep:r}){r("Scaffolding project files..."),qs({cwd:e}),r("Updating .gitignore..."),Bs(e),r("Marking ripplo.lock as generated..."),_s(e),r("Installing dependencies...");let t=await Ds(e),n=[];if(t.ok||n.push({manualCommand:t.cmd,message:`Couldn't auto-install dev dependencies (${t.reason}). Run the command below, then run \`npx ripplo lint\` to compile the lockfile.`}),t.ok){r("Compiling initial lockfile...");let i=await Os(e);i!=null&&n.push({manualCommand:void 0,message:i})}return r("Setting up browser..."),(await Ts()).map(()=>n)}async function Ts(){let{chromium:e}=await import("playwright"),r=e.executablePath();if(k.existsSync(r))return an(void 0);_.info("Chromium not found. Installing via Playwright...");let t=$s(import.meta.url),n=g.dirname(t.resolve("playwright/package.json")),o=g.join(n,"cli.js");return await Ls(process.execPath,[o,"install","chromium"]),k.existsSync(r)?an(void 0):Es({kind:"playwright-install-failed"})}async function Ds(e){let r=Fs({cwd:e,pm:Ws(e)});_.info("Installing dependencies: %s",r);try{return await As(r,{cwd:e}),{ok:!0}}catch(t){let n=t instanceof Error?t.message.split(`
|
|
101
|
+
`)[0]??t.message:String(t);return _.warn("Install failed (%s): %s",r,n),{cmd:r,ok:!1,reason:n}}}async function Os(e){try{await Y(e);return}catch(r){return`Couldn't compile initial lockfile: ${r instanceof Error?r.message:String(r)}.`}}function _s(e){let r=g.join(e,".gitattributes"),t=k.existsSync(r)?k.readFileSync(r,"utf8"):"";if(t.includes(ln))return;let n=t.length===0||t.endsWith(`
|
|
102
102
|
`)?"":`
|
|
103
|
-
`;
|
|
104
|
-
`)}function Fs({cwd:e,pm:r}){let t=Is.join(" ");return r==="pnpm"?Ns(e)?`pnpm add -wD ${t}`:`pnpm add -D ${t}`:r==="yarn"?Us({cwd:e,deps:t}):r==="bun"?`bun add -d ${t}`:`npm install -D ${t}`}function Ns(e){return
|
|
103
|
+
`;k.writeFileSync(r,`${t}${n}${ln}
|
|
104
|
+
`)}function Fs({cwd:e,pm:r}){let t=Is.join(" ");return r==="pnpm"?Ns(e)?`pnpm add -wD ${t}`:`pnpm add -D ${t}`:r==="yarn"?Us({cwd:e,deps:t}):r==="bun"?`bun add -d ${t}`:`npm install -D ${t}`}function Ns(e){return k.existsSync(g.join(e,"pnpm-workspace.yaml"))||k.existsSync(g.join(e,"pnpm-workspace.yml"))}function Us({cwd:e,deps:r}){return Ms(e)?`yarn add -D ${r}`:Hs(e)?`yarn add -WD ${r}`:`yarn add -D ${r}`}function Ms(e){if(k.existsSync(g.join(e,".yarnrc.yml"))||k.existsSync(g.join(e,".pnp.cjs"))||k.existsSync(g.join(e,".pnp.js")))return!0;let r=g.join(e,"package.json");if(!k.existsSync(r))return!1;try{let t=JSON.parse(k.readFileSync(r,"utf8"));if(t==null||typeof t!="object"||!("packageManager"in t))return!1;let n=t.packageManager;if(typeof n!="string")return!1;let o=/^yarn@(\d+)/.exec(n);return o!=null&&Number(o[1])>=2}catch{return!1}}function Hs(e){let r=g.join(e,"package.json");if(!k.existsSync(r))return!1;try{let t=JSON.parse(k.readFileSync(r,"utf8"));if(t==null||typeof t!="object"||!("workspaces"in t))return!1;let n=t.workspaces;return Array.isArray(n)||n!=null&&typeof n=="object"}catch{return!1}}function Ws(e){return k.existsSync(g.join(e,"pnpm-lock.yaml"))?"pnpm":k.existsSync(g.join(e,"yarn.lock"))?"yarn":k.existsSync(g.join(e,"bun.lockb"))||k.existsSync(g.join(e,"bun.lock"))?"bun":"npm"}function qs({cwd:e}){let r=g.join(e,".ripplo"),t=g.join(r,"entities"),n=g.join(r,"singletons"),o=g.join(r,"worlds"),i=g.join(r,"workflows");[t,n,o,i].forEach(a=>{k.mkdirSync(a,{recursive:!0})}),X(g.join(r,"index.ts"),Vs),X(g.join(t,"index.ts"),Gs),X(g.join(n,"index.ts"),zs),X(g.join(o,"index.ts"),Js),X(g.join(i,"index.ts"),Ks),X(g.join(r,"tsconfig.json"),Qs)}function X(e,r){k.existsSync(e)||k.writeFileSync(e,r)}function Bs(e){let r=g.join(e,".gitignore");if(!k.existsSync(r))return;let t=k.readFileSync(r,"utf8"),n=js.filter(i=>!t.includes(i));if(n.length===0)return;let o=t.endsWith(`
|
|
105
105
|
`)?"":`
|
|
106
|
-
`;
|
|
106
|
+
`;k.writeFileSync(r,t+o+n.join(`
|
|
107
107
|
`)+`
|
|
108
108
|
`)}var Vs=`import { createRipplo } from "@ripplo/testing";
|
|
109
109
|
import { entities } from "./entities/index";
|
|
@@ -193,11 +193,11 @@ export const workflows = [] as const;
|
|
|
193
193
|
}
|
|
194
194
|
`),lr=["../.env.local","../.env"];async function gn(e=na()){let r=process.cwd(),t=j(),n=F(t);n==null&&(process.stdout.write("Not signed in. Run `npx ripplo auth login` first.\n"),process.exit(1)),ra(r)&&(process.stdout.write(`\`.ripplo/index.ts\` already exists at ${r}. To re-init, delete it first.
|
|
195
195
|
`),process.exit(1));let o=await ta({serverUrl:t,token:n});o.length===0&&(process.stdout.write("No projects found. Create one in the dashboard first, then re-run `npx ripplo init`.\n"),process.exit(1));let i=await ia(o,e.projectId),a=await sa(r,e.envFile),s=await la(e.appUrl),l=oa(s,e.engineUrl),d=ee.resolve(ee.join(r,".ripplo"),a);Ir({cwd:r,envFiles:[a],projectId:i}),ca({appUrl:s,engineUrl:l,filePath:d}),process.stdout.write(`${Ae(je(r))}
|
|
196
|
-
`);let p=(await cn({cwd:r,onStep:
|
|
197
|
-
`)}})).match(
|
|
196
|
+
`);let p=(await cn({cwd:r,onStep:y=>{process.stdout.write(` ${y}
|
|
197
|
+
`)}})).match(y=>y,y=>{process.stderr.write(`${I(y)}
|
|
198
198
|
`),process.exit(1)});if(p.length>0){process.stdout.write(`Done with warnings:
|
|
199
|
-
`),p.forEach(
|
|
200
|
-
`),
|
|
199
|
+
`),p.forEach(y=>{process.stdout.write(` - ${y.message}
|
|
200
|
+
`),y.manualCommand!=null&&process.stdout.write(` run: ${y.manualCommand}
|
|
201
201
|
`)});return}process.stdout.write("Ready. Start `npx ripplo daemon` as a background process (or run `/ripplo:start` in Claude Code), then write workflows in `.ripplo/workflows/`.\n")}function ra(e){return Z.existsSync(ee.join(e,".ripplo","index.ts"))}async function ta({serverUrl:e,token:r}){return((await u({config:H({serverUrl:e,token:r}),document:ea,variables:void 0})).projects??[]).map(n=>({id:n.id,name:n.name}))}function na(){return{appUrl:void 0,engineUrl:void 0,envFile:void 0,projectId:void 0}}function oa(e,r){if(r!=null){try{new URL(r)}catch{process.stdout.write(`--engine-url is not a valid URL: ${r}
|
|
202
202
|
`),process.exit(1)}return r}return`${e.replace(/\/$/,"")}/ripplo`}async function ia(e,r){if(r!=null){let t=e.find(n=>n.id===r);return t==null&&(process.stdout.write(`Unknown project id: ${r}
|
|
203
203
|
`),process.exit(1)),process.stdout.write(`Using project: ${t.name} (${t.id})
|
|
@@ -214,7 +214,7 @@ export const workflows = [] as const;
|
|
|
214
214
|
`),process.exit(1)}function wa(e){process.stderr.write(`${e}
|
|
215
215
|
`),process.exit(1)}import{CancellationTokenSource as Xa}from"vscode-jsonrpc/node";import Ca from"path";import{randomUUID as va}from"crypto";import ba from"path";async function Te({assign:e,config:r,headed:t,lockfile:n,session:o,signal:i}){let a=J(n),s=await xa({assign:e,corpus:a,lockfile:n});if(s==null)return{kind:"error",reason:"base-state-arrange-failed",rows:[],trail:[]};if(s.stepRuns.length===0)return{kind:"error",reason:"empty-trail",rows:[],trail:[]};let l=Sa(a,s.stepRuns),d=await tt({attemptTimeoutMs:it,baseState:{name:Xe(e.baseStateTest),test:e.baseStateTest},corpus:a,lensId:e.lensId,lockfile:n,lockfileHash:e.lockfileHash,options:{baseUrl:r.appUrl,engineUrl:r.engineUrl,fixturesDir:ba.join(r.cwd,we),generate:be,headed:t,secret:r.webhookSecret},session:o,shrinkBudget:e.shrinkBudget,trail:s,now:()=>new Date().toISOString(),runIdFor:h=>`explore-${va()}-${String(h)}`},i);return Ra(d,l)}function Sa(e,r){return r.flatMap(t=>{let n=e[t.idx];return n==null?[]:[{actions:[...n.nav,...n.steps].map(o=>Kr(o.action)),label:`${n.test}#${String(n.index)}`}]})}async function xa({assign:e,corpus:r,lockfile:t}){return(await rt(t,{name:Xe(e.baseStateTest),test:e.baseStateTest},{generate:be,materialize:qr(be,t.valueSpaces),params:void 0})).match(o=>et({actionHashes:r.map(i=>xe(t,i)),baseStateSnapshot:o.snapshot,corpus:r,covered:new Set,lens:ot(t),lensId:e.lensId,maxLength:e.maxLength,witnessTrail:e.stepRuns}),()=>null)}function Ra(e,r){return e.kind==="error"?{kind:e.kind,reason:`runtime:${e.error.kind}`,rows:[],trail:[]}:e.kind==="timeout"?{kind:"error",reason:"trail-timeout",rows:[],trail:[]}:e.kind==="aborted"?{kind:e.kind,rows:[],trail:[]}:{kind:e.kind,rows:[...e.rows],trail:[...r]}}var Pa={covered:0,deferred:0,findings:0,saturated:!1,total:0};async function yn(e){let r=w(e.cwd).match(d=>({config:d}),d=>({failure:d}));if("failure"in r)return{failure:r.failure,kind:"config-failed"};let t=r.config,n=await Tr(e.cwd);if(n.result.isErr())return{error:n.result.error,kind:"compile-failed"};let o={fingerprint:n.fingerprint,lockfile:n.result.value},i=nt({onChange:()=>{}});if(!i.holder())return i.stop(),{kind:"explorer-busy"};let a=Se({clientVersion:C(),debugDir:Ca.join(e.cwd,".ripplo","debug"),headed:e.headed,writeOtlpPortFile:!1}),s={executed:0,status:()=>Pa},l=st({cwd:e.cwd,maxTrailLength:e.maxLength,executeTrail:(d,h)=>Te({assign:d,config:t,headed:e.headed,lockfile:o.lockfile,session:a,signal:h}),loadLockfile:()=>Promise.resolve(o),notifyWork:()=>{},onTrailDone:d=>{s.executed+=1,e.onTrail(s.executed,d,s.status())},probeApp:async()=>await ae(t.appUrl)==null});s.status=()=>l.status();try{await l.ready(),e.onReady(l.status());let d=await Ea(l,e),h=l.status();return await l.stop(),await a.close(),d===0&&h.total===0?{kind:"no-work"}:{executed:d,kind:"completed",progress:h}}finally{i.stop()}}async function Ea(e,r){let t=new AbortController().signal,n=async o=>{if(o>=r.trails)return o;let i=e.next();return i==null?o:(await i.run(t),n(o+1))};return n(0)}import{okAsync as $a}from"neverthrow";function kn(e,r,t){let n=rr(e);return er(n).andThen(o=>{let i=Ia(o,r);return i==null?$a({id:r,kind:"not-found"}):Xr(n,[{at:t,kind:"resolution",signature:i}]).map(()=>({id:r,kind:"dismissed"}))})}function wn(e,r){let t=rr(e);return er(t).andThen(n=>{let o=new Set(J(r).map(d=>xe(r,d))),i=new Set(ja(n).filter(d=>!o.has(d.actionHash)).map(d=>d.signature)),a=Aa(n),s=n.filter(d=>La(d,o,a)),l=[...a].filter(d=>!i.has(d)).length;return Zr(t,s).map(()=>({kept:s.length,removedResolved:l,removedStale:i.size}))})}function Ia(e,r){return[...Ze(e).findings.entries()].find(([n,o])=>o.resolvedAt==null&&Yr(n)===r)?.[0]}function ja(e){return e.filter(r=>r.kind==="finding")}function Aa(e){return new Set([...Ze(e).findings.entries()].filter(([,r])=>r.resolvedAt!=null).map(([r])=>r))}function La(e,r,t){return e.kind==="resolution"?!1:e.kind==="finding"?r.has(e.actionHash)&&!t.has(e.signature):!0}function vn(e){if(e.pending.length===0&&e.recurrentFlaky.length===0)return"explore: no pending findings";let r=e.pending.length===0?[]:[`explore: ${b(e.pending.length,"pending finding")} \u2014 triage in layer order, top first`,...e.pending.map(o=>Ta(o))],t=e.recurrentFlaky.length===0?[]:[`recurrent flaky-candidates (same failure ${String(e.recurrentFlaky.length)}x, no deterministic repro \u2014 triage after findings):`,...e.recurrentFlaky.map(o=>_a(o))],n=c("fuzz","triaging each finding (evidence -> classify -> fix -> replay)");return[...r,...t,"","replay after a fix: npx ripplo explore replay <id>",n].join(`
|
|
216
216
|
`).trim()}function bn(e,r){switch(r.kind){case"resolved":return`explore: ${e} replayed clean \u2014 finding resolved, its targets covered under the current workflows`;case"unreachable":return`explore: ${e}'s trail is no longer plannable under the current workflows \u2014 finding resolved (if you narrowed a given/when, make sure a test covers the excluded state)`;case"still-failing":{let t=r.runId==null?"":` (fresh evidence: run ${r.runId})`;return`explore: ${e} still reproduces \u2014 same failure signature${t}`}case"diverged":{let t=r.runId==null?"":` (captured run ${r.runId})`;return`explore: ${e} failed with a different failure signature \u2014 new finding recorded${t}`}case"flaky":return`explore: ${e} did not reproduce deterministically \u2014 recorded as flaky-candidate, finding stays pending`;case"aborted":return`explore: replay of ${e} was aborted`;case"finding-not-found":return`explore: no pending finding ${e} \u2014 check ids with: npx ripplo explore findings`;case"unreplayable":return`explore: ${e} cannot be replayed (${r.reason})`;case"error":return`explore: replay of ${e} failed (${r.reason})`}}function Sn({executed:e,progress:r,trail:t}){let n=t.trail.flatMap(o=>[` ${o.label}`,...o.actions.map(i=>` ${i}`)]);return[`trail ${String(e)} ${t.kind} \u2014 ${de(r)}`,...n,` state: ${t.label}`].join(`
|
|
217
|
-
`)}function xn(e){switch(e.kind){case"config-failed":return
|
|
217
|
+
`)}function xn(e){switch(e.kind){case"config-failed":return I(e.failure);case"compile-failed":return x(e.error);case"no-work":return"explore: nothing to explore \u2014 no runnable actions found in your workflows";case"explorer-busy":return"explore: another explorer holds the machine lock (likely the daemon's background explorer) \u2014 watch it with `npx ripplo status`, or stop it to explore in the foreground";case"completed":return`${`explore: ${String(e.executed)} trails executed`}
|
|
218
218
|
${de(e.progress)}
|
|
219
219
|
findings land in .ripplo/.local/explore-ledger.jsonl`}}function Rn(e){let r=e.evidence.map(n=>` ${n}`),t=e.runId==null?[" no captured run \u2014 replay to capture one"]:[` run: ${e.runId}`,` behavior: .ripplo/debug/${e.runId}/behavior.jsonl`];return[`${e.id} layer=${e.verifierLayer} start=${e.baseState}`,` seen ${String(e.occurrences)}x between ${dr(e.firstSeen)} and ${dr(e.lastSeen)}`,` trail: ${e.trail.join(" -> ")}`," evidence:",...r,...t,` replay after a fix: npx ripplo explore replay ${e.id}`].join(`
|
|
220
220
|
`)}function cr(e){return`explore: no pending finding ${e} \u2014 check ids with: npx ripplo explore findings`}function Cn(e){return e.kind==="not-found"?cr(e.id):`explore: dismissed finding ${e.id}. Prune the log to drop it: npx ripplo explore prune`}function Pn(e){if(e.removedStale+e.removedResolved===0)return"explore: nothing to prune \u2014 the findings log has no stale or dismissed entries.";let t=b(e.removedStale,"stale finding"),n=b(e.removedResolved,"dismissed finding");return`explore: pruned ${t} and ${n}, ${b(e.kept,"row")} kept.`}function Ta(e){let r=e.runId==null?"no captured run":`run ${e.runId}`;return[` ${e.id} layer=${e.verifierLayer} seen ${String(e.occurrences)}x (last ${dr(e.lastSeen)}) start=${e.baseState} ${r}`,` mismatch: ${Da(e.parts)}`,` trail: ${e.trail.join(" -> ")}`].join(`
|
|
@@ -282,11 +282,11 @@ Verify the dev session is live (\`npx ripplo doctor\`, ${c("start")}), or pass t
|
|
|
282
282
|
}
|
|
283
283
|
`);async function qn(e){let r=L(),n=(await u({config:r,document:tl,variables:{kind:e.kind,projectId:r.projectId,rootCause:e.rootCause,runId:e.runId,surfacedBy:e.surfacedBy,title:e.title,workflowSlug:e.testId==null?null:A(e.testId)}})).reportCaughtBug;if(n?.__typename!=="CaughtBug"){let o=n?.__typename==="WorkflowNotFoundError"?n.message:null;process.stderr.write(`${o??"reportCaughtBug failed"}
|
|
284
284
|
`),process.exit(1)}process.stdout.write(`${Wn({id:n.id,kind:e.kind,title:e.title})}
|
|
285
|
-
`)}import nl from"path";import{CancellationTokenSource as ol}from"vscode-jsonrpc/node";async function Bn({all:e,headed:r,ids:t,keepAlive:n}){let o=process.cwd(),i=process.argv[1];i==null&&fe(T({kind:"spawn-failed",message:"process.argv[1] missing"}));let a=await Fe(o);a!=null&&fe(Me(a));let l=(await te({cliEntry:i,cwd:o})).match(
|
|
286
|
-
`);let d=new ol;process.once("SIGINT",()=>{d.cancel(),l.socket.destroy(),process.exit(130)});let h=nl.join(o,".ripplo","debug"),
|
|
287
|
-
`)}})).match(
|
|
285
|
+
`)}import nl from"path";import{CancellationTokenSource as ol}from"vscode-jsonrpc/node";async function Bn({all:e,headed:r,ids:t,keepAlive:n}){let o=process.cwd(),i=process.argv[1];i==null&&fe(T({kind:"spawn-failed",message:"process.argv[1] missing"}));let a=await Fe(o);a!=null&&fe(Me(a));let l=(await te({cliEntry:i,cwd:o})).match($=>$,$=>fe(T($)));l.versionNote!=null&&process.stderr.write(`${dt(l.versionNote)}
|
|
286
|
+
`);let d=new ol;process.once("SIGINT",()=>{d.cancel(),l.socket.destroy(),process.exit(130)});let h=nl.join(o,".ripplo","debug"),y=(await De({connection:l,request:{all:e,headed:r,tests:[...t]},token:d.token,onEvent:$=>{let E=Ue({debugDir:h,event:$});E!=null&&process.stdout.write(`${E}
|
|
287
|
+
`)}})).match($=>$,$=>fe(T($)));await il({connection:l,keepAlive:n,result:y})}async function il({connection:e,keepAlive:r,result:t}){e.spawned&&!r&&await ne(e),await new Promise(n=>{e.socket.end(n)}),t.kind==="daemon-error"&&fe(He(t.error)),process.stdout.write(`${On(t)}
|
|
288
288
|
`),t.failed>0&&process.exit(1),process.exit(t.notRun>0?2:0)}function fe(e){process.stderr.write(`${e}
|
|
289
|
-
`),process.exit(1)}import Vn from"path";import{err as qe,ok as mr}from"neverthrow";async function Gn(){let e=process.cwd(),r=_.child({worker:process.pid}),t=Dt(),n=Se({clientVersion:C(),debugDir:Vn.join(e,".ripplo","debug"),headed:!1,writeOtlpPortFile:!1}),o={entry:void 0},i=a=>{n.close().catch(()=>{}).then(()=>{process.exit(a)})};process.on("disconnect",()=>{i(1)}),process.on("unhandledRejection",a=>{r.error({err:a},"worker unhandled rejection")}),process.on("uncaughtException",a=>{r.error({err:a},"worker uncaught exception"),i(1)}),t.onRequest(It,async(a,s)=>{let l=Ct.safeParse(a);if(!l.success)return We("bad-run-assign");let d=l.data;V(e);let h=w(e).match(E=>E,E=>E.kind);if(typeof h=="string")return We(`config:${h}`);let p=await zn(d.lockfileFingerprint,o,t);if(p.isErr())return We(`lockfile-unavailable:${p.error}`);let
|
|
289
|
+
`),process.exit(1)}import Vn from"path";import{err as qe,ok as mr}from"neverthrow";async function Gn(){let e=process.cwd(),r=_.child({worker:process.pid}),t=Dt(),n=Se({clientVersion:C(),debugDir:Vn.join(e,".ripplo","debug"),headed:!1,writeOtlpPortFile:!1}),o={entry:void 0},i=a=>{n.close().catch(()=>{}).then(()=>{process.exit(a)})};process.on("disconnect",()=>{i(1)}),process.on("unhandledRejection",a=>{r.error({err:a},"worker unhandled rejection")}),process.on("uncaughtException",a=>{r.error({err:a},"worker uncaught exception"),i(1)}),t.onRequest(It,async(a,s)=>{let l=Ct.safeParse(a);if(!l.success)return We("bad-run-assign");let d=l.data;V(e);let h=w(e).match(E=>E,E=>E.kind);if(typeof h=="string")return We(`config:${h}`);let p=await zn(d.lockfileFingerprint,o,t);if(p.isErr())return We(`lockfile-unavailable:${p.error}`);let y=p.value,$=Br(y).find(E=>E.ref===d.testRef);if($==null)return We(`no-test:${d.testRef}`);try{let E=await Rt({config:h,cwd:e,fixturesDir:Vn.join(e,we),headed:d.headed,lockfile:y,runId:d.runId,session:n,signal:nr(s),test:$.test});return{outcome:ct(E),serverNotified:!0}}catch(E){if(E instanceof br)return{outcome:{detail:E.message,kind:"infra-error"},serverNotified:!1};throw E}}),t.onRequest(At,(a,s)=>sl({cache:o,connection:t,cwd:e,raw:a,session:n,token:s})),t.onNotification(Lt,a=>{let s=Pt.safeParse(a);s.success&&n.injectSpan(s.data.runId,s.data.span)}),t.onNotification(Tt,()=>{i(0)}),t.sendNotification($t),await new Promise(()=>{})}function We(e){return{outcome:{detail:e,kind:"error"},serverNotified:!1}}async function sl({cache:e,connection:r,cwd:t,raw:n,session:o,token:i}){let a=Et.safeParse(n);if(!a.success)return{kind:"error",reason:"bad-assign",rows:[],trail:[]};let s=a.data;V(t);let l=w(t).match(p=>p,p=>p.kind);if(typeof l=="string")return{kind:"error",reason:`config:${l}`,rows:[],trail:[]};let d=await zn(s.lockfileFingerprint,e,r);if(d.isErr())return{kind:"error",reason:`lockfile:${d.error}`,rows:[],trail:[]};let h=d.value;return Te({assign:s,config:l,headed:!1,lockfile:h,session:o,signal:nr(i)})}async function zn(e,r,t){return r.entry!=null&&r.entry.fingerprint===e?mr(r.entry.lockfile):(await al(t,e)).andThen(o=>o.unavailable!=null?qe(o.unavailable):o.lockfileJson==null?qe("empty-reply"):ll(o.lockfileJson).map(i=>(r.entry={fingerprint:e,lockfile:i},i)))}async function al(e,r){try{return mr(await e.sendRequest(jt,{fingerprint:r}))}catch(t){return qe(`transport:${t instanceof Error?t.message:"unknown"}`)}}function ll(e){try{return mr(Lr(M,e))}catch(r){return qe(`worker-decode-failed:${r instanceof Error?r.message.slice(0,200):"unknown"}`)}}async function Jn(){await Gn()}import eo from"path";import{createRequire as dl}from"module";import{existsSync as cl}from"fs";import{readFile as Xn,writeFile as Kn}from"fs/promises";import{fileURLToPath as pl}from"url";import Qn from"path";import{err as ge,ok as ul}from"neverthrow";import{z as O}from"zod";var ml={height:800,width:1280};async function Zn({jsonlPath:e,moment:r,outDir:t,runId:n}){if(!cl(e))return ge({kind:"run-not-found",runId:n});let o=await gl(e),i=o[0],a=o.at(-1);if(i==null||a==null)return ge({kind:"no-rrweb-events",runId:n});let s=a.timestamp-i.timestamp,l=r.kind==="offset"?r.offsetMs:r.at-i.timestamp;if(l<0)return ge({durationMs:s,firstTimestamp:i.timestamp,kind:"moment-out-of-range",lastTimestamp:a.timestamp,moment:r});let d=Math.min(l,s),h=String(Math.round(d)),p=Qn.join(t,`snapshot-${h}ms.png`),y=Qn.join(t,`snapshot-${h}ms.html`);return(await bl({events:o,htmlPath:y,offsetMs:d,pngPath:p})).map(()=>({durationMs:s,htmlPath:y,offsetMs:d,pngPath:p}))}var fl=O.object({event:O.looseObject({timestamp:O.number(),type:O.number()}),kind:O.literal("rrweb")});async function gl(e){return(await Xn(e,"utf8")).split(`
|
|
290
290
|
`).filter(t=>t.length>0).map(t=>hl(t)).map(t=>fl.safeParse(t)).flatMap(t=>t.success?[t.data.event]:[])}function hl(e){try{return JSON.parse(e)}catch{return null}}var yl=O.object({data:O.looseObject({height:O.number(),width:O.number()}),type:O.literal(4)});function kl(e){let r=e.flatMap(t=>{let n=yl.safeParse(t);return n.success?[n.data]:[]})[0];return r==null?ml:{height:r.data.height,width:r.data.width}}var wl=`<!doctype html><html><head><style>
|
|
291
291
|
html, body { margin: 0; padding: 0; }
|
|
292
292
|
.replayer-wrapper { position: relative; }
|
|
@@ -299,7 +299,7 @@ iframe { border: none; }
|
|
|
299
299
|
root: document.body,
|
|
300
300
|
showWarning: false,
|
|
301
301
|
});
|
|
302
|
-
replayer.pause(${String(r)});
|
|
302
|
+
replayer.pause(${String(r+.5)});
|
|
303
303
|
globalThis.__ripploSnapshotReplayer = replayer;
|
|
304
304
|
})()`}function Rl(){return`(async () => {
|
|
305
305
|
const doc = document.querySelector(".replayer-wrapper iframe")?.contentDocument;
|
|
@@ -329,7 +329,7 @@ iframe { border: none; }
|
|
|
329
329
|
`)}function no(e){return`${P.bad("fail")} \u2014 ${$l(e)}`}function oo(){return`${P.bad("fail")} \u2014 pass exactly one of --at <epoch-ms from behavior.jsonl> or --offset <ms from the start of the recording>.`}function $l(e){switch(e.kind){case"run-not-found":return`no debug artifacts for run ${e.runId} (.ripplo/debug/${e.runId}/behavior.jsonl missing). ${c("run")}`;case"no-rrweb-events":return`run ${e.runId} has a behavior.jsonl but no rrweb events \u2014 nothing to replay.`;case"moment-out-of-range":return`${e.moment.kind==="offset"?"--offset":"--at"} is outside the recording, which spans ${String(e.firstTimestamp)}\u2013${String(e.lastTimestamp)} (duration ${String(e.durationMs)}ms). Pass --at <epoch-ms from behavior.jsonl> or --offset <0\u2013${String(e.durationMs)}>.`;case"browser-failed":return`replay browser failed (${e.detail}). Is chromium installed? Try \`npx playwright install chromium\`.`}}async function io({at:e,offset:r,runId:t}){let n=Il({at:e,offset:r});n==null&&(process.stderr.write(`${oo()}
|
|
330
330
|
`),process.exit(1)),(await ro({cwd:process.cwd(),moment:n,runId:t})).match(i=>{process.stdout.write(`${to(i)}
|
|
331
331
|
`)},i=>{process.stderr.write(`${no(i)}
|
|
332
|
-
`),process.exit(1)})}function Il({at:e,offset:r}){if(e!=null&&r==null)return{at:e,kind:"absolute"};if(r!=null&&e==null)return{kind:"offset",offsetMs:r}}async function so(){let e=L();try{let t=(await ce(e.cwd,e)).match(i=>i,i=>{process.stderr.write(`${
|
|
332
|
+
`),process.exit(1)})}function Il({at:e,offset:r}){if(e!=null&&r==null)return{at:e,kind:"absolute"};if(r!=null&&e==null)return{kind:"offset",offsetMs:r}}async function so(){let e=L();try{let t=(await ce(e.cwd,e)).match(i=>i,i=>{process.stderr.write(`${I(i)}
|
|
333
333
|
`),process.exit(1)}),n=t.lockfile.workflows.length,o=t.lockfile.entities.length;process.stdout.write(`Synced ${b(n,"workflow")} and ${b(o,"entity","entities")} to dev session ${t.devSessionId}
|
|
334
334
|
`)}catch(r){let t=r instanceof Error?r.message:String(r);process.stderr.write(`ripplo sync failed: ${t}
|
|
335
335
|
`),process.stderr.write(`${c("setup","verify auth + server reachability")}
|
|
@@ -344,7 +344,7 @@ iframe { border: none; }
|
|
|
344
344
|
`);return}Ul(e)}function Ul(e){let r=`ripplo@${e}`,t=Ll("npm",["install","-g",r],{stdio:"inherit"});if(t.status!==0){let n=`exit ${String(t.status)}`;process.stderr.write(`${fo(n)}
|
|
345
345
|
`),process.exit(1)}process.stdout.write(`${gr({evicted:0,latest:e,mode:"global"})}
|
|
346
346
|
`)}async function Ml(e){if((await Oe(e)).kind==="not-running")return;let t=await Tn(e);process.stdout.write(`${go(t)}
|
|
347
|
-
`)}async function yo({explore:e,exploreConcurrency:r}){let{runDaemon:t}=await import("./daemon-
|
|
347
|
+
`)}async function yo({explore:e,exploreConcurrency:r}){let{runDaemon:t}=await import("./daemon-YH73FRIR.js");await t({explore:e,exploreConcurrency:r})}import{graphql as Ve}from"gql.tada";function ko(){return"No scope items added \u2014 the matched tests are already in scope (check `npx ripplo scope status`)."}function wo(e){return[`No test found for: ${e.join(", ")}`,"Pass a test id (kebab-case slug of the test name) or the exact intent string.","List known tests with `npx ripplo status`. To add one, stub it first via the testing DSL.",c("create")].join(`
|
|
348
348
|
`)}import{graphql as Hl}from"gql.tada";var vo=Hl(`
|
|
349
349
|
query ScopeStatus($projectId: String!, $cwd: String!) {
|
|
350
350
|
project(id: $projectId) {
|
|
@@ -413,12 +413,12 @@ iframe { border: none; }
|
|
|
413
413
|
`);async function bo(e){let r=L();await pe(r);let n=(await u({config:r,document:vo,variables:{cwd:r.cwd,projectId:r.projectId}})).project?.devSession?.scopeItems??[];if(e.format==="json"){process.stdout.write(`${JSON.stringify(n,null,2)}
|
|
414
414
|
`);return}if(n.length===0){process.stdout.write("No scope items. Add some with `npx ripplo scope add <test-ids..>` or from the dashboard.\n");return}n.forEach(o=>{let i=o.workflow;if(i==null){process.stdout.write(` [intent] (${o.id}) ${o.label??""}
|
|
415
415
|
`);return}let a=i.spec==null?"stub":"implemented";process.stdout.write(` [${a}] (${o.id}) ${i.slug} \u2014 ${i.name}
|
|
416
|
-
`)})}async function So({testIds:e}){let r=L();await pe(r),(await ce(r.cwd,r)).match(()=>{},s=>{process.stderr.write(`${
|
|
416
|
+
`)})}async function So({testIds:e}){let r=L();await pe(r),(await ce(r.cwd,r)).match(()=>{},s=>{process.stderr.write(`${I(s)}
|
|
417
417
|
`),process.exit(1)});let o=(await u({config:r,document:ql,variables:{cwd:r.cwd,projectId:r.projectId,workflowSlugs:e.map(s=>A(s))}})).addDirtyTestsToScope;o?.__typename==="NoActiveDevSessionError"&&(process.stderr.write(`${o.message}
|
|
418
418
|
`),process.exit(1)),o?.__typename==="UnknownWorkflowSlugsError"&&(process.stderr.write(`${wo(o.slugs)}
|
|
419
419
|
`),process.exit(1));let i=o?.__typename==="MutationAddDirtyTestsToScopeSuccess"?o.data:[];if(i.length===0){process.stdout.write(`${ko()}
|
|
420
420
|
`);return}let a=i.map(s=>s.workflow?.slug??"?").join(", ");process.stdout.write(`Added ${b(i.length,"scope item")}: ${a}
|
|
421
|
-
`)}async function xo({id:e,testId:r}){let t=L();await pe(t),(await ce(t.cwd,t)).match(()=>{},i=>{process.stderr.write(`${
|
|
421
|
+
`)}async function xo({id:e,testId:r}){let t=L();await pe(t),(await ce(t.cwd,t)).match(()=>{},i=>{process.stderr.write(`${I(i)}
|
|
422
422
|
`),process.exit(1)});let o=await Gl({cfg:t,slug:r});await u({config:t,document:Bl,variables:{id:e,workflowId:o}}),process.stdout.write(`Linked scope item ${e} to ${r}
|
|
423
423
|
`)}async function Ro({ids:e}){let r=L();await pe(r);let n=(await u({config:r,document:Vl,variables:{ids:[...e]}})).removeScopeItems??0;process.stdout.write(`Removed ${b(n,"scope item")}
|
|
424
424
|
`)}async function Gl({cfg:e,slug:r}){let n=(await u({config:e,document:Wl,variables:{cwd:e.cwd,projectId:e.projectId,slug:r}})).project?.devSession?.workflows?.[0];return n==null&&(process.stderr.write(`No workflow found with id "${r}". Create a stub first via the testing DSL.
|
|
@@ -516,9 +516,9 @@ ${q(r)}
|
|
|
516
516
|
${c("create")}`}function uc(e){let r=U(e);return r.length===0?null:`--- Unimplemented stubs ---
|
|
517
517
|
${r.join(", ")}
|
|
518
518
|
Implement the stub now with \`workflow("Intent", () => ({ given, steps }))\`. Do not ask the user "implement or defer?" \u2014 that framing is forbidden by /ripplo:create. New scaffolding (entity, world, engine impl) is in-scope, not follow-up.
|
|
519
|
-
${c("create")}`}async function mc(e,r){let t=new Set(U(r).map(p=>A(p))),n=new Set(r.workflows.map(p=>A(p.name))),o=(p,
|
|
519
|
+
${c("create")}`}async function mc(e,r){let t=new Set(U(r).map(p=>A(p))),n=new Set(r.workflows.map(p=>A(p.name))),o=(p,y)=>n.has(p)?t.has(p):fc(y),i=w(e).unwrapOr(void 0);if(i==null)return{error:`--- Testing Scope (not checked) ---
|
|
520
520
|
No project config \u2014 \`npx ripplo init\` hasn't run here, so scope/stub done-checks are not enforcing. ${c("setup")}`,runnableSlugs:[]};let a=await u({config:i,document:dc,variables:{cwd:i.cwd,projectId:i.projectId}}).catch(()=>null);if(a==null)return{error:`--- Testing Scope (not checked) ---
|
|
521
|
-
Ripplo server unreachable \u2014 scope/stub done-checks are not enforcing. Verify the dev session is live (\`npx ripplo doctor\`, ${c("start")}) before declaring work done.`,runnableSlugs:[]};let s=a.project?.devSession?.scopeItems??[],l=s.flatMap(p=>{let
|
|
521
|
+
Ripplo server unreachable \u2014 scope/stub done-checks are not enforcing. Verify the dev session is live (\`npx ripplo doctor\`, ${c("start")}) before declaring work done.`,runnableSlugs:[]};let s=a.project?.devSession?.scopeItems??[],l=s.flatMap(p=>{let y=p.workflow;return y==null?[` [intent] ${p.label??"(no label)"} \u2014 write a test for this flow`]:o(y.slug,y.spec)?[` [stub] ${y.slug} \u2014 implement \`${y.name}\``]:[]}),d=s.flatMap(p=>p.workflow!=null&&!o(p.workflow.slug,p.workflow.spec)?[p.workflow.slug]:[]);return{error:l.length===0?null:`--- Testing Scope ---
|
|
522
522
|
${l.join(`
|
|
523
523
|
`)}
|
|
524
524
|
${c("create")}`,runnableSlugs:d}}function fc(e){return typeof e=="object"&&e!=null&&Reflect.get(e,"stub")===!0}async function gc(e){let r=sc.argv[1];if(r==null)return{error:ye("CLI entry missing (process.argv[1])"),infra:!1};let t=await Fe(e);if(t!=null){let i=Me(t);return Ne(t.serverUrl)?{error:ye(i),infra:!1}:{error:wr({lines:[i],retried:!1}),infra:!0}}let n=await te({cliEntry:r,cwd:e});if(n.isErr())return{error:ye(T(n.error)),infra:!1};let o=n.value;try{return await hc({connection:o,cwd:e})}finally{o.spawned&&await ne(o),o.socket.destroy()}}async function hc({connection:e,cwd:r}){let t=await li({connection:e,cwd:r,tests:[]});if(t.kind==="transport")return{error:ye(t.message),infra:!1};let n=t.notRun.length>0?await li({connection:e,cwd:r,tests:t.notRun.map(a=>a.id)}):null,o=n==null||n.kind==="transport"?t.notRun:n.notRun,i=[...t.failedLines,...n!=null&&n.kind==="done"?n.failedLines:[]];return yc({failedLines:i,notRun:o,retried:n!=null})}function yc({failedLines:e,notRun:r,retried:t}){if(e.length===0&&r.length===0)return{error:null,infra:!1};let n=e.length>0?ai(e):null,o=r.length>0?wr({lines:r.map(i=>i.line),retried:t}):null;return{error:[n,o].filter(i=>i!=null).join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ripplo",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.17",
|
|
4
4
|
"description": "CLI for Ripplo — AI-powered end-to-end testing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://ripplo.ai",
|
|
@@ -59,13 +59,13 @@
|
|
|
59
59
|
"eslint-plugin-neverthrow": "^1.1.4",
|
|
60
60
|
"tsup": "^8.5.1",
|
|
61
61
|
"vitest": "^4.1.4",
|
|
62
|
-
"@ripplo/core": "^0.0.0",
|
|
63
62
|
"@ripplo/eslint-config": "0.0.0",
|
|
63
|
+
"@ripplo/rrweb-bundle": "0.0.0",
|
|
64
|
+
"@ripplo/core": "^0.0.0",
|
|
64
65
|
"@ripplo/graphql": "^0.0.0",
|
|
66
|
+
"@ripplo/runtime": "^0.0.0",
|
|
65
67
|
"@ripplo/run-report": "0.0.0",
|
|
66
|
-
"@ripplo/
|
|
67
|
-
"@ripplo/spec": "^0.0.0",
|
|
68
|
-
"@ripplo/runtime": "^0.0.0"
|
|
68
|
+
"@ripplo/spec": "^0.0.0"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"dev": "tsx watch src/index.ts",
|