ripplo 0.7.9 → 0.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ import{$a as ve,A as H,D as A,I as X,L as E,N as Z,O as ee,Oa as ye,Pa as ge,Qa as ke,Ra as we,S as re,Sa as Se,V as oe,X as ne,Xa as R,Ya as C,Za as Re,_a as q,b as l,bb as _,c as D,cb as Pe,da as te,db as he,e as z,f as b,fb as I,g as G,ga as ie,ha as ae,hb as xe,ia as se,ja as F,jb as be,la as le,lb as Ee,mb as Ce,na as de,nb as Ie,ob as We,pb as Le,q as Q,qa as ce,qb as Te,rb as De,sa as ue,sb as He,t as J,u as K,ub as Ae,va as pe,w as V,wa as fe,x as Y,ya as h,z as m,za as me}from"./chunk-AEZPVB4X.js";import Yr from"path";import{createClient as Xr}from"graphql-sse";import Zr,{AbortError as eo}from"p-retry";import{graphql as N}from"gql.tada";import{graphql as kr}from"gql.tada";import{print as wr}from"graphql";async function Fe({config:e,cwd:o,headed:r,pool:n,runId:t,signal:i,testSlug:a,workClass:s,workflowSlug:d}){let{fingerprint:c,result:u}=await m(o);if(u.isErr())return await I(e,t,`lockfile:${u.error.kind}`),{detail:`lockfile:${u.error.kind}`,kind:"dispatch-error"};let p=gr(u.value,{testSlug:a,workflowSlug:d});if(p==null)return await I(e,t,`no-test:${d}/${a}`),{detail:`no-test:${d}/${a}`,kind:"dispatch-error"};let f=await R({headed:r,workClass:s,task:()=>n.execute({headed:r,lockfileFingerprint:c,runId:t,testRef:p},i)});return!f.serverNotified&&f.outcome.kind==="error"&&await I(e,t,f.outcome.detail),f.outcome}function gr(e,{testSlug:o,workflowSlug:r}){let t=e.workflows.find(i=>Y(i.name)===r)?.tests.find(i=>i.slug===o);return t==null?void 0:oe(t)}var Sr=6e4,Rr=kr(`
3
+ subscription RunRequestedWatch($devSessionId: String!) {
4
+ runRequested(devSessionId: $devSessionId) {
5
+ runId
6
+ testSlug
7
+ workflowId
8
+ workflowSlug
9
+ }
10
+ }
11
+ `);async function qe(e){let o=Math.min(1e3*2**e,Sr)+hr();await new Promise(r=>setTimeout(r,o))}function _e({claim:e,cwd:o,devSessionId:r,onSubscriptionDead:n,pool:t,sseClient:i,sseHealth:a}){let s=new Set;return i.subscribe({query:wr(Rr),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),n(c)},next:d=>{vr({claim:e,cwd:o,event:d.data?.runRequested,inFlightRunIds:s,pool:t})}},{connected:()=>{a.onConnected()},connecting:d=>{a.onConnecting(d),d&&l.warn("runRequested SSE reconnecting")}})}function vr({claim:e,cwd:o,event:r,inFlightRunIds:n,pool:t}){if(r==null)return;if(n.has(r.runId)){l.warn({runId:r.runId,workflowSlug:r.workflowSlug},"duplicate runRequested event; skipping dispatch");return}n.add(r.runId),process.stdout.write(`ripplo: run ${r.workflowSlug}
12
+ `),Q(o);let i=E(o).match(s=>s,s=>{l.error({failure:s,runId:r.runId},"failed to load env for run dispatch; skipping")});if(i==null){n.delete(r.runId);return}let a=Pr(e(r.runId),r);a.started(),Fe({config:i,cwd:o,headed:a.headed,pool:t,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(()=>{n.delete(r.runId)})}function Pr(e,o){return e==null?(l.debug({runId:o.runId,workflowSlug:o.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(o.runId,r)},started:()=>{e.started(o.runId)}}}function hr(){return Math.floor(Math.random()*2700)+300}function je(){let e=null,o=!0,r,n=null,t=()=>{n!=null&&(clearTimeout(n),n=null)};return{degradedBeyond:i=>e!=null&&Date.now()-e>=i,markUnhealthy:i=>{o=!1,r=i,t()},onConnected:()=>{e=null,t(),n=setTimeout(()=>{o=!0,r=void 0,n=null},1e4)},onConnecting:i=>{t(),i&&e==null&&(e=Date.now())},snapshot:()=>({detail:r,ok:o})}}import xr from"fs";import $e from"net";import{err as Ue,ok as br}from"neverthrow";async function Be({cwd:e,onConnection:o}){G(e);let r=me(e),n=await Oe({onConnection:o,socketPath:r});return n.isOk()||n.error.kind!=="stale-candidate"?n.map(Me(r)).mapErr(Ne(r)):await Er(r)?Ue({kind:"already-running",socketPath:r}):(ze(r),(await Oe({onConnection:o,socketPath:r})).map(Me(r)).mapErr(Ne(r)))}function Er(e){return new Promise(o=>{let r=$e.connect(e);r.once("connect",()=>{r.destroy(),o(!0)}),r.once("error",()=>{o(!1)})})}async function Oe(e){let o=await Cr(e);return o.kind==="listening"?br(o.server):Ue(o.error)}function Cr({onConnection:e,socketPath:o}){return new Promise(r=>{let n=$e.createServer(e);n.once("error",t=>{r({error:t.code==="EADDRINUSE"?{kind:"stale-candidate"}:{kind:"listen-failed",message:t.message},kind:"failed"})}),n.listen(o,()=>{r({kind:"listening",server:n})})})}function Me(e){return o=>({socketPath:e,close:()=>{o.close(),ze(e)}})}function ze(e){xr.rmSync(e,{force:!0})}function Ne(e){return o=>o.kind==="stale-candidate"?{kind:"already-running",socketPath:e}:{kind:"bind-failed",message:o.message}}function j(e){return{priority:e,next:()=>null,onResult:()=>{}}}function Ge({config:e,explore:o,exploreConcurrency:r,pool:n}){return Ir({appUrl:e.appUrl,cwd:e.cwd,explore:o,exploreConcurrency:r,executeTrail:async(t,i)=>(await n).exploreTrail(t,i)})}function Ir({appUrl:e,cwd:o,executeTrail:r,explore:n,exploreConcurrency:t}){let i={notify:()=>{}},a=n?Wr({appUrl:e,cwd:o,executeTrail:r,notifyWork:()=>{i.notify()}}):pe(),s=Ae({exploreConcurrency:t,exploreEnabled:n,now:Date.now,probe:Lr,setTimer:Tr,sources:[j("p0"),j("p1"),a],execute:({job:c,priority:u,signal:p})=>R({headed:!1,workClass:Dr(u),task:()=>c.run(p)})});q(()=>{s.notifyQueueChange()}),i.notify=()=>{s.notifyQueueChange()};let d=n?ue({onChange:c=>{s.setExplorerHolder(c)}}):null;return{status:()=>({explorer:Hr({explore:n,holder:s.explorerHolder()}),exploring:s.explorationActive(),progress:a.status()}),stop:()=>{d?.stop(),s.stop(),q(null),a.stop()}}}function Wr({appUrl:e,cwd:o,executeTrail:r,notifyWork:n}){return fe({cwd:o,executeTrail:r,notifyWork:n,loadLockfile:async()=>{let{fingerprint:t,result:i}=await m(o);return i.match(a=>({fingerprint:t,lockfile:a}),()=>null)},probeApp:async()=>await re(e)==null})}function Lr(){let e=Re();return{headedActive:e.headedActive,interactiveActive:e.active,interactiveQueued:e.queued,poolSize:e.poolSize}}function Tr(e,o){let r=setTimeout(e,o);return()=>{clearTimeout(r)}}function Dr(e){switch(e){case"p0":return"p0-ui";case"p1":return"p1-cli";case"p2":return"p2-cover";case"p3":return"p3-explore"}}function Hr({explore:e,holder:o}){return e?o?"holder":"standby":"off"}async function Qe({cwd:e,finding:o}){let r={at:new Date().toISOString(),kind:"resolution",signature:o.signature};await F(h(e),[r]).match(()=>{},n=>{l.warn("explore findings log append failed: %s",n.kind)})}async function Je({cwd:e,finding:o,outcome:r}){let n=r.kind==="clean"?[...r.rows,{at:new Date().toISOString(),kind:"resolution",signature:o.signature}]:r.rows;n.length!==0&&await F(h(e),n).match(()=>{},t=>{l.warn("explore findings log append failed: %s",t.kind)})}function Ke({cwd:e,pool:o}){let r={cwd:e,executeTrail:(n,t)=>R({headed:!1,workClass:"p1-cli",task:async()=>(await o).exploreTrail(n,t)}),loadLockfile:async()=>{let n=await m(e);return n.result.match(t=>({fingerprint:n.fingerprint,lockfile:t}),()=>null)}};return(n,t)=>Ar(r,{findingId:n,signal:t})}async function Ar(e,o){let r=await Fr(e.cwd,o.findingId);if("reply"in r)return r.reply;let n=await e.loadLockfile();if(n==null)return{kind:"error",reason:"lockfile-unavailable"};let t=qr(n,r.finding);if("reply"in t)return t.reply;let i=await e.executeTrail(t.assign,o.signal);return jr({cwd:e.cwd,finding:r.finding,outcome:i})}async function Fr(e,o){return se(h(e)).match(r=>{let t=[...ae(r).findings.entries()].find(([a])=>ie(a)===o);if(t==null)return{reply:{kind:"finding-not-found"}};let[,i]=t;return i.resolvedAt!=null?{reply:{kind:"finding-not-found"}}:{finding:i.latest}},()=>({reply:{kind:"unreplayable",reason:"ledger-unreadable"}}))}function qr(e,o){let r=de(e.lockfile,{sweep:!1}).find(t=>t.name===o.baseState);if(r==null)return{reply:{kind:"unreplayable",reason:"base-state-missing"}};let n=_r(e.lockfile,o);return n==null?{reply:{kind:"unreplayable",reason:"action-missing"}}:{assign:{baseStateTest:r.test,lensId:o.lensId,lockfileFingerprint:e.fingerprint,lockfileHash:le(e.lockfile),maxLength:n.length,shrinkBudget:0,stepRuns:n}}}function _r(e,o){let n=ne(e).map(a=>`${a.test}#${String(a.index)}`),i=o.trail.map((a,s)=>{let d=n.indexOf(a),c=o.trailParams[s];return d===-1||c==null?null:{idx:d,params:c}}).flatMap(a=>a==null?[]:[a]);return i.length===o.trail.length?i:null}async function jr({cwd:e,finding:o,outcome:r}){return r.kind==="aborted"?{kind:"aborted"}:r.kind==="error"?Or({cwd:e,finding:o,reason:r.reason}):(await Je({cwd:e,finding:o,outcome:r}),r.kind==="clean"?{kind:"resolved"}:r.kind==="flaky"?{kind:"flaky"}:Mr(o,r))}async function Or({cwd:e,finding:o,reason:r}){return r==="empty-trail"?(await Qe({cwd:e,finding:o}),{kind:"unreachable"}):{kind:"error",reason:r??"trail-error"}}function Mr(e,o){let r=o.rows.find(t=>t.kind==="finding"),n=r?.kind==="finding"?r.runId:void 0;return r!=null&&r.signature===e.signature?{kind:"still-failing",runId:n}:{kind:"diverged",runId:n}}import{fork as Nr}from"child_process";import Ve from"os";import{CancellationTokenSource as Ye,ResponseError as Xe}from"vscode-jsonrpc/node";function Ze(e,o){return()=>{let r=Nr(e,["run-worker"],{cwd:o,stdio:["ignore","inherit","inherit","ipc"]});return{connection:He(r),kill:()=>{r.kill("SIGKILL")},onExit:n=>{r.once("exit",n)}}}}function er(e){let o={closed:!1,lockfileProvider:e.lockfileProvider,nextId:0,size:e.initialSize,spawn:e.spawn,waiters:[],workers:[]};return{close:async()=>{o.closed=!0,await Promise.all([...o.workers].map(r=>O(r,o)))},execute:(r,n)=>Ur(r,n,o),exploreTrail:(r,n)=>Gr(r,n,o),routeSpan:(r,n)=>{let t=o.workers.find(i=>i.runId===r);t?.worker.connection.sendNotification(Te,{runId:r,span:n})},setSize:r=>{Jr(r,o)}}}var $r=1e4,rr=-32800;async function Ur(e,o,r){let n=await or(r);if(n.runId=e.runId,!n.alive)return W(n,r),{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1};let t=new Ye,i=()=>{t.cancel()};o.aborted&&t.cancel(),o.addEventListener("abort",i,{once:!0});try{let a=await n.worker.connection.sendRequest(Ie,e,t.token),s=be.safeParse(a);return s.success?s.data:{outcome:{detail:"bad-outcome-frame",kind:"error"},serverNotified:!1}}catch(a){return zr(a,n)}finally{o.removeEventListener("abort",i),t.dispose(),W(n,r)}}async function or(e){let o=e.workers.find(r=>r.alive&&r.runId===void 0);if(o!=null)return o.runId="pending",o;if(e.workers.length<e.size){let r=Br(e);return r.runId="pending",await r.ready,r}return new Promise(r=>{e.waiters.push(n=>{n.runId="pending",r(n)})})}function Br(e){let o=e.spawn(),r={resolve:()=>{}},n={alive:!0,id:e.nextId,ready:new Promise(t=>{r.resolve=t,o.connection.onNotification(Ce,t)}),runId:void 0,worker:o};return e.nextId+=1,o.connection.onRequest(We,async t=>{let i=xe.safeParse(t);return i.success?e.lockfileProvider(i.data.fingerprint):{unavailable:"bad-lockfile-request"}}),o.onExit(()=>{n.alive=!1,e.workers=e.workers.filter(t=>t!==n),o.connection.dispose(),r.resolve()}),e.workers.push(n),n}function W(e,o){if(e.runId=void 0,!e.alive||o.closed)return;if(o.workers.length>o.size){O(e,o);return}let r=o.waiters.shift();r?.(e)}async function O(e,o){if(o.workers=o.workers.filter(t=>t!==e),!e.alive)return;let r=new Promise(t=>{e.worker.onExit(t)});await e.worker.connection.sendNotification(De).catch(()=>{});let n=setTimeout(()=>{e.worker.kill()},$r);await r,clearTimeout(n)}function zr(e,o){return e instanceof Xe&&e.code===rr?{outcome:{detail:"aborted",kind:"error"},serverNotified:!1}:o.alive?{outcome:{detail:e instanceof Error?e.message:String(e),kind:"error"},serverNotified:!1}:{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1}}async function Gr(e,o,r){let n=await or(r);if(n.runId="explore",!n.alive)return W(n,r),{kind:"error",rows:[],trail:[]};let t=new Ye,i=()=>{t.cancel()};o.aborted&&t.cancel(),o.addEventListener("abort",i,{once:!0});try{let a=await n.worker.connection.sendRequest(Le,e,t.token),s=Ee.safeParse(a);return s.success?s.data:{kind:"error",rows:[],trail:[]}}catch(a){return Qr(a)}finally{o.removeEventListener("abort",i),t.dispose(),W(n,r)}}function Qr(e){return e instanceof Xe&&e.code===rr?{kind:"aborted",rows:[],trail:[]}:{kind:"error",reason:`transport:${e instanceof Error?e.message.slice(0,120):"unknown"}`,rows:[],trail:[]}}function Jr(e,o){o.size=e,e>Ve.availableParallelism()&&l.warn({cores:Ve.availableParallelism(),size:e},"worker pool size exceeds available cores");let r=o.workers.filter(t=>t.alive&&t.runId===void 0),n=o.workers.length-e;r.slice(0,Math.max(0,n)).forEach(t=>{O(t,o)})}import L from"fs";import{graphql as nr}from"gql.tada";import{print as tr}from"graphql";var Kr=nr(`
13
+ subscription HooksPausedWatch($projectId: String!) {
14
+ hooksPausedRequested(projectId: $projectId) {
15
+ paused
16
+ projectId
17
+ }
18
+ }
19
+ `),Vr=nr(`
20
+ subscription WatchLocalConcurrencyChanged {
21
+ myMaxLocalConcurrentRunsChanged
22
+ }
23
+ `);function ir({pool:e,sseClient:o}){return o.subscribe({query:tr(Vr)},{complete:()=>{},error:r=>{l.error(r,"localConcurrency subscription error")},next:r=>{let n=r.data?.myMaxLocalConcurrentRunsChanged;n!=null&&(C(n),e.setSize(n))}})}function ar({cwd:e,projectId:o,sseClient:r}){return r.subscribe({query:tr(Kr),variables:{projectId:o}},{complete:()=>{},error:n=>{l.error(n,"hooksPaused subscription error")},next:n=>{let t=n.data?.hooksPausedRequested?.paused;t!=null&&M({cwd:e,paused:t})}})}function M({cwd:e,paused:o}){let r=ce(e);if(o&&!L.existsSync(r)){L.writeFileSync(r,"");return}!o&&L.existsSync(r)&&L.unlinkSync(r)}var ro=6e4,sr=500,oo=15e3,lr=9e4,dr=6e4,no=3,to=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
+ `),io=N(`
36
+ query WatchLocalConcurrency {
37
+ currentUser {
38
+ id
39
+ maxLocalConcurrentRuns
40
+ }
41
+ }
42
+ `),ao=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 Kn({explore:e,exploreConcurrency:o}){Ro();let r=ko(process.cwd()),n=r.cwd,t=po(n),i=go(),a=Ge({config:r,explore:e,exploreConcurrency:o,pool:i.pool}),s={handler:()=>{}},d={handler:()=>{}},c=mo(),u=je(),p=he({config:r,cwd:n,explorationStatus:a.status,ready:c.promise,replayFinding:Ke({cwd:n,pool:i.pool}),onShutdownRequest:()=>{s.handler()},sseHealth:()=>u.snapshot()}),f=await yo({cwd:n,ipc:p,releasePid:t}),y=await H(n);y.isErr()&&(process.stderr.write(`ripplo: ${A(y.error)}
55
+ `),process.exit(1));let T=y.value,S=await cr(()=>_({config:r,cwd:n,lockfile:T}),{config:r,label:"initial sync"}),g=await Po(r);M({cwd:n,paused:S.hooksPaused});let v=ve(n);v!=null&&l.info("watching branch %s in %s",v,n);let k=Xr({headers:{Authorization:`Bearer ${r.token}`},retry:qe,retryAttempts:1/0,url:`${r.ripploServerUrl}/graphql`}),w=uo({cwd:n,initialConcurrency:g});i.provide(w);let ur=await te({localDir:Yr.join(n,".ripplo",".local"),writePortFile:!0,onRrwebBatch:()=>{},onSpan:x=>{let B=x.attributes["ripplo.run"];B!=null&&w.routeSpan(B,x)}}),$=lo({claim:p.claim,config:r,cwd:n,initialId:S.devSessionId,pool:w,sseClient:k,sseHealth:u}),pr=ar({cwd:n,projectId:r.projectId,sseClient:k}),fr=ir({pool:w,sseClient:k}),mr=so({config:r,session:$,sseHealth:u,onSseDead:()=>{d.handler()}}),yr=So();c.resolve(),process.stdout.write(`${ke({devSessionId:S.devSessionId,version:J()})}
56
+ `);let U=async()=>{mr(),yr(),a.stop(),f.close(),$.stop(),pr(),fr(),await w.close(),await ur.stop().catch(()=>{}),await Promise.race([b({config:r,document:ao,variables:{cwd:r.cwd,projectId:r.projectId}}).catch(()=>{}),new Promise(x=>setTimeout(x,3e3))]),t()},P=()=>{U().finally(()=>process.exit(0))};s.handler=P,d.handler=()=>{U().finally(()=>process.exit(1))},process.on("SIGINT",P),process.on("SIGTERM",P),process.on("SIGHUP",P),process.on("SIGBREAK",P),await new Promise(()=>{})}function so({config:e,onSseDead:o,session:r,sseHealth:n}){let t=async()=>{if(n.degradedBeyond(lr)){l.error("runRequested SSE degraded past %dms; exiting to respawn",lr),o();return}try{let a=await b({config:e,document:to,variables:{id:r.getId()}});a.heartbeatDevSession?.__typename==="DevSessionEndedError"&&(l.warn("dev session ended server-side (%s); re-registering",a.heartbeatDevSession.message),await r.reregister())}catch(a){l.warn("heartbeat failed: %s",a instanceof Error?a.message:String(a))}},i=setInterval(()=>{t()},oo);return()=>{clearInterval(i)}}function lo({claim:e,config:o,cwd:r,initialId:n,pool:t,sseClient:i,sseHealth:a}){let s=n,d=null,c=0,u=0,p=g=>{S(g)},f=()=>_e({claim:e,cwd:r,devSessionId:s,onSubscriptionDead:p,pool:t,sseClient:i,sseHealth:a}),y=f(),T=async g=>{let v=Date.now();c=v-u>dr*2?1:c+1,u=v,c>=no&&a.markUnhealthy(g),await co(Math.min(1e3*2**(c-1),dr));let k=await H(r);if(k.isErr()){l.error("re-register: compile failed: %s",A(k.error));return}let w=await cr(()=>_({config:o,cwd:r,lockfile:k.value}),{config:o,label:"re-register sync"});y(),s=w.devSessionId,y=f(),l.info("re-registered dev session as %s",s)},S=g=>(d!=null||(d=T(g).finally(()=>{d=null})),d);return{getId:()=>s,reregister:()=>S("dev session ended server-side"),stop:()=>{y()}}}function co(e){return new Promise(o=>setTimeout(o,e))}function uo({cwd:e,initialConcurrency:o}){return er({initialSize:o,spawn:Ze(ho(),e),lockfileProvider:async r=>{let n=await m(e);return n.result.isErr()?{unavailable:`daemon-load-failed:${n.result.error.kind}`}:n.fingerprint!==r?{unavailable:"fingerprint-mismatch"}:{lockfileJson:K(V,n.result.value)}}})}function po(e){try{return ee({cwd:e,onCompromised:fo})}catch(o){throw o instanceof Z&&(process.stderr.write(`${we({cwd:o.cwd,pid:o.pid})}
57
+ `),process.exit(1)),o}}function fo(){l.error("daemon lock compromised; shutting down"),process.stderr.write(`${Se()}
58
+ `),process.exit(1)}function mo(){let e={handler:()=>{}};return{promise:new Promise(r=>{e.handler=r}),resolve:()=>{e.handler()}}}async function yo({cwd:e,ipc:o,releasePid:r}){return(await Be({cwd:e,onConnection:o.handleConnection})).match(t=>t,t=>{process.stderr.write(`${ye(t)}
59
+ `),r(),process.exit(1)})}function go(){let e={provide:()=>{}};return{pool:new Promise(r=>{e.provide=r}),provide:r=>{e.provide(r)}}}function ko(e){return E(e).match(o=>o,o=>{process.stderr.write(`${X(o)}
60
+ `),process.exit(1)})}function cr(e,{config:o,label:r}){let n=o.ripploServerUrl.includes("localhost")||o.ripploServerUrl.includes("127.0.0.1");return Zr(async()=>{try{return await e()}catch(t){let i=t instanceof Error?t.message:String(t);throw z(t)==="FORBIDDEN"&&(process.stderr.write(`ripplo: ${ge({projectId:o.projectId,serverUrl:o.ripploServerUrl})}
61
+ `),process.exit(1)),wo(i)?t:(l.error("%s failed: %s",r,i),new eo(i))}},{factor:2,maxTimeout:n?2e3:1e4,minTimeout:n?100:1e3,retries:1/0,onFailedAttempt:({attemptNumber:t,error:i})=>{l.warn("%s attempt %d failed \u2014 retrying: %s",r,t,i.message)}})}function wo(e){return e.includes("status 502")||e.includes("ECONNREFUSED")||e.includes("Failed to connect")||e.includes("fetch failed")}function So(){D({maxRuns:sr});let e=setInterval(()=>{D({maxRuns:sr})},ro);return()=>{clearInterval(e)}}function Ro(){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 vo=4;async function Po(e){try{let r=(await b({config:e,document:io,variables:void 0})).currentUser?.maxLocalConcurrentRuns;if(r!=null)return C(r),r}catch(o){l.warn({err:o},"failed to fetch local concurrency setting; using default")}return vo}function ho(){let e=process.argv[1];if(e==null)throw new Error("cli entry unavailable");return e}export{Kn as runDaemon};