ripplo 0.7.19 → 0.7.21
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-7UWDMECF.js +2 -0
- package/dist/{chunk-WNUKCEN6.js → chunk-BJVAPI4P.js} +1 -1
- package/dist/chunk-EVYYSTR7.js +46 -0
- package/dist/chunk-IHSHBPJY.js +2 -0
- package/dist/chunk-OX6IWNCA.js +206 -0
- package/dist/chunk-R7CQWEBF.js +167 -0
- package/dist/daemon-2E6MKBO7.js +62 -0
- package/dist/daemon-APJHNVIG.js +2 -0
- package/dist/daemon-tunnel-AG6FGNXC.js +2 -0
- package/dist/gifenc.esm-GMV2LJ5K.js +2 -0
- package/dist/index.js +185 -194
- package/package.json +6 -6
- package/dist/chunk-7R7PWDYF.js +0 -137
- package/dist/chunk-APGFYCJC.js +0 -200
- package/dist/chunk-SB7H6IAS.js +0 -2
- package/dist/chunk-Y5IXMRSB.js +0 -46
- package/dist/daemon-EQZROAKJ.js +0 -2
- package/dist/daemon-EUZ4KVQP.js +0 -61
- package/dist/daemon-tunnel-MOYCRSSC.js +0 -2
package/dist/chunk-APGFYCJC.js
DELETED
|
@@ -1,200 +0,0 @@
|
|
|
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};
|
package/dist/chunk-SB7H6IAS.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
var G=Object.create;var N=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Z=Object.getPrototypeOf,ee=Object.prototype.hasOwnProperty;var P=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports);var te=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of X(e))!ee.call(i,s)&&s!==t&&N(i,s,{get:()=>e[s],enumerable:!(n=Q(e,s))||n.enumerable});return i};var ue=(i,e,t)=>(t=i!=null?G(Z(i)):{},te(e||!i||!i.__esModule?N(t,"default",{value:i,enumerable:!0}):t,i));var I=P(V=>{"use strict";Object.defineProperty(V,"__esModule",{value:!0});V.timingSafeEqual=void 0;function T(i,e=""){if(!i)throw new Error(e)}function re(i,e){if(i.byteLength!==e.byteLength)return!1;i instanceof DataView||(i=new DataView(ArrayBuffer.isView(i)?i.buffer:i)),e instanceof DataView||(e=new DataView(ArrayBuffer.isView(e)?e.buffer:e)),T(i instanceof DataView),T(e instanceof DataView);let t=i.byteLength,n=0,s=-1;for(;++s<t;)n|=i.getUint8(s)^e.getUint8(s);return n===0}V.timingSafeEqual=re});var $=P(S=>{"use strict";var ie=S&&S.__extends||(function(){var i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,s){n.__proto__=s}||function(n,s){for(var g in s)s.hasOwnProperty(g)&&(n[g]=s[g])},i(e,t)};return function(e,t){i(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}})();Object.defineProperty(S,"__esModule",{value:!0});var l=256,z=(function(){function i(e){e===void 0&&(e="="),this._paddingCharacter=e}return i.prototype.encodedLength=function(e){return this._paddingCharacter?(e+2)/3*4|0:(e*8+5)/6|0},i.prototype.encode=function(e){for(var t="",n=0;n<e.length-2;n+=3){var s=e[n]<<16|e[n+1]<<8|e[n+2];t+=this._encodeByte(s>>>18&63),t+=this._encodeByte(s>>>12&63),t+=this._encodeByte(s>>>6&63),t+=this._encodeByte(s>>>0&63)}var g=e.length-n;if(g>0){var s=e[n]<<16|(g===2?e[n+1]<<8:0);t+=this._encodeByte(s>>>18&63),t+=this._encodeByte(s>>>12&63),g===2?t+=this._encodeByte(s>>>6&63):t+=this._paddingCharacter||"",t+=this._paddingCharacter||""}return t},i.prototype.maxDecodedLength=function(e){return this._paddingCharacter?e/4*3|0:(e*6+7)/8|0},i.prototype.decodedLength=function(e){return this.maxDecodedLength(e.length-this._getPaddingLength(e))},i.prototype.decode=function(e){if(e.length===0)return new Uint8Array(0);for(var t=this._getPaddingLength(e),n=e.length-t,s=new Uint8Array(this.maxDecodedLength(n)),g=0,p=0,m=0,E=0,C=0,A=0,a=0;p<n-4;p+=4)E=this._decodeChar(e.charCodeAt(p+0)),C=this._decodeChar(e.charCodeAt(p+1)),A=this._decodeChar(e.charCodeAt(p+2)),a=this._decodeChar(e.charCodeAt(p+3)),s[g++]=E<<2|C>>>4,s[g++]=C<<4|A>>>2,s[g++]=A<<6|a,m|=E&l,m|=C&l,m|=A&l,m|=a&l;if(p<n-1&&(E=this._decodeChar(e.charCodeAt(p)),C=this._decodeChar(e.charCodeAt(p+1)),s[g++]=E<<2|C>>>4,m|=E&l,m|=C&l),p<n-2&&(A=this._decodeChar(e.charCodeAt(p+2)),s[g++]=C<<4|A>>>2,m|=A&l),p<n-3&&(a=this._decodeChar(e.charCodeAt(p+3)),s[g++]=A<<6|a,m|=a&l),m!==0)throw new Error("Base64Coder: incorrect characters for decoding");return s},i.prototype._encodeByte=function(e){var t=e;return t+=65,t+=25-e>>>8&6,t+=51-e>>>8&-75,t+=61-e>>>8&-15,t+=62-e>>>8&3,String.fromCharCode(t)},i.prototype._decodeChar=function(e){var t=l;return t+=(42-e&e-44)>>>8&-l+e-43+62,t+=(46-e&e-48)>>>8&-l+e-47+63,t+=(47-e&e-58)>>>8&-l+e-48+52,t+=(64-e&e-91)>>>8&-l+e-65+0,t+=(96-e&e-123)>>>8&-l+e-97+26,t},i.prototype._getPaddingLength=function(e){var t=0;if(this._paddingCharacter){for(var n=e.length-1;n>=0&&e[n]===this._paddingCharacter;n--)t++;if(e.length<4||t>2)throw new Error("Base64Coder: incorrect padding")}return t},i})();S.Coder=z;var D=new z;function ne(i){return D.encode(i)}S.encode=ne;function oe(i){return D.decode(i)}S.decode=oe;var R=(function(i){ie(e,i);function e(){return i!==null&&i.apply(this,arguments)||this}return e.prototype._encodeByte=function(t){var n=t;return n+=65,n+=25-t>>>8&6,n+=51-t>>>8&-75,n+=61-t>>>8&-13,n+=62-t>>>8&49,String.fromCharCode(n)},e.prototype._decodeChar=function(t){var n=l;return n+=(44-t&t-46)>>>8&-l+t-45+62,n+=(94-t&t-96)>>>8&-l+t-95+63,n+=(47-t&t-58)>>>8&-l+t-48+52,n+=(64-t&t-91)>>>8&-l+t-65+0,n+=(96-t&t-123)>>>8&-l+t-97+26,n},e})(z);S.URLSafeCoder=R;var W=new R;function fe(i){return W.encode(i)}S.encodeURLSafe=fe;function se(i){return W.decode(i)}S.decodeURLSafe=se;S.encodedLength=function(i){return D.encodedLength(i)};S.maxDecodedLength=function(i){return D.maxDecodedLength(i)};S.decodedLength=function(i){return D.decodedLength(i)}});var J=P((K,j)=>{"use strict";(function(i,e){var t={};e(t);var n=t.default;for(var s in t)n[s]=t[s];typeof j=="object"&&typeof j.exports=="object"?j.exports=n:typeof define=="function"&&define.amd?define(function(){return n}):i.sha256=n})(K,function(i){"use strict";i.__esModule=!0,i.digestLength=32,i.blockSize=64;var e=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function t(a,r,o,f,x){for(var c,u,h,_,v,d,U,b,w,y,B,O,M;x>=64;){for(c=r[0],u=r[1],h=r[2],_=r[3],v=r[4],d=r[5],U=r[6],b=r[7],y=0;y<16;y++)B=f+y*4,a[y]=(o[B]&255)<<24|(o[B+1]&255)<<16|(o[B+2]&255)<<8|o[B+3]&255;for(y=16;y<64;y++)w=a[y-2],O=(w>>>17|w<<15)^(w>>>19|w<<13)^w>>>10,w=a[y-15],M=(w>>>7|w<<25)^(w>>>18|w<<14)^w>>>3,a[y]=(O+a[y-7]|0)+(M+a[y-16]|0);for(y=0;y<64;y++)O=(((v>>>6|v<<26)^(v>>>11|v<<21)^(v>>>25|v<<7))+(v&d^~v&U)|0)+(b+(e[y]+a[y]|0)|0)|0,M=((c>>>2|c<<30)^(c>>>13|c<<19)^(c>>>22|c<<10))+(c&u^c&h^u&h)|0,b=U,U=d,d=v,v=_+O|0,_=h,h=u,u=c,c=O+M|0;r[0]+=c,r[1]+=u,r[2]+=h,r[3]+=_,r[4]+=v,r[5]+=d,r[6]+=U,r[7]+=b,f+=64,x-=64}return f}var n=(function(){function a(){this.digestLength=i.digestLength,this.blockSize=i.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return a.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},a.prototype.clean=function(){for(var r=0;r<this.buffer.length;r++)this.buffer[r]=0;for(var r=0;r<this.temp.length;r++)this.temp[r]=0;this.reset()},a.prototype.update=function(r,o){if(o===void 0&&(o=r.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var f=0;if(this.bytesHashed+=o,this.bufferLength>0){for(;this.bufferLength<64&&o>0;)this.buffer[this.bufferLength++]=r[f++],o--;this.bufferLength===64&&(t(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(o>=64&&(f=t(this.temp,this.state,r,f,o),o%=64);o>0;)this.buffer[this.bufferLength++]=r[f++],o--;return this},a.prototype.finish=function(r){if(!this.finished){var o=this.bytesHashed,f=this.bufferLength,x=o/536870912|0,c=o<<3,u=o%64<56?64:128;this.buffer[f]=128;for(var h=f+1;h<u-8;h++)this.buffer[h]=0;this.buffer[u-8]=x>>>24&255,this.buffer[u-7]=x>>>16&255,this.buffer[u-6]=x>>>8&255,this.buffer[u-5]=x>>>0&255,this.buffer[u-4]=c>>>24&255,this.buffer[u-3]=c>>>16&255,this.buffer[u-2]=c>>>8&255,this.buffer[u-1]=c>>>0&255,t(this.temp,this.state,this.buffer,0,u),this.finished=!0}for(var h=0;h<8;h++)r[h*4+0]=this.state[h]>>>24&255,r[h*4+1]=this.state[h]>>>16&255,r[h*4+2]=this.state[h]>>>8&255,r[h*4+3]=this.state[h]>>>0&255;return this},a.prototype.digest=function(){var r=new Uint8Array(this.digestLength);return this.finish(r),r},a.prototype._saveState=function(r){for(var o=0;o<this.state.length;o++)r[o]=this.state[o]},a.prototype._restoreState=function(r,o){for(var f=0;f<this.state.length;f++)this.state[f]=r[f];this.bytesHashed=o,this.finished=!1,this.bufferLength=0},a})();i.Hash=n;var s=(function(){function a(r){this.inner=new n,this.outer=new n,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var o=new Uint8Array(this.blockSize);if(r.length>this.blockSize)new n().update(r).finish(o).clean();else for(var f=0;f<r.length;f++)o[f]=r[f];for(var f=0;f<o.length;f++)o[f]^=54;this.inner.update(o);for(var f=0;f<o.length;f++)o[f]^=106;this.outer.update(o),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(var f=0;f<o.length;f++)o[f]=0}return a.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},a.prototype.clean=function(){for(var r=0;r<this.istate.length;r++)this.ostate[r]=this.istate[r]=0;this.inner.clean(),this.outer.clean()},a.prototype.update=function(r){return this.inner.update(r),this},a.prototype.finish=function(r){return this.outer.finished?this.outer.finish(r):(this.inner.finish(r),this.outer.update(r,this.digestLength).finish(r)),this},a.prototype.digest=function(){var r=new Uint8Array(this.digestLength);return this.finish(r),r},a})();i.HMAC=s;function g(a){var r=new n().update(a),o=r.digest();return r.clean(),o}i.hash=g,i.default=g;function p(a,r){var o=new s(a).update(r),f=o.digest();return o.clean(),f}i.hmac=p;function m(a,r,o,f){var x=f[0];if(x===0)throw new Error("hkdf: cannot expand more");r.reset(),x>1&&r.update(a),o&&r.update(o),r.update(f),r.finish(a),f[0]++}var E=new Uint8Array(i.digestLength);function C(a,r,o,f){r===void 0&&(r=E),f===void 0&&(f=32);for(var x=new Uint8Array([1]),c=p(r,a),u=new s(c),h=new Uint8Array(u.digestLength),_=h.length,v=new Uint8Array(f),d=0;d<f;d++)_===h.length&&(m(h,u,o,x),_=0),v[d]=h[_++];return u.clean(),h.fill(0),x.fill(0),v}i.hkdf=C;function A(a,r,o,f){for(var x=new s(a),c=x.digestLength,u=new Uint8Array(4),h=new Uint8Array(c),_=new Uint8Array(c),v=new Uint8Array(f),d=0;d*c<f;d++){var U=d+1;u[0]=U>>>24&255,u[1]=U>>>16&255,u[2]=U>>>8&255,u[3]=U>>>0&255,x.reset(),x.update(r),x.update(u),x.finish(_);for(var b=0;b<c;b++)h[b]=_[b];for(var b=2;b<=o;b++){x.reset(),x.update(_).finish(_);for(var w=0;w<c;w++)h[w]^=_[w]}for(var b=0;b<c&&d*c+b<f;b++)v[d*c+b]=h[b]}for(var d=0;d<c;d++)h[d]=_[d]=0;for(var d=0;d<4;d++)u[d]=0;return x.clean(),v}i.pbkdf2=A})});var ce=P(L=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.Webhook=L.WebhookVerificationError=void 0;var ae=I(),Y=$(),he=J(),F=300,H=class i extends Error{constructor(e){super(e),Object.setPrototypeOf(this,i.prototype),this.name="ExtendableError",this.stack=new Error(e).stack}},k=class i extends H{constructor(e){super(e),Object.setPrototypeOf(this,i.prototype),this.name="WebhookVerificationError"}};L.WebhookVerificationError=k;var q=class i{constructor(e,t){if(!e)throw new Error("Secret can't be empty.");if(t?.format==="raw")e instanceof Uint8Array?this.key=e:this.key=Uint8Array.from(e,n=>n.charCodeAt(0));else{if(typeof e!="string")throw new Error("Expected secret to be of type string");e.startsWith(i.prefix)&&(e=e.substring(i.prefix.length)),this.key=Y.decode(e)}}verify(e,t){let n={};for(let r of Object.keys(t))n[r.toLowerCase()]=t[r];let s=n["webhook-id"],g=n["webhook-signature"],p=n["webhook-timestamp"];if(!g||!s||!p)throw new k("Missing required headers");let m=this.verifyTimestamp(p),C=this.sign(s,m,e).split(",")[1],A=g.split(" "),a=new globalThis.TextEncoder;for(let r of A){let[o,f]=r.split(",");if(o==="v1"&&(0,ae.timingSafeEqual)(a.encode(f),a.encode(C)))return JSON.parse(e.toString())}throw new k("No matching signature found")}sign(e,t,n){if(typeof n!="string")if(n.constructor.name==="Buffer")n=n.toString();else throw new Error("Expected payload to be of type string or Buffer.");let s=new TextEncoder,g=Math.floor(t.getTime()/1e3),p=s.encode(`${e}.${g}.${n}`);return`v1,${Y.encode(he.hmac(this.key,p))}`}verifyTimestamp(e){let t=Math.floor(Date.now()/1e3),n=parseInt(e,10);if(isNaN(n))throw new k("Invalid Signature Headers");if(t-n>F)throw new k("Message timestamp too old");if(n>t+F)throw new k("Message timestamp too new");return new Date(n*1e3)}};L.Webhook=q;q.prefix="whsec_"});export{P as a,ue as b,ce as c};
|
package/dist/chunk-Y5IXMRSB.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{b as G,c as q}from"./chunk-SB7H6IAS.js";import{execFileSync as O}from"child_process";import U from"fs";import p from"path";function F(e){let r=L(e);return r??P(e)}function P(e){let r=p.dirname(e);return N(p.join(e,".ripplo"))?e:r===e?null:P(r)}function N(e){try{return U.statSync(e).isDirectory()}catch{return!1}}function L(e){let r=j(["rev-parse","--show-toplevel"],e);if(r==null)return null;let t=r.trim();return t.length===0?null:p.isAbsolute(t)?t:p.resolve(e,t)}function j(e,r){try{return O("git",e,{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return null}}var f=class extends Error{detail;serverUrl;constructor({detail:r,serverUrl:t}){super(`Failed to connect to Ripplo server at ${t}. Check the server is running and reachable. Details: ${r}`),this.name="GqlConnectionError",this.detail=r,this.serverUrl=t}},c=class extends Error{errors;constructor(r){super(r.map(t=>t.message).join(", ")),this.name="GqlRequestError",this.errors=r}};function B(e){if(e instanceof c)return e.errors[0]?.extensions?.code}async function x(e){let{print:r}=await import("graphql"),t=r(e.document),n=JSON.stringify({query:t,variables:e.variables}),o=`${e.config.ripploServerUrl}/graphql`,d=await W({init:{body:n,headers:{Authorization:`Bearer ${e.config.token}`,"Content-Type":"application/json"},method:"POST"},serverUrl:e.config.ripploServerUrl,url:o}),s=await Q({res:d,url:o});if(!J(s))throw new Error("Invalid GraphQL response");if(K(s))throw new c(s.errors);if(s.data==null)throw new Error("No data returned from server");return s.data}async function W({init:e,serverUrl:r,url:t}){let n=1,o=await E({init:e,url:t});for(;o.retryable&&n<3;)await H(V(n)),n+=1,o=await E({init:e,url:t});if(o.response!=null)return o.response;throw new f({detail:o.detail,serverUrl:r})}async function E({init:e,url:r}){try{let t=await fetch(r,{...e,signal:AbortSignal.timeout(15e3)});return{detail:"",response:t,retryable:t.status>=500}}catch(t){return{detail:t instanceof Error?t.message:String(t),response:void 0,retryable:!0}}}function V(e){return 300*3**(e-1)*(.5+Math.random())}function H(e){return new Promise(r=>{setTimeout(r,e)})}async function Q({res:e,url:r}){let t=await e.text();if(t.length===0)throw new Error(`Empty response from Ripplo server at ${r} (status ${String(e.status)}). The server may have restarted or the request was rejected before a body was sent.`);try{return JSON.parse(t)}catch{throw new Error(`Non-JSON response from Ripplo server at ${r} (status ${String(e.status)}): ${t.slice(0,200)}`)}}function J(e){return typeof e=="object"&&e!=null&&("data"in e||"errors"in e)}function K(e){return Array.isArray(e.errors)&&e.errors.length>0}import X from"pino";import z from"pino-pretty";var y=X({level:process.env.LOG_LEVEL??"info"},z({ignore:"pid,hostname"}));import{readdir as Y,rm as Z,stat as ee}from"fs/promises";import k from"path";var b=k.join(process.cwd(),".ripplo","debug"),T=360*60*1e3;async function re({maxRuns:e}){try{let t=(await Y(b,{withFileTypes:!0})).filter(i=>i.isDirectory()),n=Date.now(),o=await Promise.all(t.map(async i=>{let m=k.join(b,i.name),$=await ee(m);return{dirPath:m,mtime:$.mtimeMs}})),d=o.filter(i=>n-i.mtime>T),M=o.filter(i=>n-i.mtime<=T).toSorted((i,m)=>m.mtime-i.mtime).slice(e),R=[...d,...M];if(R.length===0)return;await Promise.allSettled(R.map(i=>Z(i.dirPath,{force:!0,recursive:!0}))),y.debug("Pruned %d old debug run(s)",R.length)}catch{y.warn("Debug run pruning failed, ignoring")}}import{Agent as te,RetryAgent as ne,setGlobalDispatcher as oe}from"undici";var ie=1500,se=4e3,ae=3,le=50,de=100,C=!1;function ce(){if(C)return;C=!0;let e=new te({connections:de,keepAliveMaxTimeout:se,keepAliveTimeout:ie}),r=new ne(e,{errorCodes:["ECONNRESET","ECONNREFUSED","EPIPE","ETIMEDOUT","UND_ERR_REQ_CONTENT_LENGTH_MISMATCH","UND_ERR_SOCKET"],maxRetries:ae,methods:["GET","POST","HEAD","OPTIONS","PUT","DELETE"],minTimeout:le});oe(r)}import{graphql as u}from"gql.tada";var Ue=u(`
|
|
3
|
-
query AgentReviewContextWorker($reviewId: String!) {
|
|
4
|
-
agentReview(id: $reviewId) {
|
|
5
|
-
id
|
|
6
|
-
runId
|
|
7
|
-
agentProfile {
|
|
8
|
-
id
|
|
9
|
-
name
|
|
10
|
-
description
|
|
11
|
-
output
|
|
12
|
-
successCriteria
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
`);var Fe=u(`
|
|
17
|
-
mutation StartAgentReviewWorker($reviewId: String!) {
|
|
18
|
-
startAgentReview(reviewId: $reviewId)
|
|
19
|
-
}
|
|
20
|
-
`);var Ne=u(`
|
|
21
|
-
mutation CompleteAgentReviewWorker(
|
|
22
|
-
$reviewId: String!
|
|
23
|
-
$markdown: String!
|
|
24
|
-
$shortSummary: String!
|
|
25
|
-
$verdict: AgentReviewVerdict!
|
|
26
|
-
$comments: [AgentReviewCommentInput!]!
|
|
27
|
-
) {
|
|
28
|
-
completeAgentReview(
|
|
29
|
-
reviewId: $reviewId
|
|
30
|
-
markdown: $markdown
|
|
31
|
-
shortSummary: $shortSummary
|
|
32
|
-
verdict: $verdict
|
|
33
|
-
comments: $comments
|
|
34
|
-
)
|
|
35
|
-
}
|
|
36
|
-
`);var Le=u(`
|
|
37
|
-
mutation UpdateAgentReviewProgressWorker($reviewId: String!, $text: String!) {
|
|
38
|
-
updateAgentReviewProgress(reviewId: $reviewId, text: $text)
|
|
39
|
-
}
|
|
40
|
-
`);var je=u(`
|
|
41
|
-
mutation FailAgentReviewWorker($reviewId: String!, $reason: String!) {
|
|
42
|
-
failAgentReview(reviewId: $reviewId, reason: $reason)
|
|
43
|
-
}
|
|
44
|
-
`);import l from"fs";import I from"path";import a from"fs";import ue from"os";import g from"path";var ge=".local",me=".ripplo";function v(e){return g.join(e,".ripplo",ge)}function pe(e){let r=v(e);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let t=g.join(r,".gitignore");return a.existsSync(t)||a.writeFileSync(t,`*
|
|
45
|
-
`),r}function fe(e,r){return g.join(v(e),r)}function h(){return g.join(ue.homedir(),me)}function S(){let e=h();return a.existsSync(e)?a.chmodSync(e,448):a.mkdirSync(e,{mode:448,recursive:!0}),e}function A(e){return g.join(h(),e)}function ye(e){let r=process.env.RIPPLO_TOKEN;if(r!=null&&r.trim().length>0)return r.trim();let t=w(e);if(!l.existsSync(t))return null;let n=l.readFileSync(t,"utf8").trim();return n.length===0?null:n}function we({serverUrl:e,token:r}){S();let t=w(e);l.mkdirSync(I.dirname(t),{mode:448,recursive:!0}),l.writeFileSync(t,r+`
|
|
46
|
-
`,{mode:384})}function Re(e){let r=w(e);return l.existsSync(r)?(l.unlinkSync(r),!0):!1}function w(e){return A(I.join("tokens",ve(e)))}function ve(e){return new URL(e).host.replaceAll(/[^a-zA-Z0-9.]/g,"_")}var D=G(q(),1);import _ from"crypto";function he({body:e,secret:r}){let t=new D.Webhook(r),n=`msg_${_.randomUUID()}`,o=new Date,d=t.sign(n,o,e),s=Math.floor(o.getTime()/1e3);return{"webhook-id":n,"webhook-signature":d,"webhook-timestamp":String(s)}}function Se(){return`whsec_${_.randomBytes(24).toString("base64")}`}export{F as a,f as b,B as c,x as d,y as e,re as f,pe as g,fe as h,S as i,A as j,ye as k,we as l,Re as m,w as n,ce as o,he as p,Se as q};
|
package/dist/daemon-EQZROAKJ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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-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};
|
package/dist/daemon-EUZ4KVQP.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
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};
|