ripplo 0.7.23 → 0.7.25

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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{G as Qe,J as Xe,K as Ye,L as Ze,M as er,N as ae,O as D,P as H,Q as U,R as rr,T as nr,U as tr,V as or,W as ir,X as ar,Z as sr,_ as lr,a as We,b as O,e as qe,f as Be,h as N,i as Ve,j as Ke,k as h,l as ze,m as Je,n as C,o as A,p as Ge,s as R}from"./chunk-R7CQWEBF.js";import{b as Oe,d as m,e as y,g as Ne,h as S,i as De,j as He,k as Ue}from"./chunk-EVYYSTR7.js";import ur from"fs";import K from"path";import{config as Qn}from"dotenv";import{z as B}from"zod";import{err as Xn,ok as pr}from"neverthrow";import q from"fs";import ce from"path";import{err as se,ok as cr}from"neverthrow";import{z as W}from"zod";var Kn=ce.join(".ripplo","project.json"),le=[".env",".env.local"],zn=W.object({envFiles:W.array(W.string().min(1)).optional(),projectId:W.string().min(1)});function dr(e){return ce.join(e,Kn)}function de(e){let r=dr(e);return q.existsSync(r)?Jn(r).andThen(n=>{let t=zn.safeParse(n);return t.success?cr({envFiles:t.data.envFiles??le,projectId:t.data.projectId}):se({issues:t.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`),kind:"project-file-invalid",path:r})}):se({kind:"project-file-missing",path:r})}function ue(e){return de(e).match(r=>r,()=>{})}function Jn(e){try{return cr(JSON.parse(q.readFileSync(e,"utf8")))}catch(r){return se({issues:[r instanceof Error?r.message:String(r)],kind:"project-file-invalid",path:e})}}function La({cwd:e,envFiles:r,projectId:n}){let t=dr(e);q.mkdirSync(ce.dirname(t),{recursive:!0});let o={projectId:n};r!=null&&!Gn(r)&&(o.envFiles=[...r]),q.writeFileSync(t,JSON.stringify(o,null,2)+`
2
+ import{A as Xe,B as Ye,C as Ze,D as ae,E as D,F as H,G as U,H as er,J as rr,K as nr,L as tr,M as or,N as ir,P as ar,Q as sr,Y as lr,a as We,b as O,e as qe,f as Be,h as N,i as Ve,j as Ke,k as h,l as ze,m as Je,n as C,o as A,p as Ge,s as R,z as Qe}from"./chunk-NXJP3Q4N.js";import{b as Oe,d as m,e as y,g as Ne,h as S,i as De,j as He,k as Ue}from"./chunk-EVYYSTR7.js";import ur from"fs";import K from"path";import{config as Qn}from"dotenv";import{z as B}from"zod";import{err as Xn,ok as pr}from"neverthrow";import q from"fs";import ce from"path";import{err as se,ok as cr}from"neverthrow";import{z as W}from"zod";var Kn=ce.join(".ripplo","project.json"),le=[".env",".env.local"],zn=W.object({envFiles:W.array(W.string().min(1)).optional(),projectId:W.string().min(1)});function dr(e){return ce.join(e,Kn)}function de(e){let r=dr(e);return q.existsSync(r)?Jn(r).andThen(n=>{let t=zn.safeParse(n);return t.success?cr({envFiles:t.data.envFiles??le,projectId:t.data.projectId}):se({issues:t.error.issues.map(o=>`${o.path.join(".")}: ${o.message}`),kind:"project-file-invalid",path:r})}):se({kind:"project-file-missing",path:r})}function ue(e){return de(e).match(r=>r,()=>{})}function Jn(e){try{return cr(JSON.parse(q.readFileSync(e,"utf8")))}catch(r){return se({issues:[r instanceof Error?r.message:String(r)],kind:"project-file-invalid",path:e})}}function La({cwd:e,envFiles:r,projectId:n}){let t=dr(e);q.mkdirSync(ce.dirname(t),{recursive:!0});let o={projectId:n};r!=null&&!Gn(r)&&(o.envFiles=[...r]),q.writeFileSync(t,JSON.stringify(o,null,2)+`
3
3
  `)}function Gn(e){return e.length!==le.length?!1:e.every((r,n)=>r===le[n])}function Ua(e){let n=ue(e)?.envFiles??[".env",".env.local"],t=K.join(e,".ripplo");n.forEach(o=>{let i=K.resolve(t,o);ur.existsSync(i)&&Qn({override:!0,path:i,quiet:!0})}),V=void 0}var Yn=B.object({RIPPLO_APP_URL:B.url(),RIPPLO_ENGINE_URL:B.url(),RIPPLO_WEBHOOK_SECRET:B.string().min(1)}),V;function z(){return V!=null?pr(V):et().map(e=>(V=e,e))}function Zn(e){let n=ue(e)?.envFiles??[],t=K.join(e,".ripplo");return n.map(o=>K.resolve(t,o)).filter(o=>!ur.existsSync(o))}function et(){let e=Yn.safeParse(process.env);if(!e.success)return Xn({issues:e.error.issues.map(n=>`${n.path.join(".")}: ${n.message}`),kind:"env-invalid",missingEnvFiles:Zn(process.cwd())});let r=e.data;return pr({appUrl:r.RIPPLO_APP_URL,engineUrl:r.RIPPLO_ENGINE_URL,webhookSecret:r.RIPPLO_WEBHOOK_SECRET})}import{readFileSync as rt}from"fs";import{z as fr}from"zod";var nt=fr.object({version:fr.string()});function J(){let e=rt(new URL("../package.json",import.meta.url),"utf8");return nt.parse(JSON.parse(e)).version}import ge from"fs";import G from"path";import{createJiti as pt}from"jiti";import{err as L,ok as hr}from"neverthrow";import tt from"fs";import T from"path";import b from"typescript";function mr(e){let r=T.join(e,"index.ts"),n=at(e);tt.mkdirSync(T.dirname(n.tsBuildInfoFile??""),{recursive:!0});let t=b.createIncrementalCompilerHost(n),o=b.createIncrementalProgram({host:t,options:n,rootNames:[r]}),i=[...o.getSyntacticDiagnostics(),...o.getSemanticDiagnostics()];o.emit();let s=i.filter(d=>ot(d,e));if(s.length===0)return{diagnostics:[],ok:!0};let l={getCanonicalFileName:d=>d,getCurrentDirectory:()=>T.dirname(e),getNewLine:()=>`
4
4
  `};return{diagnostics:b.formatDiagnosticsWithColorAndContext(s,l).split(`
5
5
  `).filter(d=>d.length>0),ok:!1}}function ot(e,r){let n=e.file?.fileName;return n==null?!0:n.startsWith(r)}var it=T.join(".local","tsbuildinfo");function at(e){return{allowImportingTsExtensions:!0,allowJs:!1,esModuleInterop:!0,incremental:!0,module:b.ModuleKind.Preserve,moduleResolution:b.ModuleResolutionKind.Bundler,noEmit:!0,resolveJsonModule:!0,skipLibCheck:!0,strict:!1,target:b.ScriptTarget.ES2022,tsBuildInfoFile:T.join(e,it)}}import{createHash as st}from"crypto";import yr from"fs/promises";import pe from"path";import{err as v,ok as fe,Result as lt}from"neverthrow";var j=".ripplo/fixtures",me=10*1024*1024,ye=50*1024*1024;async function gr(e,r){let n=ct(r);if(n.length===0)return fe({});let t=pe.join(e,j),o=await Promise.all(n.map(i=>dt({fixturesRoot:t,name:i})));return lt.combine(o).andThen(ut)}function ct(e){let n=e.workflows.flatMap(t=>[...t.steps,...t.tests.flatMap(o=>o.steps)]).flatMap(t=>t.action.kind==="upload"?t.action.files:[]);return[...new Set(n)].toSorted((t,o)=>t.localeCompare(o))}async function dt({fixturesRoot:e,name:r}){if(r.includes("..")||pe.isAbsolute(r))return v({kind:"fixture-invalid-name",name:r});let n=pe.join(e,r),t=await yr.lstat(n).catch(()=>null);if(t==null)return v({kind:"fixture-missing",name:r,path:n});if(t.isSymbolicLink())return v({kind:"fixture-symlink",name:r});if(!t.isFile())return v({kind:"fixture-not-file",name:r});let o=await yr.readFile(n);if(o.byteLength>me)return v({kind:"fixture-too-large",name:r,size:o.byteLength});let i=st("sha256").update(o).digest("hex");return fe([r,{sha256:i,size:o.byteLength}])}function ut(e){let r=e.reduce((n,[,t])=>n+t.size,0);return r>ye?v({kind:"fixtures-total-too-large",total:r}):fe(Object.fromEntries(e))}var E=".ripplo/ripplo.lock",F;async function kr(e){let{result:r}=await he(e);return r}async function he(e){let r=mt(G.join(e,".ripplo"));if(F!=null&&F.fingerprint===r&&F.result.isOk())return{fingerprint:r,result:F.result};let n=await M(e);return F={fingerprint:r,result:n},{fingerprint:r,result:n}}async function M(e){let r=G.join(e,".ripplo"),n=G.join(r,"index.ts"),t=mr(r);return t.ok?(await yt(n)).andThen(s=>ht({entryPath:n,exported:s})).match(async s=>(await gr(e,s)).map(u=>({...s,fixtures:u})).mapErr(u=>({error:u,kind:"fixture-failed"})),s=>Promise.resolve(L(s))):L({diagnostics:t.diagnostics,kind:"typecheck-failed"})}var ft=new Set([".local","debug","node_modules"]);function mt(e){return Sr(e).toSorted((r,n)=>r.localeCompare(n)).join("|")}function Sr(e){return(ge.existsSync(e)?ge.readdirSync(e,{withFileTypes:!0}):[]).flatMap(n=>{if(ft.has(n.name))return[];let t=G.join(e,n.name);if(n.isDirectory())return Sr(t);let o=ge.statSync(t);return[`${t}:${String(o.mtimeMs)}:${String(o.size)}`]})}async function yt(e){try{let n=await pt(import.meta.url,{fsCache:!1,moduleCache:!1,sourceMaps:!0}).import(e),t=n!=null&&typeof n=="object"&&"default"in n?Reflect.get(n,"default"):n;return hr(t)}catch(r){return L({kind:"load-threw",message:gt(r)})}}function gt(e){return e instanceof Error?e.message:String(e)}function ht({entryPath:e,exported:r}){if(r==null||typeof r!="object"||!("lockfile"in r))return L({entryPath:e,kind:"not-ripplo"});let n=Be.safeParse(Reflect.get(r,"lockfile"));return n.success?hr(n.data):L({issues:n.error.issues.map(t=>`${t.path.join(".")}: ${t.message}`),kind:"invalid-lockfile"})}function w(e,r){return r==null?`Load \`/ripplo:${e}\` skill for instructions.`:`Load \`/ripplo:${e}\` skill for instructions on ${r}.`}function cs(e){return e.length===1?w(e[0]):`Before proceeding, load the ${e.map(n=>`\`/ripplo:${n}\``).join(" and ")} skills \u2014 every one, each carries rules the others don't.`}function X(e){return[`Compilation failed: ${kt(e)}`,w("create","DSL authoring + lint rules")].join(`
@@ -121,7 +121,7 @@ import{G as Qe,J as Xe,K as Ye,L as Ze,M as er,N as ae,O as D,P as H,Q as U,R as
121
121
  clipUploadUrl(runId: $runId)
122
122
  }
123
123
  `);async function gi(e,r,n){let t=Le.join(r,n,"clip.gif");if(En(t))try{let o=await m({config:e,document:yi,variables:{runId:n}});if(o.clipUploadUrl==null)return;let i=await fetch(o.clipUploadUrl,{body:new Uint8Array(wn(t)),headers:{"Content-Type":"image/gif"},method:"PUT"});i.ok||y.warn({runId:n,status:i.status},"Clip upload failed")}catch(o){y.warn({err:o,runId:n},"Clip upload skipped")}}function hi(e){return e.reduce((r,n)=>Math.min(r,n.startMs),e[0]?.startMs??0)}function Pn(e){return e.flatMap(r=>r.kind==="step"?[{annotations:r.annotations,endMs:r.endMs,findings:r.findings,index:r.index,source:r.source,startMs:r.startMs,state:r.state,url:r.url}]:[])}function ki(e,r){let n=Le.join(e,r,"behavior.jsonl");if(!En(n))return null;let t=wn(n,"utf8").split(`
124
- `).filter(i=>i.length>0).map(i=>Si(i)).flatMap(i=>Ri(i)?[i.event]:[]),o=t[0];return o==null?null:{events:t,origin:o.timestamp}}function Si(e){return JSON.parse(e)}function Ri(e){return typeof e=="object"&&e!=null&&Reflect.get(e,"kind")==="rrweb"}function xi(e){return e.flatMap(r=>r.kind==="world"?r.aliases:[])}function bi(e){return e.flatMap(r=>{let n=wi(r.source);return n.flatMap(t=>{let i=n.filter(l=>l.entity===t.entity).indexOf(t),s=r.state.rows.filter(l=>l.status==="created"&&l.entity===t.entity).at(i);return s==null?[]:[{alias:t.as,entity:t.entity,key:s.key}]})})}function vi(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generated.map(n=>In(n)):[]))}function In({entity:e,field:r,key:n}){return`${e}\0${n}\0${r}`}function Ei(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generatedSingletons:[]))}function wi(e){return e==null?[]:e.expect.flatMap(r=>Fe(r))}function Fe(e){return e.kind==="state"&&e.assertion.kind==="created"?[{as:e.assertion.as,entity:e.entity}]:e.kind==="and"?e.predicates.flatMap(r=>Fe(r)):e.kind==="when"?e.branches.flatMap(r=>r.consequence.flatMap(n=>Fe(n))):[]}async function Pi({aliases:e,config:r,generated:n,generatedSingletons:t,origin:o,records:i,rrwebEvents:s,runId:l,stepSources:u}){let d=i.map((f,p)=>Ti({aliases:e,generated:n,generatedSingletons:t,origin:o,record:f,rrwebEvents:s,sourceTest:u?.[p]??null}));await m({config:r,document:Oi,variables:{items:[{runId:l,steps:d}]}})}var Ii=3,Ci=0;function Ai({endMs:e,rrwebEvents:r,startMs:n}){let t=r.find(o=>o.type===Ii&&o.data?.source===Ci&&o.timestamp>=n&&o.timestamp<=e);return t==null?n:t.timestamp}function Ti({aliases:e,generated:r,generatedSingletons:n,origin:t,record:o,rrwebEvents:i,sourceTest:s}){let l=Ke(o.source,o.index),u=Ai({endMs:o.endMs,rrwebEvents:i,startMs:o.startMs}),d=o.annotations.map(p=>({kind:p.kind,label:p.label,outcome:p.outcome,recordingStartMs:Math.max(0,(p.kind==="action"?u:p.atMs)-t),rrwebIds:[...p.rrwebIds]})),f=o.annotations.find(p=>p.kind==="action")?.rrwebIds??[];return{annotations:d,detail:null,duration:Math.max(0,o.endMs-o.startMs),findings:o.findings.map(p=>bn(p)),nodeType:l.kind,recordingEndMs:Math.max(0,o.endMs-t),recordingStartMs:Math.max(0,u-t),rrwebIds:[...f],snapshotTimestamp:Math.max(0,o.endMs-t),sourceTest:s,stateRows:o.state.rows.map(p=>ji({aliases:e,generated:r,row:p})),stateSingletons:o.state.singletons.map(p=>({changed:p.changed,generated:n.has(p.name),name:p.name,value:p.value==null?null:String(p.value)})),status:o.findings.length>0?"failed":"passed",stepIndex:o.index,title:xn(l),url:o.url}}function ji({aliases:e,generated:r,row:n}){let t=e.find(o=>o.entity===n.entity&&o.key===n.key);return{entity:n.entity,fields:n.fields.map(o=>({changed:o.changed,field:o.field,generated:r.has(In({entity:n.entity,field:o.field,key:n.key})),value:o.value==null?null:String(o.value)})),key:n.key,label:t?.alias??n.key,status:n.status}}var Fi=fi(pi);async function Cn(e,r,n){await m({config:e,document:Hi,variables:{reason:n,runId:r}}).catch(t=>{y.error(t,"failRun submission failed")})}async function Li(e,r,n){let t=n.events.map(s=>JSON.stringify(s)).join(`
124
+ `).filter(i=>i.length>0).map(i=>Si(i)).flatMap(i=>Ri(i)?[i.event]:[]),o=t[0];return o==null?null:{events:t,origin:o.timestamp}}function Si(e){return JSON.parse(e)}function Ri(e){return typeof e=="object"&&e!=null&&Reflect.get(e,"kind")==="rrweb"}function xi(e){return e.flatMap(r=>r.kind==="world"?r.aliases:[])}function bi(e){return e.flatMap(r=>{let n=wi(r.source);return n.flatMap(t=>{let i=n.filter(l=>l.entity===t.entity).indexOf(t),s=r.state.rows.filter(l=>l.status==="created"&&l.entity===t.entity).at(i);return s==null?[]:[{alias:t.as,entity:t.entity,key:s.key}]})})}function vi(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generated.map(n=>In(n)):[]))}function In({entity:e,field:r,key:n}){return`${e}\0${n}\0${r}`}function Ei(e){return new Set(e.flatMap(r=>r.kind==="world"?r.generatedSingletons:[]))}function wi(e){return e==null?[]:e.expect.flatMap(r=>Fe(r))}function Fe(e){return e.kind==="state"&&e.assertion.kind==="created"?[{as:e.assertion.as,entity:e.entity}]:e.kind==="and"?e.predicates.flatMap(r=>Fe(r)):e.kind==="when"?e.branches.flatMap(r=>r.consequence.flatMap(n=>Fe(n))):[]}async function Pi({aliases:e,config:r,generated:n,generatedSingletons:t,origin:o,records:i,rrwebEvents:s,runId:l,stepSources:u}){let d=i.map((f,p)=>Ti({aliases:e,generated:n,generatedSingletons:t,origin:o,record:f,rrwebEvents:s,sourceTest:u?.[p]??null}));await m({config:r,document:Oi,variables:{items:[{runId:l,steps:d}]}})}var Ii=3,Ci=0;function Ai({endMs:e,rrwebEvents:r,startMs:n}){let t=r.find(o=>o.type===Ii&&o.data?.source===Ci&&o.timestamp>=n&&o.timestamp<=e);return t==null?n:t.timestamp}function Ti({aliases:e,generated:r,generatedSingletons:n,origin:t,record:o,rrwebEvents:i,sourceTest:s}){let l=Ke(o.source,o.index),u=Ai({endMs:o.endMs,rrwebEvents:i,startMs:o.startMs}),d=o.annotations.map(p=>({kind:p.kind,label:p.label,outcome:p.outcome,recordingStartMs:Math.max(0,(p.kind==="action"?u:p.atMs)-t),rrwebIds:[...p.rrwebIds],url:p.url})),f=o.annotations.find(p=>p.kind==="action")?.rrwebIds??[];return{annotations:d,detail:null,duration:Math.max(0,o.endMs-o.startMs),findings:o.findings.map(p=>bn(p)),nodeType:l.kind,recordingEndMs:Math.max(0,o.endMs-t),recordingStartMs:Math.max(0,u-t),rrwebIds:[...f],snapshotTimestamp:Math.max(0,o.endMs-t),sourceTest:s,stateRows:o.state.rows.map(p=>ji({aliases:e,generated:r,row:p})),stateSingletons:o.state.singletons.map(p=>({changed:p.changed,generated:n.has(p.name),name:p.name,value:p.value==null?null:String(p.value)})),status:o.findings.length>0?"failed":"passed",stepIndex:o.index,title:xn(l),url:o.url}}function ji({aliases:e,generated:r,row:n}){let t=e.find(o=>o.entity===n.entity&&o.key===n.key);return{entity:n.entity,fields:n.fields.map(o=>({changed:o.changed,field:o.field,generated:r.has(In({entity:n.entity,field:o.field,key:n.key})),value:o.value==null?null:String(o.value)})),key:n.key,label:t?.alias??n.key,status:n.status}}var Fi=fi(pi);async function Cn(e,r,n){await m({config:e,document:Hi,variables:{reason:n,runId:r}}).catch(t=>{y.error(t,"failRun submission failed")})}async function Li(e,r,n){let t=n.events.map(s=>JSON.stringify(s)).join(`
125
125
  `),o=await Fi(Buffer.from(t,"utf8")),i=n.events.at(-1);await m({config:e,document:Ni,variables:{input:{bodyBase64:o.toString("base64"),chunkIndex:0,endTimestamp:Math.max(0,(i?.timestamp??n.origin)-n.origin),eventCount:n.events.length,runId:r,startTimestamp:0}}})}async function Mi(e,r,n){let t=n.filter(s=>s.findings.length>0).length,o=n.length-t,i=n.reduce((s,l)=>s+Math.max(0,l.endMs-l.startMs),0);await m({config:e,document:Di,variables:{items:[{duration:i,failCount:t,passCount:o,runId:r,status:t>0?"failed":"passed",summary:null,warnCount:0}]}})}async function $i(e,r){return((await m({config:e,document:_i,variables:{runIds:[r]}})).startRunsBatch??[]).some(t=>t.id===r)}var _i=x(`
126
126
  mutation StartRunsBatch($runIds: [String!]!) {
127
127
  startRunsBatch(runIds: $runIds) {
@@ -203,4 +203,4 @@ import{G as Qe,J as Xe,K as Ye,L as Ze,M as er,N as ae,O as D,P as H,Q as U,R as
203
203
  query ExploreFindingExists($projectId: String!, $signature: String!, $lockfileHash: String!) {
204
204
  exploreFindingExists(projectId: $projectId, signature: $signature, lockfileHash: $lockfileHash)
205
205
  }
206
- `);import Ki from"fs";import{lockSync as zi}from"proper-lockfile";var Ji="explorer.lock",Gi=15e3,Qi=15e3;function Xi(){return He(Ji)}function od({onChange:e}){let r={release:null,stopped:!1},n=()=>{r.release=null,r.stopped||e(!1)},t=()=>{if(r.stopped||r.release!=null)return;let i=Yi(n);i!=null&&(r.release=i,e(!0))};t();let o=setInterval(t,Qi);return{holder:()=>r.release!=null,stop:()=>{r.stopped=!0,clearInterval(o),r.release?.(),r.release=null}}}function Yi(e){try{De();let r=Xi(),n=zi(r,{onCompromised:e,realpath:!1,stale:Gi});return Ki.writeFileSync(r,String(process.pid)),()=>{try{n()}catch{}}}catch{return null}}import Zi from"path";import{randomUUID as ea}from"crypto";function An(e){return{axes:[Ye("unit"),Ze(e)]}}var Tn=12,jn=15,Fn=4,Ln=2;var _n={covered:0,deferred:0,findings:0,saturated:!1,total:0};function fd(){return{priority:"p3",next:()=>null,onResult:()=>{},ready:()=>Promise.resolve(),status:()=>_n,stop:()=>Promise.resolve()}}function md(e){let r={claimed:new Set,consecutiveErrors:0,covered:new Set,deferred:new Map,findings:0,haltedUntil:0,prepared:null,preparing:!1,refreshing:!1,saturated:!1,tick:0},n=Me(e,r);return{priority:"p3",next:()=>aa(e,r),onResult:()=>{},ready:()=>n,status:()=>r.prepared==null?_n:oa(r.prepared,r),stop:()=>Promise.resolve()}}async function Me(e,r){if(!r.preparing){r.preparing=!0;try{let n=await e.loadLockfile();if(n==null)return;let t=await ra(n);if(t==null)return;await U(On(e.cwd)).match(o=>{let i=H(o);r.covered=new Set(i.covered),r.findings=[...i.findings.values()].filter(s=>s.resolvedAt==null).length,r.prepared=t,r.consecutiveErrors=0,r.haltedUntil=0,r.deferred.clear(),e.notifyWork()},o=>{y.warn("explore findings log unreadable, exploration disabled: %s",o.kind)})}finally{r.preparing=!1}}}async function ra({fingerprint:e,lockfile:r}){let n=An(r),t=Ge(r);if(t.length===0)return null;let o=sr(r,{sweep:!1}),i=await na(r,o),s=tr({baseStates:i,corpus:t,lens:n,maxCount:Ln,maxDepth:Fn});return{actionHashes:t.map(l=>nr(r,l)),baseStates:o,corpus:t,fingerprint:e,graph:s,lens:n,lensIdValue:Xe(n),lockfile:r,lockfileHashValue:N(r)}}async function na(e,r){let n={generate:R,materialize:Je(R,e.valueSpaces),params:void 0};return(await Promise.all(r.map(async o=>(await lr(e,o,n)).match(s=>({name:o.name,snapshot:s.snapshot}),()=>null)))).flatMap(o=>o==null?[]:[o])}var Mn=20,ta=6e5,$n=3e5;function oa(e,r){let n=ir(e.graph),t=or({actionHashes:e.actionHashes,corpus:e.corpus,covered:r.covered,graph:e.graph,lensId:e.lensIdValue,tick:r.tick});return{covered:n-t,deferred:Dn(r).size,findings:r.findings,saturated:r.saturated,total:n}}async function ia(e,r){if(!(r.refreshing||r.preparing||r.prepared==null)){r.refreshing=!0;try{let n=await e.loadLockfile();if(n==null||n.fingerprint===r.prepared.fingerprint)return;y.info("workflow definitions changed, re-preparing exploration targets"),r.prepared=null,await Me(e,r)}finally{r.refreshing=!1}}}function aa(e,r){ia(e,r);let n=r.prepared;if(n==null||Date.now()<r.haltedUntil)return null;let t=ar({actionHashes:n.actionHashes,corpus:n.corpus,covered:new Set([...r.covered,...r.claimed,...Dn(r)]),graph:n.graph,lensId:n.lensIdValue,tick:r.tick});if(r.tick+=1,t.kind==="saturated")return r.saturated=!0,null;r.saturated=!1;let o=ma(n,t.target);return r.claimed.add(o),{id:`explore:${ea()}`,label:t.target.targetKey,run:i=>sa({choice:t.target,key:o,params:e,prepared:n,signal:i,state:r})}}async function sa({choice:e,key:r,params:n,prepared:t,signal:o,state:i}){try{let s=ca({choice:e,params:n,prepared:t});if(s==null)return;if(!await n.probeApp()){Nn(i,"app-unreachable");return}let l=await n.executeTrail(s,o);if(l.kind==="aborted")return;if(l.kind==="error"){ua({key:r,params:n,reason:l.reason,state:i});return}i.consecutiveErrors=0,y.info("exploration trail %s: %s @ %s",l.kind,l.trail.map(u=>u.label).join(" -> "),e.targetKey.slice(0,80)),n.onTrailDone?.({kind:l.kind,label:e.targetKey,trail:l.trail}),await da({outcome:la(l,e,t),params:n,state:i})}finally{i.claimed.delete(r)}}function la(e,r,n){let t={actionHash:r.actionHash,at:new Date().toISOString(),kind:"covered",lensId:n.lensIdValue,targetKey:r.targetKey};return{...e,rows:[...e.rows,t]}}function ca({choice:e,params:r,prepared:n}){let t=n.baseStates.find(o=>o.name===e.witness.baseState);return t==null?null:{baseStateTest:t.test,lensId:n.lensIdValue,lockfileFingerprint:n.fingerprint,lockfileHash:n.lockfileHashValue,maxLength:r.maxTrailLength??Tn,shrinkBudget:jn,stepRuns:e.witness.trail.map(o=>({idx:o.idx,params:o.params}))}}async function da({outcome:e,params:r,state:n}){let t=e.rows.filter(o=>o.kind!=="covered"||!n.covered.has(D(o)));t.forEach(o=>{(o.kind==="covered"||o.kind==="finding"||o.kind==="flaky-candidate")&&n.covered.add(D(o))}),e.kind==="finding"&&(n.findings+=1,y.info("exploration finding recorded")),t.length!==0&&await rr(On(r.cwd),t).match(()=>{},o=>{y.warn("explore findings log append failed: %s",o.kind)})}function On(e){return Zi.join(e,".ripplo",".local","explore-ledger.jsonl")}function ua({key:e,params:r,reason:n,state:t}){if(n==="lockfile:fingerprint-mismatch"){pa(r,t);return}fa(t,e),Nn(t,n)}function pa(e,r){r.preparing||(r.prepared=null,Me(e,r))}function fa(e,r){e.deferred.set(r,Date.now()+ta)}function Nn(e,r){e.consecutiveErrors+=1,y.debug("exploration trail error: %s",r),e.consecutiveErrors>=Mn&&(e.haltedUntil=Date.now()+$n,e.consecutiveErrors=0,y.warn("exploration cooling down for %ds after %d consecutive trail errors (last: %s)",$n/1e3,Mn,r))}function Dn(e){let r=Date.now();return[...e.deferred].filter(([,n])=>n<=r).forEach(([n])=>e.deferred.delete(n)),new Set(e.deferred.keys())}function ma(e,r){return D({actionHash:r.actionHash,lensId:e.lensIdValue,targetKey:r.targetKey})}import ya from"path";var ga=3;function kd(e){return U(ha(e)).map(r=>ka(H(r)))}function ha(e){return ya.join(e,".ripplo",".local","explore-ledger.jsonl")}function ka(e){let r=[...e.findings.entries()].filter(([,t])=>t.resolvedAt==null).map(([t,o])=>Sa(t,o)).toSorted(xa),n=[...e.flaky.entries()].filter(([,t])=>t.occurrences>=ga).map(([t,o])=>Ra(t,o)).toSorted((t,o)=>o.occurrences-t.occurrences);return{pending:r,recurrentFlaky:n}}function Sa(e,r){let n=r.latest;return{baseState:n.baseState,evidence:n.evidence,firstSeen:r.first.at,id:ae(e),lastSeen:n.at,occurrences:r.occurrences,parts:n.parts,runId:n.runId,trail:n.trail,verifierLayer:n.verifierLayer}}function Ra(e,r){return{at:r.first.at,baseState:r.first.baseState,id:ae(e),occurrences:r.occurrences,trail:r.first.trail}}var Hn={crash:0,"data-rule":1,frame:3,"page-rule":2};function xa(e,r){let n=Hn[e.verifierLayer]-Hn[r.verifierLayer];return n===0?r.occurrences-e.occurrences:n}import{createMessageConnection as Un,IPCMessageReader as Wn,IPCMessageWriter as qn,NotificationType as ba,NotificationType0 as Bn,RequestType as $e}from"vscode-jsonrpc/node";import{z as c}from"zod";var wd=c.object({headed:c.boolean(),lockfileFingerprint:c.string(),runId:c.string().min(1),testRef:c.string().min(1)}),Pd=c.object({fingerprint:c.string()}),Id=c.object({lockfileJson:c.string().optional(),unavailable:c.string().optional()}),va=c.enum(["unspecified","internal","server","client","producer","consumer"]),Ea=c.enum(["unset","ok","error"]),wa=c.object({attributes:c.record(c.string(),c.string()),durationMs:c.number(),kind:c.literal("span"),name:c.string(),parentSpanId:c.union([c.string(),c.undefined()]),source:c.literal("server"),spanId:c.string(),spanKind:va,status:c.object({code:Ea,message:c.union([c.string(),c.undefined()])}),timeNanos:c.string(),traceId:c.string()}),Cd=c.object({runId:c.string().min(1),span:wa}),Ad=c.object({outcome:Pe,serverNotified:c.boolean()}),Td=c.object({baseStateTest:qe,lensId:c.string().min(1),lockfileFingerprint:c.string(),lockfileHash:c.string().min(1),maxLength:c.number().int().positive(),shrinkBudget:c.number().int().nonnegative(),stepRuns:c.array(c.object({idx:c.number().int().nonnegative(),params:c.record(c.string(),c.union([We,c.null()]))}))}),Pa=c.object({actions:c.array(c.string()),label:c.string().min(1)}),jd=c.object({kind:c.enum(["aborted","clean","error","flaky","finding"]),reason:c.string().optional(),rows:c.array(er),trail:c.array(Pa).default([])}),Fd=new Bn("worker/ready"),Ld=new $e("worker/run"),Md=new $e("worker/lockfile"),$d=new $e("worker/exploreTrail"),_d=new ba("worker/span"),Od=new Bn("worker/shutdown");function Nd(e){let r=Un(new Wn(e),new qn(e));return r.listen(),r}function Dd(){let e=Un(new Wn(process),new qn(process));return e.listen(),e}import Ia from"path";import{randomUUID as Ca}from"crypto";async function zd({cwd:e,ref:r,signal:n,step:t}){let o=Ir(e).match(f=>({config:f}),f=>({failure:f}));if("failure"in o)return{failure:o.failure,kind:"config-failed"};let i=o.config,s=await he(e);if(s.result.isErr())return{error:s.result.error,kind:"compile-failed"};let l=s.result.value,u=A(l).find(f=>f.ref===r);return u==null?{kind:"no-test",ref:r}:(await Qe({lockfile:l,options:{baseUrl:i.appUrl,engineUrl:i.engineUrl,fixturesDir:Ia.join(i.cwd,j),generate:R,headed:!0,secret:i.webhookSecret,tunnelAuth:i.tunnelAuth},params:void 0,runId:`teleport-${Ca()}`,stopAfterStep:t,test:u.test},n)).match(f=>({kind:"done",result:f}),f=>({error:f,kind:"run-failed"}))}export{La as a,Ua as b,z as c,Zn as d,J as e,j as f,E as g,he as h,M as i,w as j,cs as k,X as l,ms as m,ys as n,gs as o,bs as p,ke as q,br as r,Er as s,Ir as t,jr as u,xe as v,Ds as w,te as x,Rn as y,gc as z,hc as A,kc as B,oi as C,Cc as D,mi as E,Cn as F,Ui as G,Wi as H,od as I,An as J,fd as K,md as L,kd as M,ha as N,ml as O,yl as P,Hr as Q,gl as R,hl as S,kl as T,Sl as U,Rl as V,xl as W,qr as X,Br as Y,Vr as Z,Kr as _,zr as $,Jr as aa,Ws as ba,qs as ca,be as da,Bs as ea,Lr as fa,il as ga,we as ha,un as ia,ac as ja,wd as ka,Pd as la,Cd as ma,Ad as na,Td as oa,jd as pa,Fd as qa,Ld as ra,Md as sa,$d as ta,_d as ua,Od as va,Nd as wa,Dd as xa,zd as ya,lc as za};
206
+ `);import Ki from"fs";import{lockSync as zi}from"proper-lockfile";var Ji="explorer.lock",Gi=15e3,Qi=15e3;function Xi(){return He(Ji)}function od({onChange:e}){let r={release:null,stopped:!1},n=()=>{r.release=null,r.stopped||e(!1)},t=()=>{if(r.stopped||r.release!=null)return;let i=Yi(n);i!=null&&(r.release=i,e(!0))};t();let o=setInterval(t,Qi);return{holder:()=>r.release!=null,stop:()=>{r.stopped=!0,clearInterval(o),r.release?.(),r.release=null}}}function Yi(e){try{De();let r=Xi(),n=zi(r,{onCompromised:e,realpath:!1,stale:Gi});return Ki.writeFileSync(r,String(process.pid)),()=>{try{n()}catch{}}}catch{return null}}import Zi from"path";import{randomUUID as ea}from"crypto";function An(e){return{axes:[Xe("unit"),Ye(e)]}}var Tn=12,jn=15,Fn=4,Ln=2;var _n={covered:0,deferred:0,findings:0,saturated:!1,total:0};function fd(){return{priority:"p3",next:()=>null,onResult:()=>{},ready:()=>Promise.resolve(),status:()=>_n,stop:()=>Promise.resolve()}}function md(e){let r={claimed:new Set,consecutiveErrors:0,covered:new Set,deferred:new Map,findings:0,haltedUntil:0,prepared:null,preparing:!1,refreshing:!1,saturated:!1,tick:0},n=Me(e,r);return{priority:"p3",next:()=>aa(e,r),onResult:()=>{},ready:()=>n,status:()=>r.prepared==null?_n:oa(r.prepared,r),stop:()=>Promise.resolve()}}async function Me(e,r){if(!r.preparing){r.preparing=!0;try{let n=await e.loadLockfile();if(n==null)return;let t=await ra(n);if(t==null)return;await U(On(e.cwd)).match(o=>{let i=H(o);r.covered=new Set(i.covered),r.findings=[...i.findings.values()].filter(s=>s.resolvedAt==null).length,r.prepared=t,r.consecutiveErrors=0,r.haltedUntil=0,r.deferred.clear(),e.notifyWork()},o=>{y.warn("explore findings log unreadable, exploration disabled: %s",o.kind)})}finally{r.preparing=!1}}}async function ra({fingerprint:e,lockfile:r}){let n=An(r),t=Ge(r);if(t.length===0)return null;let o=ar(r,{sweep:!1}),i=await na(r,o),s=nr({baseStates:i,corpus:t,lens:n,maxCount:Ln,maxDepth:Fn});return{actionHashes:t.map(l=>rr(r,l)),baseStates:o,corpus:t,fingerprint:e,graph:s,lens:n,lensIdValue:Qe(n),lockfile:r,lockfileHashValue:N(r)}}async function na(e,r){let n={generate:R,materialize:Je(R,e.valueSpaces),params:void 0};return(await Promise.all(r.map(async o=>(await sr(e,o,n)).match(s=>({name:o.name,snapshot:s.snapshot}),()=>null)))).flatMap(o=>o==null?[]:[o])}var Mn=20,ta=6e5,$n=3e5;function oa(e,r){let n=or(e.graph),t=tr({actionHashes:e.actionHashes,corpus:e.corpus,covered:r.covered,graph:e.graph,lensId:e.lensIdValue,tick:r.tick});return{covered:n-t,deferred:Dn(r).size,findings:r.findings,saturated:r.saturated,total:n}}async function ia(e,r){if(!(r.refreshing||r.preparing||r.prepared==null)){r.refreshing=!0;try{let n=await e.loadLockfile();if(n==null||n.fingerprint===r.prepared.fingerprint)return;y.info("workflow definitions changed, re-preparing exploration targets"),r.prepared=null,await Me(e,r)}finally{r.refreshing=!1}}}function aa(e,r){ia(e,r);let n=r.prepared;if(n==null||Date.now()<r.haltedUntil)return null;let t=ir({actionHashes:n.actionHashes,corpus:n.corpus,covered:new Set([...r.covered,...r.claimed,...Dn(r)]),graph:n.graph,lensId:n.lensIdValue,tick:r.tick});if(r.tick+=1,t.kind==="saturated")return r.saturated=!0,null;r.saturated=!1;let o=ma(n,t.target);return r.claimed.add(o),{id:`explore:${ea()}`,label:t.target.targetKey,run:i=>sa({choice:t.target,key:o,params:e,prepared:n,signal:i,state:r})}}async function sa({choice:e,key:r,params:n,prepared:t,signal:o,state:i}){try{let s=ca({choice:e,params:n,prepared:t});if(s==null)return;if(!await n.probeApp()){Nn(i,"app-unreachable");return}let l=await n.executeTrail(s,o);if(l.kind==="aborted")return;if(l.kind==="error"){ua({key:r,params:n,reason:l.reason,state:i});return}i.consecutiveErrors=0,y.info("exploration trail %s: %s @ %s",l.kind,l.trail.map(u=>u.label).join(" -> "),e.targetKey.slice(0,80)),n.onTrailDone?.({kind:l.kind,label:e.targetKey,trail:l.trail}),await da({outcome:la(l,e,t),params:n,state:i})}finally{i.claimed.delete(r)}}function la(e,r,n){let t={actionHash:r.actionHash,at:new Date().toISOString(),kind:"covered",lensId:n.lensIdValue,targetKey:r.targetKey};return{...e,rows:[...e.rows,t]}}function ca({choice:e,params:r,prepared:n}){let t=n.baseStates.find(o=>o.name===e.witness.baseState);return t==null?null:{baseStateTest:t.test,lensId:n.lensIdValue,lockfileFingerprint:n.fingerprint,lockfileHash:n.lockfileHashValue,maxLength:r.maxTrailLength??Tn,shrinkBudget:jn,stepRuns:e.witness.trail.map(o=>({idx:o.idx,params:o.params}))}}async function da({outcome:e,params:r,state:n}){let t=e.rows.filter(o=>o.kind!=="covered"||!n.covered.has(D(o)));t.forEach(o=>{(o.kind==="covered"||o.kind==="finding"||o.kind==="flaky-candidate")&&n.covered.add(D(o))}),e.kind==="finding"&&(n.findings+=1,y.info("exploration finding recorded")),t.length!==0&&await er(On(r.cwd),t).match(()=>{},o=>{y.warn("explore findings log append failed: %s",o.kind)})}function On(e){return Zi.join(e,".ripplo",".local","explore-ledger.jsonl")}function ua({key:e,params:r,reason:n,state:t}){if(n==="lockfile:fingerprint-mismatch"){pa(r,t);return}fa(t,e),Nn(t,n)}function pa(e,r){r.preparing||(r.prepared=null,Me(e,r))}function fa(e,r){e.deferred.set(r,Date.now()+ta)}function Nn(e,r){e.consecutiveErrors+=1,y.debug("exploration trail error: %s",r),e.consecutiveErrors>=Mn&&(e.haltedUntil=Date.now()+$n,e.consecutiveErrors=0,y.warn("exploration cooling down for %ds after %d consecutive trail errors (last: %s)",$n/1e3,Mn,r))}function Dn(e){let r=Date.now();return[...e.deferred].filter(([,n])=>n<=r).forEach(([n])=>e.deferred.delete(n)),new Set(e.deferred.keys())}function ma(e,r){return D({actionHash:r.actionHash,lensId:e.lensIdValue,targetKey:r.targetKey})}import ya from"path";var ga=3;function kd(e){return U(ha(e)).map(r=>ka(H(r)))}function ha(e){return ya.join(e,".ripplo",".local","explore-ledger.jsonl")}function ka(e){let r=[...e.findings.entries()].filter(([,t])=>t.resolvedAt==null).map(([t,o])=>Sa(t,o)).toSorted(xa),n=[...e.flaky.entries()].filter(([,t])=>t.occurrences>=ga).map(([t,o])=>Ra(t,o)).toSorted((t,o)=>o.occurrences-t.occurrences);return{pending:r,recurrentFlaky:n}}function Sa(e,r){let n=r.latest;return{baseState:n.baseState,evidence:n.evidence,firstSeen:r.first.at,id:ae(e),lastSeen:n.at,occurrences:r.occurrences,parts:n.parts,runId:n.runId,trail:n.trail,verifierLayer:n.verifierLayer}}function Ra(e,r){return{at:r.first.at,baseState:r.first.baseState,id:ae(e),occurrences:r.occurrences,trail:r.first.trail}}var Hn={crash:0,"data-rule":1,frame:3,"page-rule":2};function xa(e,r){let n=Hn[e.verifierLayer]-Hn[r.verifierLayer];return n===0?r.occurrences-e.occurrences:n}import{createMessageConnection as Un,IPCMessageReader as Wn,IPCMessageWriter as qn,NotificationType as ba,NotificationType0 as Bn,RequestType as $e}from"vscode-jsonrpc/node";import{z as c}from"zod";var wd=c.object({headed:c.boolean(),lockfileFingerprint:c.string(),runId:c.string().min(1),testRef:c.string().min(1)}),Pd=c.object({fingerprint:c.string()}),Id=c.object({lockfileJson:c.string().optional(),unavailable:c.string().optional()}),va=c.enum(["unspecified","internal","server","client","producer","consumer"]),Ea=c.enum(["unset","ok","error"]),wa=c.object({attributes:c.record(c.string(),c.string()),durationMs:c.number(),kind:c.literal("span"),name:c.string(),parentSpanId:c.union([c.string(),c.undefined()]),source:c.literal("server"),spanId:c.string(),spanKind:va,status:c.object({code:Ea,message:c.union([c.string(),c.undefined()])}),timeNanos:c.string(),traceId:c.string()}),Cd=c.object({runId:c.string().min(1),span:wa}),Ad=c.object({outcome:Pe,serverNotified:c.boolean()}),Td=c.object({baseStateTest:qe,lensId:c.string().min(1),lockfileFingerprint:c.string(),lockfileHash:c.string().min(1),maxLength:c.number().int().positive(),shrinkBudget:c.number().int().nonnegative(),stepRuns:c.array(c.object({idx:c.number().int().nonnegative(),params:c.record(c.string(),c.union([We,c.null()]))}))}),Pa=c.object({actions:c.array(c.string()),label:c.string().min(1)}),jd=c.object({kind:c.enum(["aborted","clean","error","flaky","finding"]),reason:c.string().optional(),rows:c.array(Ze),trail:c.array(Pa).default([])}),Fd=new Bn("worker/ready"),Ld=new $e("worker/run"),Md=new $e("worker/lockfile"),$d=new $e("worker/exploreTrail"),_d=new ba("worker/span"),Od=new Bn("worker/shutdown");function Nd(e){let r=Un(new Wn(e),new qn(e));return r.listen(),r}function Dd(){let e=Un(new Wn(process),new qn(process));return e.listen(),e}import Ia from"path";import{randomUUID as Ca}from"crypto";async function zd({cwd:e,ref:r,signal:n,step:t}){let o=Ir(e).match(f=>({config:f}),f=>({failure:f}));if("failure"in o)return{failure:o.failure,kind:"config-failed"};let i=o.config,s=await he(e);if(s.result.isErr())return{error:s.result.error,kind:"compile-failed"};let l=s.result.value,u=A(l).find(f=>f.ref===r);return u==null?{kind:"no-test",ref:r}:(await lr({lockfile:l,options:{baseUrl:i.appUrl,engineUrl:i.engineUrl,fixturesDir:Ia.join(i.cwd,j),generate:R,headed:!0,secret:i.webhookSecret,tunnelAuth:i.tunnelAuth},params:void 0,runId:`teleport-${Ca()}`,stopAfterStep:t,test:u.test},n)).match(f=>({kind:"done",result:f}),f=>({error:f,kind:"run-failed"}))}export{La as a,Ua as b,z as c,Zn as d,J as e,j as f,E as g,he as h,M as i,w as j,cs as k,X as l,ms as m,ys as n,gs as o,bs as p,ke as q,br as r,Er as s,Ir as t,jr as u,xe as v,Ds as w,te as x,Rn as y,gc as z,hc as A,kc as B,oi as C,Cc as D,mi as E,Cn as F,Ui as G,Wi as H,od as I,An as J,fd as K,md as L,kd as M,ha as N,ml as O,yl as P,Hr as Q,gl as R,hl as S,kl as T,Sl as U,Rl as V,xl as W,qr as X,Br as Y,Vr as Z,Kr as _,zr as $,Jr as aa,wd as ba,Pd as ca,Cd as da,Ad as ea,Td as fa,jd as ga,Fd as ha,Ld as ia,Md as ja,$d as ka,_d as la,Od as ma,Nd as na,Dd as oa,Ws as pa,qs as qa,be as ra,Bs as sa,Lr as ta,il as ua,we as va,un as wa,ac as xa,zd as ya,lc as za};