ripplo 0.7.24 → 0.7.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-EVYYSTR7.js → chunk-5VRJXHWH.js} +1 -1
- package/dist/chunk-MSUK2UBM.js +164 -0
- package/dist/{chunk-BJVAPI4P.js → chunk-RLXQYG7H.js} +1 -1
- package/dist/chunk-V252IVSN.js +218 -0
- package/dist/daemon-G75H2VRS.js +92 -0
- package/dist/daemon-PTZWFEBG.js +2 -0
- package/dist/{daemon-tunnel-AG6FGNXC.js → daemon-tunnel-DYA5LIEG.js} +1 -1
- package/dist/index.js +204 -203
- package/package.json +5 -5
- package/dist/chunk-3NSJ5N67.js +0 -206
- package/dist/chunk-E4ODIHV7.js +0 -167
- package/dist/daemon-5EX742HH.js +0 -2
- package/dist/daemon-FFCQZ4IN.js +0 -72
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ripplo",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.26",
|
|
4
4
|
"description": "CLI for Ripplo — AI-powered end-to-end testing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://ripplo.ai",
|
|
@@ -59,13 +59,13 @@
|
|
|
59
59
|
"eslint-plugin-neverthrow": "^1.1.4",
|
|
60
60
|
"tsup": "^8.5.1",
|
|
61
61
|
"vitest": "^4.1.4",
|
|
62
|
-
"@ripplo/graphql": "^0.0.0",
|
|
63
62
|
"@ripplo/eslint-config": "0.0.0",
|
|
64
|
-
"@ripplo/
|
|
63
|
+
"@ripplo/graphql": "^0.0.0",
|
|
64
|
+
"@ripplo/run-report": "0.0.0",
|
|
65
|
+
"@ripplo/core": "^0.0.0",
|
|
65
66
|
"@ripplo/rrweb-bundle": "0.0.0",
|
|
66
67
|
"@ripplo/spec": "^0.0.0",
|
|
67
|
-
"@ripplo/
|
|
68
|
-
"@ripplo/run-report": "0.0.0"
|
|
68
|
+
"@ripplo/runtime": "^0.0.0"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"dev": "tsx watch src/index.ts",
|
package/dist/chunk-3NSJ5N67.js
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
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-E4ODIHV7.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};
|