ripplo 0.7.21 → 0.7.23

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,206 @@
1
+ #!/usr/bin/env node
2
+ import{G as Qe,J as Xe,K as Ye,L as Ze,M as er,N as ae,O as D,P as H,Q as U,R as rr,T as nr,U as tr,V as or,W as ir,X as ar,Z as sr,_ as lr,a as We,b as O,e as qe,f as Be,h as N,i as Ve,j as Ke,k as h,l as ze,m as Je,n as C,o as A,p as Ge,s as R}from"./chunk-R7CQWEBF.js";import{b as Oe,d as m,e as y,g as Ne,h as S,i as De,j as He,k as Ue}from"./chunk-EVYYSTR7.js";import ur from"fs";import K from"path";import{config as Qn}from"dotenv";import{z as B}from"zod";import{err as Xn,ok as pr}from"neverthrow";import q from"fs";import ce from"path";import{err as se,ok as cr}from"neverthrow";import{z as W}from"zod";var Kn=ce.join(".ripplo","project.json"),le=[".env",".env.local"],zn=W.object({envFiles:W.array(W.string().min(1)).optional(),projectId:W.string().min(1)});function dr(e){return ce.join(e,Kn)}function de(e){let r=dr(e);return q.existsSync(r)?Jn(r).andThen(n=>{let t=zn.safeParse(n);return t.success?cr({envFiles:t.data.envFiles??le,projectId:t.data.projectId}):se({issues:t.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`),kind:"project-file-invalid",path:r})}):se({kind:"project-file-missing",path:r})}function ue(e){return de(e).match(r=>r,()=>{})}function Jn(e){try{return cr(JSON.parse(q.readFileSync(e,"utf8")))}catch(r){return se({issues:[r instanceof Error?r.message:String(r)],kind:"project-file-invalid",path:e})}}function La({cwd:e,envFiles:r,projectId:n}){let t=dr(e);q.mkdirSync(ce.dirname(t),{recursive:!0});let o={projectId:n};r!=null&&!Gn(r)&&(o.envFiles=[...r]),q.writeFileSync(t,JSON.stringify(o,null,2)+`
3
+ `)}function Gn(e){return e.length!==le.length?!1:e.every((r,n)=>r===le[n])}function Ua(e){let n=ue(e)?.envFiles??[".env",".env.local"],t=K.join(e,".ripplo");n.forEach(o=>{let i=K.resolve(t,o);ur.existsSync(i)&&Qn({override:!0,path:i,quiet:!0})}),V=void 0}var Yn=B.object({RIPPLO_APP_URL:B.url(),RIPPLO_ENGINE_URL:B.url(),RIPPLO_WEBHOOK_SECRET:B.string().min(1)}),V;function z(){return V!=null?pr(V):et().map(e=>(V=e,e))}function Zn(e){let n=ue(e)?.envFiles??[],t=K.join(e,".ripplo");return n.map(o=>K.resolve(t,o)).filter(o=>!ur.existsSync(o))}function et(){let e=Yn.safeParse(process.env);if(!e.success)return Xn({issues:e.error.issues.map(n=>`${n.path.join(".")}: ${n.message}`),kind:"env-invalid",missingEnvFiles:Zn(process.cwd())});let r=e.data;return pr({appUrl:r.RIPPLO_APP_URL,engineUrl:r.RIPPLO_ENGINE_URL,webhookSecret:r.RIPPLO_WEBHOOK_SECRET})}import{readFileSync as rt}from"fs";import{z as fr}from"zod";var nt=fr.object({version:fr.string()});function J(){let e=rt(new URL("../package.json",import.meta.url),"utf8");return nt.parse(JSON.parse(e)).version}import ge from"fs";import G from"path";import{createJiti as pt}from"jiti";import{err as L,ok as hr}from"neverthrow";import tt from"fs";import T from"path";import b from"typescript";function mr(e){let r=T.join(e,"index.ts"),n=at(e);tt.mkdirSync(T.dirname(n.tsBuildInfoFile??""),{recursive:!0});let t=b.createIncrementalCompilerHost(n),o=b.createIncrementalProgram({host:t,options:n,rootNames:[r]}),i=[...o.getSyntacticDiagnostics(),...o.getSemanticDiagnostics()];o.emit();let s=i.filter(d=>ot(d,e));if(s.length===0)return{diagnostics:[],ok:!0};let l={getCanonicalFileName:d=>d,getCurrentDirectory:()=>T.dirname(e),getNewLine:()=>`
4
+ `};return{diagnostics:b.formatDiagnosticsWithColorAndContext(s,l).split(`
5
+ `).filter(d=>d.length>0),ok:!1}}function ot(e,r){let n=e.file?.fileName;return n==null?!0:n.startsWith(r)}var it=T.join(".local","tsbuildinfo");function at(e){return{allowImportingTsExtensions:!0,allowJs:!1,esModuleInterop:!0,incremental:!0,module:b.ModuleKind.Preserve,moduleResolution:b.ModuleResolutionKind.Bundler,noEmit:!0,resolveJsonModule:!0,skipLibCheck:!0,strict:!1,target:b.ScriptTarget.ES2022,tsBuildInfoFile:T.join(e,it)}}import{createHash as st}from"crypto";import yr from"fs/promises";import pe from"path";import{err as v,ok as fe,Result as lt}from"neverthrow";var j=".ripplo/fixtures",me=10*1024*1024,ye=50*1024*1024;async function gr(e,r){let n=ct(r);if(n.length===0)return fe({});let t=pe.join(e,j),o=await Promise.all(n.map(i=>dt({fixturesRoot:t,name:i})));return lt.combine(o).andThen(ut)}function ct(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 dt({fixturesRoot:e,name:r}){if(r.includes("..")||pe.isAbsolute(r))return v({kind:"fixture-invalid-name",name:r});let n=pe.join(e,r),t=await yr.lstat(n).catch(()=>null);if(t==null)return v({kind:"fixture-missing",name:r,path:n});if(t.isSymbolicLink())return v({kind:"fixture-symlink",name:r});if(!t.isFile())return v({kind:"fixture-not-file",name:r});let o=await yr.readFile(n);if(o.byteLength>me)return v({kind:"fixture-too-large",name:r,size:o.byteLength});let i=st("sha256").update(o).digest("hex");return fe([r,{sha256:i,size:o.byteLength}])}function ut(e){let r=e.reduce((n,[,t])=>n+t.size,0);return r>ye?v({kind:"fixtures-total-too-large",total:r}):fe(Object.fromEntries(e))}var E=".ripplo/ripplo.lock",F;async function kr(e){let{result:r}=await he(e);return r}async function he(e){let r=mt(G.join(e,".ripplo"));if(F!=null&&F.fingerprint===r&&F.result.isOk())return{fingerprint:r,result:F.result};let n=await M(e);return F={fingerprint:r,result:n},{fingerprint:r,result:n}}async function M(e){let r=G.join(e,".ripplo"),n=G.join(r,"index.ts"),t=mr(r);return t.ok?(await yt(n)).andThen(s=>ht({entryPath:n,exported:s})).match(async s=>(await gr(e,s)).map(u=>({...s,fixtures:u})).mapErr(u=>({error:u,kind:"fixture-failed"})),s=>Promise.resolve(L(s))):L({diagnostics:t.diagnostics,kind:"typecheck-failed"})}var ft=new Set([".local","debug","node_modules"]);function mt(e){return Sr(e).toSorted((r,n)=>r.localeCompare(n)).join("|")}function Sr(e){return(ge.existsSync(e)?ge.readdirSync(e,{withFileTypes:!0}):[]).flatMap(n=>{if(ft.has(n.name))return[];let t=G.join(e,n.name);if(n.isDirectory())return Sr(t);let o=ge.statSync(t);return[`${t}:${String(o.mtimeMs)}:${String(o.size)}`]})}async function yt(e){try{let n=await pt(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 hr(t)}catch(r){return L({kind:"load-threw",message:gt(r)})}}function gt(e){return e instanceof Error?e.message:String(e)}function ht({entryPath:e,exported:r}){if(r==null||typeof r!="object"||!("lockfile"in r))return L({entryPath:e,kind:"not-ripplo"});let n=Be.safeParse(Reflect.get(r,"lockfile"));return n.success?hr(n.data):L({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 cs(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 X(e){return[`Compilation failed: ${kt(e)}`,w("create","DSL authoring + lint rules")].join(`
6
+ `)}function ms(){return`${E} is up to date`}function ys(e){return[`${E} is ${e==="missing"?"missing":"out of date"} \u2014 run \`npx ripplo compile\` and commit the result`,w("setup")].join(`
7
+ `)}function gs(){return`Wrote ${E}`}function kt(e){switch(e.kind){case"typecheck-failed":return["TypeScript errors in .ripplo/:",...Rr(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?):",...Rr(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 St(e.error)}}function Rr(e,r=8){return e.length<=r?e:[...e.slice(0,r),`\u2026 and ${String(e.length-r)} more`]}function St(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 ${Q(e.size)} \u2014 over the ${Q(me)} per-file limit.`;case"fixtures-total-too-large":return`Fixtures total ${Q(e.total)} \u2014 over the ${Q(ye)} limit.`}}function Q(e){return`${String(Math.round(e/(1024*1024)*10)/10)} MB`}var Y=class extends Error{failure;constructor(r){super(r.kind),this.name="CliError",this.failure=r}};function bs(e){return e instanceof Y?ke(e.failure):e instanceof Error?e.message:String(e)}function ke(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 Rt(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 X(e.error)}}function Rt(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 vt,ok as Et}from"neverthrow";import{z as Se}from"zod";var xt="https://ripplo.ai";function br(){return Er().RIPPLO_SERVER_URL}function vr(){return Er().RIPPLO_PROJECT_ID}var bt=Se.object({RIPPLO_PROJECT_ID:Se.string().min(1).optional(),RIPPLO_SERVER_URL:Se.string().min(1).default(xt)}),xr;function Er(){return xr??=bt.parse(process.env),xr}import wr from"fs";import Re from"path";function Pr(e){let r=wr.realpathSync(e),n=r,t=Re.dirname(n);for(;t!==n;){if(wr.existsSync(Re.join(n,".git")))return n;n=t,t=Re.dirname(n)}return r}function Ir(e){return de(e).andThen(r=>z().andThen(n=>{let t=br(),o=Ue(t);return o==null?vt({kind:"not-authenticated"}):Et({appUrl:n.appUrl,cwd:Pr(e),engineUrl:n.engineUrl,projectId:vr()??r.projectId,ripploServerUrl:t,token:o,tunnelAuth:void 0,webhookSecret:n.webhookSecret})}))}import Cr from"fs";import{checkSync as wt,lockSync as Pt}from"proper-lockfile";var It="dev.pid",Ar=15e3;function Tr(e){return S(e,It)}function jr(e){try{return wt(Tr(e),{realpath:!1,stale:Ar})}catch{return!1}}var xe=class extends Error{pid;cwd;constructor({cwd:r,pid:n}){super("dev-lock-held"),this.name="DevLockHeldError",this.pid=n,this.cwd=r}};function Ds({cwd:e,onCompromised:r}){Ne(e);let n=Tr(e),t=Ct({cwd:e,onCompromised:r,path:n});return Cr.writeFileSync(n,String(process.pid)),()=>{try{t()}catch{}}}function Ct({cwd:e,onCompromised:r,path:n}){try{return Pt(n,{realpath:!1,stale:Ar,onCompromised:()=>{r()}})}catch(t){throw At(t)?new xe({cwd:e,pid:Tt(n)}):t}}function At(e){if(!(e instanceof Error)||!("code"in e))return!1;let{code:r}=e;return r==="ELOCKED"}function Tt(e){try{let r=Cr.readFileSync(e,"utf8").trim(),n=Number.parseInt(r,10);return Number.isFinite(n)&&n>0?n:null}catch{return null}}import jt from"p-queue";var Ft=4,Lt={"p0-ui":3,"p1-cli":2,"p2-cover":1,"p3-explore":0},Z=new jt({concurrency:Ft}),k={headedActive:0,interactiveActive:0,interactiveQueued:0},Fr={current:null};function Ws({headed:e,task:r,workClass:n}){let t=Lt[n];return n==="p3-explore"?Z.add(r,{priority:t}):(k.interactiveQueued+=1,ee(),Z.add(()=>Mt({headed:e,task:r}),{priority:t}))}function qs(e){!Number.isFinite(e)||e<1||(Z.concurrency=Math.floor(e),ee())}function be(){return{active:k.interactiveActive,headedActive:k.headedActive,poolSize:Z.concurrency,queued:k.interactiveQueued}}function Bs(e){Fr.current=e}async function Mt({headed:e,task:r}){k.interactiveQueued-=1,k.interactiveActive+=1,k.headedActive+=e?1:0,ee();try{return await r()}finally{k.interactiveActive-=1,k.headedActive-=e?1:0,ee()}}function ee(){Fr.current?.()}import ve from"fs";import Ee from"path";function Lr(e){try{let r=$t(e);if(r==null)return;let n=Ee.join(r,"HEAD"),t=ve.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 $t(e){let r=Ee.join(e,".git");if(ve.statSync(r).isDirectory())return r;let t=ve.readFileSync(r,"utf8").trim(),o="gitdir:";if(!t.startsWith(o))return;let i=t.slice(o.length).trim();if(i.length!==0)return Ee.resolve(e,i)}import _t from"crypto";import{readFile as Mr}from"fs/promises";import $r from"path";import{graphql as Ot}from"gql.tada";import{err as Nt,ok as Dt}from"neverthrow";var Ht=Ot(`
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 il(e,r){let n=await M(e);if(n.isErr())return Nt({error:n.error,kind:"compilation-failed"});let t=await we({config:r,cwd:e,lockfile:n.value});return Dt({devSessionId:t.devSessionId,lockfile:n.value})}async function we(e){let r=Ve(e.lockfile);return Wt({config:e.config,cwd:e.cwd,fixtures:e.lockfile.fixtures,payload:r})}function Ut(e){return _t.createHash("sha256").update(JSON.stringify(e)).digest("hex")}async function Wt({config:e,cwd:r,fixtures:n,payload:t}){let o=Ut(t),i=Lr(r),s=await Bt(r),l=await qt(r,n),u=await m({config:e,document:Ht,variables:{branch:i??null,cwd:r,fixtures:l,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 qt(e,r){let n=Object.entries(r);return Promise.all(n.map(async([t,o])=>({contentBase64:(await Mr($r.join(e,j,t))).toString("base64"),sha256:o.sha256})))}async function Bt(e){try{return await Mr($r.join(e,E),"utf8")}catch{return null}}import{randomUUID as vo}from"crypto";import{createId as Eo}from"@paralleldrive/cuid2";import{CancellationTokenSource as wo,ResponseError as Po}from"vscode-jsonrpc/node";import{graphql as Vt}from"gql.tada";var Kt=Vt(`
43
+ mutation DaemonCreateRun(
44
+ $id: String
45
+ $workflowId: String!
46
+ $testId: String
47
+ $clientVersion: String
48
+ $executor: RunExecutor
49
+ $target: RunTarget
50
+ $lockfileHash: String
51
+ ) {
52
+ createRun(
53
+ id: $id
54
+ workflowId: $workflowId
55
+ testId: $testId
56
+ executor: $executor
57
+ target: $target
58
+ clientVersion: $clientVersion
59
+ lockfileHash: $lockfileHash
60
+ ) {
61
+ __typename
62
+ ... on MutationCreateRunSuccess {
63
+ data {
64
+ id
65
+ }
66
+ }
67
+ ... on LimitExceededError {
68
+ code
69
+ }
70
+ }
71
+ }
72
+ `);async function _r(e){try{let n=(await m({config:e.config,document:Kt,variables:zt(e)})).createRun;return n==null?re({detail:"create-run-null",type:"generic"}):n.__typename==="MutationCreateRunSuccess"?null:n.__typename==="LimitExceededError"?re({code:n.code,type:"limit"}):re({detail:n.__typename,type:"generic"})}catch(r){return Jt(r)}}function zt({executor:e,lockfileHash:r,runId:n,target:t}){return{clientVersion:J(),executor:e,id:n,lockfileHash:r,target:e==="cloud"?"tunnel":void 0,testId:t.testId,workflowId:t.workflowId}}function re(e){return{kind:"dispatch-error",reason:e}}function Jt(e){return e instanceof Oe?{detail:e.message,kind:"infra-error"}:re({detail:e instanceof Error?e.message:String(e),type:"generic"})}import{createMessageConnection as Gt,NotificationType as Or,RequestType as Nr,RequestType0 as Dr,SocketMessageReader as Qt,SocketMessageWriter as Xt}from"vscode-jsonrpc/node";import{z as a}from"zod";var Yt="daemon.sock",Zt="daemon.log";function ml(e){return S(e,Yt)}function yl(e){return S(e,Zt)}function Hr(e){return Gt(new Qt(e),new Xt(e))}var Ur=a.object({all:a.boolean(),headed:a.boolean(),tests:a.array(a.string())}),gl=a.object({jobId:a.string(),total:a.number()}),eo=a.enum(["holder","standby","off"]),ro=a.object({covered:a.number(),deferred:a.number(),findings:a.number(),saturated:a.boolean(),total:a.number()}),hl=a.object({active:a.number(),explorer:eo,exploring:a.number(),progress:ro,queued:a.number(),sseHealth:a.object({detail:a.string().optional(),ok:a.boolean()}).optional(),version:a.string().optional()}),no=a.enum(["MAX_RUNS","OVERAGE_CAP","MAX_AGENTS","MAX_CONCURRENT_RUNS","MAX_PROJECTS"]),to=a.discriminatedUnion("type",[a.object({code:no,type:a.literal("limit")}),a.object({detail:a.string(),type:a.literal("generic")})]),Pe=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({kind:a.literal("dispatch-error"),reason:to}),a.object({detail:a.string(),kind:a.literal("dispatch-timeout")}),a.object({detail:a.string(),kind:a.literal("infra-error")})]),oo=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:Pe,runId:a.string(),testName:a.string(),workflowName:a.string()})]),kl=a.object({event:oo,jobId:a.string()}),Sl=a.object({failed:a.number(),jobId:a.string(),notRun:a.number(),passed:a.number()}),Rl=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")})]),Wr=a.object({findingId:a.string().min(1)}),xl=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()})]),qr=new Nr("ripplo/exploreReplay"),Br=new Nr("ripplo/enqueue"),Vr=new Dr("ripplo/status"),Kr=new Dr("ripplo/shutdownIfIdle"),zr=new Or("ripplo/jobEvent"),Jr=new Or("ripplo/jobDone");import{graphql as io}from"gql.tada";async function Gr(e,r){let t=(await m({config:e,document:ao,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 ao=io(`
73
+ query DaemonWorkflows($projectId: String!, $cwd: String!) {
74
+ project(id: $projectId) {
75
+ id
76
+ devSession(cwd: $cwd) {
77
+ id
78
+ workflows {
79
+ id
80
+ slug
81
+ tests {
82
+ id
83
+ slug
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ `);import{CancellationTokenSource as so}from"vscode-jsonrpc/node";function Ie(e){return`${e.workflowSlug}/${e.testSlug}`}function Qr(e){let{headed:r,inflight:n,jobId:t,lockfileHashValue:o,onExpire:i,runId:s,selection:l,timeoutMs:u}=e,d=Ie(l),f=`${d}@${o}@${String(r)}`,p=n.get(f);if(p!=null)return p.jobIds.add(t),null;let g={cancellation:new so,claimed:!1,claimKey:d,headed:r,inflightKey:f,jobIds:new Set([t]),runId:s,testName:l.testName,timer:null,workflowName:l.workflowName};return g.timer=setTimeout(()=>{ne(n,g),i(g)},u),n.set(f,g),g}function ne(e,r){r.timer!=null&&(clearTimeout(r.timer),r.timer=null),e.delete(r.inflightKey)}function Ce(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 Xr(e,r){[...e.values()].filter(n=>n.jobIds.has(r)).forEach(n=>{n.jobIds.delete(r),n.jobIds.size===0&&(ne(e,n),n.cancellation.cancel())})}import{err as Ae,ok as Yr}from"neverthrow";function en({all:e,ids:r,lockfile:n}){if(e&&r.length>0)return Ae({kind:"conflicting-flags"});if(e)return Yr(n.workflows.filter(i=>!i.stub).flatMap(i=>i.tests.map(s=>C(s))));if(r.length===0)return Ae({kind:"nothing-selected"});let t=r.map(i=>({id:i,refs:co(n,i)})),o=t.filter(i=>i.refs.length===0).map(i=>i.id);return o.length>0?Ae({kind:"unknown-ids",known:lo(n),unknown:o}):Yr([...new Set(t.flatMap(i=>i.refs))])}function rn(e,r){let n=new Map(A(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 lo(e){return e.workflows.map(r=>h(r.name))}function co(e,r){let n=e.workflows.find(t=>t.name===r||h(t.name)===h(r));return n!=null?n.tests.map(t=>C(t)):A(e).filter(t=>t.ref===r||Zr(t.ref)===Zr(r)).map(t=>t.ref)}function Zr(e){let r=e.lastIndexOf("/");return r===-1?h(e):`${h(e.slice(0,r))}/${h(e.slice(r+1))}`}import{err as Te,ok as tn}from"neverthrow";import{graphql as on}from"gql.tada";import{execFileSync as uo}from"child_process";var po=256*1024*1024;function te(e,r){return uo("git",[...e],{cwd:r,encoding:"utf8",maxBuffer:po,stdio:["ignore","pipe","pipe"]})}async function an({config:e,cwd:r,lockfile:n}){await mo({config:e,cwd:r,lockfile:n});let t=await go(e);if(t.isErr())return Te(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 l=o.get(s);return l==null?[]:l.tests.map(u=>C(u))});return i.length===0?Te({kind:"scope-empty"}):tn(i)}var fo=on(`
90
+ mutation AddDirtyTestsToScope($projectId: String!, $cwd: String!, $workflowSlugs: [String!]!) {
91
+ addDirtyTestsToScope(projectId: $projectId, cwd: $cwd, workflowSlugs: $workflowSlugs) {
92
+ __typename
93
+ }
94
+ }
95
+ `);async function mo({config:e,cwd:r,lockfile:n}){let t=new Set(ho(r)),o=n.workflows.filter(i=>i.sourcePath!=null&&t.has(i.sourcePath)).map(i=>h(i.name));o.length!==0&&await m({config:e,document:fo,variables:{cwd:e.cwd,projectId:e.projectId,workflowSlugs:o}}).catch(i=>{y.warn({err:i},"auto-scope of dirty tests failed")})}var yo=on(`
96
+ query ScopeSelection($projectId: String!, $cwd: String!) {
97
+ project(id: $projectId) {
98
+ id
99
+ devSession(cwd: $cwd) {
100
+ id
101
+ scopeItems {
102
+ id
103
+ workflow {
104
+ id
105
+ slug
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+ `);async function go(e){try{let n=(await m({config:e,document:yo,variables:{cwd:e.cwd,projectId:e.projectId}})).project?.devSession?.scopeItems??[];return tn(n.flatMap(t=>t.workflow==null?[]:[t.workflow.slug]))}catch(r){return Te({detail:r instanceof Error?r.message:String(r),kind:"scope-fetch-failed"})}}var nn=".ripplo/workflows/";function ho(e){try{return te(["status","--porcelain","--",".ripplo/workflows"],e).split(`
112
+ `).map(r=>r.slice(3).trim()).filter(r=>r.startsWith(nn)&&r.endsWith(".ts")).map(r=>r.slice(nn.length)).filter(r=>r!=="index.ts"&&!r.endsWith("/index.ts"))}catch{return[]}}import{graphql as ko}from"gql.tada";var So=2e3,Ro=ko(`
113
+ query DaemonCloudRunStatus($runId: String!) {
114
+ run(id: $runId) {
115
+ status
116
+ failureReason
117
+ }
118
+ }
119
+ `);function ln({config:e,onComplete:r,onStarted:n,runId:t,signal:o}){let i=!1,s,l=!1,u=async()=>{if(i||o.aborted)return;let d=await xo(e,t).catch(()=>"unknown");if(!l&&(d==="running"||sn(d))&&(l=!0,n()),sn(d)){i=!0,r(bo(d));return}s=setTimeout(()=>{u()},So)};return u(),{stop:()=>{i=!0,s!=null&&clearTimeout(s)}}}async function xo(e,r){let t=(await m({config:e,document:Ro,variables:{runId:r}})).run?.status;return t??"unknown"}function sn(e){return e==="passed"||e==="failed"||e==="warning"||e==="cancelled"}function bo(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 Io=12e4,Co=-32099;function un(e){let r=new AbortController;return e.isCancellationRequested?(r.abort(),r.signal):(e.onCancellationRequested(()=>{r.abort()}),r.signal)}function ac(e){let r={...e,inflight:new Map,jobs:new Map};return{claim:n=>Lo(r,n),handleConnection:n=>{Ao(r,n)},idle:()=>pn(r)}}function Ao(e,r){let n=Hr(r);n.onRequest(Br,(t,o)=>To({connection:n,ctx:e,params:t,token:o})),n.onRequest(Vr,()=>{let t=be();return{active:t.active,queued:t.queued,sseHealth:e.sseHealth(),version:J(),...e.explorationStatus()}}),n.onRequest(qr,async(t,o)=>{let i=Wr.safeParse(t);return i.success?(await e.ready,e.replayFinding(i.data.findingId,un(o))):{kind:"error",reason:"bad-message"}}),n.onRequest(Kr,()=>{let t=pn(e);return t&&e.onShutdownRequest(),t}),n.onClose(()=>{jo(e,n)}),n.onError(t=>{y.warn({err:t},"ipc connection error")}),r.on("error",t=>{y.warn({err:t},"ipc socket error")}),n.listen()}function pn(e){let r=be();return e.jobs.size===0&&r.active===0&&r.queued===0}async function To({connection:e,ctx:r,params:n,token:t}){let o=Ur.safeParse(n);if(!o.success)throw cn({code:"bad-message"});await r.ready;let i=await $o({config:r.config,cwd:r.cwd,message:o.data});if(i.kind==="error")throw cn(i.error);let s=vo(),l=new wo;return t.onCancellationRequested(()=>{fn(r,s)}),r.jobs.set(s,{cancellation:l,connection:e,failed:0,notRun:0,passed:0,total:i.selections.length}),qo({ctx:r,headed:o.data.headed,jobId:s,lockfileHashValue:i.lockfileHashValue,selections:i.selections,targetsByClaimKey:i.targetsByClaimKey,token:l.token}).catch(u=>{y.error({err:u},"ipc dispatch failed")}),{jobId:s,total:i.selections.length}}function cn(e){return new Po(Co,e.code,e)}function fn(e,r){let n=e.jobs.get(r);n!=null&&(n.cancellation.cancel(),e.jobs.delete(r),Xr(e.inflight,r))}function jo(e,r){[...e.jobs.entries()].filter(([,n])=>n.connection===r).forEach(([n])=>{fn(e,n)})}function mn(e,r,n){let t=e.jobs.get(r);t!=null&&(dn(()=>t.connection.sendNotification(zr,{event:n,jobId:r})),n.kind==="test-outcome"&&(Fo(t,n.outcome.kind),t.passed+t.failed+t.notRun>=t.total&&(dn(()=>t.connection.sendNotification(Jr,{failed:t.failed,jobId:r,notRun:t.notRun,passed:t.passed})),e.jobs.delete(r))))}function dn(e){e().catch(r=>{y.warn({err:r},"ipc notification failed")})}function Fo(e,r){if(r==="pass"){e.passed+=1;return}if(r==="dispatch-error"||r==="dispatch-timeout"||r==="infra-error"){e.notRun+=1;return}e.failed+=1}function P(e,r,n){r.jobIds.forEach(t=>{mn(e,t,n)})}function Lo(e,r){let n=Ce(e.inflight,r);return n==null?null:{headed:n.headed,token:n.cancellation.token,finished:(t,o)=>{e.inflight.delete(n.inflightKey),P(e,n,{kind:"test-outcome",outcome:o,runId:n.runId,testName:n.testName,workflowName:n.workflowName})},started:()=>{P(e,n,{kind:"test-started",runId:n.runId,testName:n.testName,workflowName:n.workflowName})}}}function Mo(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 $o({config:e,cwd:r,message:n}){return(await kr(r)).match(o=>_o({config:e,cwd:r,lockfile:o,message:n}),o=>Promise.resolve({error:{code:"compile-failed",detail:o.kind,diagnostics:[...Mo(o)]},kind:"error"}))}async function _o({config:e,cwd:r,lockfile:n,message:t}){let o=await No(e.appUrl);if(o!=null)return{error:{code:"app-unreachable",detail:o,url:e.appUrl},kind:"error"};let i=await Do({config:e,cwd:r,lockfile:n});return i!=null?{error:{code:"sync-failed",detail:i},kind:"error"}:(await Ho({config:e,cwd:r,lockfile:n,message:t})).match(async l=>({kind:"ready",lockfileHashValue:N(n),selections:rn(n,l),targetsByClaimKey:await Gr(e,r)}),l=>Promise.resolve({error:l,kind:"error"}))}var Oo=2e3;async function No(e){try{return await fetch(e,{method:"HEAD",signal:AbortSignal.timeout(Oo)}),null}catch(r){return r instanceof Error?r.message:String(r)}}async function Do(e){try{return await we(e),null}catch(r){return r instanceof Error?r.message:String(r)}}async function Ho({config:e,cwd:r,lockfile:n,message:t}){return!t.all&&t.tests.length===0?(await an({config:e,cwd:r,lockfile:n})).mapErr(Uo):en({all:t.all,ids:t.tests,lockfile:n}).mapErr(Wo)}function Uo(e){return e.kind==="scope-empty"?{code:"selection-nothing-selected"}:{code:"scope-failed",detail:e.detail}}function Wo(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 qo(e){await e.selections.reduce((r,n)=>r.then(()=>Bo(e,n)),Promise.resolve())}async function Bo(e,r){let{ctx:n,headed:t,jobId:o,lockfileHashValue:i,targetsByClaimKey:s,token:l}=e;if(l.isCancellationRequested)return;let u=Ie(r),d=s.get(u);if(d==null){mn(n,o,{kind:"test-outcome",outcome:{kind:"dispatch-error",reason:{detail:"test-not-found",type:"generic"}},runId:"",testName:r.testName,workflowName:r.workflowName});return}let f=Qr({headed:t,inflight:n.inflight,jobId:o,lockfileHashValue:i,runId:Eo(),selection:r,timeoutMs:Io,onExpire:g=>{P(n,g,{kind:"test-outcome",outcome:{detail:"dispatch-timeout",kind:"dispatch-timeout"},runId:"",testName:g.testName,workflowName:g.workflowName})}});if(f==null)return;let p=await Vo(n,d,f.runId,i);if(p!=null){ne(n.inflight,f),P(n,f,{kind:"test-outcome",outcome:p,runId:"",testName:r.testName,workflowName:r.workflowName});return}n.executor==="cloud"&&Ko(n,f)}function Vo(e,r,n,t){return _r({config:e.config,executor:e.executor,lockfileHash:t,runId:n,target:r})}function Ko(e,r){let n=Ce(e.inflight,r.runId);n!=null&&ln({config:e.config,runId:n.runId,signal:un(n.cancellation.token),onComplete:t=>{e.inflight.delete(n.inflightKey),P(e,n,{kind:"test-outcome",outcome:t,runId:n.runId,testName:n.testName,workflowName:n.workflowName})},onStarted:()=>{P(e,n,{kind:"test-started",runId:n.runId,testName:n.testName,workflowName:n.workflowName})}})}function zo(e){let{backoffActive:r,explorerHolder:n,headedActive:t,interactiveActive:o,interactiveQueued:i}=e,{explorationActive:s,exploreConcurrency:l,poolSize:u}=e;if(!n||t||i>0)return{abortCount:s,refillCount:0};if(r)return{abortCount:0,refillCount:0};let d=Math.min(l,u-1,u-o);return{abortCount:0,refillCount:Math.max(0,d-s)}}function lc(e){let r={active:new Map,backoffUntil:0,cancelBackoffTimer:null,cancelHeartbeat:null,holder:!1,prevInteractiveActive:e.probe().interactiveActive,stopped:!1};return hn(r,e),{explorationActive:()=>r.active.size,explorerHolder:()=>r.holder,notifyQueueChange:()=>{Jo(r,e)},setExplorerHolder:n=>{r.holder=n,$(r,e)},stop:()=>{r.stopped=!0,r.cancelBackoffTimer?.(),r.cancelBackoffTimer=null,r.cancelHeartbeat?.(),r.cancelHeartbeat=null,kn(r,r.active.size)}}}function hn(e,r){e.stopped||(e.cancelHeartbeat=r.setTimer(()=>{$(e,r),hn(e,r)},15e3))}function $(e,r){if(e.stopped)return;let n=r.probe(),t=zo({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});kn(e,t.abortCount),Sn({count:t.refillCount,params:r,state:e})}function kn(e,r){[...e.active.values()].slice(0,r).forEach(({controller:n})=>{n.abort()})}function Jo(e,r){let n=r.probe();n.interactiveActive<e.prevInteractiveActive&&Go(e,r),e.prevInteractiveActive=n.interactiveActive,$(e,r)}function Go(e,r){e.backoffUntil=r.now()+3e4,e.cancelBackoffTimer?.(),e.cancelBackoffTimer=r.setTimer(()=>{e.cancelBackoffTimer=null,$(e,r)},3e4)}function Sn({count:e,params:r,state:n}){if(e<=0)return;let t=Qo(r.sources);t!=null&&(Xo({params:r,pulled:t,state:n}),Sn({count:e-1,params:r,state:n}))}function Qo(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 Xo({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(()=>{gn({job:t,outcome:yn(i.signal,null),params:e,source:o,state:n})}).catch(s=>{gn({job:t,outcome:yn(i.signal,{error:s}),params:e,source:o,state:n})})}function yn(e,r){return e.aborted?{kind:"aborted"}:r==null?{kind:"completed"}:{error:r.error,kind:"error"}}function gn({job:e,outcome:r,params:n,source:t,state:o}){o.active.delete(e.id),t.onResult(e,r),$(o,n)}import Yo from"fs";import Zo from"path";async function gc(e){let r=Zo.join(e,".ripplo","index.ts");if(!Yo.existsSync(r))return{appUrl:void 0,engineUrl:void 0,errors:[{message:".ripplo/index.ts not found",path:""}],valid:!1,warnings:[]};let n=await M(e);return n.isErr()?{appUrl:void 0,engineUrl:void 0,errors:[{message:X(n.error),path:".ripplo/"}],valid:!1,warnings:[]}:z().match(t=>({appUrl:t.appUrl,engineUrl:t.engineUrl,errors:[],valid:!0,warnings:[]}),t=>({appUrl:void 0,engineUrl:void 0,errors:[{message:ke(t),path:""}],valid:!1,warnings:[]}))}async function hc(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 kc({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 ti from"fs";import ei from"fs";import je from"path";var ri=["MERGE_HEAD","rebase-merge","rebase-apply","CHERRY_PICK_HEAD","REVERT_HEAD"];function Rn(e){let r=ni(e);return r==null?!1:ri.some(n=>ei.existsSync(je.join(r,n)))}function ni(e){try{let r=te(["rev-parse","--git-dir"],e).trim();return r.length===0?null:je.isAbsolute(r)?r:je.resolve(e,r)}catch{return null}}function oi(e){return S(e,"hooks-paused")}function Cc(e){return ti.existsSync(oi(e))||Rn(e)?!1:jr(e)}import{graphql as ie}from"gql.tada";import{gzip as pi}from"zlib";import{promisify as fi}from"util";import{existsSync as En,readFileSync as wn}from"fs";import Le from"path";import{graphql as x}from"gql.tada";function xn(e){return[e.kind,e.target,e.value].filter(r=>r.length>0).join(" ")}var ii={"no-effect":"noEffect","required-state-unsatisfied":"requiredStateUnsatisfied",unresolvable:"unresolvable"},ai={"data-rule":"dataRule","page-rule":"pageRule",step:"step"},si={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 bn(e){return e.kind==="consistency"?{consistency:{mismatch:di(e.mismatch),pending:e.pending}}:e.kind==="pending-check"?{pendingCheck:{budget:e.budget,source:ai[e.source.kind],...li(e.source)}}:e.kind==="unrunnable"?{unrunnable:{reason:ii[e.reason]}}:e.kind==="driver-error"?{driverError:{errorKind:si[e.error.kind],message:ui(e.error)}}:{impossibleAction:{subject:ci(e.step.action)}}}function li(e){return"check"in e?vn(e.check,!1):{checkKind:void 0,expected:void 0,negated:void 0,subject:void 0}}function vn(e,r){return e.kind==="not"?vn(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:O(e.locator)}:{checkKind:e.kind,expected:void 0,negated:r,subject:O(e.locator)}}function ci(e){let r=e.locator==null?e.url??"":O(e.locator);return`${e.kind} ${r}`.trim()}function di(e){return e.kind==="wrong-value"?{wrongValue:{entity:e.entity,field:e.field,key:e.key,snapshot:_(e.snapshot),sut:_(e.sut)}}:e.kind==="expected-change"?{expectedChange:{entity:e.entity,field:e.field,key:e.key,value:_(e.value)}}:e.kind==="singleton-mismatch"?{singletonMismatch:{singleton:e.singleton,snapshot:_(e.snapshot),sut:_(e.sut)}}:e.kind==="unexpected-row"?{unexpectedRow:{entity:e.entity,key:e.key}}:{missingRow:{entity:e.entity,key:e.key}}}function _(e){return e==null?null:String(e)}function ui(e){return"message"in e?e.message:"detail"in e?e.detail:null}async function mi({config:e,cwd:r,fixturesDir:n,headed:t,lockfile:o,runId:i,session:s,signal:l,test:u}){if(!await $i(e,i))return{kind:"dispatch-failed",reason:"already-claimed",runId:i};let f=Le.join(r,".ripplo","debug"),p=[];return(await s.runOnce({capture:!0,lockfile:o,options:{baseUrl:e.appUrl,engineUrl:e.engineUrl,fixturesDir:n,generate:R,headed:t,secret:e.webhookSecret,tunnelAuth:e.tunnelAuth},params:void 0,runId:i,sequence:void 0,test:u,onEvent:I=>{p.push(I)}},l)).match(async I=>{await oe({config:e,debugDir:f,events:p,recordingOptional:!1,runId:i,stepSources:void 0});let _e=Pn(p).flatMap(Vn=>Vn.findings);return _e.length>0?{findings:_e,kind:"findings",runId:i}:{kind:"pass",runId:i}},async I=>(await Cn(e,i,ze(I)),{error:I,kind:"error",runId:i}))}async function oe({config:e,debugDir:r,events:n,recordingOptional:t,runId:o,stepSources:i}){let s=Pn(n),l=ki(r,o);if(l==null&&!t)throw new Error("recording-missing");await Pi({aliases:[...xi(n),...bi(s)],config:e,generated:vi(n),generatedSingletons:Ei(n),origin:l==null?hi(s):l.origin,records:s,rrwebEvents:l==null?[]:l.events,runId:o,stepSources:i}),l!=null&&await Li(e,o,l),await Mi(e,o,s),await gi(e,r,o)}var yi=x(`
120
+ mutation ClipUploadUrl($runId: ID!) {
121
+ clipUploadUrl(runId: $runId)
122
+ }
123
+ `);async function gi(e,r,n){let t=Le.join(r,n,"clip.gif");if(En(t))try{let o=await m({config:e,document:yi,variables:{runId:n}});if(o.clipUploadUrl==null)return;let i=await fetch(o.clipUploadUrl,{body:new Uint8Array(wn(t)),headers:{"Content-Type":"image/gif"},method:"PUT"});i.ok||y.warn({runId:n,status:i.status},"Clip upload failed")}catch(o){y.warn({err:o,runId:n},"Clip upload skipped")}}function hi(e){return e.reduce((r,n)=>Math.min(r,n.startMs),e[0]?.startMs??0)}function Pn(e){return e.flatMap(r=>r.kind==="step"?[{annotations:r.annotations,endMs:r.endMs,findings:r.findings,index:r.index,source:r.source,startMs:r.startMs,state:r.state,url:r.url}]:[])}function ki(e,r){let n=Le.join(e,r,"behavior.jsonl");if(!En(n))return null;let t=wn(n,"utf8").split(`
124
+ `).filter(i=>i.length>0).map(i=>Si(i)).flatMap(i=>Ri(i)?[i.event]:[]),o=t[0];return o==null?null:{events:t,origin:o.timestamp}}function Si(e){return JSON.parse(e)}function Ri(e){return typeof e=="object"&&e!=null&&Reflect.get(e,"kind")==="rrweb"}function xi(e){return e.flatMap(r=>r.kind==="world"?r.aliases:[])}function bi(e){return e.flatMap(r=>{let n=wi(r.source);return n.flatMap(t=>{let i=n.filter(l=>l.entity===t.entity).indexOf(t),s=r.state.rows.filter(l=>l.status==="created"&&l.entity===t.entity).at(i);return s==null?[]:[{alias:t.as,entity:t.entity,key:s.key}]})})}function vi(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generated.map(n=>In(n)):[]))}function In({entity:e,field:r,key:n}){return`${e}\0${n}\0${r}`}function Ei(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generatedSingletons:[]))}function wi(e){return e==null?[]:e.expect.flatMap(r=>Fe(r))}function Fe(e){return e.kind==="state"&&e.assertion.kind==="created"?[{as:e.assertion.as,entity:e.entity}]:e.kind==="and"?e.predicates.flatMap(r=>Fe(r)):e.kind==="when"?e.branches.flatMap(r=>r.consequence.flatMap(n=>Fe(n))):[]}async function Pi({aliases:e,config:r,generated:n,generatedSingletons:t,origin:o,records:i,rrwebEvents:s,runId:l,stepSources:u}){let d=i.map((f,p)=>Ti({aliases:e,generated:n,generatedSingletons:t,origin:o,record:f,rrwebEvents:s,sourceTest:u?.[p]??null}));await m({config:r,document:Oi,variables:{items:[{runId:l,steps:d}]}})}var Ii=3,Ci=0;function Ai({endMs:e,rrwebEvents:r,startMs:n}){let t=r.find(o=>o.type===Ii&&o.data?.source===Ci&&o.timestamp>=n&&o.timestamp<=e);return t==null?n:t.timestamp}function Ti({aliases:e,generated:r,generatedSingletons:n,origin:t,record:o,rrwebEvents:i,sourceTest:s}){let l=Ke(o.source,o.index),u=Ai({endMs:o.endMs,rrwebEvents:i,startMs:o.startMs}),d=o.annotations.map(p=>({kind:p.kind,label:p.label,outcome:p.outcome,recordingStartMs:Math.max(0,(p.kind==="action"?u:p.atMs)-t),rrwebIds:[...p.rrwebIds]})),f=o.annotations.find(p=>p.kind==="action")?.rrwebIds??[];return{annotations:d,detail:null,duration:Math.max(0,o.endMs-o.startMs),findings:o.findings.map(p=>bn(p)),nodeType:l.kind,recordingEndMs:Math.max(0,o.endMs-t),recordingStartMs:Math.max(0,u-t),rrwebIds:[...f],snapshotTimestamp:Math.max(0,o.endMs-t),sourceTest:s,stateRows:o.state.rows.map(p=>ji({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:xn(l),url:o.url}}function ji({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(In({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 Fi=fi(pi);async function Cn(e,r,n){await m({config:e,document:Hi,variables:{reason:n,runId:r}}).catch(t=>{y.error(t,"failRun submission failed")})}async function Li(e,r,n){let t=n.events.map(s=>JSON.stringify(s)).join(`
125
+ `),o=await Fi(Buffer.from(t,"utf8")),i=n.events.at(-1);await m({config:e,document:Ni,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 Mi(e,r,n){let t=n.filter(s=>s.findings.length>0).length,o=n.length-t,i=n.reduce((s,l)=>s+Math.max(0,l.endMs-l.startMs),0);await m({config:e,document:Di,variables:{items:[{duration:i,failCount:t,passCount:o,runId:r,status:t>0?"failed":"passed",summary:null,warnCount:0}]}})}async function $i(e,r){return((await m({config:e,document:_i,variables:{runIds:[r]}})).startRunsBatch??[]).some(t=>t.id===r)}var _i=x(`
126
+ mutation StartRunsBatch($runIds: [String!]!) {
127
+ startRunsBatch(runIds: $runIds) {
128
+ id
129
+ }
130
+ }
131
+ `),Oi=x(`
132
+ mutation SubmitRunStepsBatch($items: [SubmitRunStepsItem!]!) {
133
+ submitRunStepsBatch(items: $items)
134
+ }
135
+ `),Ni=x(`
136
+ mutation SubmitRunRecordingChunk($input: SubmitRunRecordingChunkInput!) {
137
+ submitRunRecordingChunk(input: $input)
138
+ }
139
+ `),Di=x(`
140
+ mutation CompleteRunsBatch($items: [CompleteRunItem!]!) {
141
+ completeRunsBatch(items: $items) {
142
+ id
143
+ status
144
+ }
145
+ }
146
+ `),Hi=x(`
147
+ mutation FailRun($runId: String!, $reason: String!) {
148
+ failRun(runId: $runId, reason: $reason)
149
+ }
150
+ `),qc=x(`
151
+ mutation MarkRunArtifactsUploadedBatch($runIds: [String!]!) {
152
+ markRunArtifactsUploadedBatch(runIds: $runIds)
153
+ }
154
+ `);async function Ui({baseState:e,branchName:r,category:n,commitSha:t,config:o,debugDir:i,devSessionId:s,events:l,lockfileHash:u,runId:d,signature:f,spec:p,stepSources:g}){await m({config:o,document:qi,variables:{branchName:r??null,commitSha:t??null,devSessionId:s??null,lockfileHash:u??null,projectId:o.projectId,runId:d,spec:p??null}}),await oe({config:o,debugDir:i,events:l,recordingOptional:!0,runId:d,stepSources:g}),await m({config:o,document:Bi,variables:{baseState:e,category:n,projectId:o.projectId,reproRunId:d,signature:f}})}async function Wi(e,r,n){await m({config:e,document:Vi,variables:{projectId:e.projectId,signature:r,status:n}})}var qi=ie(`
155
+ mutation CreateExploreRun(
156
+ $projectId: String!
157
+ $runId: String!
158
+ $devSessionId: String
159
+ $branchName: String
160
+ $commitSha: String
161
+ $lockfileHash: String
162
+ $spec: String
163
+ ) {
164
+ createExploreRun(
165
+ projectId: $projectId
166
+ runId: $runId
167
+ devSessionId: $devSessionId
168
+ branchName: $branchName
169
+ commitSha: $commitSha
170
+ lockfileHash: $lockfileHash
171
+ spec: $spec
172
+ ) {
173
+ id
174
+ }
175
+ }
176
+ `),Bi=ie(`
177
+ mutation SubmitExploreFinding(
178
+ $projectId: String!
179
+ $signature: String!
180
+ $baseState: String!
181
+ $category: ExploreFindingCategory!
182
+ $reproRunId: String!
183
+ ) {
184
+ submitExploreFinding(
185
+ projectId: $projectId
186
+ signature: $signature
187
+ baseState: $baseState
188
+ category: $category
189
+ reproRunId: $reproRunId
190
+ ) {
191
+ id
192
+ }
193
+ }
194
+ `),Vi=ie(`
195
+ mutation SetExploreFindingStatus(
196
+ $projectId: String!
197
+ $signature: String!
198
+ $status: ExploreFindingStatus!
199
+ ) {
200
+ setExploreFindingStatus(projectId: $projectId, signature: $signature, status: $status)
201
+ }
202
+ `),Jc=ie(`
203
+ query ExploreFindingExists($projectId: String!, $signature: String!, $lockfileHash: String!) {
204
+ exploreFindingExists(projectId: $projectId, signature: $signature, lockfileHash: $lockfileHash)
205
+ }
206
+ `);import Ki from"fs";import{lockSync as zi}from"proper-lockfile";var Ji="explorer.lock",Gi=15e3,Qi=15e3;function Xi(){return He(Ji)}function od({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=Yi(n);i!=null&&(r.release=i,e(!0))};t();let o=setInterval(t,Qi);return{holder:()=>r.release!=null,stop:()=>{r.stopped=!0,clearInterval(o),r.release?.(),r.release=null}}}function Yi(e){try{De();let r=Xi(),n=zi(r,{onCompromised:e,realpath:!1,stale:Gi});return Ki.writeFileSync(r,String(process.pid)),()=>{try{n()}catch{}}}catch{return null}}import Zi from"path";import{randomUUID as ea}from"crypto";function An(e){return{axes:[Ye("unit"),Ze(e)]}}var Tn=12,jn=15,Fn=4,Ln=2;var _n={covered:0,deferred:0,findings:0,saturated:!1,total:0};function fd(){return{priority:"p3",next:()=>null,onResult:()=>{},ready:()=>Promise.resolve(),status:()=>_n,stop:()=>Promise.resolve()}}function md(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=Me(e,r);return{priority:"p3",next:()=>aa(e,r),onResult:()=>{},ready:()=>n,status:()=>r.prepared==null?_n:oa(r.prepared,r),stop:()=>Promise.resolve()}}async function Me(e,r){if(!r.preparing){r.preparing=!0;try{let n=await e.loadLockfile();if(n==null)return;let t=await ra(n);if(t==null)return;await U(On(e.cwd)).match(o=>{let i=H(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=>{y.warn("explore findings log unreadable, exploration disabled: %s",o.kind)})}finally{r.preparing=!1}}}async function ra({fingerprint:e,lockfile:r}){let n=An(r),t=Ge(r);if(t.length===0)return null;let o=sr(r,{sweep:!1}),i=await na(r,o),s=tr({baseStates:i,corpus:t,lens:n,maxCount:Ln,maxDepth:Fn});return{actionHashes:t.map(l=>nr(r,l)),baseStates:o,corpus:t,fingerprint:e,graph:s,lens:n,lensIdValue:Xe(n),lockfile:r,lockfileHashValue:N(r)}}async function na(e,r){let n={generate:R,materialize:Je(R,e.valueSpaces),params:void 0};return(await Promise.all(r.map(async o=>(await lr(e,o,n)).match(s=>({name:o.name,snapshot:s.snapshot}),()=>null)))).flatMap(o=>o==null?[]:[o])}var Mn=20,ta=6e5,$n=3e5;function oa(e,r){let n=ir(e.graph),t=or({actionHashes:e.actionHashes,corpus:e.corpus,covered:r.covered,graph:e.graph,lensId:e.lensIdValue,tick:r.tick});return{covered:n-t,deferred:Dn(r).size,findings:r.findings,saturated:r.saturated,total:n}}async function ia(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;y.info("workflow definitions changed, re-preparing exploration targets"),r.prepared=null,await Me(e,r)}finally{r.refreshing=!1}}}function aa(e,r){ia(e,r);let n=r.prepared;if(n==null||Date.now()<r.haltedUntil)return null;let t=ar({actionHashes:n.actionHashes,corpus:n.corpus,covered:new Set([...r.covered,...r.claimed,...Dn(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=ma(n,t.target);return r.claimed.add(o),{id:`explore:${ea()}`,label:t.target.targetKey,run:i=>sa({choice:t.target,key:o,params:e,prepared:n,signal:i,state:r})}}async function sa({choice:e,key:r,params:n,prepared:t,signal:o,state:i}){try{let s=ca({choice:e,params:n,prepared:t});if(s==null)return;if(!await n.probeApp()){Nn(i,"app-unreachable");return}let l=await n.executeTrail(s,o);if(l.kind==="aborted")return;if(l.kind==="error"){ua({key:r,params:n,reason:l.reason,state:i});return}i.consecutiveErrors=0,y.info("exploration trail %s: %s @ %s",l.kind,l.trail.map(u=>u.label).join(" -> "),e.targetKey.slice(0,80)),n.onTrailDone?.({kind:l.kind,label:e.targetKey,trail:l.trail}),await da({outcome:la(l,e,t),params:n,state:i})}finally{i.claimed.delete(r)}}function la(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 ca({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??Tn,shrinkBudget:jn,stepRuns:e.witness.trail.map(o=>({idx:o.idx,params:o.params}))}}async function da({outcome:e,params:r,state:n}){let t=e.rows.filter(o=>o.kind!=="covered"||!n.covered.has(D(o)));t.forEach(o=>{(o.kind==="covered"||o.kind==="finding"||o.kind==="flaky-candidate")&&n.covered.add(D(o))}),e.kind==="finding"&&(n.findings+=1,y.info("exploration finding recorded")),t.length!==0&&await rr(On(r.cwd),t).match(()=>{},o=>{y.warn("explore findings log append failed: %s",o.kind)})}function On(e){return Zi.join(e,".ripplo",".local","explore-ledger.jsonl")}function ua({key:e,params:r,reason:n,state:t}){if(n==="lockfile:fingerprint-mismatch"){pa(r,t);return}fa(t,e),Nn(t,n)}function pa(e,r){r.preparing||(r.prepared=null,Me(e,r))}function fa(e,r){e.deferred.set(r,Date.now()+ta)}function Nn(e,r){e.consecutiveErrors+=1,y.debug("exploration trail error: %s",r),e.consecutiveErrors>=Mn&&(e.haltedUntil=Date.now()+$n,e.consecutiveErrors=0,y.warn("exploration cooling down for %ds after %d consecutive trail errors (last: %s)",$n/1e3,Mn,r))}function Dn(e){let r=Date.now();return[...e.deferred].filter(([,n])=>n<=r).forEach(([n])=>e.deferred.delete(n)),new Set(e.deferred.keys())}function ma(e,r){return D({actionHash:r.actionHash,lensId:e.lensIdValue,targetKey:r.targetKey})}import ya from"path";var ga=3;function kd(e){return U(ha(e)).map(r=>ka(H(r)))}function ha(e){return ya.join(e,".ripplo",".local","explore-ledger.jsonl")}function ka(e){let r=[...e.findings.entries()].filter(([,t])=>t.resolvedAt==null).map(([t,o])=>Sa(t,o)).toSorted(xa),n=[...e.flaky.entries()].filter(([,t])=>t.occurrences>=ga).map(([t,o])=>Ra(t,o)).toSorted((t,o)=>o.occurrences-t.occurrences);return{pending:r,recurrentFlaky:n}}function Sa(e,r){let n=r.latest;return{baseState:n.baseState,evidence:n.evidence,firstSeen:r.first.at,id:ae(e),lastSeen:n.at,occurrences:r.occurrences,parts:n.parts,runId:n.runId,trail:n.trail,verifierLayer:n.verifierLayer}}function Ra(e,r){return{at:r.first.at,baseState:r.first.baseState,id:ae(e),occurrences:r.occurrences,trail:r.first.trail}}var Hn={crash:0,"data-rule":1,frame:3,"page-rule":2};function xa(e,r){let n=Hn[e.verifierLayer]-Hn[r.verifierLayer];return n===0?r.occurrences-e.occurrences:n}import{createMessageConnection as Un,IPCMessageReader as Wn,IPCMessageWriter as qn,NotificationType as ba,NotificationType0 as Bn,RequestType as $e}from"vscode-jsonrpc/node";import{z as c}from"zod";var wd=c.object({headed:c.boolean(),lockfileFingerprint:c.string(),runId:c.string().min(1),testRef:c.string().min(1)}),Pd=c.object({fingerprint:c.string()}),Id=c.object({lockfileJson:c.string().optional(),unavailable:c.string().optional()}),va=c.enum(["unspecified","internal","server","client","producer","consumer"]),Ea=c.enum(["unset","ok","error"]),wa=c.object({attributes:c.record(c.string(),c.string()),durationMs:c.number(),kind:c.literal("span"),name:c.string(),parentSpanId:c.union([c.string(),c.undefined()]),source:c.literal("server"),spanId:c.string(),spanKind:va,status:c.object({code:Ea,message:c.union([c.string(),c.undefined()])}),timeNanos:c.string(),traceId:c.string()}),Cd=c.object({runId:c.string().min(1),span:wa}),Ad=c.object({outcome:Pe,serverNotified:c.boolean()}),Td=c.object({baseStateTest:qe,lensId:c.string().min(1),lockfileFingerprint:c.string(),lockfileHash:c.string().min(1),maxLength:c.number().int().positive(),shrinkBudget:c.number().int().nonnegative(),stepRuns:c.array(c.object({idx:c.number().int().nonnegative(),params:c.record(c.string(),c.union([We,c.null()]))}))}),Pa=c.object({actions:c.array(c.string()),label:c.string().min(1)}),jd=c.object({kind:c.enum(["aborted","clean","error","flaky","finding"]),reason:c.string().optional(),rows:c.array(er),trail:c.array(Pa).default([])}),Fd=new Bn("worker/ready"),Ld=new $e("worker/run"),Md=new $e("worker/lockfile"),$d=new $e("worker/exploreTrail"),_d=new ba("worker/span"),Od=new Bn("worker/shutdown");function Nd(e){let r=Un(new Wn(e),new qn(e));return r.listen(),r}function Dd(){let e=Un(new Wn(process),new qn(process));return e.listen(),e}import Ia from"path";import{randomUUID as Ca}from"crypto";async function zd({cwd:e,ref:r,signal:n,step:t}){let o=Ir(e).match(f=>({config:f}),f=>({failure:f}));if("failure"in o)return{failure:o.failure,kind:"config-failed"};let i=o.config,s=await he(e);if(s.result.isErr())return{error:s.result.error,kind:"compile-failed"};let l=s.result.value,u=A(l).find(f=>f.ref===r);return u==null?{kind:"no-test",ref:r}:(await Qe({lockfile:l,options:{baseUrl:i.appUrl,engineUrl:i.engineUrl,fixturesDir:Ia.join(i.cwd,j),generate:R,headed:!0,secret:i.webhookSecret,tunnelAuth:i.tunnelAuth},params:void 0,runId:`teleport-${Ca()}`,stopAfterStep:t,test:u.test},n)).match(f=>({kind:"done",result:f}),f=>({error:f,kind:"run-failed"}))}export{La as a,Ua as b,z as c,Zn as d,J as e,j as f,E as g,he as h,M as i,w as j,cs as k,X as l,ms as m,ys as n,gs as o,bs as p,ke as q,br as r,Er as s,Ir as t,jr as u,xe as v,Ds as w,te as x,Rn as y,gc as z,hc as A,kc as B,oi as C,Cc as D,mi as E,Cn as F,Ui as G,Wi as H,od as I,An as J,fd as K,md as L,kd as M,ha as N,ml as O,yl as P,Hr as Q,gl as R,hl as S,kl as T,Sl as U,Rl as V,xl as W,qr as X,Br as Y,Vr as Z,Kr as _,zr as $,Jr as aa,Ws as ba,qs as ca,be as da,Bs as ea,Lr as fa,il as ga,we as ha,un as ia,ac as ja,wd as ka,Pd as la,Cd as ma,Ad as na,Td as oa,jd as pa,Fd as qa,Ld as ra,Md as sa,$d as ta,_d as ua,Od as va,Nd as wa,Dd as xa,zd as ya,lc as za};
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ import{A as re,C as de,F as C,H as ce,I as ue,K as pe,L as fe,N as h,O as Re,b as G,ba as w,ca as T,da as ve,e as Q,ea as q,fa as Pe,h as y,ha as _,i as A,ia as xe,ja as he,l as H,la as be,na as Ee,pa as Ie,q as X,qa as Ce,ra as Te,sa as We,t as I,ta as Le,ua as De,v as Z,va as Ae,w as ee,wa as He,ya as Fe,za as qe}from"./chunk-MOJRP3IN.js";import{H as te,N as ie,P as ae,Q as se,R as F,Z as le,ba as me,c as J,ca as ye,da as ge,ea as ke,fa as we,g as K,ga as Se,h as V,k as Y,n as ne,p as oe}from"./chunk-R7CQWEBF.js";import{b as _e}from"./chunk-BJVAPI4P.js";import{c as B,d as E,e as l,f as D,g as z}from"./chunk-EVYYSTR7.js";import"./chunk-IHSHBPJY.js";import"./chunk-7UWDMECF.js";import sn from"path";import{createClient as ln}from"graphql-sse";import dn,{AbortError as cn}from"p-retry";import{graphql as N}from"gql.tada";import{graphql as Pr}from"gql.tada";import{print as xr}from"graphql";async function $e({config:e,cwd:n,headed:r,pool:t,runId:o,signal:i,testSlug:a,workClass:s,workflowSlug:d}){let{fingerprint:c,result:u}=await y(n);if(u.isErr())return await C(e,o,`lockfile:${u.error.kind}`),{kind:"dispatch-error",reason:{detail:`lockfile:${u.error.kind}`,type:"generic"}};let f=vr(u.value,{testSlug:a,workflowSlug:d});if(f==null)return await C(e,o,`no-test:${d}/${a}`),{kind:"dispatch-error",reason:{detail:`no-test:${d}/${a}`,type:"generic"}};let m=await w({headed:r,workClass:s,task:()=>t.execute({headed:r,lockfileFingerprint:c,runId:o,testRef:f},i)});return!m.serverNotified&&m.outcome.kind==="error"&&await C(e,o,m.outcome.detail),m.outcome}function vr(e,{testSlug:n,workflowSlug:r}){let o=e.workflows.find(i=>Y(i.name)===r)?.tests.find(i=>i.slug===n);return o==null?void 0:ne(o)}var hr=6e4,br=Pr(`
3
+ subscription RunRequestedWatch($devSessionId: String!) {
4
+ runRequested(devSessionId: $devSessionId) {
5
+ runId
6
+ testSlug
7
+ workflowId
8
+ workflowSlug
9
+ }
10
+ }
11
+ `);async function Oe(e){let n=Math.min(1e3*2**e,hr)+Cr();await new Promise(r=>setTimeout(r,n))}function je({claim:e,cwd:n,devSessionId:r,onSubscriptionDead:t,pool:o,sseClient:i,sseHealth:a}){let s=new Set;return i.subscribe({query:xr(br),variables:{devSessionId:r}},{complete:()=>{},error:d=>{let c=d instanceof Error?d.message:String(d);l.warn("runRequested SSE failed: %s; re-registering session",c),t(c)},next:d=>{Er({claim:e,cwd:n,event:d.data?.runRequested,inFlightRunIds:s,pool:o})}},{connected:()=>{a.onConnected()},connecting:d=>{a.onConnecting(d),d&&l.debug("runRequested SSE reconnecting")}})}function Er({claim:e,cwd:n,event:r,inFlightRunIds:t,pool:o}){if(r==null)return;if(t.has(r.runId)){l.warn({runId:r.runId,workflowSlug:r.workflowSlug},"duplicate runRequested event; skipping dispatch");return}t.add(r.runId),process.stdout.write(`ripplo: run ${r.workflowSlug}
12
+ `),G(n);let i=I(n).match(s=>s,s=>{l.error({failure:s,runId:r.runId},"failed to load env for run dispatch; skipping")});if(i==null){t.delete(r.runId);return}let a=Ir(e(r.runId),r);a.started(),$e({config:i,cwd:n,headed:a.headed,pool:o,runId:r.runId,signal:a.signal,testSlug:r.testSlug,workClass:a.workClass,workflowSlug:r.workflowSlug}).then(s=>{a.finished(s)}).catch(s=>{l.error({err:s,runId:r.runId,workflowSlug:r.workflowSlug},"run execution failed; daemon continuing"),a.finished({detail:s instanceof Error?s.message:String(s),kind:"error"})}).finally(()=>{t.delete(r.runId)})}function Ir(e,n){return e==null?(l.debug({runId:n.runId,workflowSlug:n.workflowSlug},"dispatching unclaimed run (externally triggered or replayed)"),{headed:!1,signal:new AbortController().signal,workClass:"p0-ui",finished:()=>{},started:()=>{}}):{headed:e.headed,signal:xe(e.token),workClass:"p1-cli",finished:r=>{e.finished(n.runId,r)},started:()=>{e.started(n.runId)}}}function Cr(){return Math.floor(Math.random()*2700)+300}import{graphql as Tr}from"gql.tada";import{print as Wr}from"graphql";var Lr=Tr(`
13
+ subscription TeleportRequestedWatch($devSessionId: String!) {
14
+ teleportRequested(devSessionId: $devSessionId) {
15
+ runId
16
+ stepIndex
17
+ testSlug
18
+ workflowSlug
19
+ }
20
+ }
21
+ `);function Ne({cwd:e,devSessionId:n,onSubscriptionDead:r,sseClient:t}){let o=new Set,i=t.subscribe({query:Wr(Lr),variables:{devSessionId:n}},{complete:()=>{},error:a=>{let s=a instanceof Error?a.message:String(a);l.warn("teleportRequested SSE failed: %s; re-registering session",s),r(s)},next:a=>{Dr({cwd:e,event:a.data?.teleportRequested,running:o})}});return()=>{o.forEach(a=>{a.abort()}),o.clear(),i()}}function Dr({cwd:e,event:n,running:r}){if(n==null)return;let t=`${n.workflowSlug}/${n.testSlug}`,o=new AbortController;r.add(o),process.stdout.write(`ripplo: teleport ${t} step ${String(n.stepIndex+1)}
22
+ `),Fe({cwd:e,ref:t,signal:o.signal,step:n.stepIndex+1}).then(i=>{i.kind!=="done"&&l.warn({kind:i.kind,ref:t},"teleport could not open")}).catch(i=>{l.error({err:i,ref:t},"teleport failed; daemon continuing")}).finally(()=>{r.delete(o)})}function Me(){let e=!0,n,r=null,t=()=>{r!=null&&(clearTimeout(r),r=null)};return{markUnhealthy:o=>{e=!1,n=o,t()},onConnected:()=>{t(),r=setTimeout(()=>{e=!0,n=void 0,r=null},1e4)},onConnecting:()=>{t()},snapshot:()=>({detail:n,ok:e})}}import Ar from"fs";import Ge from"net";import{err as Qe,ok as Hr}from"neverthrow";async function Je({cwd:e,onConnection:n}){z(e);let r=Re(e),t=await Ue({onConnection:n,socketPath:r});return t.isOk()||t.error.kind!=="stale-candidate"?t.map(Be(r)).mapErr(ze(r)):await Fr(r)?Qe({kind:"already-running",socketPath:r}):(Ke(r),(await Ue({onConnection:n,socketPath:r})).map(Be(r)).mapErr(ze(r)))}function Fr(e){return new Promise(n=>{let r=Ge.connect(e);r.once("connect",()=>{r.destroy(),n(!0)}),r.once("error",()=>{n(!1)})})}async function Ue(e){let n=await qr(e);return n.kind==="listening"?Hr(n.server):Qe(n.error)}function qr({onConnection:e,socketPath:n}){return new Promise(r=>{let t=Ge.createServer(e);t.once("error",o=>{r({error:o.code==="EADDRINUSE"?{kind:"stale-candidate"}:{kind:"listen-failed",message:o.message},kind:"failed"})}),t.listen(n,()=>{r({kind:"listening",server:t})})})}function Be(e){return n=>({socketPath:e,close:()=>{n.close(),Ke(e)}})}function Ke(e){Ar.rmSync(e,{force:!0})}function ze(e){return n=>n.kind==="stale-candidate"?{kind:"already-running",socketPath:e}:{kind:"bind-failed",message:n.message}}function $(e){return{priority:e,next:()=>null,onResult:()=>{}}}function Ve({config:e,executor:n,explore:r,exploreConcurrency:t,pool:o}){return _r({appUrl:e.appUrl,cwd:e.cwd,explore:r&&n==="local",exploreConcurrency:t,executeTrail:async(i,a)=>(await o).exploreTrail(i,a)})}function _r({appUrl:e,cwd:n,executeTrail:r,explore:t,exploreConcurrency:o}){let i={notify:()=>{}},a=t?$r({appUrl:e,cwd:n,executeTrail:r,notifyWork:()=>{i.notify()}}):pe(),s=qe({exploreConcurrency:o,exploreEnabled:t,now:Date.now,probe:Or,setTimer:jr,sources:[$("p0"),$("p1"),a],execute:({job:c,priority:u,signal:f})=>w({headed:!1,workClass:Nr(u),task:()=>c.run(f)})});q(()=>{s.notifyQueueChange()}),i.notify=()=>{s.notifyQueueChange()};let d=t?ue({onChange:c=>{s.setExplorerHolder(c)}}):null;return{status:()=>({explorer:Mr({explore:t,holder:s.explorerHolder()}),exploring:s.explorationActive(),progress:a.status()}),stop:()=>{d?.stop(),s.stop(),q(null),a.stop()}}}function $r({appUrl:e,cwd:n,executeTrail:r,notifyWork:t}){return fe({cwd:n,executeTrail:r,notifyWork:t,loadLockfile:async()=>{let{fingerprint:o,result:i}=await y(n);return i.match(a=>({fingerprint:o,lockfile:a}),()=>null)},probeApp:async()=>await re(e)==null})}function Or(){let e=ve();return{headedActive:e.headedActive,interactiveActive:e.active,interactiveQueued:e.queued,poolSize:e.poolSize}}function jr(e,n){let r=setTimeout(e,n);return()=>{clearTimeout(r)}}function Nr(e){switch(e){case"p0":return"p0-ui";case"p1":return"p1-cli";case"p2":return"p2-cover";case"p3":return"p3-explore"}}function Mr({explore:e,holder:n}){return e?n?"holder":"standby":"off"}async function Ye({cwd:e,finding:n}){let r={at:new Date().toISOString(),kind:"resolution",signature:n.signature};await F(h(e),[r]).match(()=>{},t=>{l.warn("explore findings log append failed: %s",t.kind)})}async function Xe({cwd:e,finding:n,outcome:r}){let t=r.kind==="clean"?[...r.rows,{at:new Date().toISOString(),kind:"resolution",signature:n.signature}]:r.rows;t.length!==0&&await F(h(e),t).match(()=>{},o=>{l.warn("explore findings log append failed: %s",o.kind)})}function Ze({config:e,cwd:n,pool:r}){let t={cwd:n,executeTrail:(o,i)=>w({headed:!1,workClass:"p1-cli",task:async()=>(await r).exploreTrail(o,i)}),loadLockfile:async()=>{let o=await y(n);return o.result.match(i=>({fingerprint:o.fingerprint,lockfile:i}),()=>null)},pushResolved:o=>ce(e,o,"resolved").catch(i=>{l.warn({error:i},"explore finding status push failed")})};return(o,i)=>Ur(t,{findingId:o,signal:i})}async function Ur(e,n){let r=await Br(e.cwd,n.findingId);if("reply"in r)return r.reply;let t=await e.loadLockfile();if(t==null)return{kind:"error",reason:"lockfile-unavailable"};let o=zr(t,r.finding);if("reply"in o)return o.reply;let i=await e.executeTrail(o.assign,n.signal),a=await Qr({cwd:e.cwd,finding:r.finding,outcome:i});return(a.kind==="resolved"||a.kind==="unreachable")&&await e.pushResolved(r.finding.signature),a}async function Br(e,n){return se(h(e)).match(r=>{let o=[...ae(r).findings.entries()].find(([a])=>ie(a)===n);if(o==null)return{reply:{kind:"finding-not-found"}};let[,i]=o;return i.resolvedAt!=null?{reply:{kind:"finding-not-found"}}:{finding:i.latest}},()=>({reply:{kind:"unreplayable",reason:"ledger-unreadable"}}))}function zr(e,n){let r=le(e.lockfile,{sweep:!1}).find(o=>o.name===n.baseState);if(r==null)return{reply:{kind:"unreplayable",reason:"base-state-missing"}};let t=Gr(e.lockfile,n);return t==null?{reply:{kind:"unreplayable",reason:"action-missing"}}:{assign:{baseStateTest:r.test,lensId:n.lensId,lockfileFingerprint:e.fingerprint,lockfileHash:V(e.lockfile),maxLength:t.length,shrinkBudget:0,stepRuns:t}}}function Gr(e,n){let t=oe(e).map(a=>`${a.test}#${String(a.index)}`),i=n.trail.map((a,s)=>{let d=t.indexOf(a),c=n.trailParams[s];return d===-1||c==null?null:{idx:d,params:c}}).flatMap(a=>a==null?[]:[a]);return i.length===n.trail.length?i:null}async function Qr({cwd:e,finding:n,outcome:r}){return r.kind==="aborted"?{kind:"aborted"}:r.kind==="error"?Jr({cwd:e,finding:n,reason:r.reason}):(await Xe({cwd:e,finding:n,outcome:r}),r.kind==="clean"?{kind:"resolved"}:r.kind==="flaky"?{kind:"flaky"}:Kr(n,r))}async function Jr({cwd:e,finding:n,reason:r}){return r==="empty-trail"?(await Ye({cwd:e,finding:n}),{kind:"unreachable"}):{kind:"error",reason:r??"trail-error"}}function Kr(e,n){let r=n.rows.find(o=>o.kind==="finding"),t=r?.kind==="finding"?r.runId:void 0;return r!=null&&r.signature===e.signature?{kind:"still-failing",runId:t}:{kind:"diverged",runId:t}}import{fork as Vr}from"child_process";import er from"os";import{CancellationTokenSource as rr,ResponseError as nr}from"vscode-jsonrpc/node";function or(e,n){return()=>{let r=Vr(e,["run-worker"],{cwd:n,stdio:["ignore","inherit","inherit","ipc"]});return{connection:He(r),kill:()=>{r.kill("SIGKILL")},onExit:t=>{r.once("exit",t)}}}}function tr(e){let n={closed:!1,lockfileProvider:e.lockfileProvider,nextId:0,size:e.initialSize,spawn:e.spawn,waiters:[],workers:[]};return{close:async()=>{n.closed=!0,await Promise.all([...n.workers].map(r=>O(r,n)))},execute:(r,t)=>Xr(r,t,n),exploreTrail:(r,t)=>rn(r,t,n),routeSpan:(r,t)=>{let o=n.workers.find(i=>i.runId===r);o?.worker.connection.sendNotification(De,{runId:r,span:t})},setSize:r=>{on(r,n)}}}var Yr=1e4,ir=-32800;async function Xr(e,n,r){let t=await ar(r);if(t.runId=e.runId,!t.alive)return W(t,r),{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1};let o=new rr,i=()=>{o.cancel()};n.aborted&&o.cancel(),n.addEventListener("abort",i,{once:!0});try{let a=await t.worker.connection.sendRequest(Te,e,o.token),s=Ee.safeParse(a);return s.success?s.data:{outcome:{detail:"bad-outcome-frame",kind:"error"},serverNotified:!1}}catch(a){return en(a,t)}finally{n.removeEventListener("abort",i),o.dispose(),W(t,r)}}async function ar(e){let n=e.workers.find(r=>r.alive&&r.runId===void 0);if(n!=null)return n.runId="pending",n;if(e.workers.length<e.size){let r=Zr(e);return r.runId="pending",await r.ready,r}return new Promise(r=>{e.waiters.push(t=>{t.runId="pending",r(t)})})}function Zr(e){let n=e.spawn(),r={resolve:()=>{}},t={alive:!0,id:e.nextId,ready:new Promise(o=>{r.resolve=o,n.connection.onNotification(Ce,o)}),runId:void 0,worker:n};return e.nextId+=1,n.connection.onRequest(We,async o=>{let i=be.safeParse(o);return i.success?e.lockfileProvider(i.data.fingerprint):{unavailable:"bad-lockfile-request"}}),n.onExit(()=>{t.alive=!1,e.workers=e.workers.filter(o=>o!==t),n.connection.dispose(),r.resolve()}),e.workers.push(t),t}function W(e,n){if(e.runId=void 0,!e.alive||n.closed)return;if(n.workers.length>n.size){O(e,n);return}let r=n.waiters.shift();r?.(e)}async function O(e,n){if(n.workers=n.workers.filter(o=>o!==e),!e.alive)return;let r=new Promise(o=>{e.worker.onExit(o)});await e.worker.connection.sendNotification(Ae).catch(()=>{});let t=setTimeout(()=>{e.worker.kill()},Yr);await r,clearTimeout(t)}function en(e,n){return e instanceof nr&&e.code===ir?{outcome:{detail:"aborted",kind:"error"},serverNotified:!1}:n.alive?{outcome:{detail:e instanceof Error?e.message:String(e),kind:"error"},serverNotified:!1}:{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1}}async function rn(e,n,r){let t=await ar(r);if(t.runId="explore",!t.alive)return W(t,r),{kind:"error",rows:[],trail:[]};let o=new rr,i=()=>{o.cancel()};n.aborted&&o.cancel(),n.addEventListener("abort",i,{once:!0});try{let a=await t.worker.connection.sendRequest(Le,e,o.token),s=Ie.safeParse(a);return s.success?s.data:{kind:"error",rows:[],trail:[]}}catch(a){return nn(a)}finally{n.removeEventListener("abort",i),o.dispose(),W(t,r)}}function nn(e){return e instanceof nr&&e.code===ir?{kind:"aborted",rows:[],trail:[]}:{kind:"error",reason:`transport:${e instanceof Error?e.message.slice(0,120):"unknown"}`,rows:[],trail:[]}}function on(e,n){n.size=e,e>er.availableParallelism()&&l.warn({cores:er.availableParallelism(),size:e},"worker pool size exceeds available cores");let r=n.workers.filter(o=>o.alive&&o.runId===void 0),t=n.workers.length-e;r.slice(0,Math.max(0,t)).forEach(o=>{O(o,n)})}import L from"fs";import{graphql as sr}from"gql.tada";import{print as lr}from"graphql";var tn=sr(`
23
+ subscription HooksPausedWatch($projectId: String!) {
24
+ hooksPausedRequested(projectId: $projectId) {
25
+ paused
26
+ projectId
27
+ }
28
+ }
29
+ `),an=sr(`
30
+ subscription WatchLocalConcurrencyChanged {
31
+ myMaxLocalConcurrentRunsChanged
32
+ }
33
+ `);function dr({pool:e,sseClient:n}){return n.subscribe({query:lr(an)},{complete:()=>{},error:r=>{l.error(r,"localConcurrency subscription error")},next:r=>{let t=r.data?.myMaxLocalConcurrentRunsChanged;t!=null&&(T(t),e.setSize(t))}})}function cr({cwd:e,projectId:n,sseClient:r}){return r.subscribe({query:lr(tn),variables:{projectId:n}},{complete:()=>{},error:t=>{l.error(t,"hooksPaused subscription error")},next:t=>{let o=t.data?.hooksPausedRequested?.paused;o!=null&&j({cwd:e,paused:o})}})}function j({cwd:e,paused:n}){let r=de(e);if(n&&!L.existsSync(r)){L.writeFileSync(r,"");return}!n&&L.existsSync(r)&&L.unlinkSync(r)}var un=6e4,ur=500,pn=15e3,pr=6e4,fn=3,mn=N(`
34
+ mutation HeartbeatDevSessionWatch($id: String!) {
35
+ heartbeatDevSession(id: $id) {
36
+ __typename
37
+ ... on DevSession {
38
+ id
39
+ }
40
+ ... on DevSessionEndedError {
41
+ message
42
+ }
43
+ }
44
+ }
45
+ `),yn=N(`
46
+ query WatchLocalConcurrency {
47
+ currentUser {
48
+ id
49
+ maxLocalConcurrentRuns
50
+ }
51
+ }
52
+ `),gn=N(`
53
+ mutation EndDevSessionWatch($projectId: String!, $cwd: String!) {
54
+ endDevSession(projectId: $projectId, cwd: $cwd) {
55
+ __typename
56
+ ... on DevSession {
57
+ id
58
+ }
59
+ ... on NoActiveDevSessionError {
60
+ message
61
+ }
62
+ }
63
+ }
64
+ `);async function wt(e){let{executor:n,explore:r,exploreConcurrency:t}=e;Hn();let o=Wn(process.cwd()),i=o.cwd,a=bn(i),s=Tn(),d=Ve({config:o,executor:n,explore:r,exploreConcurrency:t,pool:s.pool}),c={handler:()=>{}},u=In(),f=Me(),m=he({config:o,cwd:i,executor:n,explorationStatus:d.status,ready:u.promise,replayFinding:Ze({config:o,cwd:i,pool:s.pool}),onShutdownRequest:()=>{c.handler()},sseHealth:()=>f.snapshot()}),S=await Cn({cwd:i,ipc:m,releasePid:a}),R=await A(i);R.isErr()&&(process.stderr.write(`ripplo: ${H(R.error)}
65
+ `),process.exit(1));let b=R.value,p=await fr(()=>_({config:o,cwd:i,lockfile:b}),{config:o,label:"initial sync"}),g=await qn(o);j({cwd:i,paused:p.hooksPaused});let k=Pe(i);k!=null&&l.info("watching branch %s in %s",k,i);let v=ln({headers:{Authorization:`Bearer ${o.token}`},retry:Oe,retryAttempts:1/0,url:`${o.ripploServerUrl}/graphql`}),P=hn({cwd:i,initialConcurrency:g});s.provide(P);let mr=await Sn({cwd:i,pool:P}),M=Pn({claim:m.claim,config:o,cwd:i,initialId:p.devSessionId,pool:P,sseClient:v,sseHealth:f}),yr=cr({cwd:i,projectId:o.projectId,sseClient:v}),gr=dr({pool:P,sseClient:v}),kr=vn({config:o,session:M}),wr=An(),U=await kn({config:o,devSessionId:p.devSessionId,executor:n});u.resolve(),Rn({devSessionId:p.devSessionId,executor:n,tunnel:U});let Sr=async()=>{kr(),wr(),d.stop(),S.close(),M.stop(),yr(),gr(),await P.close(),await wn(U),await mr.stop().catch(()=>{}),await Promise.race([E({config:o,document:gn,variables:{cwd:o.cwd,projectId:o.projectId}}).catch(()=>{}),new Promise(Rr=>setTimeout(Rr,3e3))]),a()},x=()=>{Sr().finally(()=>process.exit(0))};c.handler=x,process.on("SIGINT",x),process.on("SIGTERM",x),process.on("SIGHUP",x),process.on("SIGBREAK",x),await new Promise(()=>{})}async function kn({config:e,devSessionId:n,executor:r}){if(r==="cloud")return _e({config:e,devSessionId:n})}async function wn(e){e!=null&&await e.stop()}function Sn({cwd:e,pool:n}){return te({localDir:sn.join(e,".ripplo",".local"),writePortFile:!0,onRrwebBatch:()=>{},onSpan:r=>{let t=r.attributes["ripplo.run"];t!=null&&n.routeSpan(t,r)}})}function Rn({devSessionId:e,executor:n,tunnel:r}){process.stdout.write(`${ke({devSessionId:e,executor:n,tunnelHostname:r?.hostname,version:Q()})}
66
+ `)}function vn({config:e,session:n}){let r=async()=>{try{let o=await E({config:e,document:mn,variables:{id:n.getId()}});o.heartbeatDevSession?.__typename==="DevSessionEndedError"&&(l.warn("dev session ended server-side (%s); re-registering",o.heartbeatDevSession.message),await n.reregister())}catch(o){l.warn("heartbeat failed: %s",o instanceof Error?o.message:String(o))}},t=setInterval(()=>{r()},pn);return()=>{clearInterval(t)}}function Pn({claim:e,config:n,cwd:r,initialId:t,pool:o,sseClient:i,sseHealth:a}){let s=t,d=null,c=0,u=0,f=p=>{b(p)},m=()=>{let p=je({claim:e,cwd:r,devSessionId:s,onSubscriptionDead:f,pool:o,sseClient:i,sseHealth:a}),g=Ne({cwd:r,devSessionId:s,onSubscriptionDead:f,sseClient:i});return()=>{p(),g()}},S=m(),R=async p=>{let g=Date.now();c=g-u>pr*2?1:c+1,u=g,c>=fn&&a.markUnhealthy(p),await xn(Math.min(1e3*2**(c-1),pr));let k=await A(r);if(k.isErr()){l.error("re-register: compile failed: %s",H(k.error));return}let v=await fr(()=>_({config:n,cwd:r,lockfile:k.value}),{config:n,label:"re-register sync"});S(),s=v.devSessionId,S=m(),l.info("re-registered dev session as %s",s)},b=p=>(d!=null||(d=R(p).finally(()=>{d=null})),d);return{getId:()=>s,reregister:()=>b("dev session ended server-side"),stop:()=>{S()}}}function xn(e){return new Promise(n=>setTimeout(n,e))}function hn({cwd:e,initialConcurrency:n}){return tr({initialSize:n,spawn:or(_n(),e),lockfileProvider:async r=>{let t=await y(e);return t.result.isErr()?{unavailable:`daemon-load-failed:${t.result.error.kind}`}:t.fingerprint!==r?{unavailable:"fingerprint-mismatch"}:{lockfileJson:J(K,t.result.value)}}})}function bn(e){try{return ee({cwd:e,onCompromised:En})}catch(n){throw n instanceof Z&&(process.stderr.write(`${we({cwd:n.cwd,pid:n.pid})}
67
+ `),process.exit(1)),n}}function En(){l.error("daemon lock compromised; shutting down"),process.stderr.write(`${Se()}
68
+ `),process.exit(1)}function In(){let e={handler:()=>{}};return{promise:new Promise(r=>{e.handler=r}),resolve:()=>{e.handler()}}}async function Cn({cwd:e,ipc:n,releasePid:r}){return(await Je({cwd:e,onConnection:n.handleConnection})).match(o=>o,o=>{process.stderr.write(`${me(o)}
69
+ `),r(),process.exit(1)})}function Tn(){let e={provide:()=>{}};return{pool:new Promise(r=>{e.provide=r}),provide:r=>{e.provide(r)}}}function Wn(e){return I(e).match(n=>n,n=>{process.stderr.write(`${X(n)}
70
+ `),process.exit(1)})}function fr(e,{config:n,label:r}){let t=n.ripploServerUrl.includes("localhost")||n.ripploServerUrl.includes("127.0.0.1");return dn(async()=>{try{return await e()}catch(o){Ln({config:n,error:o});let i=o instanceof Error?o.message:String(o);throw Dn(i)?o:(l.error("%s failed: %s",r,i),new cn(i))}},{factor:2,maxTimeout:t?2e3:1e4,minTimeout:t?100:1e3,retries:1/0,onFailedAttempt:({attemptNumber:o,error:i})=>{l.warn("%s attempt %d failed \u2014 retrying: %s",r,o,i.message)}})}function Ln({config:e,error:n}){let r=B(n);r==="UNAUTHENTICATED"&&(process.stderr.write(`ripplo: ${ge()}
71
+ `),process.exit(1)),r==="FORBIDDEN"&&(process.stderr.write(`ripplo: ${ye({projectId:e.projectId,serverUrl:e.ripploServerUrl})}
72
+ `),process.exit(1))}function Dn(e){return e.includes("status 502")||e.includes("ECONNREFUSED")||e.includes("Failed to connect")||e.includes("fetch failed")}function An(){D({maxRuns:ur});let e=setInterval(()=>{D({maxRuns:ur})},un);return()=>{clearInterval(e)}}function Hn(){process.on("unhandledRejection",e=>{l.error({err:e},"unhandledRejection in watch; continuing")}),process.on("uncaughtException",e=>{l.error({err:e},"uncaughtException in watch; continuing")})}var Fn=4;async function qn(e){try{let r=(await E({config:e,document:yn,variables:void 0})).currentUser?.maxLocalConcurrentRuns;if(r!=null)return T(r),r}catch(n){l.warn({err:n},"failed to fetch local concurrency setting; using default")}return Fn}function _n(){let e=process.argv[1];if(e==null)throw new Error("cli entry unavailable");return e}export{wt as runDaemon};