ripplo 0.7.17 → 0.7.18

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.
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ import{A as Ke,B as ze,C as Je,D as ne,E as O,F as N,G as D,H as Ge,J as Qe,K as $,L as Xe,M as Ye,N as Ze,O as er,Q as rr,R as nr,a as Ne,b as _,e as De,f as $e,h as We,i as He,j as h,k as Ue,l as qe,m as I,n as re,o as Be,r as A,z as Ve}from"./chunk-RZKJVOMP.js";import{b as Le,d as y,e as m,g as Fe,h as S,i as Me,j as _e,k as Oe}from"./chunk-Y5IXMRSB.js";import ir from"fs";import B from"path";import{config as qn}from"dotenv";import{z as U}from"zod";import{err as Bn,ok as ar}from"neverthrow";import H from"fs";import ie from"path";import{err as te,ok as tr}from"neverthrow";import{z as W}from"zod";var $n=ie.join(".ripplo","project.json"),oe=[".env",".env.local"],Wn=W.object({envFiles:W.array(W.string().min(1)).optional(),projectId:W.string().min(1)});function or(e){return ie.join(e,$n)}function ae(e){let r=or(e);return H.existsSync(r)?Hn(r).andThen(n=>{let t=Wn.safeParse(n);return t.success?tr({envFiles:t.data.envFiles??oe,projectId:t.data.projectId}):te({issues:t.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`),kind:"project-file-invalid",path:r})}):te({kind:"project-file-missing",path:r})}function se(e){return ae(e).match(r=>r,()=>{})}function Hn(e){try{return tr(JSON.parse(H.readFileSync(e,"utf8")))}catch(r){return te({issues:[r instanceof Error?r.message:String(r)],kind:"project-file-invalid",path:e})}}function ha({cwd:e,envFiles:r,projectId:n}){let t=or(e);H.mkdirSync(ie.dirname(t),{recursive:!0});let o={projectId:n};r!=null&&!Un(r)&&(o.envFiles=[...r]),H.writeFileSync(t,JSON.stringify(o,null,2)+`
3
+ `)}function Un(e){return e.length!==oe.length?!1:e.every((r,n)=>r===oe[n])}function Ea(e){let n=se(e)?.envFiles??[".env",".env.local"],t=B.join(e,".ripplo");n.forEach(o=>{let i=B.resolve(t,o);ir.existsSync(i)&&qn({override:!0,path:i,quiet:!0})}),q=void 0}var Vn=U.object({RIPPLO_APP_URL:U.url(),RIPPLO_ENGINE_URL:U.url(),RIPPLO_WEBHOOK_SECRET:U.string().min(1)}),q;function V(){return q!=null?ar(q):zn().map(e=>(q=e,e))}function Kn(e){let n=se(e)?.envFiles??[],t=B.join(e,".ripplo");return n.map(o=>B.resolve(t,o)).filter(o=>!ir.existsSync(o))}function zn(){let e=Vn.safeParse(process.env);if(!e.success)return Bn({issues:e.error.issues.map(n=>`${n.path.join(".")}: ${n.message}`),kind:"env-invalid",missingEnvFiles:Kn(process.cwd())});let r=e.data;return ar({appUrl:r.RIPPLO_APP_URL,engineUrl:r.RIPPLO_ENGINE_URL,webhookSecret:r.RIPPLO_WEBHOOK_SECRET})}import{readFileSync as Jn}from"fs";import{z as sr}from"zod";var Gn=sr.object({version:sr.string()});function K(){let e=Jn(new URL("../package.json",import.meta.url),"utf8");return Gn.parse(JSON.parse(e)).version}import fe from"fs";import z from"path";import{createJiti as it}from"jiti";import{err as j,ok as ur}from"neverthrow";import Qn from"fs";import C from"path";import x from"typescript";function lr(e){let r=C.join(e,"index.ts"),n=Zn(e);Qn.mkdirSync(C.dirname(n.tsBuildInfoFile??""),{recursive:!0});let t=x.createIncrementalCompilerHost(n),o=x.createIncrementalProgram({host:t,options:n,rootNames:[r]}),i=[...o.getSyntacticDiagnostics(),...o.getSemanticDiagnostics()];o.emit();let s=i.filter(d=>Xn(d,e));if(s.length===0)return{diagnostics:[],ok:!0};let c={getCanonicalFileName:d=>d,getCurrentDirectory:()=>C.dirname(e),getNewLine:()=>`
4
+ `};return{diagnostics:x.formatDiagnosticsWithColorAndContext(s,c).split(`
5
+ `).filter(d=>d.length>0),ok:!1}}function Xn(e,r){let n=e.file?.fileName;return n==null?!0:n.startsWith(r)}var Yn=C.join(".local","tsbuildinfo");function Zn(e){return{allowImportingTsExtensions:!0,allowJs:!1,esModuleInterop:!0,incremental:!0,module:x.ModuleKind.Preserve,moduleResolution:x.ModuleResolutionKind.Bundler,noEmit:!0,resolveJsonModule:!0,skipLibCheck:!0,strict:!1,target:x.ScriptTarget.ES2022,tsBuildInfoFile:C.join(e,Yn)}}import{createHash as et}from"crypto";import cr from"fs/promises";import le from"path";import{err as b,ok as ce,Result as rt}from"neverthrow";var de=".ripplo/fixtures",ue=10*1024*1024,pe=50*1024*1024;async function dr(e,r){let n=nt(r);if(n.length===0)return ce({});let t=le.join(e,de),o=await Promise.all(n.map(i=>tt({fixturesRoot:t,name:i})));return rt.combine(o).andThen(ot)}function nt(e){let n=e.workflows.flatMap(t=>[...t.steps,...t.tests.flatMap(o=>o.steps)]).flatMap(t=>t.action.kind==="upload"?t.action.files:[]);return[...new Set(n)].toSorted((t,o)=>t.localeCompare(o))}async function tt({fixturesRoot:e,name:r}){if(r.includes("..")||le.isAbsolute(r))return b({kind:"fixture-invalid-name",name:r});let n=le.join(e,r),t=await cr.lstat(n).catch(()=>null);if(t==null)return b({kind:"fixture-missing",name:r,path:n});if(t.isSymbolicLink())return b({kind:"fixture-symlink",name:r});if(!t.isFile())return b({kind:"fixture-not-file",name:r});let o=await cr.readFile(n);if(o.byteLength>ue)return b({kind:"fixture-too-large",name:r,size:o.byteLength});let i=et("sha256").update(o).digest("hex");return ce([r,{sha256:i,size:o.byteLength}])}function ot(e){let r=e.reduce((n,[,t])=>n+t.size,0);return r>pe?b({kind:"fixtures-total-too-large",total:r}):ce(Object.fromEntries(e))}var v=".ripplo/ripplo.lock",T;async function pr(e){let{result:r}=await at(e);return r}async function at(e){let r=lt(z.join(e,".ripplo"));if(T!=null&&T.fingerprint===r&&T.result.isOk())return{fingerprint:r,result:T.result};let n=await L(e);return T={fingerprint:r,result:n},{fingerprint:r,result:n}}async function L(e){let r=z.join(e,".ripplo"),n=z.join(r,"index.ts"),t=lr(r);return t.ok?(await ct(n)).andThen(s=>ut({entryPath:n,exported:s})).match(async s=>(await dr(e,s)).map(u=>({...s,fixtures:u})).mapErr(u=>({error:u,kind:"fixture-failed"})),s=>Promise.resolve(j(s))):j({diagnostics:t.diagnostics,kind:"typecheck-failed"})}var st=new Set([".local","debug","node_modules"]);function lt(e){return fr(e).toSorted((r,n)=>r.localeCompare(n)).join("|")}function fr(e){return(fe.existsSync(e)?fe.readdirSync(e,{withFileTypes:!0}):[]).flatMap(n=>{if(st.has(n.name))return[];let t=z.join(e,n.name);if(n.isDirectory())return fr(t);let o=fe.statSync(t);return[`${t}:${String(o.mtimeMs)}:${String(o.size)}`]})}async function ct(e){try{let n=await it(import.meta.url,{fsCache:!1,moduleCache:!1,sourceMaps:!0}).import(e),t=n!=null&&typeof n=="object"&&"default"in n?Reflect.get(n,"default"):n;return ur(t)}catch(r){return j({kind:"load-threw",message:dt(r)})}}function dt(e){return e instanceof Error?e.message:String(e)}function ut({entryPath:e,exported:r}){if(r==null||typeof r!="object"||!("lockfile"in r))return j({entryPath:e,kind:"not-ripplo"});let n=$e.safeParse(Reflect.get(r,"lockfile"));return n.success?ur(n.data):j({issues:n.error.issues.map(t=>`${t.path.join(".")}: ${t.message}`),kind:"invalid-lockfile"})}function w(e,r){return r==null?`Load \`/ripplo:${e}\` skill for instructions.`:`Load \`/ripplo:${e}\` skill for instructions on ${r}.`}function za(e){return e.length===1?w(e[0]):`Before proceeding, load the ${e.map(n=>`\`/ripplo:${n}\``).join(" and ")} skills \u2014 every one, each carries rules the others don't.`}function G(e){return[`Compilation failed: ${pt(e)}`,w("create","DSL authoring + lint rules")].join(`
6
+ `)}function Ya(){return`${v} is up to date`}function Za(e){return[`${v} is ${e==="missing"?"missing":"out of date"} \u2014 run \`npx ripplo compile\` and commit the result`,w("setup")].join(`
7
+ `)}function es(){return`Wrote ${v}`}function pt(e){switch(e.kind){case"typecheck-failed":return["TypeScript errors in .ripplo/:",...mr(e.diagnostics)].join(`
8
+ `);case"not-ripplo":return`${e.entryPath} must default-export a Ripplo (createRipplo({ entities, singletons, workflows })). Check that the default export is the value returned by createRipplo, not a function or a re-export.`;case"invalid-lockfile":return["Lockfile failed schema validation (stale or hand-edited .ripplo/ripplo.lock?):",...mr(e.issues),"Regenerate with `npx ripplo compile` \u2014 never hand-edit the lockfile."].join(`
9
+ `);case"load-threw":return[`.ripplo/index.ts threw while loading: ${e.message}`,"Usually a bad import or a top-level throw in .ripplo/ \u2014 run `npx ripplo compile` for the stack."].join(`
10
+ `);case"fixture-failed":return ft(e.error)}}function mr(e,r=8){return e.length<=r?e:[...e.slice(0,r),`\u2026 and ${String(e.length-r)} more`]}function ft(e){switch(e.kind){case"fixture-missing":return`Fixture "${e.name}" not found at ${e.path} \u2014 add the file under .ripplo/fixtures/ or fix the upload() name.`;case"fixture-invalid-name":return`Invalid fixture name "${e.name}" \u2014 upload() takes a bare name under .ripplo/fixtures/, no .. or absolute paths.`;case"fixture-symlink":return`Fixture "${e.name}" is a symlink \u2014 only regular files are allowed.`;case"fixture-not-file":return`Fixture "${e.name}" is not a regular file.`;case"fixture-too-large":return`Fixture "${e.name}" is ${J(e.size)} \u2014 over the ${J(ue)} per-file limit.`;case"fixtures-total-too-large":return`Fixtures total ${J(e.total)} \u2014 over the ${J(pe)} limit.`}}function J(e){return`${String(Math.round(e/(1024*1024)*10)/10)} MB`}var Q=class extends Error{failure;constructor(r){super(r.kind),this.name="CliError",this.failure=r}};function as(e){return e instanceof Q?me(e.failure):e instanceof Error?e.message:String(e)}function me(e){switch(e.kind){case"project-file-missing":return[`Missing ${e.path} \u2014 this directory is not a Ripplo project.`,"Run `npx ripplo init` to create it (or cd into the project root).",w("setup")].join(`
11
+ `);case"project-file-invalid":return[`${e.path} is invalid:`,...e.issues.map(r=>` ${r}`),"Fix the file by hand or re-run `npx ripplo init`."].join(`
12
+ `);case"not-authenticated":return["Not signed in. Run `npx ripplo auth login`.","(Claude Code: run it yourself in the background \u2014 the user just approves in the browser.)"].join(`
13
+ `);case"env-invalid":return mt(e);case"playwright-install-failed":return["Playwright browser install failed \u2014 Chromium is still missing.","Run `npx playwright install chromium` and check its output for network, proxy, or disk-space errors."].join(`
14
+ `);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(`
15
+ `);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(`
16
+ `);case"compilation-failed":return G(e.error)}}function mt(e){let r=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.",...r].join(`
17
+ `)}import{err as ht,ok as kt}from"neverthrow";import{z as ye}from"zod";var yt="https://ripplo.ai";function gr(){return kr().RIPPLO_SERVER_URL}function hr(){return kr().RIPPLO_PROJECT_ID}var gt=ye.object({RIPPLO_PROJECT_ID:ye.string().min(1).optional(),RIPPLO_SERVER_URL:ye.string().min(1).default(yt)}),yr;function kr(){return yr??=gt.parse(process.env),yr}import Sr from"fs";import ge from"path";function Rr(e){let r=Sr.realpathSync(e),n=r,t=ge.dirname(n);for(;t!==n;){if(Sr.existsSync(ge.join(n,".git")))return n;n=t,t=ge.dirname(n)}return r}function Ss(e){return ae(e).andThen(r=>V().andThen(n=>{let t=gr(),o=Oe(t);return o==null?ht({kind:"not-authenticated"}):kt({appUrl:n.appUrl,cwd:Rr(e),engineUrl:n.engineUrl,projectId:hr()??r.projectId,ripploServerUrl:t,token:o,tunnelAuth:void 0,webhookSecret:n.webhookSecret})}))}import xr from"fs";import{checkSync as St,lockSync as Rt}from"proper-lockfile";var xt="dev.pid",br=15e3;function vr(e){return S(e,xt)}function wr(e){try{return St(vr(e),{realpath:!1,stale:br})}catch{return!1}}var he=class extends Error{pid;cwd;constructor({cwd:r,pid:n}){super("dev-lock-held"),this.name="DevLockHeldError",this.pid=n,this.cwd=r}};function ws({cwd:e,onCompromised:r}){Fe(e);let n=vr(e),t=bt({cwd:e,onCompromised:r,path:n});return xr.writeFileSync(n,String(process.pid)),()=>{try{t()}catch{}}}function bt({cwd:e,onCompromised:r,path:n}){try{return Rt(n,{realpath:!1,stale:br,onCompromised:()=>{r()}})}catch(t){throw vt(t)?new he({cwd:e,pid:wt(n)}):t}}function vt(e){if(!(e instanceof Error)||!("code"in e))return!1;let{code:r}=e;return r==="ELOCKED"}function wt(e){try{let r=xr.readFileSync(e,"utf8").trim(),n=Number.parseInt(r,10);return Number.isFinite(n)&&n>0?n:null}catch{return null}}import Et from"p-queue";var Pt=4,It={"p0-ui":3,"p1-cli":2,"p2-cover":1,"p3-explore":0},X=new Et({concurrency:Pt}),k={headedActive:0,interactiveActive:0,interactiveQueued:0},Er={current:null};function Is({headed:e,task:r,workClass:n}){let t=It[n];return n==="p3-explore"?X.add(r,{priority:t}):(k.interactiveQueued+=1,Y(),X.add(()=>At({headed:e,task:r}),{priority:t}))}function As(e){!Number.isFinite(e)||e<1||(X.concurrency=Math.floor(e),Y())}function ke(){return{active:k.interactiveActive,headedActive:k.headedActive,poolSize:X.concurrency,queued:k.interactiveQueued}}function Cs(e){Er.current=e}async function At({headed:e,task:r}){k.interactiveQueued-=1,k.interactiveActive+=1,k.headedActive+=e?1:0,Y();try{return await r()}finally{k.interactiveActive-=1,k.headedActive-=e?1:0,Y()}}function Y(){Er.current?.()}import Se from"fs";import Re from"path";function Pr(e){try{let r=Ct(e);if(r==null)return;let n=Re.join(r,"HEAD"),t=Se.readFileSync(n,"utf8").trim(),o="ref: refs/heads/";return t.startsWith(o)?t.slice(o.length):t.length===0?void 0:t.slice(0,7)}catch{return}}function Ct(e){let r=Re.join(e,".git");if(Se.statSync(r).isDirectory())return r;let t=Se.readFileSync(r,"utf8").trim(),o="gitdir:";if(!t.startsWith(o))return;let i=t.slice(o.length).trim();if(i.length!==0)return Re.resolve(e,i)}import Tt from"crypto";import{readFile as Ir}from"fs/promises";import Ar from"path";import{graphql as jt}from"gql.tada";import{err as Lt,ok as Ft}from"neverthrow";var Mt=jt(`
18
+ mutation SyncDevSession(
19
+ $projectId: String!
20
+ $cwd: String!
21
+ $branch: String
22
+ $lockfileContent: String
23
+ $fixtures: [SyncDevFixtureInput!]
24
+ $preconditions: [SyncDevPreconditionInput!]!
25
+ $singletons: [SyncDevSingletonInput!]
26
+ $workflows: [SyncDevWorkflowInput!]!
27
+ ) {
28
+ syncDevSession(
29
+ projectId: $projectId
30
+ cwd: $cwd
31
+ branch: $branch
32
+ lockfileContent: $lockfileContent
33
+ fixtures: $fixtures
34
+ preconditions: $preconditions
35
+ singletons: $singletons
36
+ workflows: $workflows
37
+ ) {
38
+ id
39
+ hooksPaused
40
+ }
41
+ }
42
+ `);async function Bs(e,r){let n=await L(e);if(n.isErr())return Lt({error:n.error,kind:"compilation-failed"});let t=await xe({config:r,cwd:e,lockfile:n.value});return Ft({devSessionId:t.devSessionId,lockfile:n.value})}async function xe(e){let r=We(e.lockfile);return Ot({config:e.config,cwd:e.cwd,fixtures:e.lockfile.fixtures,payload:r})}function _t(e){return Tt.createHash("sha256").update(JSON.stringify(e)).digest("hex")}async function Ot({config:e,cwd:r,fixtures:n,payload:t}){let o=_t(t),i=Pr(r),s=await Dt(r),c=await Nt(r,n),u=await y({config:e,document:Mt,variables:{branch:i??null,cwd:r,fixtures:c,lockfileContent:s,preconditions:t.preconditions.map(d=>({depends:[...d.depends],description:d.description,name:d.name,returns:[...d.returns]})),projectId:e.projectId,singletons:t.singletons.map(d=>({defaultValue:d.defaultValue,description:d.description,name:d.name,type:d.type})),workflows:t.workflows.map(d=>({expectedOutcome:d.expectedOutcome,name:d.name,preconditions:[...d.preconditions],requiresKeys:d.requiresKeys.map(f=>({namespace:f.namespace,preconditionName:f.preconditionName})),slug:d.slug,sourcePath:d.sourcePath,spec:JSON.stringify(d.spec)}))}});if(u.syncDevSession==null)throw new Error("syncDevSession returned null");return{devSessionId:u.syncDevSession.id,hash:o,hooksPaused:u.syncDevSession.hooksPaused}}async function Nt(e,r){let n=Object.entries(r);return Promise.all(n.map(async([t,o])=>({contentBase64:(await Ir(Ar.join(e,de,t))).toString("base64"),sha256:o.sha256})))}async function Dt(e){try{return await Ir(Ar.join(e,v),"utf8")}catch{return null}}import{randomUUID as yo}from"crypto";import{createId as go}from"@paralleldrive/cuid2";import{CancellationTokenSource as ho,ResponseError as ko}from"vscode-jsonrpc/node";import{graphql as $t}from"gql.tada";var Wt=$t(`
43
+ mutation DaemonCreateRun(
44
+ $id: String
45
+ $workflowId: String!
46
+ $testId: String
47
+ $clientVersion: String
48
+ $executor: RunExecutor
49
+ $target: RunTarget
50
+ ) {
51
+ createRun(
52
+ id: $id
53
+ workflowId: $workflowId
54
+ testId: $testId
55
+ executor: $executor
56
+ target: $target
57
+ clientVersion: $clientVersion
58
+ ) {
59
+ __typename
60
+ ... on MutationCreateRunSuccess {
61
+ data {
62
+ id
63
+ }
64
+ }
65
+ }
66
+ }
67
+ `);async function Cr(e){try{let n=(await y({config:e.config,document:Wt,variables:Ht(e)})).createRun;return n==null?{detail:"create-run-null",kind:"dispatch-error"}:n.__typename==="MutationCreateRunSuccess"?null:{detail:n.__typename,kind:"dispatch-error"}}catch(r){return Ut(r)}}function Ht({executor:e,runId:r,target:n}){return{clientVersion:K(),executor:e,id:r,target:e==="cloud"?"tunnel":void 0,testId:n.testId,workflowId:n.workflowId}}function Ut(e){return e instanceof Le?{detail:e.message,kind:"infra-error"}:{detail:e instanceof Error?e.message:String(e),kind:"dispatch-error"}}import{createMessageConnection as qt,NotificationType as Tr,RequestType as jr,RequestType0 as Lr,SocketMessageReader as Bt,SocketMessageWriter as Vt}from"vscode-jsonrpc/node";import{z as a}from"zod";var Kt="daemon.sock",zt="daemon.log";function Zs(e){return S(e,Kt)}function el(e){return S(e,zt)}function Fr(e){return qt(new Bt(e),new Vt(e))}var Mr=a.object({all:a.boolean(),headed:a.boolean(),tests:a.array(a.string())}),rl=a.object({jobId:a.string(),total:a.number()}),Jt=a.enum(["holder","standby","off"]),Gt=a.object({covered:a.number(),deferred:a.number(),findings:a.number(),saturated:a.boolean(),total:a.number()}),nl=a.object({active:a.number(),explorer:Jt,exploring:a.number(),progress:Gt,queued:a.number(),sseHealth:a.object({detail:a.string().optional(),ok:a.boolean()}).optional(),version:a.string().optional()}),be=a.discriminatedUnion("kind",[a.object({kind:a.literal("pass")}),a.object({findingLines:a.array(a.string()),kind:a.literal("findings")}),a.object({detail:a.string(),kind:a.literal("error")}),a.object({detail:a.string(),kind:a.literal("dispatch-error")}),a.object({detail:a.string(),kind:a.literal("infra-error")})]),Qt=a.discriminatedUnion("kind",[a.object({kind:a.literal("test-started"),runId:a.string(),testName:a.string(),workflowName:a.string()}),a.object({kind:a.literal("test-outcome"),outcome:be,runId:a.string(),testName:a.string(),workflowName:a.string()})]),tl=a.object({event:Qt,jobId:a.string()}),ol=a.object({failed:a.number(),jobId:a.string(),notRun:a.number(),passed:a.number()}),il=a.discriminatedUnion("code",[a.object({code:a.literal("compile-failed"),detail:a.string(),diagnostics:a.array(a.string()).default([])}),a.object({code:a.literal("selection-conflicting-flags")}),a.object({code:a.literal("selection-nothing-selected")}),a.object({code:a.literal("selection-unknown-ids"),known:a.array(a.string()),unknown:a.array(a.string())}),a.object({code:a.literal("scope-failed"),detail:a.string()}),a.object({code:a.literal("app-unreachable"),detail:a.string(),url:a.string()}),a.object({code:a.literal("sync-failed"),detail:a.string()}),a.object({code:a.literal("bad-message")})]),_r=a.object({findingId:a.string().min(1)}),al=a.discriminatedUnion("kind",[a.object({kind:a.literal("resolved")}),a.object({kind:a.literal("unreachable")}),a.object({kind:a.literal("still-failing"),runId:a.string().optional()}),a.object({kind:a.literal("diverged"),runId:a.string().optional()}),a.object({kind:a.literal("flaky")}),a.object({kind:a.literal("aborted")}),a.object({kind:a.literal("finding-not-found")}),a.object({kind:a.literal("unreplayable"),reason:a.enum(["base-state-missing","action-missing","ledger-unreadable"])}),a.object({kind:a.literal("error"),reason:a.string()})]),Or=new jr("ripplo/exploreReplay"),Nr=new jr("ripplo/enqueue"),Dr=new Lr("ripplo/status"),$r=new Lr("ripplo/shutdownIfIdle"),Wr=new Tr("ripplo/jobEvent"),Hr=new Tr("ripplo/jobDone");import{graphql as Xt}from"gql.tada";async function Ur(e,r){let t=(await y({config:e,document:Yt,variables:{cwd:r,projectId:e.projectId}})).project?.devSession?.workflows??[];return new Map(t.flatMap(o=>o.tests.map(i=>[`${o.slug}/${i.slug}`,{testId:i.id,workflowId:o.id}])))}var Yt=Xt(`
68
+ query DaemonWorkflows($projectId: String!, $cwd: String!) {
69
+ project(id: $projectId) {
70
+ id
71
+ devSession(cwd: $cwd) {
72
+ id
73
+ workflows {
74
+ id
75
+ slug
76
+ tests {
77
+ id
78
+ slug
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
84
+ `);import{CancellationTokenSource as Zt}from"vscode-jsonrpc/node";function ve(e){return`${e.workflowSlug}/${e.testSlug}`}function qr(e){let{headed:r,inflight:n,jobId:t,lockfileHashValue:o,onExpire:i,runId:s,selection:c,timeoutMs:u}=e,d=ve(c),f=`${d}@${o}@${String(r)}`,g=n.get(f);if(g!=null)return g.jobIds.add(t),null;let p={cancellation:new Zt,claimed:!1,claimKey:d,headed:r,inflightKey:f,jobIds:new Set([t]),runId:s,testName:c.testName,timer:null,workflowName:c.workflowName};return p.timer=setTimeout(()=>{Z(n,p),i(p)},u),n.set(f,p),p}function Z(e,r){r.timer!=null&&(clearTimeout(r.timer),r.timer=null),e.delete(r.inflightKey)}function we(e,r){let n=[...e.values()].find(t=>t.runId===r&&!t.claimed);return n==null?null:(n.claimed=!0,n.timer!=null&&(clearTimeout(n.timer),n.timer=null),n)}function Br(e,r){[...e.values()].filter(n=>n.jobIds.has(r)).forEach(n=>{n.jobIds.delete(r),n.jobIds.size===0&&(Z(e,n),n.cancellation.cancel())})}import{err as Ee,ok as Vr}from"neverthrow";function zr({all:e,ids:r,lockfile:n}){if(e&&r.length>0)return Ee({kind:"conflicting-flags"});if(e)return Vr(n.workflows.filter(i=>!i.stub).flatMap(i=>i.tests.map(s=>I(s))));if(r.length===0)return Ee({kind:"nothing-selected"});let t=r.map(i=>({id:i,refs:ro(n,i)})),o=t.filter(i=>i.refs.length===0).map(i=>i.id);return o.length>0?Ee({kind:"unknown-ids",known:eo(n),unknown:o}):Vr([...new Set(t.flatMap(i=>i.refs))])}function Jr(e,r){let n=new Map(re(e).map(t=>[t.ref,{testName:t.test.name,testSlug:t.test.slug,workflowName:t.workflow.name,workflowSlug:h(t.workflow.name)}]));return r.map(t=>{let o=n.get(t);if(o==null)throw new Error(`selectionsFor: ref not in lockfile: ${t}`);return o})}function eo(e){return e.workflows.map(r=>h(r.name))}function ro(e,r){let n=e.workflows.find(t=>t.name===r||h(t.name)===h(r));return n!=null?n.tests.map(t=>I(t)):re(e).filter(t=>t.ref===r||Kr(t.ref)===Kr(r)).map(t=>t.ref)}function Kr(e){let r=e.lastIndexOf("/");return r===-1?h(e):`${h(e.slice(0,r))}/${h(e.slice(r+1))}`}import{err as Pe,ok as Qr}from"neverthrow";import{graphql as Xr}from"gql.tada";import{execFileSync as no}from"child_process";var to=256*1024*1024;function ee(e,r){return no("git",[...e],{cwd:r,encoding:"utf8",maxBuffer:to,stdio:["ignore","pipe","pipe"]})}async function Yr({config:e,cwd:r,lockfile:n}){await io({config:e,cwd:r,lockfile:n});let t=await so(e);if(t.isErr())return Pe(t.error);let o=new Map(n.workflows.filter(s=>!s.stub).map(s=>[h(s.name),s])),i=[...new Set(t.value)].flatMap(s=>{let c=o.get(s);return c==null?[]:c.tests.map(u=>I(u))});return i.length===0?Pe({kind:"scope-empty"}):Qr(i)}var oo=Xr(`
85
+ mutation AddDirtyTestsToScope($projectId: String!, $cwd: String!, $workflowSlugs: [String!]!) {
86
+ addDirtyTestsToScope(projectId: $projectId, cwd: $cwd, workflowSlugs: $workflowSlugs) {
87
+ __typename
88
+ }
89
+ }
90
+ `);async function io({config:e,cwd:r,lockfile:n}){let t=new Set(lo(r)),o=n.workflows.filter(i=>i.sourcePath!=null&&t.has(i.sourcePath)).map(i=>h(i.name));o.length!==0&&await y({config:e,document:oo,variables:{cwd:e.cwd,projectId:e.projectId,workflowSlugs:o}}).catch(i=>{m.warn({err:i},"auto-scope of dirty tests failed")})}var ao=Xr(`
91
+ query ScopeSelection($projectId: String!, $cwd: String!) {
92
+ project(id: $projectId) {
93
+ id
94
+ devSession(cwd: $cwd) {
95
+ id
96
+ scopeItems {
97
+ id
98
+ workflow {
99
+ id
100
+ slug
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ `);async function so(e){try{let n=(await y({config:e,document:ao,variables:{cwd:e.cwd,projectId:e.projectId}})).project?.devSession?.scopeItems??[];return Qr(n.flatMap(t=>t.workflow==null?[]:[t.workflow.slug]))}catch(r){return Pe({detail:r instanceof Error?r.message:String(r),kind:"scope-fetch-failed"})}}var Gr=".ripplo/workflows/";function lo(e){try{return ee(["status","--porcelain","--",".ripplo/workflows"],e).split(`
107
+ `).map(r=>r.slice(3).trim()).filter(r=>r.startsWith(Gr)&&r.endsWith(".ts")).map(r=>r.slice(Gr.length)).filter(r=>r!=="index.ts"&&!r.endsWith("/index.ts"))}catch{return[]}}import{graphql as co}from"gql.tada";var uo=2e3,po=co(`
108
+ query DaemonCloudRunStatus($runId: String!) {
109
+ run(id: $runId) {
110
+ status
111
+ failureReason
112
+ }
113
+ }
114
+ `);function en({config:e,onComplete:r,onStarted:n,runId:t,signal:o}){let i=!1,s,c=!1,u=async()=>{if(i||o.aborted)return;let d=await fo(e,t).catch(()=>"unknown");if(!c&&(d==="running"||Zr(d))&&(c=!0,n()),Zr(d)){i=!0,r(mo(d));return}s=setTimeout(()=>{u()},uo)};return u(),{stop:()=>{i=!0,s!=null&&clearTimeout(s)}}}async function fo(e,r){let t=(await y({config:e,document:po,variables:{runId:r}})).run?.status;return t??"unknown"}function Zr(e){return e==="passed"||e==="failed"||e==="warning"||e==="cancelled"}function mo(e){return e==="passed"?{kind:"pass"}:e==="failed"?{detail:"failed",kind:"error"}:e==="warning"?{findingLines:[],kind:"findings"}:e==="cancelled"?{detail:"cancelled",kind:"error"}:{detail:"unknown",kind:"error"}}var So=12e4,Ro=-32099;function tn(e){let r=new AbortController;return e.isCancellationRequested?(r.abort(),r.signal):(e.onCancellationRequested(()=>{r.abort()}),r.signal)}function Vl(e){let r={...e,inflight:new Map,jobs:new Map};return{claim:n=>Eo(r,n),handleConnection:n=>{xo(r,n)},idle:()=>on(r)}}function xo(e,r){let n=Fr(r);n.onRequest(Nr,(t,o)=>bo({connection:n,ctx:e,params:t,token:o})),n.onRequest(Dr,()=>{let t=ke();return{active:t.active,queued:t.queued,sseHealth:e.sseHealth(),version:K(),...e.explorationStatus()}}),n.onRequest(Or,async(t,o)=>{let i=_r.safeParse(t);return i.success?(await e.ready,e.replayFinding(i.data.findingId,tn(o))):{kind:"error",reason:"bad-message"}}),n.onRequest($r,()=>{let t=on(e);return t&&e.onShutdownRequest(),t}),n.onClose(()=>{vo(e,n)}),n.onError(t=>{m.warn({err:t},"ipc connection error")}),r.on("error",t=>{m.warn({err:t},"ipc socket error")}),n.listen()}function on(e){let r=ke();return e.jobs.size===0&&r.active===0&&r.queued===0}async function bo({connection:e,ctx:r,params:n,token:t}){let o=Mr.safeParse(n);if(!o.success)throw rn({code:"bad-message"});await r.ready;let i=await Io({config:r.config,cwd:r.cwd,message:o.data});if(i.kind==="error")throw rn(i.error);let s=yo(),c=new ho;return t.onCancellationRequested(()=>{an(r,s)}),r.jobs.set(s,{cancellation:c,connection:e,failed:0,notRun:0,passed:0,total:i.selections.length}),_o({ctx:r,headed:o.data.headed,jobId:s,lockfileHashValue:i.lockfileHashValue,selections:i.selections,targetsByClaimKey:i.targetsByClaimKey,token:c.token}).catch(u=>{m.error({err:u},"ipc dispatch failed")}),{jobId:s,total:i.selections.length}}function rn(e){return new ko(Ro,e.code,e)}function an(e,r){let n=e.jobs.get(r);n!=null&&(n.cancellation.cancel(),e.jobs.delete(r),Br(e.inflight,r))}function vo(e,r){[...e.jobs.entries()].filter(([,n])=>n.connection===r).forEach(([n])=>{an(e,n)})}function sn(e,r,n){let t=e.jobs.get(r);t!=null&&(nn(()=>t.connection.sendNotification(Wr,{event:n,jobId:r})),n.kind==="test-outcome"&&(wo(t,n.outcome.kind),t.passed+t.failed+t.notRun>=t.total&&(nn(()=>t.connection.sendNotification(Hr,{failed:t.failed,jobId:r,notRun:t.notRun,passed:t.passed})),e.jobs.delete(r))))}function nn(e){e().catch(r=>{m.warn({err:r},"ipc notification failed")})}function wo(e,r){if(r==="pass"){e.passed+=1;return}if(r==="dispatch-error"||r==="infra-error"){e.notRun+=1;return}e.failed+=1}function E(e,r,n){r.jobIds.forEach(t=>{sn(e,t,n)})}function Eo(e,r){let n=we(e.inflight,r);return n==null?null:{headed:n.headed,token:n.cancellation.token,finished:(t,o)=>{e.inflight.delete(n.inflightKey),E(e,n,{kind:"test-outcome",outcome:o,runId:n.runId,testName:n.testName,workflowName:n.workflowName})},started:()=>{E(e,n,{kind:"test-started",runId:n.runId,testName:n.testName,workflowName:n.workflowName})}}}function Po(e){return e.kind==="typecheck-failed"?e.diagnostics.slice(0,5):e.kind==="invalid-lockfile"?e.issues.slice(0,5):e.kind==="load-threw"?[e.message]:[]}async function Io({config:e,cwd:r,message:n}){return(await pr(r)).match(o=>Ao({config:e,cwd:r,lockfile:o,message:n}),o=>Promise.resolve({error:{code:"compile-failed",detail:o.kind,diagnostics:[...Po(o)]},kind:"error"}))}async function Ao({config:e,cwd:r,lockfile:n,message:t}){let o=await To(e.appUrl);if(o!=null)return{error:{code:"app-unreachable",detail:o,url:e.appUrl},kind:"error"};let i=await jo({config:e,cwd:r,lockfile:n});return i!=null?{error:{code:"sync-failed",detail:i},kind:"error"}:(await Lo({config:e,cwd:r,lockfile:n,message:t})).match(async c=>({kind:"ready",lockfileHashValue:$(n),selections:Jr(n,c),targetsByClaimKey:await Ur(e,r)}),c=>Promise.resolve({error:c,kind:"error"}))}var Co=2e3;async function To(e){try{return await fetch(e,{method:"HEAD",signal:AbortSignal.timeout(Co)}),null}catch(r){return r instanceof Error?r.message:String(r)}}async function jo(e){try{return await xe(e),null}catch(r){return r instanceof Error?r.message:String(r)}}async function Lo({config:e,cwd:r,lockfile:n,message:t}){return!t.all&&t.tests.length===0?(await Yr({config:e,cwd:r,lockfile:n})).mapErr(Fo):zr({all:t.all,ids:t.tests,lockfile:n}).mapErr(Mo)}function Fo(e){return e.kind==="scope-empty"?{code:"selection-nothing-selected"}:{code:"scope-failed",detail:e.detail}}function Mo(e){switch(e.kind){case"conflicting-flags":return{code:"selection-conflicting-flags"};case"nothing-selected":return{code:"selection-nothing-selected"};case"unknown-ids":return{code:"selection-unknown-ids",known:[...e.known],unknown:[...e.unknown]}}}async function _o(e){await e.selections.reduce((r,n)=>r.then(()=>Oo(e,n)),Promise.resolve())}async function Oo(e,r){let{ctx:n,headed:t,jobId:o,lockfileHashValue:i,targetsByClaimKey:s,token:c}=e;if(c.isCancellationRequested)return;let u=ve(r),d=s.get(u);if(d==null){sn(n,o,{kind:"test-outcome",outcome:{detail:"test-not-found",kind:"dispatch-error"},runId:"",testName:r.testName,workflowName:r.workflowName});return}let f=qr({headed:t,inflight:n.inflight,jobId:o,lockfileHashValue:i,runId:go(),selection:r,timeoutMs:So,onExpire:p=>{E(n,p,{kind:"test-outcome",outcome:{detail:"dispatch-timeout",kind:"dispatch-error"},runId:"",testName:p.testName,workflowName:p.workflowName})}});if(f==null)return;let g=await No(n,d,f.runId);if(g!=null){Z(n.inflight,f),E(n,f,{kind:"test-outcome",outcome:g,runId:"",testName:r.testName,workflowName:r.workflowName});return}n.executor==="cloud"&&Do(n,f)}function No(e,r,n){return Cr({config:e.config,executor:e.executor,runId:n,target:r})}function Do(e,r){let n=we(e.inflight,r.runId);n!=null&&en({config:e.config,runId:n.runId,signal:tn(n.cancellation.token),onComplete:t=>{e.inflight.delete(n.inflightKey),E(e,n,{kind:"test-outcome",outcome:t,runId:n.runId,testName:n.testName,workflowName:n.workflowName})},onStarted:()=>{E(e,n,{kind:"test-started",runId:n.runId,testName:n.testName,workflowName:n.workflowName})}})}function $o(e){let{backoffActive:r,explorerHolder:n,headedActive:t,interactiveActive:o,interactiveQueued:i}=e,{explorationActive:s,exploreConcurrency:c,poolSize:u}=e;if(!n||t||i>0)return{abortCount:s,refillCount:0};if(r)return{abortCount:0,refillCount:0};let d=Math.min(c,u-1,u-o);return{abortCount:0,refillCount:Math.max(0,d-s)}}function zl(e){let r={active:new Map,backoffUntil:0,cancelBackoffTimer:null,cancelHeartbeat:null,holder:!1,prevInteractiveActive:e.probe().interactiveActive,stopped:!1};return dn(r,e),{explorationActive:()=>r.active.size,explorerHolder:()=>r.holder,notifyQueueChange:()=>{Wo(r,e)},setExplorerHolder:n=>{r.holder=n,F(r,e)},stop:()=>{r.stopped=!0,r.cancelBackoffTimer?.(),r.cancelBackoffTimer=null,r.cancelHeartbeat?.(),r.cancelHeartbeat=null,un(r,r.active.size)}}}function dn(e,r){e.stopped||(e.cancelHeartbeat=r.setTimer(()=>{F(e,r),dn(e,r)},15e3))}function F(e,r){if(e.stopped)return;let n=r.probe(),t=$o({backoffActive:r.now()<e.backoffUntil,explorationActive:e.active.size,exploreConcurrency:r.exploreConcurrency,explorerHolder:e.holder&&r.exploreEnabled,headedActive:n.headedActive>0,interactiveActive:n.interactiveActive,interactiveQueued:n.interactiveQueued,poolSize:n.poolSize});un(e,t.abortCount),pn({count:t.refillCount,params:r,state:e})}function un(e,r){[...e.active.values()].slice(0,r).forEach(({controller:n})=>{n.abort()})}function Wo(e,r){let n=r.probe();n.interactiveActive<e.prevInteractiveActive&&Ho(e,r),e.prevInteractiveActive=n.interactiveActive,F(e,r)}function Ho(e,r){e.backoffUntil=r.now()+3e4,e.cancelBackoffTimer?.(),e.cancelBackoffTimer=r.setTimer(()=>{e.cancelBackoffTimer=null,F(e,r)},3e4)}function pn({count:e,params:r,state:n}){if(e<=0)return;let t=Uo(r.sources);t!=null&&(qo({params:r,pulled:t,state:n}),pn({count:e-1,params:r,state:n}))}function Uo(e){return e.reduce((r,n)=>{if(r!=null)return r;let t=n.next();return t==null?null:{job:t,source:n}},null)}function qo({params:e,pulled:r,state:n}){let{job:t,source:o}=r,i=new AbortController;n.active.set(t.id,{controller:i,job:t,source:o}),e.execute({job:t,priority:o.priority,signal:i.signal}).then(()=>{cn({job:t,outcome:ln(i.signal,null),params:e,source:o,state:n})}).catch(s=>{cn({job:t,outcome:ln(i.signal,{error:s}),params:e,source:o,state:n})})}function ln(e,r){return e.aborted?{kind:"aborted"}:r==null?{kind:"completed"}:{error:r.error,kind:"error"}}function cn({job:e,outcome:r,params:n,source:t,state:o}){o.active.delete(e.id),t.onResult(e,r),F(o,n)}import Bo from"fs";import Vo from"path";async function rc(e){let r=Vo.join(e,".ripplo","index.ts");if(!Bo.existsSync(r))return{appUrl:void 0,engineUrl:void 0,errors:[{message:".ripplo/index.ts not found",path:""}],valid:!1,warnings:[]};let n=await L(e);return n.isErr()?{appUrl:void 0,engineUrl:void 0,errors:[{message:G(n.error),path:".ripplo/"}],valid:!1,warnings:[]}:V().match(t=>({appUrl:t.appUrl,engineUrl:t.engineUrl,errors:[],valid:!0,warnings:[]}),t=>({appUrl:void 0,engineUrl:void 0,errors:[{message:me(t),path:""}],valid:!1,warnings:[]}))}async function nc(e){try{await fetch(e,{method:"HEAD",signal:AbortSignal.timeout(5e3)});return}catch{return`appUrl (${e}) is not responding. Make sure your dev server is running on that port.`}}async function tc({appUrl:e,engineUrl:r}){let n=r.startsWith("http://")||r.startsWith("https://")?r:`${e}${r}`;try{return(await fetch(`${n}/setup`,{body:JSON.stringify({}),headers:{"Content-Type":"application/json"},method:"PUT",signal:AbortSignal.timeout(5e3)})).ok?"Engine endpoint accepted an unsigned request \u2014 webhook signature verification may be missing.":void 0}catch{return}}import Go from"fs";import Ko from"fs";import Ie from"path";var zo=["MERGE_HEAD","rebase-merge","rebase-apply","CHERRY_PICK_HEAD","REVERT_HEAD"];function fn(e){let r=Jo(e);return r==null?!1:zo.some(n=>Ko.existsSync(Ie.join(r,n)))}function Jo(e){try{let r=ee(["rev-parse","--git-dir"],e).trim();return r.length===0?null:Ie.isAbsolute(r)?r:Ie.resolve(e,r)}catch{return null}}function Qo(e){return S(e,"hooks-paused")}function fc(e){return Go.existsSync(Qo(e))||fn(e)?!1:wr(e)}import Xo from"fs";import{lockSync as Yo}from"proper-lockfile";var Zo="explorer.lock",ei=15e3,ri=15e3;function ni(){return _e(Zo)}function kc({onChange:e}){let r={release:null,stopped:!1},n=()=>{r.release=null,r.stopped||e(!1)},t=()=>{if(r.stopped||r.release!=null)return;let i=ti(n);i!=null&&(r.release=i,e(!0))};t();let o=setInterval(t,ri);return{holder:()=>r.release!=null,stop:()=>{r.stopped=!0,clearInterval(o),r.release?.(),r.release=null}}}function ti(e){try{Me();let r=ni(),n=Yo(r,{onCompromised:e,realpath:!1,stale:ei});return Xo.writeFileSync(r,String(process.pid)),()=>{try{n()}catch{}}}catch{return null}}import oi from"path";import{randomUUID as ii}from"crypto";function mn(e){return{axes:[Ke("unit"),ze(e)]}}var yn=12,gn=15,hn=4,kn=2,xc=12e4;var xn={covered:0,deferred:0,findings:0,saturated:!1,total:0};function Ac(){return{priority:"p3",next:()=>null,onResult:()=>{},ready:()=>Promise.resolve(),status:()=>xn,stop:()=>Promise.resolve()}}function Cc(e){let r={claimed:new Set,consecutiveErrors:0,covered:new Set,deferred:new Map,findings:0,haltedUntil:0,prepared:null,preparing:!1,refreshing:!1,saturated:!1,tick:0},n=Ae(e,r);return{priority:"p3",next:()=>di(e,r),onResult:()=>{},ready:()=>n,status:()=>r.prepared==null?xn:li(r.prepared,r),stop:()=>Promise.resolve()}}async function Ae(e,r){if(!r.preparing){r.preparing=!0;try{let n=await e.loadLockfile();if(n==null)return;let t=await ai(n);if(t==null)return;await D(vn(e.cwd)).match(o=>{let i=N(o);r.covered=new Set(i.covered),r.findings=[...i.findings.values()].filter(s=>s.resolvedAt==null).length,r.prepared=t,r.consecutiveErrors=0,r.haltedUntil=0,r.deferred.clear(),e.notifyWork()},o=>{m.warn("explore findings log unreadable, exploration disabled: %s",o.kind)})}finally{r.preparing=!1}}}async function ai({fingerprint:e,lockfile:r}){let n=mn(r),t=Be(r);if(t.length===0)return null;let o=rr(r,{sweep:!1}),i=await si(r,o),s=Xe({baseStates:i,corpus:t,lens:n,maxCount:kn,maxDepth:hn});return{actionHashes:t.map(c=>Qe(r,c)),baseStates:o,corpus:t,fingerprint:e,graph:s,lens:n,lensIdValue:Ve(n),lockfile:r,lockfileHashValue:$(r)}}async function si(e,r){let n={generate:A,materialize:qe(A,e.valueSpaces),params:void 0};return(await Promise.all(r.map(async o=>(await nr(e,o,n)).match(s=>({name:o.name,snapshot:s.snapshot}),()=>null)))).flatMap(o=>o==null?[]:[o])}var Sn=20,bn=6e5,Rn=3e5;function li(e,r){let n=Ze(e.graph),t=Ye({actionHashes:e.actionHashes,corpus:e.corpus,covered:r.covered,graph:e.graph,lensId:e.lensIdValue,tick:r.tick});return{covered:n-t,deferred:En(r).size,findings:r.findings,saturated:r.saturated,total:n}}async function ci(e,r){if(!(r.refreshing||r.preparing||r.prepared==null)){r.refreshing=!0;try{let n=await e.loadLockfile();if(n==null||n.fingerprint===r.prepared.fingerprint)return;m.info("workflow definitions changed, re-preparing exploration targets"),r.prepared=null,await Ae(e,r)}finally{r.refreshing=!1}}}function di(e,r){ci(e,r);let n=r.prepared;if(n==null||Date.now()<r.haltedUntil)return null;let t=er({actionHashes:n.actionHashes,corpus:n.corpus,covered:new Set([...r.covered,...r.claimed,...En(r)]),graph:n.graph,lensId:n.lensIdValue,tick:r.tick});if(r.tick+=1,t.kind==="saturated")return r.saturated=!0,null;r.saturated=!1;let o=ki(n,t.target);return r.claimed.add(o),{id:`explore:${ii()}`,label:t.target.targetKey,run:i=>ui({choice:t.target,key:o,params:e,prepared:n,signal:i,state:r})}}async function ui({choice:e,key:r,params:n,prepared:t,signal:o,state:i}){try{let s=fi({choice:e,params:n,prepared:t});if(s==null)return;if(!await n.probeApp()){wn(i,"app-unreachable");return}let c=await n.executeTrail(s,o);if(c.kind==="aborted")return;if(c.kind==="error"){yi({key:r,params:n,reason:c.reason,state:i});return}i.consecutiveErrors=0,m.info("exploration trail %s: %s @ %s",c.kind,c.trail.map(u=>u.label).join(" -> "),e.targetKey.slice(0,80)),n.onTrailDone?.({kind:c.kind,label:e.targetKey,trail:c.trail}),await mi({outcome:pi(c,e,t),params:n,state:i})}finally{i.claimed.delete(r)}}function pi(e,r,n){let t={actionHash:r.actionHash,at:new Date().toISOString(),kind:"covered",lensId:n.lensIdValue,targetKey:r.targetKey};return{...e,rows:[...e.rows,t]}}function fi({choice:e,params:r,prepared:n}){let t=n.baseStates.find(o=>o.name===e.witness.baseState);return t==null?null:{baseStateTest:t.test,lensId:n.lensIdValue,lockfileFingerprint:n.fingerprint,lockfileHash:n.lockfileHashValue,maxLength:r.maxTrailLength??yn,shrinkBudget:gn,stepRuns:e.witness.trail.map(o=>({idx:o.idx,params:o.params}))}}async function mi({outcome:e,params:r,state:n}){let t=e.rows.filter(o=>o.kind!=="covered"||!n.covered.has(O(o)));t.forEach(o=>{(o.kind==="covered"||o.kind==="finding"||o.kind==="flaky-candidate")&&n.covered.add(O(o))}),e.kind==="finding"&&(n.findings+=1,m.info("exploration finding recorded")),t.length!==0&&await Ge(vn(r.cwd),t).match(()=>{},o=>{m.warn("explore findings log append failed: %s",o.kind)})}function vn(e){return oi.join(e,".ripplo",".local","explore-ledger.jsonl")}function yi({key:e,params:r,reason:n,state:t}){if(n==="lockfile:fingerprint-mismatch"){gi(r,t);return}if(hi(t,e),n==="trail-timeout"){m.warn("exploration attempt timed out, target deferred for %ds",bn/1e3);return}wn(t,n)}function gi(e,r){r.preparing||(r.prepared=null,Ae(e,r))}function hi(e,r){e.deferred.set(r,Date.now()+bn)}function wn(e,r){e.consecutiveErrors+=1,m.debug("exploration trail error: %s",r),e.consecutiveErrors>=Sn&&(e.haltedUntil=Date.now()+Rn,e.consecutiveErrors=0,m.warn("exploration cooling down for %ds after %d consecutive trail errors (last: %s)",Rn/1e3,Sn,r))}function En(e){let r=Date.now();return[...e.deferred].filter(([,n])=>n<=r).forEach(([n])=>e.deferred.delete(n)),new Set(e.deferred.keys())}function ki(e,r){return O({actionHash:r.actionHash,lensId:e.lensIdValue,targetKey:r.targetKey})}import Si from"path";var Ri=3;function Fc(e){return D(xi(e)).map(r=>bi(N(r)))}function xi(e){return Si.join(e,".ripplo",".local","explore-ledger.jsonl")}function bi(e){let r=[...e.findings.entries()].filter(([,t])=>t.resolvedAt==null).map(([t,o])=>vi(t,o)).toSorted(Ei),n=[...e.flaky.entries()].filter(([,t])=>t.occurrences>=Ri).map(([t,o])=>wi(t,o)).toSorted((t,o)=>o.occurrences-t.occurrences);return{pending:r,recurrentFlaky:n}}function vi(e,r){let n=r.latest;return{baseState:n.baseState,evidence:n.evidence,firstSeen:r.first.at,id:ne(e),lastSeen:n.at,occurrences:r.occurrences,parts:n.parts,runId:n.runId,trail:n.trail,verifierLayer:n.verifierLayer}}function wi(e,r){return{at:r.first.at,baseState:r.first.baseState,id:ne(e),occurrences:r.occurrences,trail:r.first.trail}}var Pn={crash:0,"data-rule":1,frame:3,"page-rule":2};function Ei(e,r){let n=Pn[e.verifierLayer]-Pn[r.verifierLayer];return n===0?r.occurrences-e.occurrences:n}import{createMessageConnection as In,IPCMessageReader as An,IPCMessageWriter as Cn,NotificationType as Pi,NotificationType0 as Tn,RequestType as Ce}from"vscode-jsonrpc/node";import{z as l}from"zod";var Wc=l.object({headed:l.boolean(),lockfileFingerprint:l.string(),runId:l.string().min(1),testRef:l.string().min(1)}),Hc=l.object({fingerprint:l.string()}),Uc=l.object({lockfileJson:l.string().optional(),unavailable:l.string().optional()}),Ii=l.enum(["unspecified","internal","server","client","producer","consumer"]),Ai=l.enum(["unset","ok","error"]),Ci=l.object({attributes:l.record(l.string(),l.string()),durationMs:l.number(),kind:l.literal("span"),name:l.string(),parentSpanId:l.union([l.string(),l.undefined()]),source:l.literal("server"),spanId:l.string(),spanKind:Ii,status:l.object({code:Ai,message:l.union([l.string(),l.undefined()])}),timeNanos:l.string(),traceId:l.string()}),qc=l.object({runId:l.string().min(1),span:Ci}),Bc=l.object({outcome:be,serverNotified:l.boolean()}),Vc=l.object({baseStateTest:De,lensId:l.string().min(1),lockfileFingerprint:l.string(),lockfileHash:l.string().min(1),maxLength:l.number().int().positive(),shrinkBudget:l.number().int().nonnegative(),stepRuns:l.array(l.object({idx:l.number().int().nonnegative(),params:l.record(l.string(),l.union([Ne,l.null()]))}))}),Ti=l.object({actions:l.array(l.string()),label:l.string().min(1)}),Kc=l.object({kind:l.enum(["aborted","clean","error","flaky","finding"]),reason:l.string().optional(),rows:l.array(Je),trail:l.array(Ti).default([])}),zc=new Tn("worker/ready"),Jc=new Ce("worker/run"),Gc=new Ce("worker/lockfile"),Qc=new Ce("worker/exploreTrail"),Xc=new Pi("worker/span"),Yc=new Tn("worker/shutdown");function Zc(e){let r=In(new An(e),new Cn(e));return r.listen(),r}function ed(){let e=In(new An(process),new Cn(process));return e.listen(),e}import{gzip as Di}from"zlib";import{promisify as $i}from"util";import{existsSync as Wi,readFileSync as Hi}from"fs";import Mn from"path";import{graphql as P}from"gql.tada";function jn(e){return[e.kind,e.target,e.value].filter(r=>r.length>0).join(" ")}var ji={"no-effect":"noEffect","required-state-unsatisfied":"requiredStateUnsatisfied",unresolvable:"unresolvable"},Li={"data-rule":"dataRule","page-rule":"pageRule",step:"step"},Fi={aborted:"aborted","action-failed":"actionFailed","check-failed":"checkFailed","client-mount-missing":"clientMountMissing","conflicting-sessions":"conflictingSessions","driver-launch":"driverLaunch","engine-decode":"engineDecode","engine-http":"engineHttp","engine-network":"engineNetwork","engine-unreachable":"engineUnreachable","setup-missing-row":"setupMissingRow","state-identity":"stateIdentity"};function Ln(e){return e.kind==="consistency"?{consistency:{mismatch:Oi(e.mismatch),pending:e.pending}}:e.kind==="pending-check"?{pendingCheck:{budget:e.budget,source:Li[e.source.kind],...Mi(e.source)}}:e.kind==="unrunnable"?{unrunnable:{reason:ji[e.reason]}}:e.kind==="driver-error"?{driverError:{errorKind:Fi[e.error.kind],message:Ni(e.error)}}:{impossibleAction:{subject:_i(e.step.action)}}}function Mi(e){return"check"in e?Fn(e.check,!1):{checkKind:void 0,expected:void 0,negated:void 0,subject:void 0}}function Fn(e,r){return e.kind==="not"?Fn(e.inner,!r):e.kind==="browser"?{checkKind:"browser",expected:e.value,negated:r,subject:e.name}:e.kind==="value"||e.kind==="text"?{checkKind:e.kind,expected:e.value,negated:r,subject:_(e.locator)}:{checkKind:e.kind,expected:void 0,negated:r,subject:_(e.locator)}}function _i(e){let r=e.locator==null?e.url??"":_(e.locator);return`${e.kind} ${r}`.trim()}function Oi(e){return e.kind==="wrong-value"?{wrongValue:{entity:e.entity,field:e.field,key:e.key,snapshot:M(e.snapshot),sut:M(e.sut)}}:e.kind==="expected-change"?{expectedChange:{entity:e.entity,field:e.field,key:e.key,value:M(e.value)}}:e.kind==="singleton-mismatch"?{singletonMismatch:{singleton:e.singleton,snapshot:M(e.snapshot),sut:M(e.sut)}}:e.kind==="unexpected-row"?{unexpectedRow:{entity:e.entity,key:e.key}}:{missingRow:{entity:e.entity,key:e.key}}}function M(e){return e==null?null:String(e)}function Ni(e){return"message"in e?e.message:"detail"in e?e.detail:null}async function Ui({config:e,cwd:r,fixturesDir:n,headed:t,lockfile:o,runId:i,session:s,signal:c,test:u}){if(!await sa(e,i))return{kind:"dispatch-failed",reason:"already-claimed",runId:i};let f=Mn.join(r,".ripplo","debug"),g=[];return(await s.runOnce({capture:!0,lockfile:o,options:{baseUrl:e.appUrl,engineUrl:e.engineUrl,fixturesDir:n,generate:A,headed:t,secret:e.webhookSecret,tunnelAuth:e.tunnelAuth},params:void 0,runId:i,sequence:void 0,test:u,onEvent:R=>{g.push(R)}},c)).match(async R=>{await qi({config:e,debugDir:f,events:g,runId:i,test:u,total:R.ran.length});let je=_n(g).flatMap(Dn=>Dn.findings);return je.length>0?{findings:je,kind:"findings",runId:i}:{kind:"pass",runId:i}},async R=>(await Nn(e,i,Ue(R)),{error:R,kind:"error",runId:i}))}async function qi({config:e,debugDir:r,events:n,runId:t,test:o}){let i=_n(n),s=Bi(r,t);if(s==null)throw new Error("recording-missing");await Promise.all([Yi({aliases:[...zi(n),...Ji(i,o)],config:e,generated:Gi(n),generatedSingletons:Qi(n),origin:s.origin,records:i,rrwebEvents:s.events,runId:t,test:o}),ia(e,t,s)]),await aa(e,t,i)}function _n(e){return e.flatMap(r=>r.kind==="step"?[{annotations:r.annotations,endMs:r.endMs,findings:r.findings,index:r.index,startMs:r.startMs,state:r.state,url:r.url}]:[])}function Bi(e,r){let n=Mn.join(e,r,"behavior.jsonl");if(!Wi(n))return null;let t=Hi(n,"utf8").split(`
115
+ `).filter(i=>i.length>0).map(i=>Vi(i)).flatMap(i=>Ki(i)?[i.event]:[]),o=t[0];return o==null?null:{events:t,origin:o.timestamp}}function Vi(e){return JSON.parse(e)}function Ki(e){return typeof e=="object"&&e!=null&&Reflect.get(e,"kind")==="rrweb"}function zi(e){return e.flatMap(r=>r.kind==="world"?r.aliases:[])}function Ji(e,r){return e.flatMap(n=>{let t=Xi(r.steps[n.index]);return t.flatMap(o=>{let s=t.filter(u=>u.entity===o.entity).indexOf(o),c=n.state.rows.filter(u=>u.status==="created"&&u.entity===o.entity).at(s);return c==null?[]:[{alias:o.as,entity:o.entity,key:c.key}]})})}function Gi(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generated.map(n=>On(n)):[]))}function On({entity:e,field:r,key:n}){return`${e}\0${n}\0${r}`}function Qi(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generatedSingletons:[]))}function Xi(e){return e==null?[]:e.expect.flatMap(r=>Te(r))}function Te(e){return e.kind==="state"&&e.assertion.kind==="created"?[{as:e.assertion.as,entity:e.entity}]:e.kind==="and"?e.predicates.flatMap(r=>Te(r)):e.kind==="when"?e.branches.flatMap(r=>r.consequence.flatMap(n=>Te(n))):[]}async function Yi({aliases:e,config:r,generated:n,generatedSingletons:t,origin:o,records:i,rrwebEvents:s,runId:c,test:u}){let d=i.map(f=>na({aliases:e,generated:n,generatedSingletons:t,origin:o,record:f,rrwebEvents:s,test:u}));await y({config:r,document:ca,variables:{items:[{runId:c,steps:d}]}})}var Zi=3,ea=0;function ra({endMs:e,rrwebEvents:r,startMs:n}){let t=r.find(o=>o.type===Zi&&o.data?.source===ea&&o.timestamp>=n&&o.timestamp<=e);return t==null?n:t.timestamp}function na({aliases:e,generated:r,generatedSingletons:n,origin:t,record:o,rrwebEvents:i,test:s}){let c=s.steps[o.index];if(c==null)throw new Error("step-descriptor-missing");let u=He(c,o.index),d=ra({endMs:o.endMs,rrwebEvents:i,startMs:o.startMs}),f=o.annotations.map(p=>({kind:p.kind,label:p.label,outcome:p.outcome,recordingStartMs:Math.max(0,(p.kind==="action"?d:p.atMs)-t),rrwebIds:[...p.rrwebIds]})),g=o.annotations.find(p=>p.kind==="action")?.rrwebIds??[];return{annotations:f,detail:null,duration:Math.max(0,o.endMs-o.startMs),findings:o.findings.map(p=>Ln(p)),nodeType:u.kind,recordingEndMs:Math.max(0,o.endMs-t),recordingStartMs:Math.max(0,d-t),rrwebIds:[...g],snapshotTimestamp:Math.max(0,o.endMs-t),stateRows:o.state.rows.map(p=>ta({aliases:e,generated:r,row:p})),stateSingletons:o.state.singletons.map(p=>({changed:p.changed,generated:n.has(p.name),name:p.name,value:p.value==null?null:String(p.value)})),status:o.findings.length>0?"failed":"passed",stepIndex:o.index,title:jn(u),url:o.url}}function ta({aliases:e,generated:r,row:n}){let t=e.find(o=>o.entity===n.entity&&o.key===n.key);return{entity:n.entity,fields:n.fields.map(o=>({changed:o.changed,field:o.field,generated:r.has(On({entity:n.entity,field:o.field,key:n.key})),value:o.value==null?null:String(o.value)})),key:n.key,label:t?.alias??n.key,status:n.status}}var oa=$i(Di);async function Nn(e,r,n){await y({config:e,document:pa,variables:{reason:n,runId:r}}).catch(t=>{m.error(t,"failRun submission failed")})}async function ia(e,r,n){let t=n.events.map(s=>JSON.stringify(s)).join(`
116
+ `),o=await oa(Buffer.from(t,"utf8")),i=n.events.at(-1);await y({config:e,document:da,variables:{input:{bodyBase64:o.toString("base64"),chunkIndex:0,endTimestamp:Math.max(0,(i?.timestamp??n.origin)-n.origin),eventCount:n.events.length,runId:r,startTimestamp:0}}})}async function aa(e,r,n){let t=n.filter(s=>s.findings.length>0).length,o=n.length-t,i=n.reduce((s,c)=>s+Math.max(0,c.endMs-c.startMs),0);await y({config:e,document:ua,variables:{items:[{duration:i,failCount:t,passCount:o,runId:r,status:t>0?"failed":"passed",summary:null,warnCount:0}]}})}async function sa(e,r){return((await y({config:e,document:la,variables:{runIds:[r]}})).startRunsBatch??[]).some(t=>t.id===r)}var la=P(`
117
+ mutation StartRunsBatch($runIds: [String!]!) {
118
+ startRunsBatch(runIds: $runIds) {
119
+ id
120
+ }
121
+ }
122
+ `),ca=P(`
123
+ mutation SubmitRunStepsBatch($items: [SubmitRunStepsItem!]!) {
124
+ submitRunStepsBatch(items: $items)
125
+ }
126
+ `),da=P(`
127
+ mutation SubmitRunRecordingChunk($input: SubmitRunRecordingChunkInput!) {
128
+ submitRunRecordingChunk(input: $input)
129
+ }
130
+ `),ua=P(`
131
+ mutation CompleteRunsBatch($items: [CompleteRunItem!]!) {
132
+ completeRunsBatch(items: $items) {
133
+ id
134
+ status
135
+ }
136
+ }
137
+ `),pa=P(`
138
+ mutation FailRun($runId: String!, $reason: String!) {
139
+ failRun(runId: $runId, reason: $reason)
140
+ }
141
+ `),yd=P(`
142
+ mutation MarkRunArtifactsUploadedBatch($runIds: [String!]!) {
143
+ markRunArtifactsUploadedBatch(runIds: $runIds)
144
+ }
145
+ `);export{ha as a,Ea as b,V as c,Kn as d,K as e,de as f,v as g,at as h,L as i,w as j,za as k,G as l,Ya as m,Za as n,es as o,as as p,me as q,gr as r,kr as s,Ss as t,wr as u,he as v,ws as w,ee as x,fn as y,rc as z,nc as A,tc as B,Qo as C,fc as D,kc as E,mn as F,xc as G,Ac as H,Cc as I,Fc as J,xi as K,Zs as L,el as M,Fr as N,rl as O,nl as P,tl as Q,ol as R,il as S,al as T,Or as U,Nr as V,Dr as W,$r as X,Wr as Y,Hr as Z,Is as _,As as $,ke as aa,Cs as ba,Pr as ca,Bs as da,xe as ea,tn as fa,Vl as ga,Ui as ha,Nn as ia,Wc as ja,Hc as ka,qc as la,Bc as ma,Vc as na,Kc as oa,zc as pa,Jc as qa,Gc as ra,Qc as sa,Xc as ta,Yc as ua,Zc as va,ed as wa,zl as xa};