ripplo 0.7.18 → 0.7.19

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