ripplo 0.7.16 → 0.7.18

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,2 @@
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};
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import{d as p,e as a}from"./chunk-Y5IXMRSB.js";import{graphql as y}from"gql.tada";import{execFileSync as S,spawn as T}from"child_process";import{existsSync as m}from"fs";var g=2e3,w=["/opt/homebrew/bin/cloudflared","/usr/local/bin/cloudflared","/usr/bin/cloudflared"],d=class extends Error{};function v({token:n}){let e=h(),i=!1,r,o,s=()=>{if(i)return;let t=T(e,["tunnel","--no-autoupdate","run"],{env:{...process.env,TUNNEL_TOKEN:n},stdio:"ignore"});r=t,t.on("error",l=>{a.warn({err:l},"cloudflared spawn failed"),f()}),t.on("exit",(l,c)=>{a.warn({code:l,signal:c},"cloudflared exited"),r=void 0,f()})},f=()=>{i||o!=null||(o=setTimeout(()=>{o=void 0,s()},g))};return s(),{stop:async()=>{i=!0,o!=null&&(clearTimeout(o),o=void 0);let t=r;t!=null&&(t.kill("SIGTERM"),await new Promise(l=>{let c=setTimeout(()=>{t.kill("SIGKILL"),l()},5e3);t.on("exit",()=>{clearTimeout(c),l()})}))}}}function h(){let n=w.find(e=>m(e));if(n!=null)return n;try{let e=S("/usr/bin/env",["which","cloudflared"],{encoding:"utf8"}).trim();if(e.length>0&&m(e))return e}catch{throw new d}throw new d}var P=y(`
3
+ mutation ReleaseDevTunnel($devSessionId: String!) {
4
+ releaseDevTunnel(devSessionId: $devSessionId)
5
+ }
6
+ `),x=y(`
7
+ mutation ProvisionDevTunnel($devSessionId: String!, $localUrl: String!, $engineUrl: String) {
8
+ provisionDevTunnel(devSessionId: $devSessionId, localUrl: $localUrl, engineUrl: $engineUrl) {
9
+ __typename
10
+ ... on DevTunnel {
11
+ hostname
12
+ tunnelId
13
+ tunnelToken
14
+ }
15
+ ... on DevSessionEndedError {
16
+ message
17
+ }
18
+ ... on TunnelNotConfiguredError {
19
+ message
20
+ }
21
+ }
22
+ }
23
+ `),u=class extends Error{failure;constructor(e){super(e.kind),this.failure=e}};async function $({config:n,devSessionId:e}){let r=(await p({config:n,document:x,variables:{devSessionId:e,engineUrl:n.engineUrl,localUrl:n.appUrl}})).provisionDevTunnel;if(r==null)throw new u({kind:"empty-response"});if(r.__typename!=="DevTunnel")throw new u({kind:"server-error",typename:r.__typename});let o=r.hostname,s=v({token:r.tunnelToken});return a.info({hostname:o},"cloud-executor tunnel up"),{hostname:o,stop:()=>D({config:n,devSessionId:e,sidecar:s})}}async function D({config:n,devSessionId:e,sidecar:i}){await i.stop(),await p({config:n,document:P,variables:{devSessionId:e}}).catch(r=>{a.warn({err:r},"releaseDevTunnel on shutdown failed")})}export{u as a,$ as b};
@@ -0,0 +1,46 @@
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};
@@ -0,0 +1,2 @@
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-RZKJVOMP.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};
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ import{$ as C,A as ne,C as ue,E as pe,H as fe,I as me,K as h,L as Re,_ as S,aa as ve,b as J,ba as _,ca as Pe,e as K,ea as O,fa as he,ga as xe,h as m,i as A,ia as I,ka as be,l as F,ma as Ee,oa as Ce,pa as Ie,q as Z,qa as Te,ra as We,sa as Le,t as E,ta as De,ua as He,v as ee,va as Ae,w as re,xa as Fe}from"./chunk-LYAUCRJZ.js";import{D as ae,F as se,G as le,H as q,K as de,Q as ce,U as ye,V as ge,W as ke,X as we,Y as Se,c as V,g as Y,j as X,m as oe,o as te,w as ie}from"./chunk-RZKJVOMP.js";import{b as qe}from"./chunk-WNUKCEN6.js";import{c as G,d as b,e as l,f as H,g as Q}from"./chunk-Y5IXMRSB.js";import"./chunk-SB7H6IAS.js";import en from"path";import{createClient as rn}from"graphql-sse";import nn,{AbortError as on}from"p-retry";import{graphql as $}from"gql.tada";import{graphql as Rr}from"gql.tada";import{print as vr}from"graphql";async function _e({config:e,cwd:n,headed:r,pool:o,runId:t,signal:i,testSlug:a,workClass:s,workflowSlug:d}){let{fingerprint:c,result:u}=await m(n);if(u.isErr())return await I(e,t,`lockfile:${u.error.kind}`),{detail:`lockfile:${u.error.kind}`,kind:"dispatch-error"};let f=Sr(u.value,{testSlug:a,workflowSlug:d});if(f==null)return await I(e,t,`no-test:${d}/${a}`),{detail:`no-test:${d}/${a}`,kind:"dispatch-error"};let p=await S({headed:r,workClass:s,task:()=>o.execute({headed:r,lockfileFingerprint:c,runId:t,testRef:f},i)});return!p.serverNotified&&p.outcome.kind==="error"&&await I(e,t,p.outcome.detail),p.outcome}function Sr(e,{testSlug:n,workflowSlug:r}){let t=e.workflows.find(i=>X(i.name)===r)?.tests.find(i=>i.slug===n);return t==null?void 0:oe(t)}var Pr=6e4,hr=Rr(`
3
+ subscription RunRequestedWatch($devSessionId: String!) {
4
+ runRequested(devSessionId: $devSessionId) {
5
+ runId
6
+ testSlug
7
+ workflowId
8
+ workflowSlug
9
+ }
10
+ }
11
+ `);async function Oe(e){let n=Math.min(1e3*2**e,Pr)+Er();await new Promise(r=>setTimeout(r,n))}function je({claim:e,cwd:n,devSessionId:r,onSubscriptionDead:o,pool:t,sseClient:i,sseHealth:a}){let s=new Set;return i.subscribe({query:vr(hr),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),o(c)},next:d=>{xr({claim:e,cwd:n,event:d.data?.runRequested,inFlightRunIds:s,pool:t})}},{connected:()=>{a.onConnected()},connecting:d=>{a.onConnecting(d),d&&l.warn("runRequested SSE reconnecting")}})}function xr({claim:e,cwd:n,event:r,inFlightRunIds:o,pool:t}){if(r==null)return;if(o.has(r.runId)){l.warn({runId:r.runId,workflowSlug:r.workflowSlug},"duplicate runRequested event; skipping dispatch");return}o.add(r.runId),process.stdout.write(`ripplo: run ${r.workflowSlug}
12
+ `),J(n);let i=E(n).match(s=>s,s=>{l.error({failure:s,runId:r.runId},"failed to load env for run dispatch; skipping")});if(i==null){o.delete(r.runId);return}let a=br(e(r.runId),r);a.started(),_e({config:i,cwd:n,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(()=>{o.delete(r.runId)})}function br(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:he(e.token),workClass:"p1-cli",finished:r=>{e.finished(n.runId,r)},started:()=>{e.started(n.runId)}}}function Er(){return Math.floor(Math.random()*2700)+300}function Me(){let e=null,n=!0,r,o=null,t=()=>{o!=null&&(clearTimeout(o),o=null)};return{degradedBeyond:i=>e!=null&&Date.now()-e>=i,markUnhealthy:i=>{n=!1,r=i,t()},onConnected:()=>{e=null,t(),o=setTimeout(()=>{n=!0,r=void 0,o=null},1e4)},onConnecting:i=>{t(),i&&e==null&&(e=Date.now())},snapshot:()=>({detail:r,ok:n})}}import Cr from"fs";import Be from"net";import{err as ze,ok as Ir}from"neverthrow";async function Ge({cwd:e,onConnection:n}){Q(e);let r=Re(e),o=await Ne({onConnection:n,socketPath:r});return o.isOk()||o.error.kind!=="stale-candidate"?o.map($e(r)).mapErr(Ue(r)):await Tr(r)?ze({kind:"already-running",socketPath:r}):(Qe(r),(await Ne({onConnection:n,socketPath:r})).map($e(r)).mapErr(Ue(r)))}function Tr(e){return new Promise(n=>{let r=Be.connect(e);r.once("connect",()=>{r.destroy(),n(!0)}),r.once("error",()=>{n(!1)})})}async function Ne(e){let n=await Wr(e);return n.kind==="listening"?Ir(n.server):ze(n.error)}function Wr({onConnection:e,socketPath:n}){return new Promise(r=>{let o=Be.createServer(e);o.once("error",t=>{r({error:t.code==="EADDRINUSE"?{kind:"stale-candidate"}:{kind:"listen-failed",message:t.message},kind:"failed"})}),o.listen(n,()=>{r({kind:"listening",server:o})})})}function $e(e){return n=>({socketPath:e,close:()=>{n.close(),Qe(e)}})}function Qe(e){Cr.rmSync(e,{force:!0})}function Ue(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 Je({config:e,executor:n,explore:r,exploreConcurrency:o,pool:t}){return Lr({appUrl:e.appUrl,cwd:e.cwd,explore:r&&n==="local",exploreConcurrency:o,executeTrail:async(i,a)=>(await t).exploreTrail(i,a)})}function Lr({appUrl:e,cwd:n,executeTrail:r,explore:o,exploreConcurrency:t}){let i={notify:()=>{}},a=o?Dr({appUrl:e,cwd:n,executeTrail:r,notifyWork:()=>{i.notify()}}):fe(),s=Fe({exploreConcurrency:t,exploreEnabled:o,now:Date.now,probe:Hr,setTimer:Ar,sources:[j("p0"),j("p1"),a],execute:({job:c,priority:u,signal:f})=>S({headed:!1,workClass:Fr(u),task:()=>c.run(f)})});_(()=>{s.notifyQueueChange()}),i.notify=()=>{s.notifyQueueChange()};let d=o?pe({onChange:c=>{s.setExplorerHolder(c)}}):null;return{status:()=>({explorer:qr({explore:o,holder:s.explorerHolder()}),exploring:s.explorationActive(),progress:a.status()}),stop:()=>{d?.stop(),s.stop(),_(null),a.stop()}}}function Dr({appUrl:e,cwd:n,executeTrail:r,notifyWork:o}){return me({cwd:n,executeTrail:r,notifyWork:o,loadLockfile:async()=>{let{fingerprint:t,result:i}=await m(n);return i.match(a=>({fingerprint:t,lockfile:a}),()=>null)},probeApp:async()=>await ne(e)==null})}function Hr(){let e=ve();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 Fr(e){switch(e){case"p0":return"p0-ui";case"p1":return"p1-cli";case"p2":return"p2-cover";case"p3":return"p3-explore"}}function qr({explore:e,holder:n}){return e?n?"holder":"standby":"off"}async function Ke({cwd:e,finding:n}){let r={at:new Date().toISOString(),kind:"resolution",signature:n.signature};await q(h(e),[r]).match(()=>{},o=>{l.warn("explore findings log append failed: %s",o.kind)})}async function Ve({cwd:e,finding:n,outcome:r}){let o=r.kind==="clean"?[...r.rows,{at:new Date().toISOString(),kind:"resolution",signature:n.signature}]:r.rows;o.length!==0&&await q(h(e),o).match(()=>{},t=>{l.warn("explore findings log append failed: %s",t.kind)})}function Ye({cwd:e,pool:n}){let r={cwd:e,executeTrail:(o,t)=>S({headed:!1,workClass:"p1-cli",task:async()=>(await n).exploreTrail(o,t)}),loadLockfile:async()=>{let o=await m(e);return o.result.match(t=>({fingerprint:o.fingerprint,lockfile:t}),()=>null)}};return(o,t)=>_r(r,{findingId:o,signal:t})}async function _r(e,n){let r=await Or(e.cwd,n.findingId);if("reply"in r)return r.reply;let o=await e.loadLockfile();if(o==null)return{kind:"error",reason:"lockfile-unavailable"};let t=jr(o,r.finding);if("reply"in t)return t.reply;let i=await e.executeTrail(t.assign,n.signal);return Nr({cwd:e.cwd,finding:r.finding,outcome:i})}async function Or(e,n){return le(h(e)).match(r=>{let t=[...se(r).findings.entries()].find(([a])=>ae(a)===n);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 jr(e,n){let r=ce(e.lockfile,{sweep:!1}).find(t=>t.name===n.baseState);if(r==null)return{reply:{kind:"unreplayable",reason:"base-state-missing"}};let o=Mr(e.lockfile,n);return o==null?{reply:{kind:"unreplayable",reason:"action-missing"}}:{assign:{baseStateTest:r.test,lensId:n.lensId,lockfileFingerprint:e.fingerprint,lockfileHash:de(e.lockfile),maxLength:o.length,shrinkBudget:0,stepRuns:o}}}function Mr(e,n){let o=te(e).map(a=>`${a.test}#${String(a.index)}`),i=n.trail.map((a,s)=>{let d=o.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 Nr({cwd:e,finding:n,outcome:r}){return r.kind==="aborted"?{kind:"aborted"}:r.kind==="error"?$r({cwd:e,finding:n,reason:r.reason}):(await Ve({cwd:e,finding:n,outcome:r}),r.kind==="clean"?{kind:"resolved"}:r.kind==="flaky"?{kind:"flaky"}:Ur(n,r))}async function $r({cwd:e,finding:n,reason:r}){return r==="empty-trail"?(await Ke({cwd:e,finding:n}),{kind:"unreachable"}):{kind:"error",reason:r??"trail-error"}}function Ur(e,n){let r=n.rows.find(t=>t.kind==="finding"),o=r?.kind==="finding"?r.runId:void 0;return r!=null&&r.signature===e.signature?{kind:"still-failing",runId:o}:{kind:"diverged",runId:o}}import{fork as Br}from"child_process";import Xe from"os";import{CancellationTokenSource as Ze,ResponseError as er}from"vscode-jsonrpc/node";function rr(e,n){return()=>{let r=Br(e,["run-worker"],{cwd:n,stdio:["ignore","inherit","inherit","ipc"]});return{connection:Ae(r),kill:()=>{r.kill("SIGKILL")},onExit:o=>{r.once("exit",o)}}}}function nr(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=>M(r,n)))},execute:(r,o)=>Gr(r,o,n),exploreTrail:(r,o)=>Kr(r,o,n),routeSpan:(r,o)=>{let t=n.workers.find(i=>i.runId===r);t?.worker.connection.sendNotification(De,{runId:r,span:o})},setSize:r=>{Yr(r,n)}}}var zr=1e4,or=-32800;async function Gr(e,n,r){let o=await tr(r);if(o.runId=e.runId,!o.alive)return T(o,r),{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1};let t=new Ze,i=()=>{t.cancel()};n.aborted&&t.cancel(),n.addEventListener("abort",i,{once:!0});try{let a=await o.worker.connection.sendRequest(Te,e,t.token),s=Ee.safeParse(a);return s.success?s.data:{outcome:{detail:"bad-outcome-frame",kind:"error"},serverNotified:!1}}catch(a){return Jr(a,o)}finally{n.removeEventListener("abort",i),t.dispose(),T(o,r)}}async function tr(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=Qr(e);return r.runId="pending",await r.ready,r}return new Promise(r=>{e.waiters.push(o=>{o.runId="pending",r(o)})})}function Qr(e){let n=e.spawn(),r={resolve:()=>{}},o={alive:!0,id:e.nextId,ready:new Promise(t=>{r.resolve=t,n.connection.onNotification(Ie,t)}),runId:void 0,worker:n};return e.nextId+=1,n.connection.onRequest(We,async t=>{let i=be.safeParse(t);return i.success?e.lockfileProvider(i.data.fingerprint):{unavailable:"bad-lockfile-request"}}),n.onExit(()=>{o.alive=!1,e.workers=e.workers.filter(t=>t!==o),n.connection.dispose(),r.resolve()}),e.workers.push(o),o}function T(e,n){if(e.runId=void 0,!e.alive||n.closed)return;if(n.workers.length>n.size){M(e,n);return}let r=n.waiters.shift();r?.(e)}async function M(e,n){if(n.workers=n.workers.filter(t=>t!==e),!e.alive)return;let r=new Promise(t=>{e.worker.onExit(t)});await e.worker.connection.sendNotification(He).catch(()=>{});let o=setTimeout(()=>{e.worker.kill()},zr);await r,clearTimeout(o)}function Jr(e,n){return e instanceof er&&e.code===or?{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 Kr(e,n,r){let o=await tr(r);if(o.runId="explore",!o.alive)return T(o,r),{kind:"error",rows:[],trail:[]};let t=new Ze,i=()=>{t.cancel()};n.aborted&&t.cancel(),n.addEventListener("abort",i,{once:!0});try{let a=await o.worker.connection.sendRequest(Le,e,t.token),s=Ce.safeParse(a);return s.success?s.data:{kind:"error",rows:[],trail:[]}}catch(a){return Vr(a)}finally{n.removeEventListener("abort",i),t.dispose(),T(o,r)}}function Vr(e){return e instanceof er&&e.code===or?{kind:"aborted",rows:[],trail:[]}:{kind:"error",reason:`transport:${e instanceof Error?e.message.slice(0,120):"unknown"}`,rows:[],trail:[]}}function Yr(e,n){n.size=e,e>Xe.availableParallelism()&&l.warn({cores:Xe.availableParallelism(),size:e},"worker pool size exceeds available cores");let r=n.workers.filter(t=>t.alive&&t.runId===void 0),o=n.workers.length-e;r.slice(0,Math.max(0,o)).forEach(t=>{M(t,n)})}import W from"fs";import{graphql as ir}from"gql.tada";import{print as ar}from"graphql";var Xr=ir(`
13
+ subscription HooksPausedWatch($projectId: String!) {
14
+ hooksPausedRequested(projectId: $projectId) {
15
+ paused
16
+ projectId
17
+ }
18
+ }
19
+ `),Zr=ir(`
20
+ subscription WatchLocalConcurrencyChanged {
21
+ myMaxLocalConcurrentRunsChanged
22
+ }
23
+ `);function sr({pool:e,sseClient:n}){return n.subscribe({query:ar(Zr)},{complete:()=>{},error:r=>{l.error(r,"localConcurrency subscription error")},next:r=>{let o=r.data?.myMaxLocalConcurrentRunsChanged;o!=null&&(C(o),e.setSize(o))}})}function lr({cwd:e,projectId:n,sseClient:r}){return r.subscribe({query:ar(Xr),variables:{projectId:n}},{complete:()=>{},error:o=>{l.error(o,"hooksPaused subscription error")},next:o=>{let t=o.data?.hooksPausedRequested?.paused;t!=null&&N({cwd:e,paused:t})}})}function N({cwd:e,paused:n}){let r=ue(e);if(n&&!W.existsSync(r)){W.writeFileSync(r,"");return}!n&&W.existsSync(r)&&W.unlinkSync(r)}var tn=6e4,dr=500,an=15e3,cr=9e4,ur=6e4,sn=3,ln=$(`
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
+ `),dn=$(`
36
+ query WatchLocalConcurrency {
37
+ currentUser {
38
+ id
39
+ maxLocalConcurrentRuns
40
+ }
41
+ }
42
+ `),cn=$(`
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 ot(e){let{executor:n,explore:r,exploreConcurrency:o}=e;Cn();let t=xn(process.cwd()),i=t.cwd,a=Sn(i),s=hn(),d=Je({config:t,executor:n,explore:r,exploreConcurrency:o,pool:s.pool}),c={handler:()=>{}},u={handler:()=>{}},f=vn(),p=Me(),k=xe({config:t,cwd:i,executor:n,explorationStatus:d.status,ready:f.promise,replayFinding:Ye({cwd:i,pool:s.pool}),onShutdownRequest:()=>{c.handler()},sseHealth:()=>p.snapshot()}),L=await Pn({cwd:i,ipc:k,releasePid:a}),w=await A(i);w.isErr()&&(process.stderr.write(`ripplo: ${F(w.error)}
55
+ `),process.exit(1));let y=w.value,g=await pr(()=>O({config:t,cwd:i,lockfile:y}),{config:t,label:"initial sync"}),R=await Tn(t);N({cwd:i,paused:g.hooksPaused});let x=Pe(i);x!=null&&l.info("watching branch %s in %s",x,i);let D=rn({headers:{Authorization:`Bearer ${t.token}`},retry:Oe,retryAttempts:1/0,url:`${t.ripploServerUrl}/graphql`}),v=wn({cwd:i,initialConcurrency:R});s.provide(v);let fr=await fn({cwd:i,pool:v}),U=gn({claim:k.claim,config:t,cwd:i,initialId:g.devSessionId,pool:v,sseClient:D,sseHealth:p}),mr=lr({cwd:i,projectId:t.projectId,sseClient:D}),yr=sr({pool:v,sseClient:D}),gr=yn({config:t,session:U,sseHealth:p,onSseDead:()=>{u.handler()}}),kr=En(),B=await un({config:t,devSessionId:g.devSessionId,executor:n});f.resolve(),mn({devSessionId:g.devSessionId,executor:n,tunnel:B});let z=async()=>{gr(),kr(),d.stop(),L.close(),U.stop(),mr(),yr(),await v.close(),await pn(B),await fr.stop().catch(()=>{}),await Promise.race([b({config:t,document:cn,variables:{cwd:t.cwd,projectId:t.projectId}}).catch(()=>{}),new Promise(wr=>setTimeout(wr,3e3))]),a()},P=()=>{z().finally(()=>process.exit(0))};c.handler=P,u.handler=()=>{z().finally(()=>process.exit(1))},process.on("SIGINT",P),process.on("SIGTERM",P),process.on("SIGHUP",P),process.on("SIGBREAK",P),await new Promise(()=>{})}async function un({config:e,devSessionId:n,executor:r}){if(r==="cloud")return qe({config:e,devSessionId:n})}async function pn(e){e!=null&&await e.stop()}function fn({cwd:e,pool:n}){return ie({localDir:en.join(e,".ripplo",".local"),writePortFile:!0,onRrwebBatch:()=>{},onSpan:r=>{let o=r.attributes["ripplo.run"];o!=null&&n.routeSpan(o,r)}})}function mn({devSessionId:e,executor:n,tunnel:r}){process.stdout.write(`${ke({devSessionId:e,executor:n,tunnelHostname:r?.hostname,version:K()})}
56
+ `)}function yn({config:e,onSseDead:n,session:r,sseHealth:o}){let t=async()=>{if(o.degradedBeyond(cr)){l.error("runRequested SSE degraded past %dms; exiting to respawn",cr),n();return}try{let a=await b({config:e,document:ln,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()},an);return()=>{clearInterval(i)}}function gn({claim:e,config:n,cwd:r,initialId:o,pool:t,sseClient:i,sseHealth:a}){let s=o,d=null,c=0,u=0,f=y=>{w(y)},p=()=>je({claim:e,cwd:r,devSessionId:s,onSubscriptionDead:f,pool:t,sseClient:i,sseHealth:a}),k=p(),L=async y=>{let g=Date.now();c=g-u>ur*2?1:c+1,u=g,c>=sn&&a.markUnhealthy(y),await kn(Math.min(1e3*2**(c-1),ur));let R=await A(r);if(R.isErr()){l.error("re-register: compile failed: %s",F(R.error));return}let x=await pr(()=>O({config:n,cwd:r,lockfile:R.value}),{config:n,label:"re-register sync"});k(),s=x.devSessionId,k=p(),l.info("re-registered dev session as %s",s)},w=y=>(d!=null||(d=L(y).finally(()=>{d=null})),d);return{getId:()=>s,reregister:()=>w("dev session ended server-side"),stop:()=>{k()}}}function kn(e){return new Promise(n=>setTimeout(n,e))}function wn({cwd:e,initialConcurrency:n}){return nr({initialSize:n,spawn:rr(Wn(),e),lockfileProvider:async r=>{let o=await m(e);return o.result.isErr()?{unavailable:`daemon-load-failed:${o.result.error.kind}`}:o.fingerprint!==r?{unavailable:"fingerprint-mismatch"}:{lockfileJson:V(Y,o.result.value)}}})}function Sn(e){try{return re({cwd:e,onCompromised:Rn})}catch(n){throw n instanceof ee&&(process.stderr.write(`${we({cwd:n.cwd,pid:n.pid})}
57
+ `),process.exit(1)),n}}function Rn(){l.error("daemon lock compromised; shutting down"),process.stderr.write(`${Se()}
58
+ `),process.exit(1)}function vn(){let e={handler:()=>{}};return{promise:new Promise(r=>{e.handler=r}),resolve:()=>{e.handler()}}}async function Pn({cwd:e,ipc:n,releasePid:r}){return(await Ge({cwd:e,onConnection:n.handleConnection})).match(t=>t,t=>{process.stderr.write(`${ye(t)}
59
+ `),r(),process.exit(1)})}function hn(){let e={provide:()=>{}};return{pool:new Promise(r=>{e.provide=r}),provide:r=>{e.provide(r)}}}function xn(e){return E(e).match(n=>n,n=>{process.stderr.write(`${Z(n)}
60
+ `),process.exit(1)})}function pr(e,{config:n,label:r}){let o=n.ripploServerUrl.includes("localhost")||n.ripploServerUrl.includes("127.0.0.1");return nn(async()=>{try{return await e()}catch(t){let i=t instanceof Error?t.message:String(t);throw G(t)==="FORBIDDEN"&&(process.stderr.write(`ripplo: ${ge({projectId:n.projectId,serverUrl:n.ripploServerUrl})}
61
+ `),process.exit(1)),bn(i)?t:(l.error("%s failed: %s",r,i),new on(i))}},{factor:2,maxTimeout:o?2e3:1e4,minTimeout:o?100:1e3,retries:1/0,onFailedAttempt:({attemptNumber:t,error:i})=>{l.warn("%s attempt %d failed \u2014 retrying: %s",r,t,i.message)}})}function bn(e){return e.includes("status 502")||e.includes("ECONNREFUSED")||e.includes("Failed to connect")||e.includes("fetch failed")}function En(){H({maxRuns:dr});let e=setInterval(()=>{H({maxRuns:dr})},tn);return()=>{clearInterval(e)}}function Cn(){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 In=4;async function Tn(e){try{let r=(await b({config:e,document:dn,variables:void 0})).currentUser?.maxLocalConcurrentRuns;if(r!=null)return C(r),r}catch(n){l.warn({err:n},"failed to fetch local concurrency setting; using default")}return In}function Wn(){let e=process.argv[1];if(e==null)throw new Error("cli entry unavailable");return e}export{ot as runDaemon};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a,b}from"./chunk-WNUKCEN6.js";import"./chunk-Y5IXMRSB.js";import"./chunk-SB7H6IAS.js";export{a as TunnelProvisionFailedError,b as startDaemonTunnel};