ripplo 0.7.7 → 0.7.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ripplo",
3
- "version": "0.7.7",
3
+ "version": "0.7.8",
4
4
  "description": "CLI for Ripplo — AI-powered end-to-end testing",
5
5
  "type": "module",
6
6
  "homepage": "https://ripplo.ai",
@@ -27,6 +27,7 @@
27
27
  "graphql": "^16.11.0",
28
28
  "graphql-sse": "^2.6.0",
29
29
  "jiti": "^2.6.1",
30
+ "latest-version": "^9.0.0",
30
31
  "neverthrow": "^8.2.0",
31
32
  "p-queue": "^9.3.0",
32
33
  "p-retry": "^8.0.0",
@@ -36,9 +37,11 @@
36
37
  "playwright": "1.59.1",
37
38
  "proper-lockfile": "^4.1.2",
38
39
  "remeda": "^2.33.7",
40
+ "semver": "^7.8.4",
39
41
  "shell-quote": "1.8.3",
40
42
  "typescript": "^5.9.3",
41
43
  "undici": "^7.0.0",
44
+ "update-notifier": "^7.3.1",
42
45
  "vscode-jsonrpc": "^9.0.0",
43
46
  "yargs": "^18.0.0",
44
47
  "zod": "4.3.6"
@@ -47,17 +50,19 @@
47
50
  "@types/node": "catalog:",
48
51
  "@types/picomatch": "^4.0.2",
49
52
  "@types/proper-lockfile": "^4.1.4",
53
+ "@types/semver": "^7.7.1",
50
54
  "@types/shell-quote": "^1.7.5",
55
+ "@types/update-notifier": "^6.0.8",
51
56
  "@types/yargs": "^17.0.35",
52
57
  "eslint": "catalog:",
53
58
  "eslint-plugin-neverthrow": "^1.1.4",
54
59
  "tsup": "^8.5.1",
55
60
  "vitest": "^4.1.4",
56
- "@ripplo/spec": "^0.0.0",
57
- "@ripplo/runtime": "^0.0.0",
58
61
  "@ripplo/core": "^0.0.0",
59
62
  "@ripplo/eslint-config": "0.0.0",
60
63
  "@ripplo/rrweb-bundle": "0.0.0",
64
+ "@ripplo/runtime": "^0.0.0",
65
+ "@ripplo/spec": "^0.0.0",
61
66
  "@ripplo/graphql": "^0.0.0"
62
67
  },
63
68
  "scripts": {
@@ -1,60 +0,0 @@
1
- #!/usr/bin/env node
2
- import{C as T,H as J,K as F,Ka as ce,La as ue,M as K,Ma as pe,N as V,Na as fe,Oa as me,R as X,Sa as w,Ta as x,U as Z,Ua as ye,Va as H,Wa as ke,Ya as q,Za as ge,_a as we,aa as Y,ab as h,b as d,c as L,cb as Se,da as ee,e as U,ea as re,eb as ve,f as P,fa as oe,g as M,ga as A,gb as Re,hb as Pe,ia as ne,ib as xe,jb as he,ka as te,kb as be,lb as Ee,mb as Ie,na as ie,nb as Ce,pa as ae,pb as We,q as B,ra as se,sa as le,t as z,ua as R,v as G,va as de,w as Q,y as f,z as D}from"./chunk-A6RTZMN6.js";import Ar from"path";import{createClient as Hr}from"graphql-sse";import qr,{AbortError as jr}from"p-retry";import{graphql as I}from"gql.tada";import{print as Nr}from"graphql";import sr from"fs";import Fe from"net";import{err as Ae,ok as lr}from"neverthrow";async function He({cwd:e,onConnection:o}){M(e);let r=de(e),n=await Le({onConnection:o,socketPath:r});return n.isOk()||n.error.kind!=="stale-candidate"?n.map(De(r)).mapErr(Te(r)):await dr(r)?Ae({kind:"already-running",socketPath:r}):(qe(r),(await Le({onConnection:o,socketPath:r})).map(De(r)).mapErr(Te(r)))}function dr(e){return new Promise(o=>{let r=Fe.connect(e);r.once("connect",()=>{r.destroy(),o(!0)}),r.once("error",()=>{o(!1)})})}async function Le(e){let o=await cr(e);return o.kind==="listening"?lr(o.server):Ae(o.error)}function cr({onConnection:e,socketPath:o}){return new Promise(r=>{let n=Fe.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 De(e){return o=>({socketPath:e,close:()=>{o.close(),qe(e)}})}function qe(e){sr.rmSync(e,{force:!0})}function Te(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 je({config:e,explore:o,exploreConcurrency:r,pool:n}){return ur({appUrl:e.appUrl,cwd:e.cwd,explore:o,exploreConcurrency:r,executeTrail:async(t,i)=>(await n).exploreTrail(t,i)})}function ur({appUrl:e,cwd:o,executeTrail:r,explore:n,exploreConcurrency:t}){let i={notify:()=>{}},a=n?pr({appUrl:e,cwd:o,executeTrail:r,notifyWork:()=>{i.notify()}}):se(),s=We({exploreConcurrency:t,exploreEnabled:n,now:Date.now,probe:fr,setTimer:mr,sources:[j("p0"),j("p1"),a],execute:({job:u,priority:p,signal:c})=>w({headed:!1,workClass:yr(p),task:()=>u.run(c)})});H(()=>{s.notifyQueueChange()}),i.notify=()=>{s.notifyQueueChange()};let l=n?ae({onChange:u=>{s.setExplorerHolder(u)}}):null;return{status:()=>({explorer:kr({explore:n,holder:s.explorerHolder()}),exploring:s.explorationActive(),progress:a.status()}),stop:()=>{l?.stop(),s.stop(),H(null),a.stop()}}}function pr({appUrl:e,cwd:o,executeTrail:r,notifyWork:n}){return le({cwd:o,executeTrail:r,notifyWork:n,loadLockfile:async()=>{let{fingerprint:t,result:i}=await f(o);return i.match(a=>({fingerprint:t,lockfile:a}),()=>null)},probeApp:async()=>await X(e)==null})}function fr(){let e=ye();return{headedActive:e.headedActive,interactiveActive:e.active,interactiveQueued:e.queued,poolSize:e.poolSize}}function mr(e,o){let r=setTimeout(e,o);return()=>{clearTimeout(r)}}function yr(e){switch(e){case"p0":return"p0-ui";case"p1":return"p1-cli";case"p2":return"p2-cover";case"p3":return"p3-explore"}}function kr({explore:e,holder:o}){return e?o?"holder":"standby":"off"}async function Ne({cwd:e,finding:o}){let r={at:new Date().toISOString(),kind:"resolution",signature:o.signature};await A(R(e),[r]).match(()=>{},n=>{d.warn("explore ledger append failed: %s",n.kind)})}async function Oe({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 A(R(e),n).match(()=>{},t=>{d.warn("explore ledger append failed: %s",t.kind)})}function $e({cwd:e,pool:o}){let r={cwd:e,executeTrail:(n,t)=>w({headed:!1,workClass:"p1-cli",task:async()=>(await o).exploreTrail(n,t)}),loadLockfile:async()=>{let n=await f(e);return n.result.match(t=>({fingerprint:n.fingerprint,lockfile:t}),()=>null)}};return(n,t)=>gr(r,{findingId:n,signal:t})}async function gr(e,o){let r=await wr(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=Sr(n,r.finding);if("reply"in t)return t.reply;let i=await e.executeTrail(t.assign,o.signal);return Rr({cwd:e.cwd,finding:r.finding,outcome:i})}async function wr(e,o){return oe(R(e)).match(r=>{let t=[...re(r).findings.entries()].find(([a])=>ee(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 Sr(e,o){let r=te(e.lockfile,{sweep:!1}).find(t=>t.name===o.depot);if(r==null)return{reply:{kind:"unreplayable",reason:"depot-missing"}};let n=vr(e.lockfile,o);return n==null?{reply:{kind:"unreplayable",reason:"transition-missing"}}:{assign:{depotTest:r.test,firings:n,lensId:o.lensId,lockfileFingerprint:e.fingerprint,lockfileHash:ne(e.lockfile),maxLength:n.length,shrinkBudget:0}}}function vr(e,o){let n=Z(e).map(a=>`${a.test}#${String(a.index)}`),i=o.trail.map((a,s)=>{let l=n.indexOf(a),u=o.trailParams[s];return l===-1||u==null?null:{idx:l,params:u}}).flatMap(a=>a==null?[]:[a]);return i.length===o.trail.length?i:null}async function Rr({cwd:e,finding:o,outcome:r}){return r.kind==="aborted"?{kind:"aborted"}:r.kind==="error"?Pr({cwd:e,finding:o,reason:r.reason}):(await Oe({cwd:e,finding:o,outcome:r}),r.kind==="clean"?{kind:"resolved"}:r.kind==="flaky"?{kind:"flaky"}:xr(o,r))}async function Pr({cwd:e,finding:o,reason:r}){return r==="empty-trail"?(await Ne({cwd:e,finding:o}),{kind:"unreachable"}):{kind:"error",reason:r??"trail-error"}}function xr(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}}async function _e({config:e,cwd:o,headed:r,pool:n,runId:t,signal:i,workClass:a,workflowSlug:s}){let{fingerprint:l,result:u}=await f(o);if(u.isErr())return await h(e,t,`lockfile:${u.error.kind}`),{detail:`lockfile:${u.error.kind}`,kind:"dispatch-error"};if(u.value.tests.find(k=>Q(k.name)===s)==null)return await h(e,t,`no-test:${s}`),{detail:`no-test:${s}`,kind:"dispatch-error"};let c=await w({headed:r,workClass:a,task:()=>n.execute({headed:r,lockfileFingerprint:l,runId:t,workflowSlug:s},i)});return!c.serverNotified&&c.outcome.kind==="error"&&await h(e,t,c.outcome.detail),c.outcome}import{fork as hr}from"child_process";import Ue from"os";import{CancellationTokenSource as Me,ResponseError as Be}from"vscode-jsonrpc/node";function ze(e,o){return()=>{let r=hr(e,["run-worker"],{cwd:o,stdio:["ignore","inherit","inherit","ipc"]});return{connection:Ce(r),kill:()=>{r.kill("SIGKILL")},onExit:n=>{r.once("exit",n)}}}}function Ge(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=>N(r,o)))},execute:(r,n)=>Er(r,n,o),exploreTrail:(r,n)=>Wr(r,n,o),routeSpan:(r,n)=>{let t=o.workers.find(i=>i.runId===r);t?.worker.connection.sendNotification(Ee,{runId:r,span:n})},setSize:r=>{Dr(r,o)}}}var br=1e4,Qe=-32800;async function Er(e,o,r){let n=await Je(r);if(n.runId=e.runId,!n.alive)return b(n,r),{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1};let t=new Me,i=()=>{t.cancel()};o.aborted&&t.cancel(),o.addEventListener("abort",i,{once:!0});try{let a=await n.worker.connection.sendRequest(xe,e,t.token),s=ve.safeParse(a);return s.success?s.data:{outcome:{detail:"bad-outcome-frame",kind:"error"},serverNotified:!1}}catch(a){return Cr(a,n)}finally{o.removeEventListener("abort",i),t.dispose(),b(n,r)}}async function Je(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=Ir(e);return r.runId="pending",await r.ready,r}return new Promise(r=>{e.waiters.push(n=>{n.runId="pending",r(n)})})}function Ir(e){let o=e.spawn(),r={resolve:()=>{}},n={alive:!0,id:e.nextId,ready:new Promise(t=>{r.resolve=t,o.connection.onNotification(Pe,t)}),runId:void 0,worker:o};return e.nextId+=1,o.connection.onRequest(he,async t=>{let i=Se.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 b(e,o){if(e.runId=void 0,!e.alive||o.closed)return;if(o.workers.length>o.size){N(e,o);return}let r=o.waiters.shift();r?.(e)}async function N(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(Ie).catch(()=>{});let n=setTimeout(()=>{e.worker.kill()},br);await r,clearTimeout(n)}function Cr(e,o){return e instanceof Be&&e.code===Qe?{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 Wr(e,o,r){let n=await Je(r);if(n.runId="explore",!n.alive)return b(n,r),{kind:"error",rows:[],trail:[]};let t=new Me,i=()=>{t.cancel()};o.aborted&&t.cancel(),o.addEventListener("abort",i,{once:!0});try{let a=await n.worker.connection.sendRequest(be,e,t.token),s=Re.safeParse(a);return s.success?s.data:{kind:"error",rows:[],trail:[]}}catch(a){return Lr(a)}finally{o.removeEventListener("abort",i),t.dispose(),b(n,r)}}function Lr(e){return e instanceof Be&&e.code===Qe?{kind:"aborted",rows:[],trail:[]}:{kind:"error",reason:`transport:${e instanceof Error?e.message.slice(0,120):"unknown"}`,rows:[],trail:[]}}function Dr(e,o){o.size=e,e>Ue.availableParallelism()&&d.warn({cores:Ue.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=>{N(t,o)})}import E from"fs";import{graphql as Ke}from"gql.tada";import{print as Ve}from"graphql";var Tr=Ke(`
3
- subscription HooksPausedWatch($projectId: String!) {
4
- hooksPausedRequested(projectId: $projectId) {
5
- paused
6
- projectId
7
- }
8
- }
9
- `),Fr=Ke(`
10
- subscription WatchLocalConcurrencyChanged {
11
- myMaxLocalConcurrentRunsChanged
12
- }
13
- `);function Xe({pool:e,sseClient:o}){return o.subscribe({query:Ve(Fr)},{complete:()=>{},error:r=>{d.error(r,"localConcurrency subscription error")},next:r=>{let n=r.data?.myMaxLocalConcurrentRunsChanged;n!=null&&(x(n),e.setSize(n))}})}function Ze({cwd:e,projectId:o,sseClient:r}){return r.subscribe({query:Ve(Tr),variables:{projectId:o}},{complete:()=>{},error:n=>{d.error(n,"hooksPaused subscription error")},next:n=>{let t=n.data?.hooksPausedRequested?.paused;t!=null&&O({cwd:e,paused:t})}})}function O({cwd:e,paused:o}){let r=ie(e);if(o&&!E.existsSync(r)){E.writeFileSync(r,"");return}!o&&E.existsSync(r)&&E.unlinkSync(r)}var Or=6e4,Ye=500,$r=15e3,_r=I(`
14
- subscription RunRequestedWatch($devSessionId: String!) {
15
- runRequested(devSessionId: $devSessionId) {
16
- runId
17
- workflowId
18
- workflowSlug
19
- }
20
- }
21
- `),Ur=I(`
22
- mutation HeartbeatDevSessionWatch($id: String!) {
23
- heartbeatDevSession(id: $id) {
24
- __typename
25
- ... on DevSession {
26
- id
27
- }
28
- ... on DevSessionEndedError {
29
- message
30
- }
31
- }
32
- }
33
- `),Mr=I(`
34
- query WatchLocalConcurrency {
35
- currentUser {
36
- id
37
- maxLocalConcurrentRuns
38
- }
39
- }
40
- `),Br=I(`
41
- mutation EndDevSessionWatch($projectId: String!, $cwd: String!) {
42
- endDevSession(projectId: $projectId, cwd: $cwd) {
43
- __typename
44
- ... on DevSession {
45
- id
46
- }
47
- ... on NoActiveDevSessionError {
48
- message
49
- }
50
- }
51
- }
52
- `);async function Pn({explore:e,exploreConcurrency:o}){oo();let r=Yr(process.cwd()),n=r.cwd,t=Jr(n),i=Zr(),a=je({config:r,explore:e,exploreConcurrency:o,pool:i.pool}),s={handler:()=>{}},l=Vr(),u=we({config:r,cwd:n,explorationStatus:a.status,ready:l.promise,replayFinding:$e({cwd:n,pool:i.pool}),onShutdownRequest:()=>{s.handler()}}),p=await Xr({cwd:n,ipc:u,releasePid:t}),c=await D(n);c.isErr()&&(process.stderr.write(`ripplo: ${T(c.error)}
53
- `),process.exit(1));let k=c.value,m=await er(()=>q({config:r,cwd:n,lockfile:k}),{config:r,label:"initial sync"}),C=await to(r);O({cwd:n,paused:m.hooksPaused});let $=ke(n);$!=null&&d.info("watching branch %s in %s",$,n);let W=Hr({headers:{Authorization:`Bearer ${r.token}`},retryAttempts:1/0,url:`${r.ripploServerUrl}/graphql`}),S=Ge({initialSize:C,spawn:ze(io(),n),lockfileProvider:async g=>{let y=await f(n);return y.result.isErr()?{unavailable:`daemon-load-failed:${y.result.error.kind}`}:y.fingerprint!==g?{unavailable:"fingerprint-mismatch"}:{lockfileJson:z(G,y.result.value)}}});i.provide(S);let rr=await Y({localDir:Ar.join(n,".ripplo",".local"),writePortFile:!0,onRrwebBatch:()=>{},onSpan:g=>{let y=g.attributes["ripplo.run"];y!=null&&S.routeSpan(y,g)}}),_=Qr({claim:u.claim,config:r,cwd:n,initialId:m.devSessionId,pool:S,sseClient:W}),or=Ze({cwd:n,projectId:r.projectId,sseClient:W}),nr=Xe({pool:S,sseClient:W}),tr=Gr({config:r,session:_}),ir=ro();l.resolve(),process.stdout.write(`${pe(m.devSessionId)}
54
- `);let ar=async()=>{tr(),ir(),a.stop(),p.close(),_.stop(),or(),nr(),await S.close(),await rr.stop().catch(()=>{}),await Promise.race([P({config:r,document:Br,variables:{cwd:r.cwd,projectId:r.projectId}}).catch(()=>{}),new Promise(g=>setTimeout(g,3e3))]),t()},v=()=>{ar().finally(()=>process.exit(0))};s.handler=v,process.on("SIGINT",v),process.on("SIGTERM",v),process.on("SIGHUP",v),process.on("SIGBREAK",v),await new Promise(()=>{})}function zr({claim:e,cwd:o,devSessionId:r,onSubscriptionDead:n,pool:t,sseClient:i}){let a=new Set;return i.subscribe({query:Nr(_r),variables:{devSessionId:r}},{complete:()=>{},error:s=>{d.warn("runRequested SSE failed: %s; re-registering session",s instanceof Error?s.message:String(s)),n()},next:s=>{let l=s.data?.runRequested;if(l==null)return;if(a.has(l.runId)){d.warn({runId:l.runId,workflowSlug:l.workflowSlug},"duplicate runRequested event; skipping dispatch");return}a.add(l.runId),process.stdout.write(`ripplo: run ${l.workflowSlug}
55
- `),B(o);let u=F(o).match(c=>c,c=>{d.error({failure:c,runId:l.runId},"failed to load env for run dispatch; skipping")});if(u==null){a.delete(l.runId);return}let p=e(l.workflowSlug);p?.started(l.runId),_e({config:u,cwd:o,headed:p?.headed??!1,pool:t,runId:l.runId,signal:p==null?new AbortController().signal:ge(p.token),workClass:p==null?"p0-ui":"p1-cli",workflowSlug:l.workflowSlug}).then(c=>{p?.finished(l.runId,c)}).catch(c=>{d.error({err:c,runId:l.runId,workflowSlug:l.workflowSlug},"run execution failed; daemon continuing"),p?.finished(l.runId,{detail:c instanceof Error?c.message:String(c),kind:"error"})}).finally(()=>{a.delete(l.runId)})}},{connecting:s=>{s&&d.warn("runRequested SSE reconnecting")}})}function Gr({config:e,session:o}){let r=async()=>{try{let t=await P({config:e,document:Ur,variables:{id:o.getId()}});t.heartbeatDevSession?.__typename==="DevSessionEndedError"&&(d.warn("dev session ended server-side (%s); re-registering",t.heartbeatDevSession.message),await o.reregister())}catch(t){d.warn("heartbeat failed: %s",t instanceof Error?t.message:String(t))}},n=setInterval(()=>{r()},$r);return()=>{clearInterval(n)}}function Qr({claim:e,config:o,cwd:r,initialId:n,pool:t,sseClient:i}){let a=n,s=null,l=()=>{k()},u=()=>zr({claim:e,cwd:r,devSessionId:a,onSubscriptionDead:l,pool:t,sseClient:i}),p=u(),c=async()=>{let m=await D(r);if(m.isErr()){d.error("re-register: compile failed: %s",T(m.error));return}let C=await er(()=>q({config:o,cwd:r,lockfile:m.value}),{config:o,label:"re-register sync"});p(),a=C.devSessionId,p=u(),d.info("re-registered dev session as %s",a)},k=()=>(s!=null||(s=c().finally(()=>{s=null})),s);return{reregister:k,getId:()=>a,stop:()=>{p()}}}function Jr(e){try{return V({cwd:e,onCompromised:Kr})}catch(o){throw o instanceof K&&(process.stderr.write(`${fe({cwd:o.cwd,pid:o.pid})}
56
- `),process.exit(1)),o}}function Kr(){d.error("daemon lock compromised; shutting down"),process.stderr.write(`${me()}
57
- `),process.exit(1)}function Vr(){let e={handler:()=>{}};return{promise:new Promise(r=>{e.handler=r}),resolve:()=>{e.handler()}}}async function Xr({cwd:e,ipc:o,releasePid:r}){return(await He({cwd:e,onConnection:o.handleConnection})).match(t=>t,t=>{process.stderr.write(`${ce(t)}
58
- `),r(),process.exit(1)})}function Zr(){let e={provide:()=>{}};return{pool:new Promise(r=>{e.provide=r}),provide:r=>{e.provide(r)}}}function Yr(e){return F(e).match(o=>o,o=>{process.stderr.write(`${J(o)}
59
- `),process.exit(1)})}function er(e,{config:o,label:r}){let n=o.ripploServerUrl.includes("localhost")||o.ripploServerUrl.includes("127.0.0.1");return qr(async()=>{try{return await e()}catch(t){let i=t instanceof Error?t.message:String(t);throw U(t)==="FORBIDDEN"&&(process.stderr.write(`ripplo: ${ue({projectId:o.projectId,serverUrl:o.ripploServerUrl})}
60
- `),process.exit(1)),eo(i)?t:(d.error("%s failed: %s",r,i),new jr(i))}},{factor:2,maxTimeout:n?2e3:1e4,minTimeout:n?100:1e3,retries:1/0,onFailedAttempt:({attemptNumber:t,error:i})=>{d.warn("%s attempt %d failed; retrying: %s",r,t,i.message)}})}function eo(e){return e.includes("status 502")||e.includes("ECONNREFUSED")||e.includes("Failed to connect")||e.includes("fetch failed")}function ro(){L({maxRuns:Ye});let e=setInterval(()=>{L({maxRuns:Ye})},Or);return()=>{clearInterval(e)}}function oo(){process.on("unhandledRejection",e=>{d.error({err:e},"unhandledRejection in watch; continuing")}),process.on("uncaughtException",e=>{d.error({err:e},"uncaughtException in watch; continuing")})}var no=4;async function to(e){try{let r=(await P({config:e,document:Mr,variables:void 0})).currentUser?.maxLocalConcurrentRuns;if(r!=null)return x(r),r}catch(o){d.warn({err:o},"failed to fetch local concurrency setting; using default")}return no}function io(){let e=process.argv[1];if(e==null)throw new Error("cli entry unavailable");return e}export{Pn as runDaemon};