@stacksjs/ts-cloud 0.16.91 → 0.16.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/{chunk-97j6xrfe.js → chunk-00arzt4m.js} +1 -1
- package/dist/bin/{chunk-vbsk8b9d.js → chunk-eb591jvz.js} +1 -1
- package/dist/bin/{chunk-g21yhm1b.js → chunk-v72zwetk.js} +1 -1
- package/dist/bin/cli.js +4 -4
- package/dist/bin/dashboard-server.js +1 -1
- package/dist/{chunk-n95wbpge.js → chunk-cjm5j58y.js} +1 -1
- package/dist/{chunk-mvmxy0z7.js → chunk-zjkxhvn0.js} +1 -1
- package/dist/deploy/index.js +1 -1
- package/dist/drivers/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/ui/404.html +1 -1
- package/dist/ui/accept-invitation.html +1 -1
- package/dist/ui/access-denied.html +1 -1
- package/dist/ui/account/automation.html +6 -6
- package/dist/ui/account/security.html +2 -2
- package/dist/ui/applications/compose.html +6 -6
- package/dist/ui/applications/new.html +2 -2
- package/dist/ui/data/backups.html +6 -6
- package/dist/ui/data/services.html +6 -6
- package/dist/ui/data/volumes.html +6 -6
- package/dist/ui/index.html +6 -6
- package/dist/ui/infrastructure/topology.html +5 -5
- package/dist/ui/integrations.html +1 -1
- package/dist/ui/operations/alerts.html +6 -6
- package/dist/ui/operations/configuration.html +6 -6
- package/dist/ui/operations/jobs.html +6 -6
- package/dist/ui/operations/maintenance.html +5 -5
- package/dist/ui/operations/observability.html +6 -6
- package/dist/ui/operations/previews.html +6 -6
- package/dist/ui/operations/queue.html +6 -6
- package/dist/ui/operations/regions.html +6 -6
- package/dist/ui/operations/releases.html +6 -6
- package/dist/ui/operations/spend.html +6 -6
- package/dist/ui/operations/workloads.html +6 -6
- package/dist/ui/security.html +1 -1
- package/dist/ui/server/actions.html +6 -6
- package/dist/ui/server/activity.html +1 -1
- package/dist/ui/server/capacity.html +6 -6
- package/dist/ui/server/database.html +6 -6
- package/dist/ui/server/deployments.html +5 -5
- package/dist/ui/server/diagnostics.html +2 -2
- package/dist/ui/server/firewall.html +6 -6
- package/dist/ui/server/fleet.html +6 -6
- package/dist/ui/server/logs.html +6 -6
- package/dist/ui/server/metrics.html +5 -5
- package/dist/ui/server/security.html +2 -2
- package/dist/ui/server/services.html +1 -1
- package/dist/ui/server/sites.html +6 -6
- package/dist/ui/server/ssh-keys.html +6 -6
- package/dist/ui/server/team.html +6 -6
- package/dist/ui/server/terminal.html +2 -2
- package/dist/ui/serverless/alarms.html +6 -6
- package/dist/ui/serverless/assets.html +2 -2
- package/dist/ui/serverless/cost.html +2 -2
- package/dist/ui/serverless/data.html +6 -6
- package/dist/ui/serverless/deployments.html +1 -1
- package/dist/ui/serverless/firewall.html +1 -1
- package/dist/ui/serverless/functions.html +6 -6
- package/dist/ui/serverless/logs.html +6 -6
- package/dist/ui/serverless/metrics.html +2 -2
- package/dist/ui/serverless/queues.html +6 -6
- package/dist/ui/serverless/secrets.html +5 -5
- package/dist/ui/serverless/traces.html +6 -6
- package/dist/ui/serverless.html +5 -5
- package/package.json +3 -3
package/dist/bin/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
import{C,Xt,n,r,a,Or,e,u,i,s,P,d,Zo,c,Cn,we,pa,ma,ga,fa,f}from"./chunk-32dr1fym.js";import{Ta,H,Vr,w,U,rs,l,o,T,wa,Aa,Ra,Le,Ge,ct,is,Rn,zi,In,os,ka,Na,xa,_a,$a,j,b,M,lt,N,be,as,We,er,Hi,Pe,cs,Gi,tr,_t,La,Ma}from"./chunk-cb0yqrpk.js";import"./chunk-8ctmc30y.js";import{Ue,_,Mn,y,Un,io,Bn,Ss,Wr,ut,_e,jn,Vn,zn,Hn,Gn,qn,Wn,Kn,ae,ar,cr,Jn,Kr,Xn,Qn,Yn,Zn,ei,ti,ri,ni,pt,lr,dr,Mt,Jr,ur,pr,oo,Ut,ii,pe,oi,si,ai,Xr,Qr,ci,Yr,mr,gr,mt,Bt,Ft,Zr,me,li,Tc,Ec,fr,wc,G,so,Je,gt,ft,di,en,ui,tn,pi,mi,rn,vs,ge,Ce,Be,Te,gi,hr}from"./chunk-
|
|
2
|
+
import{C,Xt,n,r,a,Or,e,u,i,s,P,d,Zo,c,Cn,we,pa,ma,ga,fa,f}from"./chunk-32dr1fym.js";import{Ta,H,Vr,w,U,rs,l,o,T,wa,Aa,Ra,Le,Ge,ct,is,Rn,zi,In,os,ka,Na,xa,_a,$a,j,b,M,lt,N,be,as,We,er,Hi,Pe,cs,Gi,tr,_t,La,Ma}from"./chunk-cb0yqrpk.js";import"./chunk-8ctmc30y.js";import{Ue,_,Mn,y,Un,io,Bn,Ss,Wr,ut,_e,jn,Vn,zn,Hn,Gn,qn,Wn,Kn,ae,ar,cr,Jn,Kr,Xn,Qn,Yn,Zn,ei,ti,ri,ni,pt,lr,dr,Mt,Jr,ur,pr,oo,Ut,ii,pe,oi,si,ai,Xr,Qr,ci,Yr,mr,gr,mt,Bt,Ft,Zr,me,li,Tc,Ec,fr,wc,G,so,Je,gt,ft,di,en,ui,tn,pi,mi,rn,vs,ge,Ce,Be,Te,gi,hr}from"./chunk-00arzt4m.js";import{p,ya}from"./chunk-0qzt0swj.js";import{J,Pt,Qo}from"./chunk-kefwtr8r.js";import{tt,Bs,re,bo,Ai,So,vo,ln,Co,To,Ee,ne,rt,Oe,dn,Ct,$e,Tr,un,nt,it,Er,pn,Ri,Ii,fe,Tt,Pi,Ar,Rr,Ir,mn,Pr,O,wo,Ao,Qc,Ro,Fs,js,Vs,zs,Et,Hs,Io,Po,Do}from"./chunk-v72zwetk.js";import{de,h,Fr}from"./chunk-42nh9ac7.js";import{$r,kt,Lr,Mr,Ur,Br,Tn}from"./chunk-pat56kbr.js";import{S,jt,fi,Ts,yr,Ac,Rc,Ic,hi,yi,nn,Vt,on,ht,yt,Xe,je,Qe,bt,br,Ve,Ye,bi,Si,Ze,sn,an,lo,po,Cr,zt,St,Ht,te,ho,Ti,Ei,Os}from"./chunk-kp84kged.js";import{F}from"./chunk-407wz1f4.js";import{at,Wt,kr,oa,sa,Nr,ye,Bi,xr,jo,Vo,zo,Ho,Go,qo,K,Kt,B,Fi}from"./chunk-1p7rtk98.js";import{W,A,xo,Ks,Js,tl,rl,fn,Rt,$i}from"./chunk-zpk7fn1s.js";import{v}from"./chunk-r1q343bm.js";import{Q}from"./chunk-fcst782q.js";import{Dt,g}from"./chunk-kbtx3q9m.js";import"./chunk-57yxbyh6.js";import{le,q,Jc,Xc,et}from"./chunk-3h7gmatb.js";import{D}from"./chunk-fmgv99xw.js";import{he}from"./chunk-j34ask5s.js";import{or,$n,sr,ro,Ln,bs}from"./chunk-p6swcv5y.js";import"./chunk-gkgqss71.js";import{E}from"./chunk-55mv5w3m.js";import{It}from"./chunk-0zepgwq9.js";import{vt}from"./chunk-kdjrcvr6.js";import{no}from"./chunk-j7j7gffr.js";import{ie,Ae}from"./chunk-chx779q9.js";import{V}from"./chunk-xk8nrvjz.js";import"./chunk-xhqfha32.js";import"./chunk-sjzzx539.js";import"./chunk-g1s5s95g.js";import"./chunk-6ty1wegm.js";import{Ni}from"./chunk-mrkrn8dk.js";import{Dr}from"./chunk-eqqqbsjm.js";import{x}from"./chunk-ncj8dpdp.js";import{existsSync as _u}from"node:fs";import Pa from"node:fs/promises";import Vl from"node:os";import Da from"node:path";import Yi from"node:process";import{EventEmitter as Mu}from"node:events";import ji from"node:process";import ql from"node:process";import Fa from"node:process";import Ps from"node:process";import Wo from"node:process";import Jl from"node:tty";import Pm,{stdin as sy,stdout as ay}from"node:process";class Yl{configPath;config=null;events=[];retryCount=0;maxRetries=3;retryDelayMs=1000;constructor(){let R=Vl.homedir(),t=Da.join(R,".config","clapp");this.configPath=Da.join(t,"telemetry.json")}async isEnabled(){if(Yi.env.DO_NOT_TRACK==="1"||Yi.env.DO_NOT_TRACK==="true")return!1;if(Yi.env.NO_TELEMETRY==="1"||Yi.env.NO_TELEMETRY==="true")return!1;return(await this.loadConfig()).enabled}async enable(){let R=await this.loadConfig();if(R.enabled=!0,!R.userId)R.userId=this.generateUserId();await this.saveConfig(R)}async disable(){let R=await this.loadConfig();R.enabled=!1,await this.saveConfig(R)}async track(R,t){if(!await this.isEnabled())return;let k={event:R,...t,timestamp:Date.now(),platform:Vl.platform(),nodeVersion:Yi.version};if(this.events.push(k),this.events.length>=10)await this.send()}async trackCommand(R,t){await this.track("command",{command:R,duration:t})}async trackError(R,t){await this.track("error",{error:R,command:t})}async send(){if(!await this.isEnabled()||this.events.length===0)return!0;try{this.events=[],this.retryCount=0;let t=await this.loadConfig();return t.lastSent=Date.now(),await this.saveConfig(t),!0}catch{if(this.retryCount<this.maxRetries){this.retryCount++;let t=this.retryDelayMs*2**(this.retryCount-1);return await this.sleep(t),this.send()}return this.events=[],this.retryCount=0,!1}}async flush(){if(this.events.length===0)return!0;return this.send()}sleep(R){return new Promise((t)=>setTimeout(t,R))}async status(){let R=await this.loadConfig();return{enabled:R.enabled,doNotTrack:Yi.env.DO_NOT_TRACK==="1"||Yi.env.DO_NOT_TRACK==="true",eventsQueued:this.events.length,lastSent:R.lastSent}}async loadConfig(){if(this.config)return this.config;try{if(_u(this.configPath)){let R=await Pa.readFile(this.configPath,"utf-8");return this.config=JSON.parse(R),this.config}}catch{}return this.config={enabled:!1},this.config}async saveConfig(R){this.config=R;try{let t=Da.dirname(this.configPath);await Pa.mkdir(t,{recursive:!0}),await Pa.writeFile(this.configPath,JSON.stringify(R,null,2),"utf-8")}catch{}}generateUserId(){let R=Math.random().toString(36).substring(2,15),t=Date.now().toString(36);return`${R}-${t}`}}var Gh=new Yl;function Oa(R){return R.replace(/[<[].+/,"").trim()}function zu(R){let t=/<([^>]+)>/g,m=/\[([^\]]+)\]/g,k=[],I=(Y)=>{let Z=!1,X=Y[1];if(X.startsWith("..."))X=X.slice(3),Z=!0;return{required:Y[0].startsWith("<"),value:X,variadic:Z}},L;while(L=t.exec(R))k.push(I(L));let z;while(z=m.exec(R))k.push(I(z));return k}function Uu(R){let t={alias:{},boolean:[]};for(let[m,k]of R.entries()){if(k.names.length>1)t.alias[k.names[0]]=k.names.slice(1);if(k.isBoolean)if(k.negated){if(!R.some((L,z)=>z!==m&&L.names.some((Y)=>k.names.includes(Y))&&typeof L.required==="boolean"))t.boolean.push(k.names[0])}else t.boolean.push(k.names[0])}return t}function Hl(R){return R.reduce((t,m)=>t.length>=m.length?t:m,"")}function Ea(R,t){return R.length>=t?R:`${R}${" ".repeat(t-R.length)}`}function Is(R){return R.replace(/([a-z])-([a-z])/g,(t,m,k)=>m+k.toUpperCase())}function Wu(R,t,m){let k=0,I=t.length,L=R,z;for(;k<I;++k)z=L[t[k]],L=L[t[k]]=k===I-1?m:z!=null?z:!!~t[k+1].indexOf(".")||!(+t[k+1]>-1)?{}:[]}function Vu(R,t){for(let m of Object.keys(t)){let k=t[m];if(k.shouldTransform){if(R[m]=Array.prototype.concat.call([],R[m]),typeof k.transformFunction==="function")R[m]=R[m].map(k.transformFunction)}}}function qu(R){let t=/([^\\/]+)$/.exec(R);return t?t[1]:""}function Ko(R){return R.split(".").map((t,m)=>m===0?Is(t):t).join(".")}class Jo extends Error{exitCode=2;isUsageError=!0;usage;constructor(R,t){super(R);if(this.name=this.constructor.name,t!==void 0)this.usage=t;if(typeof Error.captureStackTrace==="function")Error.captureStackTrace(this,this.constructor);else this.stack=Error(R).stack}format(R=!1){if(R&&this.stack)return`${this.message}
|
|
3
3
|
|
|
4
4
|
Stack trace:
|
|
5
5
|
${this.stack}`;return this.message}}function Hu(R){if(R instanceof Jo)return!0;return!!R&&typeof R==="object"&&R.name==="ClappError"&&typeof R.message==="string"}function Gu(){let{env:R}=ql,{TERM:t,TERM_PROGRAM:m}=R;if(ql.platform!=="win32")return t!=="linux";return Boolean(R.WT_SESSION)||Boolean(R.TERMINUS_SUBLIME)||R.ConEmuTask==="{cmd::Cmder}"||m==="Terminus-Sublime"||m==="vscode"||t==="xterm-256color"||t==="alacritty"||t==="rxvt-unicode"||t==="rxvt-unicode-256color"||R.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var xs="\x1B",Qt=`${xs}[`;var Gl={to(R,t){if(!t)return`${Qt}${R+1}G`;return`${Qt}${t+1};${R+1}H`},move(R,t){let m="";if(R<0)m+=`${Qt}${-R}D`;else if(R>0)m+=`${Qt}${R}C`;if(t<0)m+=`${Qt}${-t}A`;else if(t>0)m+=`${Qt}${t}B`;return m},up:(R=1)=>`${Qt}${R}A`,down:(R=1)=>`${Qt}${R}B`,forward:(R=1)=>`${Qt}${R}C`,backward:(R=1)=>`${Qt}${R}D`,nextLine:(R=1)=>`${Qt}E`.repeat(R),prevLine:(R=1)=>`${Qt}F`.repeat(R),left:`${Qt}G`,hide:`${Qt}?25l`,show:`${Qt}?25h`,save:`${xs}7`,restore:`${xs}8`};var Zh={screen:`${Qt}2J`,up:(R=1)=>`${Qt}1J`.repeat(R),down:(R=1)=>`${Qt}J`.repeat(R),line:`${Qt}2K`,lineEnd:`${Qt}K`,lineStart:`${Qt}1K`,lines(R){let t="";for(let m=0;m<R;m++)t+=this.line+(m<R-1?Gl.up():"");if(R)t+=Gl.left;return t}},Qh={screen:`${xs}c`};function Ku(R,t){let m=[];for(let k=0;k<=t.length;k++)m[k]=[k];for(let k=0;k<=R.length;k++)m[0][k]=k;for(let k=1;k<=t.length;k++)for(let I=1;I<=R.length;I++)if(t.charAt(k-1)===R.charAt(I-1))m[k][I]=m[k-1][I-1];else m[k][I]=Math.min(m[k-1][I-1]+1,m[k][I-1]+1,m[k-1][I]+1);return m[t.length][R.length]}function Zl(R,t,m=2,k=3){return t.map((I)=>({cmd:I,distance:Ku(R,I)})).filter(({distance:I})=>I<=m).sort((I,L)=>I.distance-L.distance).slice(0,k).map(({cmd:I})=>I)}function Ju(R,t={}){let m={_:[]},k=t.alias||{},I=new Set(t.boolean||[]),L={};for(let Z of Object.keys(k))for(let X of k[Z])L[X]=Z;for(let Z of I)if(k[Z])for(let X of k[Z])I.add(X);function z(Z,X){if(Z===void 0)return X;if(typeof X==="boolean")return X;return Array.isArray(Z)?[...Z,X]:[Z,X]}function Y(Z,X){let ee=L[Z]||Z,oe=z(m[ee],X);if(m[ee]=oe,k[ee])for(let se of k[ee])m[se]=oe;if(L[Z]&&k[L[Z]])for(let se of k[L[Z]])m[se]=oe;m[Z]=oe}for(let Z=0;Z<R.length;Z++){let X=R[Z];if(X==="--"){m._.push(...R.slice(Z+1));break}if(X.startsWith("--")){let ee=X.indexOf("=");if(ee!==-1){let oe=Is(X.slice(2,ee)),se=X.slice(ee+1);Y(oe,se)}else{let oe=X.slice(2);if(oe.startsWith("no-")){let ke=Is(oe.slice(3));Y(ke,!1);continue}let se=Is(oe),ue=L[se]||se;if(I.has(ue)||I.has(se))Y(se,!0);else{let ke=R[Z+1];if(ke!==void 0&&!ke.startsWith("-"))Y(se,ke),Z++;else Y(se,!0)}}}else if(X.startsWith("-")&&X.length>1){let ee=X.slice(1);for(let oe=0;oe<ee.length;oe++){let se=ee[oe],ue=L[se]||se;if(oe===ee.length-1&&!I.has(ue)&&!I.has(se)){let ke=R[Z+1];if(ke!==void 0&&!ke.startsWith("-"))Y(se,ke),Z++;else Y(se,!0)}else Y(se,!0)}}else m._.push(X)}return m}class Ql{rawName;description;name;names;isBoolean;required;config;negated;constructor(R,t,m){if(this.rawName=R,this.description=t,this.config=Object.assign({},m),R=R.replace(/\.\*/g,""),this.negated=!1,this.names=Oa(R).split(",").map((k)=>{let I=k.trim().replace(/^-{1,2}/,"");if(I.startsWith("no-"))this.negated=!0,I=I.replace(/^no-/,"");return Ko(I)}).sort((k,I)=>k.length>I.length?1:-1),this.name=this.names[this.names.length-1],this.negated&&this.config.default==null)this.config.default=!0;if(R.includes("<"))this.required=!0;else if(R.includes("["))this.required=!1;else this.isBoolean=!0}}var ey=Fa.argv,Yu=`${Fa.platform}-${Fa.arch} bun-v${typeof Bun<"u"?Bun.version:"unknown"}`,Kl=Ps.argv,Zu=`${Ps.platform}-${Ps.arch} node-${Ps.version}`;class ja{rawName;description;config;cli;options;aliasNames;name;namespace;args;commandAction;usageText;versionNumber;examples;helpCallback;globalCommand;beforeHooks;afterHooks;middleware;constructor(R,t,m,k){this.rawName=R,this.description=t,this.config=m,this.cli=k,this.options=[],this.aliasNames=[],this.name=Oa(R);let I=Oa(R),L=I.indexOf(":");if(L>0)this.namespace=I.substring(0,L),this.name=I.substring(L+1);if(this.args=zu(R),this.examples=[],this.beforeHooks=[],this.afterHooks=[],this.middleware=[],!m)this.config={}}usage(R){return this.usageText=R,this}allowUnknownOptions(){return this.config.allowUnknownOptions=!0,this}ignoreOptionDefaultValue(){return this.config.ignoreOptionDefaultValue=!0,this}version(R,t="-v, --version"){return this.versionNumber=R,this.option(t,"Display version number"),this}example(R){return this.examples.push(R),this}option(R,t,m){let k=new Ql(R,t,m);return this.options.push(k),this}alias(R){return this.aliasNames.push(R),this}action(R){return this.commandAction=R,this}before(R){return this.beforeHooks.push(R),this}after(R){return this.afterHooks.push(R),this}use(R){return this.middleware.push(R),this}isMatched(R){if(this.aliasNames.includes(R))return!0;if(this.namespace)return`${this.namespace}:${this.name}`===R;return this.name===R}get isDefaultCommand(){return this.name===""||this.aliasNames.includes("!")}get isGlobalCommand(){return this instanceof Ba}get displayName(){return this.namespace?`${this.namespace}:${this.name}`:this.name}hasOption(R){let t=Ko(R.split(".")[0]);return!!this.options.find((m)=>m.names.some((k)=>Ko(k)===t))}outputHelp(){let{name:R,commands:t}=this.cli,{versionNumber:m,options:k,helpCallback:I}=this.cli.globalCommand,L=[{body:`${R}${m?`/${m}`:""}`}];if(L.push({title:"Usage",body:` $ ${R} ${this.usageText||this.rawName}`}),(this.isGlobalCommand||this.isDefaultCommand)&&t.length>0){let X=Hl(t.map((ke)=>ke.rawName)),ee=new Map,oe=[];for(let ke of t)if(ke.namespace){if(!ee.has(ke.namespace))ee.set(ke.namespace,[]);ee.get(ke.namespace).push(ke)}else oe.push(ke);let se="";if(oe.sort((ke,ce)=>ke.rawName<ce.rawName?-1:ke.rawName>ce.rawName?1:0),oe.length>0)se+=oe.map((ke)=>` ${Ea(ke.rawName,X.length)} ${ke.description}`).join(`
|
|
@@ -28,7 +28,7 @@ Received ${m}, cleaning up...`),R)try{await R()}catch(k){console.error("Error du
|
|
|
28
28
|
`)),this.enableDidYouMean){let t=[];for(let k of this.commands){if(k.displayName)t.push(k.displayName);if(k.aliasNames)t.push(...k.aliasNames)}let m=Zl(R,t);if(m.length>0)console.log(Uo.yellow("Did you mean one of these?")),m.forEach((k)=>console.log(` ${Uo.dim("•")} ${this.name} ${k}`)),console.log("")}console.log(Uo.dim("Run"),`${this.name} --help`,Uo.dim("to see all available commands")),ji.exit(1)}async parse(R=Kl,t={}){let{run:m=!0,exitOnError:k=!1}=t;if(k)try{return await this.parse(R,{run:m})}catch(Z){throw this.handleUsageError(Z),Z}if(this.rawArgs=R,!this.name)this.name=R[1]?qu(R[1]):"cli";let I=!0,L=R.slice(2),z=L[0];if(z&&!z.startsWith("-")){for(let Z of this.commands)if(Z.isMatched(z)){let X=this.mri(L,Z);I=!1;let ee={...X,args:X.args.slice(1)};this.setParsedInfo(ee,Z,z),this.emit(`command:${z}`,Z);break}if(I){let Z=L[1];if(Z&&!Z.startsWith("-")){let X=`${z}:${Z}`;for(let ee of this.commands)if(ee.isMatched(X)){let oe=this.mri(L,ee);I=!1;let se={...oe,args:oe.args.slice(2)};this.setParsedInfo(se,ee,X),this.emit(`command:${X}`,ee);break}}}}if(I){for(let Z of this.commands)if(Z.name===""){I=!1;let X=this.mri(L,Z);this.setParsedInfo(X,Z),this.emit("command:!",Z);break}}if(I){let Z=this.mri(R.slice(2));this.setParsedInfo(Z)}if(this.options.verbose)this.isVerbose=!0;if(this.options.quiet)this.isQuiet=!0;if(this.options.debug)this.isDebug=!0;if(this.options.noInteraction||this.options.interaction===!1)this.isNoInteraction=!0;if(this.options.env)this.environment=String(this.options.env);if(this.options.dryRun)this.isDryRun=!0;if(this.options.force)this.isForce=!0;if(this.options.noEmoji||this.options.emoji===!1)this.useEmoji=!1;if(this.options.theme)this.theme=String(this.options.theme);if(this.options.noCache||this.options.cache===!1)this.isNoCache=!0;if(this.options.help&&this.showHelpOnExit)this.outputHelp(),m=!1,this.unsetMatchedCommand();if(this.options.version&&this.showVersionOnExit&&this.matchedCommandName==null)this.outputVersion(),m=!1,this.unsetMatchedCommand();let Y={args:this.args,options:this.options};if(m)await this.runMatchedCommand();if(!this.matchedCommand&&this.args[0]){if(this.emit("command:*"),!(this.listenerCount("command:*")>0))this.showCommandNotFound(this.args[0])}return Y}mri(R,t){let m=[...this.globalCommand.options,...t?t.options:[]],k=Uu(m),I=[],L=R.indexOf("--");if(L>-1)I=R.slice(L+1),R=R.slice(0,L);let z=Ju(R,k),Y={_:z._};for(let se of Object.keys(z))if(se!=="_")Y[Ko(se)]=z[se];let Z=Y._,X={"--":I},ee=t&&t.config.ignoreOptionDefaultValue?t.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,oe=Object.create(null);for(let se of m){if(!ee&&se.config.default!==void 0)for(let ue of se.names)X[ue]=se.config.default;if(Array.isArray(se.config.type)){if(oe[se.name]===void 0)oe[se.name]={shouldTransform:!0,transformFunction:se.config.type[0]}}}for(let se of Object.keys(Y))if(se!=="_"){let ue=se.split(".");Wu(X,ue,Y[se]),Vu(X,oe)}return{args:Z,options:X}}async run(R=Kl){return this.parse(R,{run:!0,exitOnError:!0})}handleUsageError(R){if(!Hu(R)||R.isUsageError===!1)return;let t=R.message||"command-line error",m=this.name?`${this.name}: `:"",k=/--help/.test(t)?"":R.usage?`
|
|
29
29
|
Usage: ${R.usage}`:`
|
|
30
30
|
Run \`${this.name??"cli"} --help\` for usage.`;ji.stderr.write(`${m}${t}${k}
|
|
31
|
-
`),ji.exit(R.exitCode??2)}async runMatchedCommand(){let{args:R,options:t,matchedCommand:m}=this;if(!m||!m.commandAction)return;m.checkUnknownOptions(),m.checkOptionValue(),m.checkRequiredArgs();let k=[];m.args.forEach((Y,Z)=>{if(Y.variadic)k.push(R.slice(Z));else k.push(R[Z])}),k.push(t);let I={command:m,args:k,options:t};for(let Y of m.beforeHooks)await Y(I);let L,z=async()=>{let Y=m.commandAction.apply(this,k);if(Y instanceof Promise)L=await Y;else L=Y;return L};if(m.middleware.length>0){let Y=0,Z=async()=>{if(Y<m.middleware.length){let X=m.middleware[Y++];await X({...I,next:Z})}else await z()};await Z()}else await z();for(let Y of m.afterHooks)await Y(I);return L}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return ji.removeAllListeners("SIGINT"),ji.removeAllListeners("SIGTERM"),this.signalHandlersSet=!1,this}destroy(){this.removeSignalHandlers(),this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.matchedCommand=void 0,this.matchedCommandName=void 0,this.removeAllListeners()}}class Xl{cache;enabled;cleanupInterval=null;hits=0;misses=0;constructor(){this.cache=new Map,this.enabled=!0,this.startCleanupInterval()}startCleanupInterval(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanup()},30000),this.cleanupInterval.unref()}stopCleanup(){if(this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}isEnabled(){return this.enabled}get(R){if(!this.enabled){this.misses++;return}let t=this.cache.get(R);if(!t){this.misses++;return}if(Date.now()-t.timestamp>t.ttl){this.cache.delete(R),this.misses++;return}return this.hits++,t.value}set(R,t,m=5000){if(!this.enabled)return;this.cache.set(R,{value:t,timestamp:Date.now(),ttl:m})}has(R){if(!this.enabled)return!1;let t=this.cache.get(R);if(!t)return!1;if(Date.now()-t.timestamp>t.ttl)return this.cache.delete(R),!1;return!0}delete(R){this.cache.delete(R)}clear(){this.cache.clear()}disable(){this.enabled=!1,this.clear()}enable(){this.enabled=!0}stats(){return{size:this.cache.size,enabled:this.enabled,hits:this.hits,misses:this.misses}}resetStats(){this.hits=0,this.misses=0}keys(){return Array.from(this.cache.keys())}cleanup(){let R=Date.now();for(let[t,m]of this.cache.entries())if(R-m.timestamp>m.ttl)this.cache.delete(t)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var ny=new Xl;function tm(){if("FORCE_COLOR"in Wo.env)return Wo.env.FORCE_COLOR!=="0";if("NO_COLOR"in Wo.env||Wo.env.TERM==="dumb")return!1;if(Wo.platform==="win32")return!0;return Jl.isatty(1)&&Jl.isatty(2)}var ed=tm();function Zt(R,t){if(!ed)return(m)=>m;return(m)=>R+m+t}var nm=Zt("\x1B[0m","\x1B[0m"),rm=Zt("\x1B[31m","\x1B[39m"),im=Zt("\x1B[32m","\x1B[39m"),om=Zt("\x1B[33m","\x1B[39m"),sm=Zt("\x1B[34m","\x1B[39m"),am=Zt("\x1B[35m","\x1B[39m"),cm=Zt("\x1B[36m","\x1B[39m"),lm=Zt("\x1B[37m","\x1B[39m"),dm=Zt("\x1B[90m","\x1B[39m"),um=Zt("\x1B[1m","\x1B[22m"),mm=Zt("\x1B[3m","\x1B[23m"),pm=Zt("\x1B[4m","\x1B[24m"),fm=Zt("\x1B[2m","\x1B[22m"),gm=Zt("\x1B[7m","\x1B[27m"),hm=Zt("\x1B[8m","\x1B[28m"),ym=Zt("\x1B[9m","\x1B[29m"),vm=Zt("\x1B[41m","\x1B[49m"),bm=Zt("\x1B[42m","\x1B[49m"),wm=Zt("\x1B[43m","\x1B[49m"),Sm=Zt("\x1B[44m","\x1B[49m"),Cm=Zt("\x1B[45m","\x1B[49m"),$m=Zt("\x1B[46m","\x1B[49m"),km=Zt("\x1B[47m","\x1B[49m"),Am=ed,Rm={reset:nm,red:rm,green:im,yellow:om,blue:sm,magenta:am,cyan:cm,white:lm,gray:dm,bold:um,italic:mm,underline:pm,dim:fm,inverse:gm,hidden:hm,strikethrough:ym,bgRed:vm,bgGreen:bm,bgYellow:wm,bgBlue:Sm,bgMagenta:Cm,bgCyan:$m,bgWhite:km,isColorSupported:Am},Im=Rm,xm=["up","down","left","right","space","enter","cancel"],cy={actions:new Set(xm),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};var ly=Pm.platform.startsWith("win"),dy=Symbol("clapp:cancel");var Dm=Gu();var Yt=(R,t)=>Dm?R:t,uy=Yt("◆","*"),my=Yt("■","x"),py=Yt("▲","x"),fy=Yt("◇","o"),gy=Yt("┌","T"),Em=Yt("│","|"),hy=Yt("└","—"),yy=Yt("●",">"),vy=Yt("○"," "),by=Yt("◻","[•]"),wy=Yt("◼","[+]"),Sy=Yt("◻","[ ]"),Cy=Yt("▪","•"),$y=Yt("─","-"),ky=Yt("╮","+"),Ay=Yt("├","+"),Ry=Yt("╯","+"),Iy=Yt("●","•"),Py=Yt("◆","*"),xy=Yt("▲","!"),Dy=Yt("■","x");var Ey={light:Yt("─","-"),heavy:Yt("━","="),block:Yt("█","#")};function Tm(){return`${Im.gray(Em)} `}var Ty=Tm();var Ua="0.16.
|
|
31
|
+
`),ji.exit(R.exitCode??2)}async runMatchedCommand(){let{args:R,options:t,matchedCommand:m}=this;if(!m||!m.commandAction)return;m.checkUnknownOptions(),m.checkOptionValue(),m.checkRequiredArgs();let k=[];m.args.forEach((Y,Z)=>{if(Y.variadic)k.push(R.slice(Z));else k.push(R[Z])}),k.push(t);let I={command:m,args:k,options:t};for(let Y of m.beforeHooks)await Y(I);let L,z=async()=>{let Y=m.commandAction.apply(this,k);if(Y instanceof Promise)L=await Y;else L=Y;return L};if(m.middleware.length>0){let Y=0,Z=async()=>{if(Y<m.middleware.length){let X=m.middleware[Y++];await X({...I,next:Z})}else await z()};await Z()}else await z();for(let Y of m.afterHooks)await Y(I);return L}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return ji.removeAllListeners("SIGINT"),ji.removeAllListeners("SIGTERM"),this.signalHandlersSet=!1,this}destroy(){this.removeSignalHandlers(),this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.matchedCommand=void 0,this.matchedCommandName=void 0,this.removeAllListeners()}}class Xl{cache;enabled;cleanupInterval=null;hits=0;misses=0;constructor(){this.cache=new Map,this.enabled=!0,this.startCleanupInterval()}startCleanupInterval(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanup()},30000),this.cleanupInterval.unref()}stopCleanup(){if(this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}isEnabled(){return this.enabled}get(R){if(!this.enabled){this.misses++;return}let t=this.cache.get(R);if(!t){this.misses++;return}if(Date.now()-t.timestamp>t.ttl){this.cache.delete(R),this.misses++;return}return this.hits++,t.value}set(R,t,m=5000){if(!this.enabled)return;this.cache.set(R,{value:t,timestamp:Date.now(),ttl:m})}has(R){if(!this.enabled)return!1;let t=this.cache.get(R);if(!t)return!1;if(Date.now()-t.timestamp>t.ttl)return this.cache.delete(R),!1;return!0}delete(R){this.cache.delete(R)}clear(){this.cache.clear()}disable(){this.enabled=!1,this.clear()}enable(){this.enabled=!0}stats(){return{size:this.cache.size,enabled:this.enabled,hits:this.hits,misses:this.misses}}resetStats(){this.hits=0,this.misses=0}keys(){return Array.from(this.cache.keys())}cleanup(){let R=Date.now();for(let[t,m]of this.cache.entries())if(R-m.timestamp>m.ttl)this.cache.delete(t)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var ny=new Xl;function tm(){if("FORCE_COLOR"in Wo.env)return Wo.env.FORCE_COLOR!=="0";if("NO_COLOR"in Wo.env||Wo.env.TERM==="dumb")return!1;if(Wo.platform==="win32")return!0;return Jl.isatty(1)&&Jl.isatty(2)}var ed=tm();function Zt(R,t){if(!ed)return(m)=>m;return(m)=>R+m+t}var nm=Zt("\x1B[0m","\x1B[0m"),rm=Zt("\x1B[31m","\x1B[39m"),im=Zt("\x1B[32m","\x1B[39m"),om=Zt("\x1B[33m","\x1B[39m"),sm=Zt("\x1B[34m","\x1B[39m"),am=Zt("\x1B[35m","\x1B[39m"),cm=Zt("\x1B[36m","\x1B[39m"),lm=Zt("\x1B[37m","\x1B[39m"),dm=Zt("\x1B[90m","\x1B[39m"),um=Zt("\x1B[1m","\x1B[22m"),mm=Zt("\x1B[3m","\x1B[23m"),pm=Zt("\x1B[4m","\x1B[24m"),fm=Zt("\x1B[2m","\x1B[22m"),gm=Zt("\x1B[7m","\x1B[27m"),hm=Zt("\x1B[8m","\x1B[28m"),ym=Zt("\x1B[9m","\x1B[29m"),vm=Zt("\x1B[41m","\x1B[49m"),bm=Zt("\x1B[42m","\x1B[49m"),wm=Zt("\x1B[43m","\x1B[49m"),Sm=Zt("\x1B[44m","\x1B[49m"),Cm=Zt("\x1B[45m","\x1B[49m"),$m=Zt("\x1B[46m","\x1B[49m"),km=Zt("\x1B[47m","\x1B[49m"),Am=ed,Rm={reset:nm,red:rm,green:im,yellow:om,blue:sm,magenta:am,cyan:cm,white:lm,gray:dm,bold:um,italic:mm,underline:pm,dim:fm,inverse:gm,hidden:hm,strikethrough:ym,bgRed:vm,bgGreen:bm,bgYellow:wm,bgBlue:Sm,bgMagenta:Cm,bgCyan:$m,bgWhite:km,isColorSupported:Am},Im=Rm,xm=["up","down","left","right","space","enter","cancel"],cy={actions:new Set(xm),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};var ly=Pm.platform.startsWith("win"),dy=Symbol("clapp:cancel");var Dm=Gu();var Yt=(R,t)=>Dm?R:t,uy=Yt("◆","*"),my=Yt("■","x"),py=Yt("▲","x"),fy=Yt("◇","o"),gy=Yt("┌","T"),Em=Yt("│","|"),hy=Yt("└","—"),yy=Yt("●",">"),vy=Yt("○"," "),by=Yt("◻","[•]"),wy=Yt("◼","[+]"),Sy=Yt("◻","[ ]"),Cy=Yt("▪","•"),$y=Yt("─","-"),ky=Yt("╮","+"),Ay=Yt("├","+"),Ry=Yt("╯","+"),Iy=Yt("●","•"),Py=Yt("◆","*"),xy=Yt("▲","!"),Dy=Yt("■","x");var Ey={light:Yt("─","-"),heavy:Yt("━","="),block:Yt("█","#")};function Tm(){return`${Im.gray(Em)} `}var Ty=Tm();var Ua="0.16.93";function td(R,t,m=process.env){let k=t?.options.find((z)=>z.name==="profile");if((!k||/\baws\b/i.test(k.description))&&typeof R.profile==="string"&&R.profile)m.AWS_PROFILE=R.profile,delete m.AWS_ACCESS_KEY_ID,delete m.AWS_SECRET_ACCESS_KEY,delete m.AWS_SESSION_TOKEN;if(!t?.options.some((z)=>z.name==="region")&&typeof R.region==="string"&&R.region)m.AWS_REGION=R.region,m.AWS_DEFAULT_REGION=R.region}import{existsSync as Wa}from"node:fs";import{mkdir as Om,writeFile as nd}from"node:fs/promises";function Va(R){R.command("init","Initialize a new ts-cloud project").option("--mode <mode>","Deployment mode: server or serverless").option("--name <name>","Project name").option("--region <region>","AWS Region").action(async(t)=>{if(i("Initializing ts-cloud Project"),Wa("cloud.config.ts")){if(!await d("cloud.config.ts already exists. Overwrite?",!1)){e("Initialization cancelled");return}}let m=t?.name||await P("Project name","my-app"),k=t?.mode||await Zo("Select deployment mode",["serverless","server"]),I=t?.region||await Zo("Select AWS region",["us-east-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1"]),L=new s("Creating configuration file...");L.start();let z=`import { defineConfig } from '@ts-cloud/core'
|
|
32
32
|
|
|
33
33
|
export default defineConfig({
|
|
34
34
|
project: {
|
|
@@ -315,7 +315,7 @@ Resources to create: ${Ie}`);let Me={};for(let Ne of Object.values(X.Resources||
|
|
|
315
315
|
No changes detected - infrastructure is up to date`);return}if(e(`
|
|
316
316
|
Changes detected:
|
|
317
317
|
`),Se.length>0){n(`Resources to add (${Se.length}):`);for(let Re of Se){let Ie=ue[Re].Type;e(` + ${Re} (${Ie})`)}console.log()}if(xe.length>0){r(`Resources to remove (${xe.length}):`);for(let Re of xe){let Ie=se[Re].Type;e(` - ${Re} (${Ie})`)}console.log()}if(ve.length>0){a(`Resources to modify (${ve.length}):`);for(let Re of ve){let Ie=ue[Re].Type;e(` ~ ${Re} (${Ie})`)}console.log()}e("Summary:"),e(` - Add: ${Se.length}`),e(` - Remove: ${xe.length}`),e(` - Modify: ${ve.length}`),e("\nRun `cloud deploy` to apply these changes")}catch(m){r(`Diff failed: ${m.message}`)}})}function Mi(R,t=0){let m=Number(R);return Number.isFinite(m)?m:t}function Za(R){return Mi(R)*1024}function mp(R){let t=R?.date?.trim(),m=R?.time?.trim();if(!t||!m)return null;let k=new Date(`${t}T${m}Z`);return Number.isFinite(k.getTime())?k.toISOString():null}function pp(R,t,m){let k;try{k=JSON.parse(R)}catch{return[]}let I=(k?.sysstat?.hosts??[]).flatMap((z)=>z.statistics??[]),L=[];for(let z of I){let Y=mp(z.timestamp);if(!Y)continue;let Z=new Date(Y).getTime();if(Z<t.getTime()||Z>m.getTime())continue;let X=z["cpu-load"]?.find((oe)=>oe.cpu==="all")??z["cpu-load"]?.[0],ee=Mi(X?.idle,100);L.push({timestamp:Y,cpuUsedPercent:Math.max(0,Math.min(100,100-ee)),cpuUserPercent:Mi(X?.user),cpuSystemPercent:Mi(X?.system),cpuIowaitPercent:Mi(X?.iowait),memoryUsedPercent:Mi(z.memory?.["memused-percent"]),memoryUsedBytes:Za(z.memory?.memused),memoryAvailableBytes:Za(z.memory?.avail),swapUsedPercent:Mi(z.memory?.["swpused-percent"]),swapUsedBytes:Za(z.memory?.swpused)})}return L.sort((z,Y)=>z.timestamp.localeCompare(Y.timestamp))}function fp(R){return Object.fromEntries(Object.entries(R.time_series??{}).map(([t,m])=>[t,(m.values??[]).map(([k,I])=>({timestamp:new Date(Number(k)*1000).toISOString(),value:Mi(I,Number.NaN)})).filter((k)=>Number.isFinite(k.value))]))}function hd(R){return R.length?R.reduce((t,m)=>t+m,0)/R.length:null}function Qa(R){return R.length?Math.max(...R):null}function gp(R){return R.length?Math.min(...R):null}async function yd(R){let[t,m]=await Promise.all([R.client.getServerMetrics(R.serverId,{types:["cpu","disk","network"],start:R.from,end:R.to,step:R.step}),Oe(R.remote.host,"LC_ALL=C sadf -j -- -u -r -S",R.remote).catch(()=>"")]),k=pp(m,R.from,R.to),I=fp(t),z=(I.cpu??[]).map((oe)=>Math.max(0,Math.min(100,oe.value/Math.max(1,R.cores)))),Y=k.map((oe)=>oe.cpuUsedPercent),Z=z.length?z:Y,X=k.map((oe)=>oe.memoryUsedPercent),ee=k.map((oe)=>oe.swapUsedPercent);return{from:R.from.toISOString(),to:R.to.toISOString(),cores:R.cores,host:k,provider:I,summary:{cpuAveragePercent:hd(Z),cpuPeakPercent:Qa(Z),memoryAveragePercent:hd(X),memoryPeakPercent:Qa(X),memoryMinimumAvailableBytes:gp(k.map((oe)=>oe.memoryAvailableBytes)),swapPeakPercent:Qa(ee)}}}function hp(R){if(R.length===0)throw Error("A server name cannot be empty.");if(R.length>253)throw Error(`'${R}' is longer than the 253 characters a hostname allows.`);for(let t of R.split(".")){if(t.length===0)throw Error(`'${R}' has an empty label — a hostname cannot contain '..'.`);if(t.length>63)throw Error(`'${t}' is longer than the 63 characters a hostname label allows.`);if(!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(t))throw Error(`'${t}' is not a valid hostname label. Use letters, digits and hyphens, not starting or ending with a hyphen.`)}}async function vd(R,t,m){if(hp(t),R===t)throw Error(`'${R}' is already named that.`);if((await m.takenNames()).some((L)=>L===t&&L!==R))throw Error(`'${t}' is already taken. Server names have to be unique within a provider project.`);let I=[];if(m.providerName&&m.renameProvider){let{providerName:L,renameProvider:z}=m;I.push({id:"provider",title:"Rename the server at the provider",change:{from:R,to:t},satisfied:async()=>await L()===t,apply:()=>z(t)})}if(m.stateName&&m.writeStateName){let{stateName:L,writeStateName:z}=m;I.push({id:"state-pin",title:"Update the recorded name in the local driver state",change:{from:R,to:t},satisfied:async()=>{let Y=await L();return Y===void 0||Y===t},apply:()=>z(t)})}if(m.remoteHostname&&m.setRemoteHostname){let{remoteHostname:L,setRemoteHostname:z}=m;I.push({id:"hostname",title:"Set the hostname on the box",change:{from:R,to:t},satisfied:async()=>await L()===t,apply:()=>z(t)})}return I.push({id:"inventory",title:"Rename the fleet inventory record",change:{from:R,to:t},satisfied:async()=>m.inventoryName()===t,apply:async()=>{await m.renameInventory(t)}}),{operation:"server:rename",target:R,steps:I}}function bd(R){let t=`'${R.replace(/'/g,`'"'"'`)}'`;return["set -eu",'TS_CLOUD_OLD="$(hostname)"',`hostnamectl set-hostname ${t} 2>/dev/null || { echo ${t} > /etc/hostname && hostname ${t}; }`,'if grep -q "^127.0.1.1" /etc/hosts; then',` TS_CLOUD_HOSTS="$(sed -E "s/^127\\.0\\.1\\.1.*/127.0.1.1\\t${R}/" /etc/hosts)"`,` printf '%s\\n' "$TS_CLOUD_HOSTS" > /etc/hosts`,"else",` printf '127.0.1.1\\t%s\\n' ${t} >> /etc/hosts`,"fi",'printf "%s -> %s\\n" "$TS_CLOUD_OLD" "$(hostname)"'].join(`
|
|
318
|
-
`)}async function yp(){let R=await De(),t=y(process.cwd(),R),m=new _e(t.store),k=new jn(m,[new ut("aws"),new ut("hetzner"),new ut("ssh")]);return{controlPlane:t,store:m,service:k}}async function Hr(R){let t=await yp();try{return await R(t)}finally{t.controlPlane.store.close()}}var Ui=(R,t)=>{let m=R.store.list(R.controlPlane.project.id).find((k)=>k.id===t||k.name===t);if(!m)throw Error(`Server ${t} was not found.`);return m},wn=(R)=>{r(R instanceof Error?R.message:String(R)),process.exitCode=1};function Xa(R,t){let m=Number.parseInt(R??"",10);return Number.isFinite(m)&&m>=0?m:t}function vp(R="3h"){let t=R.match(/^(\d+)(m|h)$/);if(!t)throw Error("--range must use minutes or hours, for example 30m or 3h.");let m=Number(t[1])*(t[2]==="h"?3600000:60000);if(m<300000||m>86400000)throw Error("--range must be between 5 minutes and 24 hours.");return m}function ts(R,t="%"){return R==null?"unavailable":`${R.toFixed(1)}${t}`}async function bp(R,t){let m=await De();if(m.cloud?.provider!=="hetzner")throw Error("server:monitoring currently requires the Hetzner provider.");let k=t.env??process.env.CLOUD_ENV??"production",I=T(m,k),L=await fe(I);if(!L?.serverId)throw Error(`No pinned Hetzner server was found for ${I}.`);if(![L.serverName,String(L.serverId),L.stackName].includes(R))throw Error(`Refusing to read ${R}: project state is pinned to ${L.serverName}.`);let z=Ct(m),Y=new $e({apiToken:Tr(z.apiToken,m)}),Z=await Y.getServer(L.serverId),X=L.publicIp??Z.public_net.ipv4?.ip;if(!X)throw Error(`Server ${Z.name} has no public IPv4 address.`);let ee=new Date,oe=new Date(ee.getTime()-vp(t.range)),se=Math.min(3600,Math.max(60,Xa(t.step,60))),ue=await yd({client:Y,serverId:Z.id,cores:Math.max(1,Number(Z.server_type.cores)||1),from:oe,to:ee,step:se,remote:{host:X,user:L.sshUser??z.sshUser,identityFile:z.sshPrivateKeyPath,connectTimeoutSec:15}});if(t.json){console.log(JSON.stringify({schemaVersion:1,server:Z.name,result:ue},null,2));return}c(["Server","Window","CPU average / peak","RAM average / peak","Minimum available","Swap peak"],[[Z.name,`${ue.from} to ${ue.to}`,`${ts(ue.summary.cpuAveragePercent)} / ${ts(ue.summary.cpuPeakPercent)}`,`${ts(ue.summary.memoryAveragePercent)} / ${ts(ue.summary.memoryPeakPercent)}`,ue.summary.memoryMinimumAvailableBytes==null?"unavailable":`${(ue.summary.memoryMinimumAvailableBytes/1073741824).toFixed(2)} GB`,ts(ue.summary.swapPeakPercent)]])}function wd(R){let t=R.targetType.prices?.find((m)=>m.location===R.location);return{serverId:R.serverId,serverName:R.serverName,location:R.location,from:R.currentType.name,to:R.targetType.name,capacityAvailable:R.capacityAvailable,alreadyComplete:R.alreadyComplete,upgradeDisk:R.upgradeDisk,target:{cores:R.targetType.cores,memoryGb:R.targetType.memory,diskGb:R.targetType.disk,architecture:R.targetType.architecture,cpuType:R.targetType.cpu_type},price:t?{hourlyNet:t.price_hourly.net,hourlyGross:t.price_hourly.gross,monthlyNet:t.price_monthly.net,monthlyGross:t.price_monthly.gross}:void 0}}function wp(R){let t=wd(R);c(["Server","Location","Resize","Capacity","CPU / RAM / disk","Monthly"],[[`${t.serverName} (${t.serverId})`,t.location,`${t.from} -> ${t.to}`,t.capacityAvailable?"available":"waiting",`${t.target.cores??0} / ${t.target.memoryGb??0} GB / ${t.target.diskGb??0} GB`,t.price?.monthlyGross??t.price?.monthlyNet??"not reported"]])}async function Sp(R,t,m){let k=await De();if(k.cloud?.provider!=="hetzner")throw Error("server:resize currently requires the Hetzner provider.");let I=m.env??process.env.CLOUD_ENV??"production",L=T(k,I),z=await fe(L),Y=Ct(k),Z=new $e({apiToken:Tr(Y.apiToken,k)}),ee=z&&(R===z.serverName||R===String(z.serverId)||R===z.stackName)?await Z.getServer(z.serverId):(await Z.listServers()).find((Ne)=>Ne.name===R||String(Ne.id)===R);if(!ee)throw Error(`Hetzner server ${R} was not found.`);if(z?.serverId&&z.serverId!==ee.id)throw Error(`Refusing to resize ${R}: project state is pinned to server ${z.serverId}.`);let oe=nt(t),se=m.upgradeDisk!==!1,ue=await it(Z,ee.id,oe,se);if(m.json)console.log(JSON.stringify({schemaVersion:1,plan:wd(ue)},null,2));else wp(ue);if(!m.apply){if(!m.json)e(`Preview only. Re-run with --apply --confirm ${ee.name} to execute.`);return}if(m.confirm!==ee.name)throw Error(`Resize requires --confirm ${ee.name}.`);let ke=z?.publicIp??ee.public_net.ipv4?.ip;if(!ke)throw Error(`Server ${ee.name} has no public IPv4 address for verification.`);let ce={host:ke,user:z?.sshUser??Y.sshUser,identityFile:Y.sshPrivateKeyPath,connectTimeoutSec:15,sshTimeoutMs:600000,routeTimeoutMs:20000},Se=await zs(L),xe=new Date().toISOString(),ve={schemaVersion:1,operationId:Se?.targetType===oe&&Se.serverId===ee.id?Se.operationId:crypto.randomUUID(),stackName:L,serverId:ee.id,serverName:ee.name,sourceType:ue.currentType.name,targetType:oe,upgradeDisk:se,phase:"planning",status:"running",attempts:Se?.targetType===oe?Se.attempts:0,startedAt:Se?.targetType===oe?Se.startedAt:xe,updatedAt:xe,manifest:Se?.targetType===oe?Se.manifest:void 0};await Et(ve);let Re=Xa(m.pollSeconds,900)*1000,Ie=Xa(m.maxWaitMinutes,0)*60000,Me=Date.now();for(;;){let Ne=await it(Z,ee.id,oe,se);if(!Ne.capacityAvailable&&!Ne.alreadyComplete){if(ve={...ve,phase:"waiting-capacity",status:"waiting-capacity",updatedAt:new Date().toISOString()},await Et(ve),!m.wait){if(!m.json)e(`${oe} has no capacity in ${Ne.location}. The server remains running and unchanged. Use --wait to poll safely.`);return}if(Ie>0&&Date.now()-Me>=Ie)throw Error(`Timed out waiting for ${oe} capacity in ${Ne.location}.`);if(!m.json)e(`Waiting ${Math.round(Re/1000)} seconds for ${oe} capacity...`);await Bun.sleep(Re);continue}let Fe=await Hs(L);try{let ze=await(async()=>{try{return ve={...ve,status:"running",attempts:ve.attempts+1,updatedAt:new Date().toISOString()},await Et(ve),await Er({client:Z,serverId:ee.id,targetType:oe,upgradeDisk:se,resumeFromOff:ve.phase==="shutting-down"||ve.phase==="resizing"||ve.phase==="powering-on"||ve.phase==="verifying",manifest:ve.manifest,hooks:{preflight:async()=>{let ot=await Ri(ce);return ve={...ve,manifest:ot,updatedAt:new Date().toISOString()},await Et(ve),ot},afterBoot:async(ot,wt,He,dt)=>Ii(ce,wt,He,dt),onPhase:async(ot,wt)=>{if(ve={...ve,phase:ot,status:ot==="waiting-capacity"?"waiting-capacity":ot==="complete"?"completed":"running",updatedAt:new Date().toISOString()},await Et(ve),!m.json)e(`${ot}${wt?` ${JSON.stringify(wt)}`:""}`)}}})}finally{await Fe()}})();if(ve={...ve,status:ze.status==="completed"||ze.status==="already-complete"?"completed":ze.status==="recovered"?"recovered":"waiting-capacity",lastError:ze.status==="recovered"?ze.error:void 0,updatedAt:new Date().toISOString()},await Et(ve),m.json)console.log(JSON.stringify({schemaVersion:1,result:ze},null,2));else if(ze.status==="completed"||ze.status==="already-complete")n(`${ee.name} is on ${oe} and passed full post-boot verification.`);else if(ze.status==="recovered"&&ze.retryable&&m.wait){e(`Capacity race recovered safely. Waiting ${Math.round(Re/1000)} seconds before retry.`),await Bun.sleep(Re);continue}else if(ze.status==="recovered")throw Error(`Resize did not complete and the original server was recovered: ${ze.error}`);return}catch(ze){throw ve={...ve,status:"failed",lastError:ze instanceof Error?ze.message:String(ze),updatedAt:new Date().toISOString()},await Et(ve),ze}}}async function Cp(R,t){let m=await De();if(m.cloud?.provider!=="hetzner")throw Error("server:optimize currently requires the Hetzner provider.");let k=t.env??process.env.CLOUD_ENV??"production",I=T(m,k),L=await fe(I);if(!L?.serverId)throw Error(`No pinned Hetzner server was found for ${I}.`);if(![L.serverName,String(L.serverId),L.stackName].includes(R))throw Error(`Refusing to optimize ${R}: project state is pinned to ${L.serverName}.`);let z=Ct(m),Y=new $e({apiToken:Tr(z.apiToken,m)}),Z=await Y.getServer(L.serverId),X=L.publicIp??Z.public_net.ipv4?.ip;if(!X)throw Error(`Server ${Z.name} has no public IPv4 address.`);let ee=Ro(m);if(t.json)console.log(JSON.stringify({schemaVersion:1,server:Z.name,plan:ee},null,2));else c(["Server","Firewall ports","Monitoring","Auto updates","Swap","SSH passwords"],[[Z.name,ee.firewallPorts.join(","),ee.monitoring?"on":"off",ee.autoUpdates?"on":"off",`${ee.swapGb} GB`,"disabled"]]);if(!t.apply){if(!t.json)e(`Preview only. Re-run with --apply --confirm ${Z.name} to execute.`);return}if(t.confirm!==Z.name)throw Error(`Optimization requires --confirm ${Z.name}.`);let oe={host:X,user:L.sshUser??z.sshUser,identityFile:z.sshPrivateKeyPath,connectTimeoutSec:15},se=await pn(oe),ue=se.routeProbes.filter((He)=>!He.ok),ke=m.infrastructure?.compute,ce=ne(ke)?new Set(["nginx.service","bun-gateway.service","ts-cloud-nginx.service"]):new Set,Se=se.failedUnits.filter((He)=>!ce.has(He));if(Se.length>0)throw Error(`Preflight found failed services: ${Se.join(", ")}`);if(ue.length>0)throw Error(`Preflight found unhealthy routes: ${ue.map((He)=>He.domain).join(", ")}`);let xe=ne(ke)?[]:Object.values(m.sites??{}).flatMap((He)=>typeof He?.port==="number"&&![80,443].includes(He.port)?[He.port]:[]),ve=un({allowSsh:ke?.allowSsh!==!1,sitePorts:xe,allowedPorts:ke?.firewall?.allowedPorts}),Re=(L.firewallId?(await Y.listFirewalls()).find((He)=>He.id===L.firewallId):void 0)??(await Y.listFirewalls()).find((He)=>He.name===`${m.project.slug}-${k}-app-fw`);if(!Re)throw Error(`Managed firewall for ${Z.name} was not found.`);let Ie=await Y.setFirewallRules(Re.id,ve);await Promise.all(Ie.map((He)=>Y.waitForAction(He.id))),await Fs(m,oe);let[Me,Ne]=await Promise.all([pn(oe),js(oe)]),Fe=Vs(ee,Ne),ze=Qc(se,Me),ot=Me.routeProbes.filter((He)=>!He.ok);if(ze.stoppedServices.length>0)Fe.push(`services stopped: ${ze.stoppedServices.join(", ")}`);if(ze.changedRouteFragments.length>0)Fe.push(`route fragments changed: ${ze.changedRouteFragments.join(", ")}`);if(ze.missingRouteIds.length>0)Fe.push(`routes disappeared: ${ze.missingRouteIds.join(", ")}`);if(ze.changedReleaseLinks.length>0)Fe.push(`release links changed: ${ze.changedReleaseLinks.join(", ")}`);if(ze.missingData.length>0)Fe.push(`databases or volumes disappeared: ${ze.missingData.join(", ")}`);if(ot.length>0)Fe.push(`unhealthy routes: ${ot.map((He)=>He.domain).join(", ")}`);if(Fe.length>0)throw Error(`Host optimization verification failed: ${Fe.join("; ")}`);let wt={serverId:Z.id,serverName:Z.name,services:Me.runningServices.length,routes:Me.routeIds.length,healthyDomains:Me.routeProbes.length,releaseLinks:Me.releaseLinks.length,databasesAndVolumes:Me.dataCatalog.length,report:Ne};if(t.json)console.log(JSON.stringify({schemaVersion:1,result:wt},null,2));else n(`${Z.name} passed full host, rpx route, service, release, and data verification.`)}async function $p(R,t,m){let k=await De(),I=m.env??"production",L=T(k,I);await Hr(async(z)=>{let Y=Ui(z,R),Z=z.store.list(z.controlPlane.project.id,!0),X=Y.provider==="hetzner"&&Y.providerId?(()=>{try{let Re=Ct(k);return new $e({apiToken:Tr(Re.apiToken,k)})}catch{return null}})():null,ee=Y.providerId?Number(Y.providerId):Number.NaN,oe=await fe(L),se=oe!=null&&oe.serverId===ee,ue=new Wr,ke=Y.trustState==="pinned",ce={takenNames:async()=>{let Re=Z.map((Ie)=>Ie.name);if(X)Re.push(...(await X.listServers()).map((Ie)=>Ie.name));return Re},inventoryName:()=>z.store.get(Y.id)?.name??Y.name,renameInventory:(Re)=>{z.store.update(Y.id,{name:Re})},...X&&Number.isFinite(ee)?{providerName:async()=>(await X.getServer(ee)).name,renameProvider:async(Re)=>{await X.renameServer(ee,Re)}}:{},...se?{stateName:async()=>(await fe(L))?.serverName,writeStateName:async(Re)=>{let Ie=await fe(L);if(Ie)await Tt(L,{...Ie,serverName:Re})}}:{},...ke?{remoteHostname:async()=>{let Re=await ue.exec(Y,"hostname");return Re.code===0?Re.stdout.trim():void 0},setRemoteHostname:async(Re)=>{let Ie=await ue.exec(Y,bd(Re));if(Ie.code!==0)throw Error(Ie.stderr.trim()||`hostname exited ${Ie.code}`)}}:{}},Se=await vd(Y.name,t,ce),xe=await Es(Se);if(!m.apply){let Re=[X?"":"provider record (no provider id or no API token)",se?"":"local state pin (none points at this server)",ke?"":"box hostname (host key is not pinned — run server:validate first)"].filter(Boolean);if(m.json){console.log(JSON.stringify({schemaVersion:1,operation:Se.operation,target:Se.target,rename:{from:Y.name,to:t},notCovered:Re,steps:xe.map((Ie)=>({id:Ie.step.id,title:Ie.step.title,state:Ie.state,change:Ie.step.change,reason:Ie.reason}))},null,2));return}for(let Ie of Ns(Se,xe))console.log(Ie);for(let Ie of Re)console.log(` not covered: ${Ie}`);console.log(" Re-run with --apply to perform it.");return}let ve=await Ls(Se,xe,{log:(Re)=>e(Re),audit:(Re)=>z.controlPlane.store.appendEvent({projectId:z.controlPlane.project.id,resourceId:Y.resourceId,type:`${Re.operation}.${Re.step}.${Re.state}`,level:Re.state==="failed"?"error":"info",payload:{target:Re.target,renameTo:t,...Re.error?{error:Re.error}:{}}})});if(m.json)console.log(JSON.stringify({schemaVersion:1,outcome:ve},null,2));if(!ve.success){let Re=ve.steps.find((Ie)=>Ie.state==="failed");throw Error(`${Se.operation} stopped at '${Re?.title}': ${Re?.error}. Earlier steps stayed applied; re-run the same command to continue from here.`)}if(!m.json)n(`Renamed ${Y.name} to ${t}.`)})}function ec(R){R.command("capabilities [server]","Show provider and target operation support").option("--json","Print structured JSON").action(async(t,m)=>{try{await Hr(async(k)=>{let I=t?[Ui(k,t)]:k.store.list(k.controlPlane.project.id),L=I.flatMap((z)=>Object.entries(z.capabilities).map(([Y,Z])=>({server:z.name,provider:z.provider,action:Y,...Z})));if(m.json)console.log(JSON.stringify({schemaVersion:1,targets:L},null,2));else c(["Server","Provider","Action","Support","Explanation"],L.map((z)=>[z.server,z.provider,z.action,z.supported?"supported":"unsupported",z.reason??"—"]))})}catch(k){wn(k)}}),R.command("server:resize <name> <type>","Safely resize Hetzner compute with full host verification").option("--env <environment>","Deployment environment",{default:"production"}).option("--apply","Execute the reviewed resize plan").option("--confirm <name>","Exact server name required for mutation").option("--upgrade-disk","Permanently expand the root disk to the target size",{default:!0}).option("--wait","Poll capacity without taking the server offline until placement is available").option("--poll-seconds <seconds>","Capacity retry interval",{default:"900"}).option("--max-wait-minutes <minutes>","Stop waiting after this many minutes; 0 waits indefinitely",{default:"0"}).option("--json","Print structured JSON").action(async(t,m,k)=>{try{await Sp(t,m,k)}catch(I){wn(I)}}),R.command("server:optimize <name>","Reconcile and verify a production Hetzner host").option("--env <environment>","Deployment environment",{default:"production"}).option("--apply","Apply the reviewed host optimization plan").option("--confirm <name>","Exact server name required for mutation").option("--json","Print structured JSON").action(async(t,m)=>{try{await Cp(t,m)}catch(k){wn(k)}}),R.command("server:monitoring <name>","Read historical Hetzner CPU, RAM, swap, disk, and network metrics").option("--env <environment>","Deployment environment",{default:"production"}).option("--range <duration>","Historical window from 5m to 24h",{default:"3h"}).option("--step <seconds>","Hetzner provider sample interval",{default:"60"}).option("--json","Print structured JSON").action(async(t,m)=>{try{await bp(t,m)}catch(k){wn(k)}}),R.command("server:list","List fleet servers").option("--json","Print structured JSON").action(async(t)=>{try{await Hr(async(m)=>{let k=m.store.list(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(k,null,2));else c(["Name","Provider ID","Provider / region","Status / trust","Roles","CPU / memory","Heartbeat"],k.map((I)=>[I.name,I.providerId??"—",`${I.provider} / ${I.region??"external"}`,`${I.status} / ${I.trustState}`,I.roles.join(","),`${I.capacity.cpu??0} / ${I.capacity.memoryBytes??0}`,I.heartbeatAt??"never"]))})}catch(m){wn(m)}}),R.command("server:create <name>","Enroll a provisioned or existing server").option("--provider <provider>","aws, hetzner, or ssh",{default:"ssh"}).option("--provider-id <id>","Stable provider identity").option("--endpoint <host>","SSH hostname or IP").option("--user <user>","Non-root SSH user",{default:"deploy"}).option("--credential-ref <ref>","Secret reference",{default:"secret://fleet/agent"}).option("--region <region>","Provider region").option("--roles <roles>","Comma-separated roles",{default:"application"}).option("--labels <labels>","Comma-separated key=value labels").action(async(t,m)=>{try{await Hr(async(k)=>{let I=m.provider;if(!["aws","hetzner","ssh"].includes(I)||!m.endpoint)throw Error("A supported --provider and --endpoint are required; provisioning and enrollment are separate operations.");let L=k.service.enroll({organizationId:k.controlPlane.organization.id,projectId:k.controlPlane.project.id,name:t,provider:I,providerId:m.providerId,endpoint:m.endpoint,sshUser:m.user??"deploy",credentialRef:m.credentialRef??"secret://fleet/agent",region:m.region,roles:String(m.roles??"application").split(","),labels:Object.fromEntries(String(m.labels??"").split(",").map((z)=>z.split("=")).filter((z)=>z[0]&&z[1]))});n(`Enrolled ${L.name} as ${L.id}; no remote mutation was performed.`)})}catch(k){wn(k)}}),R.command("server:validate <name>","Pin trust and validate a server").option("--accept-host-key <fingerprint>","Accept reviewed rotation").option("--json","Print JSON").action(async(t,m)=>{try{await Hr(async(k)=>{let I=Ui(k,t);if(I=await k.service.test(I.id),I.trustState==="rotation_pending"){if(!m.acceptHostKey)throw Error(`Host key changed to ${I.pendingHostKey}; review it first.`);I=k.service.reviewHostKey(I.id,m.acceptHostKey)}let L=await k.service.validate(I.id);if(m.json)console.log(JSON.stringify(L.validation,null,2));else c(["Severity","Code","Finding","Remediation"],(L.validation?.findings??[]).map((z)=>[z.severity,z.code,z.message,z.remediation??"—"]));if(!L.validation?.valid)process.exitCode=1})}catch(k){wn(k)}}),R.command("server:bootstrap <name>","Preview or queue bootstrap").option("--apply","Apply reviewed plan").action(async(t,m)=>{try{await Hr(async(k)=>{let I=k.service.bootstrap(Ui(k,t).id,!!m.apply);if(I.preview)c(["Step"],I.steps.map((L)=>[L]));else n(`Bootstrap queued: ${I.operation?.id}`)})}catch(k){wn(k)}}),R.command("server:rename <name> <new-name>","Rename a server in place, without recreating it").option("--env <environment>","Deployment environment",{default:"production"}).option("--apply","Perform the reviewed rename plan").option("--json","Print structured JSON").action(async(t,m,k)=>{try{await $p(t,m,k)}catch(I){wn(I)}}),R.command("server:drain <name>","Drain without terminating").option("--complete","Mark movement complete").action(async(t,m)=>{try{await Hr(async(k)=>n(k.service.drain(Ui(k,t).id,!!m.complete).status))}catch(k){wn(k)}}),R.command("server:uncordon <name>","Return a server to scheduling").action(async(t)=>{try{await Hr(async(m)=>{m.service.uncordon(Ui(m,t).id),n(`Uncordoned ${t}.`)})}catch(m){wn(m)}}),R.command("server:archive <name>","Archive inventory without termination").option("--confirm <name>","Exact name").action(async(t,m)=>{try{await Hr(async(k)=>{k.service.archive(Ui(k,t).id,m.confirm??""),n(`Archived ${t}; provider infrastructure was not terminated.`)})}catch(k){wn(k)}}),R.command("server:ssh <name>","Open strict SSH using the enrolled endpoint").action(async(t)=>{try{await Hr(async(m)=>{let k=Ui(m,t);if(k.trustState!=="pinned")throw Error("Validate and pin the server host key first.");let I=Bun.spawn(["ssh","-p",String(k.sshPort),"-o","StrictHostKeyChecking=yes",`${k.sshUser}@${k.endpoint}`],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}),L=await I.exited;if(L)process.exitCode=L})}catch(m){wn(m)}});for(let[t,m]of[["server:logs <name>","Use the runtime log service"],["server:deploy <name>","Use immutable release deployment"],["server:reboot <name>","Reboot provider compute"],["server:destroy <name>","Terminate provider compute"],["server:recipe <name> <recipe>","Apply a server recipe"],["server:firewall:add <name> <rule>","Add firewall rule"],["server:firewall:list <name>","List firewall rules"],["server:firewall:remove <name> <rule>","Remove firewall rule"],["server:ssl:install <domain>","Install TLS"],["server:ssl:renew <domain>","Renew TLS"],["server:snapshot <name>","Create provider snapshot"],["server:snapshot:restore <name> <snapshot-id>","Restore provider snapshot"],["server:update <name>","Update OS packages"],["server:secure <name>","Apply OS hardening"]])R.command(t,m).action(async(...k)=>xn(t.split(" ")[0],{target:String(k[0]??""),nextAction:"Use the dashboard capability view or the corresponding runtime, release, firewall, backup, or maintenance service."}))}import{existsSync as Sd,mkdirSync as kp,readFileSync as Ap,writeFileSync as Rp}from"node:fs";import{join as Cd,resolve as Ip}from"node:path";var tc=(R)=>{r(R instanceof Error?R.message:String(R)),process.exitCode=1};async function Pp(){try{return await De()}catch{return}}function xp(R){if(R===void 0)return;let t=Number(R);if(!Number.isInteger(t)||t<1||t>65535)throw Error(`--port must be a port number, not '${R}'.`);return t}function $d(R,t,m){let k=R?.ssh?.hosts?.find((I)=>I.host===t);return new Pr({hosts:t?[k??{host:t}]:R?.ssh?.hosts,user:m.user,port:xp(m.port),privateKeyPath:m.key,hostKey:R?.ssh?.hostKey,sudo:R?.ssh?.sudo,profile:m.profile??R?.ssh?.profile,publicIp:R?.ssh?.publicIp,lan:R?.ssh?.lan})}var kd=1073741824;function nc(R){R.command("ssh:preflight [host]","Check a bring-your-own Linux host before adopting it").option("--user <user>","SSH user (default: ssh.hosts[].user, then root)").option("--port <port>","SSH port (default: ssh.hosts[].port, then 22)").option("--key <path>","SSH private key (default: ssh.hosts[].privateKeyPath, then ~/.ssh/id_ed25519)").option("--profile <profile>","raspberry-pi or generic (default: ssh.profile, then generic)").option("--json","Print the facts and findings as JSON").action(async(t,m)=>{try{let k=await Pp(),I=$d(k,t,m),L=t??I.targetHost(),z=await I.ensureHostKey(L),{facts:Y,findings:Z}=await I.preflight(L);if(m.json)console.log(JSON.stringify({schemaVersion:1,host:L,hostKeyFingerprint:z.fingerprint,facts:Y,findings:Z},null,2));else{if(i(`Preflight ${L}`),z.pinnedNow)e(`Pinned host key ${z.fingerprint}`);if(e(`${Y.os} on ${Y.arch}, ${Y.cpuCores} cores, ${(Y.memoryBytes/kd).toFixed(1)} GiB memory, ${(Y.diskFreeBytes/kd).toFixed(1)} GiB free`),Y.piModel)e(Y.piModel);if(Y.lanIp)e(`LAN address ${Y.lanIp}`);if(console.log(mn(Z)),Ir(Z))r("The host is not ready; fix the errors above and run the preflight again.");else n("The host is ready to adopt.")}if(Ir(Z))process.exitCode=1}catch(k){tc(k)}}),R.command("ssh:bootstrap","Adopt the configured host: pin its key, run the preflight, then bootstrap it").option("--env <environment>","Deployment environment",{default:"production"}).option("--dry-run","Print the bootstrap script instead of running it").action(async(t)=>{try{let m=await De(),k=t.env??"production";if(t.dryRun){let z=Rr(m),[Y]=z.hosts;console.log(Ar({config:m,environment:k,profile:z.profile,sudoUser:Y.user!=="root"?Y.user:void 0,lan:z.lan}));return}let I=$d(m,void 0,{});i(`Adopt ${I.targetHost()}`);let L=await I.provisionComputeInfrastructure({config:m,environment:k});n(`${L.appPublicIp} is bootstrapped; deploy with: cloud deploy --env ${k}`)}catch(m){tc(m)}}),R.command("ssh:first-boot","Write cloud-init first-boot files for a freshly flashed Raspberry Pi OS or Ubuntu image").option("--os <os>","raspberry-pi-os or ubuntu",{default:"raspberry-pi-os"}).option("--out <dir>","Directory to write user-data, network-config and meta-data into (never a mounted card; copy them yourself)").option("--hostname <name>","Hostname of the new host").option("--user <user>","Deploy user created on first boot (default: ssh.hosts[].user, then pi)").option("--key <path>","Public key authorized for the user",{default:"~/.ssh/id_ed25519.pub"}).option("--wifi-ssid <ssid>","Join this Wi-Fi network on first boot").option("--wifi-passphrase-env <name>","Environment variable holding the Wi-Fi passphrase",{default:"WIFI_PASSWORD"}).option("--wifi-country <cc>","Wi-Fi regulatory domain, e.g. DE").option("--timezone <tz>","IANA timezone, e.g. Europe/Berlin").option("--locale <locale>","System locale, e.g. en_US.UTF-8").option("--env <environment>","Deployment environment the embedded bootstrap is built for",{default:"production"}).option("--force","Overwrite files already in --out").action(async(t)=>{try{if(!t.out)throw Error("--out <dir> is required.");if(!t.hostname)throw Error("--hostname <name> is required.");let m=t.os??"raspberry-pi-os";if(!(m in wo))throw Error(`--os must be raspberry-pi-os or ubuntu, not '${m}'.`);let k=await De(),I=t.env??"production",L=Rr(k,{hosts:k.ssh?.hosts?.length?void 0:[{host:t.hostname}],profile:m==="raspberry-pi-os"?"raspberry-pi":void 0}),z=t.user??(k.ssh?.hosts?.[0]?.user??"pi"),Y=dn(t.key??"~/.ssh/id_ed25519.pub");if(!Sd(Y))throw Error(`Public key not found at ${Y}; pass --key <path to a .pub file>.`);let Z=Ap(Y,"utf8").trim(),X;if(t.wifiSsid){let ke=t.wifiPassphraseEnv??"WIFI_PASSWORD",ce=process.env[ke];if(!ce)throw Error(`--wifi-ssid needs the passphrase in $${ke} (set it in the environment, not on the command line).`);if(!t.wifiCountry)throw Error("--wifi-country <cc> is required with --wifi-ssid.");X={ssid:t.wifiSsid,passphrase:ce,country:t.wifiCountry}}let ee=Ar({config:k,environment:I,profile:L.profile,sudoUser:z!=="root"?z:void 0,lan:L.lan}),oe=Ao({hostname:t.hostname,user:z,publicKey:Z,timezone:t.timezone,locale:t.locale,wifi:X},ee,{os:m}),se=Ip(t.out);kp(se,{recursive:!0});let ue=Object.keys(oe.files).filter((ke)=>Sd(Cd(se,ke)));if(ue.length>0&&!t.force)throw Error(`${ue.join(", ")} already exist in ${se}; pass --force to overwrite.`);for(let[ke,ce]of Object.entries(oe.files))Rp(Cd(se,ke),ce,{mode:384});i(`First boot for ${t.hostname}`),n(`Wrote ${Object.keys(oe.files).join(", ")} to ${se}`),console.log(oe.instructions)}catch(m){tc(m)}})}async function Dp(){let R=await De(),t=y(process.cwd(),R),m=new Vn(t.store),k=new zn(m,new _e(t.store));return{controlPlane:t,store:m,service:k}}async function ns(R){let t=await Dp();try{await R(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var _s=(R)=>Object.fromEntries(String(R??"").split(",").map((t)=>t.split("=")).filter((t)=>t[0]&&t[1])),Ad=(R)=>Object.fromEntries(Object.entries(_s(R)).map(([t,m])=>[t,Number(m)]));function rc(R){R.command("pool:list","List capacity pools and reservations").option("--json","Print structured JSON").action(async(t)=>ns((m)=>{let k=m.store.listPools(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(k,null,2));else c(["Name","Purpose","Backend","Region / arch","Status","Capacity","Concurrency"],k.map((I)=>[I.name,I.purpose,I.backend,`${I.region??"any"} / ${I.architecture??"any"}`,I.status,JSON.stringify(I.capacity),String(I.concurrency)]))})),R.command("pool:create <name>","Create a capacity pool").option("--purpose <purpose>","application, build, worker, monitoring, or backup",{default:"application"}).option("--backend <backend>","server, ecs, or asg",{default:"server"}).option("--capacity <values>","cpu=4,memoryBytes=8589934592,diskBytes=...").option("--region <region>","Required region").option("--arch <architecture>","Required architecture").option("--labels <labels>","Pool key=value labels").option("--selector <labels>","Required server labels").option("--max <count>","Maximum workloads",{default:"10"}).option("--concurrency <count>","Build concurrency",{default:"1"}).action(async(t,m)=>ns((k)=>{let{purpose:I,backend:L}=m;if(!["application","build","worker","monitoring","backup"].includes(I)||!["server","ecs","asg"].includes(L))throw Error("Unsupported pool purpose or backend.");let z=k.store.createPool({organizationId:k.controlPlane.organization.id,projectId:k.controlPlane.project.id,name:t,purpose:I,backend:L,region:m.region,architecture:m.arch,labels:_s(m.labels),requiredServerLabels:_s(m.selector),toleratedTaints:[],capacity:{cpu:0,memoryBytes:0,diskBytes:0,gpu:0,...Ad(m.capacity)},maxWorkloads:Number(m.max),costWeight:1,concurrency:Number(m.concurrency),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"});n(`Created ${z.name} (${z.id}).`)})),R.command("pool:add-server <pool> <server>","Attach an enrolled server to a pool").action(async(t,m)=>ns((k)=>{let I=k.store.listPools(k.controlPlane.project.id).find((z)=>z.id===t||z.name===t),L=new _e(k.controlPlane.store).list(k.controlPlane.project.id).find((z)=>z.id===m||z.name===m);if(!I||!L)throw Error("Pool or server was not found.");k.store.addMember(I.id,L.id),n(`Attached ${L.name} to ${I.name}.`)})),R.command("placement:explain","Explain eligible and rejected placement targets").option("--purpose <purpose>","Workload purpose",{default:"application"}).option("--resources <values>","Requested resources").option("--region <region>","Required region").option("--arch <architecture>","Required architecture").option("--labels <labels>","Required pool labels").option("--json","Print structured JSON").action(async(t)=>ns((m)=>{let k=m.service.explain(m.controlPlane.project.id,{purpose:t.purpose,resources:Ad(t.resources),region:t.region,architecture:t.arch,labels:_s(t.labels)});if(t.json)console.log(JSON.stringify(k,null,2));else c(["Pool","Server","Eligible","Available","Fit / spread / cost","Reasons"],k.map((I)=>[I.poolName,I.serverId??"provider-managed",I.eligible?"yes":"no",JSON.stringify(I.available),`${I.score.fit.toFixed(2)} / ${I.score.spread} / ${I.score.cost}`,I.reasons.join("; ")||"eligible"]))})),R.command("pool:drain <pool>","Move stateless placements and block stateful placements").action(async(t)=>ns((m)=>{let k=m.store.listPools(m.controlPlane.project.id).find((L)=>L.id===t||L.name===t);if(!k)throw Error("Pool was not found.");let I=m.service.drainPool(k.id);n(`Draining ${k.name}: moved ${I.moved.length}, blocked ${I.blocked.length} stateful placement(s).`)}))}async function Ep(){let R=await De(),t=y(process.cwd(),R),m=new Hn(t.store),k=new Gn(m);return{controlPlane:t,store:m,service:k}}async function Qi(R){let t=await Ep();try{await R(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var ss=(R,t)=>{let m=R.store.list(R.controlPlane.project.id).find((k)=>k.id===t||k.name===t);if(!m)throw Error("Regional topology was not found.");return m},Tp=(R)=>R.split(",").map((t,m)=>{let[k,I="aws"]=t.split(":");return{region:String(k),provider:I,role:m===0?"primary":"secondary"}}),Np=(R)=>{let t=new Set(["s3","dynamodb","secrets"]),m=R.split(",").map((I)=>I.trim()),k=m.find((I)=>!t.has(I));if(k)throw Error(`Unsupported replication kind: ${k}`);return m};function ic(R){R.command("region:list","List regional topology, traffic, and replication health").option("--json","Print structured JSON").action(async(t)=>Qi((m)=>{let k=m.store.list(m.controlPlane.project.id).map((I)=>({topology:I,targets:m.store.targets(I.id),channels:m.store.channels(I.id),route:m.store.route(I.id),executions:m.store.executions(I.id)}));if(t.json)console.log(JSON.stringify(k,null,2));else c(["Name","Hostname","Active","Status","Revision","Replication"],k.map((I)=>[I.topology.name,I.topology.hostname,I.topology.activeRegion,I.topology.status,I.topology.revision??"—",`${I.channels.filter((L)=>L.status==="in_sync").length}/${I.channels.length} in sync`]))})),R.command("region:create <name>","Create a persistent multi-region topology").option("--hostname <hostname>","Traffic hostname").option("--regions <regions>","Comma-separated region[:provider], primary first").option("--replicate <kinds>","s3,dynamodb,secrets",{default:"s3,dynamodb,secrets"}).option("--max-lag <seconds>","Maximum failover lag",{default:"30"}).option("--cdn","Enable CloudFront edge state").option("--waf","Enable WAF edge state").action(async(t,m)=>Qi((k)=>{if(!m.hostname||!m.regions)throw Error("--hostname and --regions are required.");let I=k.service.create({organizationId:k.controlPlane.organization.id,projectId:k.controlPlane.project.id,name:t,hostname:m.hostname,regions:Tp(m.regions),trafficPolicy:"active_passive",dataPolicy:{replicate:Np(String(m.replicate)),maxLagSeconds:Number(m.maxLag),retainOnDestroy:!0},dnsProvider:"route53",cdnEnabled:!!m.cdn,wafEnabled:!!m.waf});n(`Created ${I.name} (${I.id}); run region:rollout with an immutable manifest.`)})),R.command("region:plan <name> <operation>","Preview exact regional execution steps").option("--target <region>","Failover or failback region").action(async(t,m,k)=>Qi((I)=>c(["Step"],I.service.plan(ss(I,t).id,m,k.target).map((L)=>[L])))),R.command("region:rollout <name> <revision>","Queue secondary-first regional stack rollout").option("--manifest <file>","Regional stack manifest JSON").action(async(t,m,k)=>Qi(async(I)=>{let L=k.manifest?await Bun.file(k.manifest).json():{},z=I.service.enqueue({topologyId:ss(I,t).id,kind:"rollout",revision:m,manifest:L});n(`Regional rollout queued: ${z.operation.id}`)})),R.command("region:failover <name> <region>","Queue health and RPO-gated failover").action(async(t,m)=>Qi((k)=>{let I=k.service.enqueue({topologyId:ss(k,t).id,kind:"failover",targetRegion:m});n(`Failover queued: ${I.operation.id}`)})),R.command("region:failback <name> <region>","Queue health and RPO-gated failback").action(async(t,m)=>Qi((k)=>{let I=k.service.enqueue({topologyId:ss(k,t).id,kind:"failback",targetRegion:m});n(`Failback queued: ${I.operation.id}`)})),R.command("region:destroy <name>","Drain traffic and delete regional stacks while retaining data").option("--confirm <name>","Exact topology name").action(async(t,m)=>Qi((k)=>{let I=k.service.enqueue({topologyId:ss(k,t).id,kind:"destroy",confirmation:m.confirm});n(`Regional teardown queued: ${I.operation.id}; replicated data remains retained.`)}))}var ls="0.16.91";async function Lp(){let R=await De(),t=y(process.cwd(),R),m=new qn(t.store),k=new Wn(m),I=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((L)=>new Kn(L,t.store,t.project.id,t.organization.id));return{controlPlane:t,store:m,service:k,cleanup:I}}async function Ci(R){let t=await Lp();try{await R(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}function oc(R){R.command("maintenance:list","List updates, campaigns, cleanup plans, and DR drills").option("--json","Print structured JSON").action(async(t)=>Ci((m)=>{let k={manifests:m.store.manifests(m.controlPlane.organization.id),windows:m.store.windows(m.controlPlane.project.id),campaigns:m.store.campaigns(m.controlPlane.project.id),cleanups:m.store.cleanups(m.controlPlane.project.id),drills:m.store.drills(m.controlPlane.project.id)},I=[...k.manifests.map((L)=>["update",L.version,L.compatibility.compatible?"compatible":"blocked",L.compatibility.reasons.join("; ")||L.channel]),...k.campaigns.map((L)=>["upgrade",L.id,L.status,L.currentStage??L.fromVersion]),...k.cleanups.map((L)=>["cleanup",L.kind,L.status,`${L.candidates.length} items / ${L.estimatedBytes} bytes`]),...k.drills.map((L)=>["DR drill",L.scenario,L.status,L.isolatedTarget])];if(t.json)console.log(JSON.stringify(k,null,2));else c(["Area","Name / version","Status","Detail"],I)})),R.command("maintenance:key:add <name> <pem>","Trust an Ed25519 update signing key").action(async(t,m)=>Ci(async(k)=>{let I=k.store.addTrustedKey({organizationId:k.controlPlane.organization.id,name:t,publicKeyPem:await Bun.file(m).text()});n(`Trusted ${I.name}: ${I.fingerprint}`)})),R.command("maintenance:manifest <document> <signature> <key>","Verify and import a signed update manifest").action(async(t,m,k)=>Ci(async(I)=>{let L=await Bun.file(t).json(),z=(await Bun.file(m).text()).trim(),Y=I.store.importManifest({organizationId:I.controlPlane.organization.id,keyId:k,document:L,signature:z,current:{schemaVersion:I.controlPlane.store.health().schemaVersion,currentVersion:ls,platform:process.platform,architecture:process.arch}});n(`Verified ${Y.version}; ${Y.compatibility.compatible?"compatible":"blocked: "+Y.compatibility.reasons.join("; ")}`)})),R.command("maintenance:window <name> <schedule>","Create an approved maintenance window").option("--timezone <timezone>","IANA timezone",{default:"UTC"}).option("--minutes <minutes>","Duration",{default:"60"}).action(async(t,m,k)=>Ci((I)=>{let L=I.store.createWindow({projectId:I.controlPlane.project.id,name:t,schedule:m,timezone:k.timezone,durationMinutes:Number(k.minutes),allowedOperations:["platform.upgrade"],requireApproval:!0});n(`Created ${L.name} (${L.id}).`)})),R.command("platform:upgrade <manifest> <backup>","Plan and queue a signed staged platform update").option("--strategy <strategy>","canary or rolling",{default:"canary"}).option("--batch <count>","Rolling batch size",{default:"1"}).action(async(t,m,k)=>Ci((I)=>{let L=new _e(I.controlPlane.store).list(I.controlPlane.project.id).filter((Z)=>Z.status==="ready").map((Z)=>({serverId:Z.id,target:Z.name,previousVersion:Z.bootstrapVersion??ls}));if(!L.length)L.push({target:"control-plane",previousVersion:ls});let z=I.store.createCampaign({projectId:I.controlPlane.project.id,manifestId:t,fromVersion:ls,strategy:k.strategy==="rolling"?"rolling":"canary",batchSize:Number(k.batch),healthGate:{kind:"platform"},backupId:m,targets:L}),Y=I.service.enqueueCampaign(z.id);n(`Staged upgrade queued: ${Y.operation.id}`)})),R.command("cleanup:preview <kind>","Discover a bounded cleanup candidate set without deleting").option("--older-than <days>","Minimum age",{default:"30"}).action(async(t,m)=>Ci(async(k)=>{let I=await k.service.previewCleanup({projectId:k.controlPlane.project.id,kind:t,criteria:{olderThanDays:Number(m.olderThan)}},k.cleanup);c(["ID","Candidate","Bytes"],I.candidates.map((L)=>[L.id,L.label,String(L.bytes)])),e(`Apply with: cloud cleanup:apply ${I.id} --confirm "DELETE ${I.candidates.length} ${I.kind}"`)})),R.command("cleanup:apply <plan>","Apply an unchanged cleanup preview").option("--confirm <text>","Exact preview confirmation").action(async(t,m)=>Ci((k)=>{let I=k.service.enqueueCleanup(t,String(m.confirm??""));n(`Cleanup queued: ${I.operation.id}`)})),R.command("dr:plan <scenario> <target>","Plan an isolated disaster-recovery drill").option("--rpo <minutes>","RPO objective",{default:"60"}).option("--rto <minutes>","RTO objective",{default:"30"}).option("--recovery-point <id>","Recovery point").option("--topology <id>","Regional topology").action(async(t,m,k)=>Ci((I)=>{let L=I.store.createDrill({projectId:I.controlPlane.project.id,scenario:t,isolatedTarget:m,expectedRpoMinutes:Number(k.rpo),expectedRtoMinutes:Number(k.rto),recoveryPointId:k.recoveryPoint,topologyId:k.topology});n(`Planned isolated drill ${L.id}.`)})),R.command("dr:run <drill>","Queue an isolated disaster-recovery drill").action(async(t)=>Ci((m)=>{let k=m.service.enqueueDrill(t);n(`DR drill queued: ${k.operation.id}`)}))}async function sc(){try{return(await De()).project.region||process.env.AWS_REGION||"us-east-1"}catch{return process.env.AWS_REGION||"us-east-1"}}function ac(R){R.command("function:list","List all Lambda functions").option("--region <region>","AWS region").action(async(t)=>{i("Lambda Functions");let m=t?.region||await sc(),k=new D(m);try{let{Functions:I=[]}=await k.listFunctions({MaxItems:50});if(!I.length){e("No functions found");return}c(["Name","Runtime","Memory","Timeout","Last Modified"],I.map((L)=>[L.FunctionName??"-",L.Runtime??"-",L.MemorySize?`${L.MemorySize} MB`:"-",L.Timeout?`${L.Timeout}s`:"-",L.LastModified??"-"]))}catch(I){r(`Failed to list functions: ${I.message}`),process.exitCode=1}}),R.command("function:invoke <name>","Invoke a Lambda function").option("--payload <json>","Event payload as JSON",{default:"{}"}).option("--async","Fire-and-forget (Event invocation)").option("--region <region>","AWS region").action(async(t,m)=>{i(`Invoking ${t}`);let k=m?.region||await sc(),I=new D(k),L=new s("Invoking function...");L.start();try{let z=await I.invoke({FunctionName:t,InvocationType:m?.async?"Event":"RequestResponse",Payload:m?.payload||"{}",LogType:m?.async?"None":"Tail"});if(z.FunctionError){if(L.fail(`Function returned an error (${z.FunctionError})`),z.Payload)e(z.Payload);process.exitCode=1;return}if(L.succeed(`Invoked (status ${z.StatusCode})`),z.Payload)e(`
|
|
318
|
+
`)}async function yp(){let R=await De(),t=y(process.cwd(),R),m=new _e(t.store),k=new jn(m,[new ut("aws"),new ut("hetzner"),new ut("ssh")]);return{controlPlane:t,store:m,service:k}}async function Hr(R){let t=await yp();try{return await R(t)}finally{t.controlPlane.store.close()}}var Ui=(R,t)=>{let m=R.store.list(R.controlPlane.project.id).find((k)=>k.id===t||k.name===t);if(!m)throw Error(`Server ${t} was not found.`);return m},wn=(R)=>{r(R instanceof Error?R.message:String(R)),process.exitCode=1};function Xa(R,t){let m=Number.parseInt(R??"",10);return Number.isFinite(m)&&m>=0?m:t}function vp(R="3h"){let t=R.match(/^(\d+)(m|h)$/);if(!t)throw Error("--range must use minutes or hours, for example 30m or 3h.");let m=Number(t[1])*(t[2]==="h"?3600000:60000);if(m<300000||m>86400000)throw Error("--range must be between 5 minutes and 24 hours.");return m}function ts(R,t="%"){return R==null?"unavailable":`${R.toFixed(1)}${t}`}async function bp(R,t){let m=await De();if(m.cloud?.provider!=="hetzner")throw Error("server:monitoring currently requires the Hetzner provider.");let k=t.env??process.env.CLOUD_ENV??"production",I=T(m,k),L=await fe(I);if(!L?.serverId)throw Error(`No pinned Hetzner server was found for ${I}.`);if(![L.serverName,String(L.serverId),L.stackName].includes(R))throw Error(`Refusing to read ${R}: project state is pinned to ${L.serverName}.`);let z=Ct(m),Y=new $e({apiToken:Tr(z.apiToken,m)}),Z=await Y.getServer(L.serverId),X=L.publicIp??Z.public_net.ipv4?.ip;if(!X)throw Error(`Server ${Z.name} has no public IPv4 address.`);let ee=new Date,oe=new Date(ee.getTime()-vp(t.range)),se=Math.min(3600,Math.max(60,Xa(t.step,60))),ue=await yd({client:Y,serverId:Z.id,cores:Math.max(1,Number(Z.server_type.cores)||1),from:oe,to:ee,step:se,remote:{host:X,user:L.sshUser??z.sshUser,identityFile:z.sshPrivateKeyPath,connectTimeoutSec:15}});if(t.json){console.log(JSON.stringify({schemaVersion:1,server:Z.name,result:ue},null,2));return}c(["Server","Window","CPU average / peak","RAM average / peak","Minimum available","Swap peak"],[[Z.name,`${ue.from} to ${ue.to}`,`${ts(ue.summary.cpuAveragePercent)} / ${ts(ue.summary.cpuPeakPercent)}`,`${ts(ue.summary.memoryAveragePercent)} / ${ts(ue.summary.memoryPeakPercent)}`,ue.summary.memoryMinimumAvailableBytes==null?"unavailable":`${(ue.summary.memoryMinimumAvailableBytes/1073741824).toFixed(2)} GB`,ts(ue.summary.swapPeakPercent)]])}function wd(R){let t=R.targetType.prices?.find((m)=>m.location===R.location);return{serverId:R.serverId,serverName:R.serverName,location:R.location,from:R.currentType.name,to:R.targetType.name,capacityAvailable:R.capacityAvailable,alreadyComplete:R.alreadyComplete,upgradeDisk:R.upgradeDisk,target:{cores:R.targetType.cores,memoryGb:R.targetType.memory,diskGb:R.targetType.disk,architecture:R.targetType.architecture,cpuType:R.targetType.cpu_type},price:t?{hourlyNet:t.price_hourly.net,hourlyGross:t.price_hourly.gross,monthlyNet:t.price_monthly.net,monthlyGross:t.price_monthly.gross}:void 0}}function wp(R){let t=wd(R);c(["Server","Location","Resize","Capacity","CPU / RAM / disk","Monthly"],[[`${t.serverName} (${t.serverId})`,t.location,`${t.from} -> ${t.to}`,t.capacityAvailable?"available":"waiting",`${t.target.cores??0} / ${t.target.memoryGb??0} GB / ${t.target.diskGb??0} GB`,t.price?.monthlyGross??t.price?.monthlyNet??"not reported"]])}async function Sp(R,t,m){let k=await De();if(k.cloud?.provider!=="hetzner")throw Error("server:resize currently requires the Hetzner provider.");let I=m.env??process.env.CLOUD_ENV??"production",L=T(k,I),z=await fe(L),Y=Ct(k),Z=new $e({apiToken:Tr(Y.apiToken,k)}),ee=z&&(R===z.serverName||R===String(z.serverId)||R===z.stackName)?await Z.getServer(z.serverId):(await Z.listServers()).find((Ne)=>Ne.name===R||String(Ne.id)===R);if(!ee)throw Error(`Hetzner server ${R} was not found.`);if(z?.serverId&&z.serverId!==ee.id)throw Error(`Refusing to resize ${R}: project state is pinned to server ${z.serverId}.`);let oe=nt(t),se=m.upgradeDisk!==!1,ue=await it(Z,ee.id,oe,se);if(m.json)console.log(JSON.stringify({schemaVersion:1,plan:wd(ue)},null,2));else wp(ue);if(!m.apply){if(!m.json)e(`Preview only. Re-run with --apply --confirm ${ee.name} to execute.`);return}if(m.confirm!==ee.name)throw Error(`Resize requires --confirm ${ee.name}.`);let ke=z?.publicIp??ee.public_net.ipv4?.ip;if(!ke)throw Error(`Server ${ee.name} has no public IPv4 address for verification.`);let ce={host:ke,user:z?.sshUser??Y.sshUser,identityFile:Y.sshPrivateKeyPath,connectTimeoutSec:15,sshTimeoutMs:600000,routeTimeoutMs:20000},Se=await zs(L),xe=new Date().toISOString(),ve={schemaVersion:1,operationId:Se?.targetType===oe&&Se.serverId===ee.id?Se.operationId:crypto.randomUUID(),stackName:L,serverId:ee.id,serverName:ee.name,sourceType:ue.currentType.name,targetType:oe,upgradeDisk:se,phase:"planning",status:"running",attempts:Se?.targetType===oe?Se.attempts:0,startedAt:Se?.targetType===oe?Se.startedAt:xe,updatedAt:xe,manifest:Se?.targetType===oe?Se.manifest:void 0};await Et(ve);let Re=Xa(m.pollSeconds,900)*1000,Ie=Xa(m.maxWaitMinutes,0)*60000,Me=Date.now();for(;;){let Ne=await it(Z,ee.id,oe,se);if(!Ne.capacityAvailable&&!Ne.alreadyComplete){if(ve={...ve,phase:"waiting-capacity",status:"waiting-capacity",updatedAt:new Date().toISOString()},await Et(ve),!m.wait){if(!m.json)e(`${oe} has no capacity in ${Ne.location}. The server remains running and unchanged. Use --wait to poll safely.`);return}if(Ie>0&&Date.now()-Me>=Ie)throw Error(`Timed out waiting for ${oe} capacity in ${Ne.location}.`);if(!m.json)e(`Waiting ${Math.round(Re/1000)} seconds for ${oe} capacity...`);await Bun.sleep(Re);continue}let Fe=await Hs(L);try{let ze=await(async()=>{try{return ve={...ve,status:"running",attempts:ve.attempts+1,updatedAt:new Date().toISOString()},await Et(ve),await Er({client:Z,serverId:ee.id,targetType:oe,upgradeDisk:se,resumeFromOff:ve.phase==="shutting-down"||ve.phase==="resizing"||ve.phase==="powering-on"||ve.phase==="verifying",manifest:ve.manifest,hooks:{preflight:async()=>{let ot=await Ri(ce);return ve={...ve,manifest:ot,updatedAt:new Date().toISOString()},await Et(ve),ot},afterBoot:async(ot,wt,He,dt)=>Ii(ce,wt,He,dt),onPhase:async(ot,wt)=>{if(ve={...ve,phase:ot,status:ot==="waiting-capacity"?"waiting-capacity":ot==="complete"?"completed":"running",updatedAt:new Date().toISOString()},await Et(ve),!m.json)e(`${ot}${wt?` ${JSON.stringify(wt)}`:""}`)}}})}finally{await Fe()}})();if(ve={...ve,status:ze.status==="completed"||ze.status==="already-complete"?"completed":ze.status==="recovered"?"recovered":"waiting-capacity",lastError:ze.status==="recovered"?ze.error:void 0,updatedAt:new Date().toISOString()},await Et(ve),m.json)console.log(JSON.stringify({schemaVersion:1,result:ze},null,2));else if(ze.status==="completed"||ze.status==="already-complete")n(`${ee.name} is on ${oe} and passed full post-boot verification.`);else if(ze.status==="recovered"&&ze.retryable&&m.wait){e(`Capacity race recovered safely. Waiting ${Math.round(Re/1000)} seconds before retry.`),await Bun.sleep(Re);continue}else if(ze.status==="recovered")throw Error(`Resize did not complete and the original server was recovered: ${ze.error}`);return}catch(ze){throw ve={...ve,status:"failed",lastError:ze instanceof Error?ze.message:String(ze),updatedAt:new Date().toISOString()},await Et(ve),ze}}}async function Cp(R,t){let m=await De();if(m.cloud?.provider!=="hetzner")throw Error("server:optimize currently requires the Hetzner provider.");let k=t.env??process.env.CLOUD_ENV??"production",I=T(m,k),L=await fe(I);if(!L?.serverId)throw Error(`No pinned Hetzner server was found for ${I}.`);if(![L.serverName,String(L.serverId),L.stackName].includes(R))throw Error(`Refusing to optimize ${R}: project state is pinned to ${L.serverName}.`);let z=Ct(m),Y=new $e({apiToken:Tr(z.apiToken,m)}),Z=await Y.getServer(L.serverId),X=L.publicIp??Z.public_net.ipv4?.ip;if(!X)throw Error(`Server ${Z.name} has no public IPv4 address.`);let ee=Ro(m);if(t.json)console.log(JSON.stringify({schemaVersion:1,server:Z.name,plan:ee},null,2));else c(["Server","Firewall ports","Monitoring","Auto updates","Swap","SSH passwords"],[[Z.name,ee.firewallPorts.join(","),ee.monitoring?"on":"off",ee.autoUpdates?"on":"off",`${ee.swapGb} GB`,"disabled"]]);if(!t.apply){if(!t.json)e(`Preview only. Re-run with --apply --confirm ${Z.name} to execute.`);return}if(t.confirm!==Z.name)throw Error(`Optimization requires --confirm ${Z.name}.`);let oe={host:X,user:L.sshUser??z.sshUser,identityFile:z.sshPrivateKeyPath,connectTimeoutSec:15},se=await pn(oe),ue=se.routeProbes.filter((He)=>!He.ok),ke=m.infrastructure?.compute,ce=ne(ke)?new Set(["nginx.service","bun-gateway.service","ts-cloud-nginx.service"]):new Set,Se=se.failedUnits.filter((He)=>!ce.has(He));if(Se.length>0)throw Error(`Preflight found failed services: ${Se.join(", ")}`);if(ue.length>0)throw Error(`Preflight found unhealthy routes: ${ue.map((He)=>He.domain).join(", ")}`);let xe=ne(ke)?[]:Object.values(m.sites??{}).flatMap((He)=>typeof He?.port==="number"&&![80,443].includes(He.port)?[He.port]:[]),ve=un({allowSsh:ke?.allowSsh!==!1,sitePorts:xe,allowedPorts:ke?.firewall?.allowedPorts}),Re=(L.firewallId?(await Y.listFirewalls()).find((He)=>He.id===L.firewallId):void 0)??(await Y.listFirewalls()).find((He)=>He.name===`${m.project.slug}-${k}-app-fw`);if(!Re)throw Error(`Managed firewall for ${Z.name} was not found.`);let Ie=await Y.setFirewallRules(Re.id,ve);await Promise.all(Ie.map((He)=>Y.waitForAction(He.id))),await Fs(m,oe);let[Me,Ne]=await Promise.all([pn(oe),js(oe)]),Fe=Vs(ee,Ne),ze=Qc(se,Me),ot=Me.routeProbes.filter((He)=>!He.ok);if(ze.stoppedServices.length>0)Fe.push(`services stopped: ${ze.stoppedServices.join(", ")}`);if(ze.changedRouteFragments.length>0)Fe.push(`route fragments changed: ${ze.changedRouteFragments.join(", ")}`);if(ze.missingRouteIds.length>0)Fe.push(`routes disappeared: ${ze.missingRouteIds.join(", ")}`);if(ze.changedReleaseLinks.length>0)Fe.push(`release links changed: ${ze.changedReleaseLinks.join(", ")}`);if(ze.missingData.length>0)Fe.push(`databases or volumes disappeared: ${ze.missingData.join(", ")}`);if(ot.length>0)Fe.push(`unhealthy routes: ${ot.map((He)=>He.domain).join(", ")}`);if(Fe.length>0)throw Error(`Host optimization verification failed: ${Fe.join("; ")}`);let wt={serverId:Z.id,serverName:Z.name,services:Me.runningServices.length,routes:Me.routeIds.length,healthyDomains:Me.routeProbes.length,releaseLinks:Me.releaseLinks.length,databasesAndVolumes:Me.dataCatalog.length,report:Ne};if(t.json)console.log(JSON.stringify({schemaVersion:1,result:wt},null,2));else n(`${Z.name} passed full host, rpx route, service, release, and data verification.`)}async function $p(R,t,m){let k=await De(),I=m.env??"production",L=T(k,I);await Hr(async(z)=>{let Y=Ui(z,R),Z=z.store.list(z.controlPlane.project.id,!0),X=Y.provider==="hetzner"&&Y.providerId?(()=>{try{let Re=Ct(k);return new $e({apiToken:Tr(Re.apiToken,k)})}catch{return null}})():null,ee=Y.providerId?Number(Y.providerId):Number.NaN,oe=await fe(L),se=oe!=null&&oe.serverId===ee,ue=new Wr,ke=Y.trustState==="pinned",ce={takenNames:async()=>{let Re=Z.map((Ie)=>Ie.name);if(X)Re.push(...(await X.listServers()).map((Ie)=>Ie.name));return Re},inventoryName:()=>z.store.get(Y.id)?.name??Y.name,renameInventory:(Re)=>{z.store.update(Y.id,{name:Re})},...X&&Number.isFinite(ee)?{providerName:async()=>(await X.getServer(ee)).name,renameProvider:async(Re)=>{await X.renameServer(ee,Re)}}:{},...se?{stateName:async()=>(await fe(L))?.serverName,writeStateName:async(Re)=>{let Ie=await fe(L);if(Ie)await Tt(L,{...Ie,serverName:Re})}}:{},...ke?{remoteHostname:async()=>{let Re=await ue.exec(Y,"hostname");return Re.code===0?Re.stdout.trim():void 0},setRemoteHostname:async(Re)=>{let Ie=await ue.exec(Y,bd(Re));if(Ie.code!==0)throw Error(Ie.stderr.trim()||`hostname exited ${Ie.code}`)}}:{}},Se=await vd(Y.name,t,ce),xe=await Es(Se);if(!m.apply){let Re=[X?"":"provider record (no provider id or no API token)",se?"":"local state pin (none points at this server)",ke?"":"box hostname (host key is not pinned — run server:validate first)"].filter(Boolean);if(m.json){console.log(JSON.stringify({schemaVersion:1,operation:Se.operation,target:Se.target,rename:{from:Y.name,to:t},notCovered:Re,steps:xe.map((Ie)=>({id:Ie.step.id,title:Ie.step.title,state:Ie.state,change:Ie.step.change,reason:Ie.reason}))},null,2));return}for(let Ie of Ns(Se,xe))console.log(Ie);for(let Ie of Re)console.log(` not covered: ${Ie}`);console.log(" Re-run with --apply to perform it.");return}let ve=await Ls(Se,xe,{log:(Re)=>e(Re),audit:(Re)=>z.controlPlane.store.appendEvent({projectId:z.controlPlane.project.id,resourceId:Y.resourceId,type:`${Re.operation}.${Re.step}.${Re.state}`,level:Re.state==="failed"?"error":"info",payload:{target:Re.target,renameTo:t,...Re.error?{error:Re.error}:{}}})});if(m.json)console.log(JSON.stringify({schemaVersion:1,outcome:ve},null,2));if(!ve.success){let Re=ve.steps.find((Ie)=>Ie.state==="failed");throw Error(`${Se.operation} stopped at '${Re?.title}': ${Re?.error}. Earlier steps stayed applied; re-run the same command to continue from here.`)}if(!m.json)n(`Renamed ${Y.name} to ${t}.`)})}function ec(R){R.command("capabilities [server]","Show provider and target operation support").option("--json","Print structured JSON").action(async(t,m)=>{try{await Hr(async(k)=>{let I=t?[Ui(k,t)]:k.store.list(k.controlPlane.project.id),L=I.flatMap((z)=>Object.entries(z.capabilities).map(([Y,Z])=>({server:z.name,provider:z.provider,action:Y,...Z})));if(m.json)console.log(JSON.stringify({schemaVersion:1,targets:L},null,2));else c(["Server","Provider","Action","Support","Explanation"],L.map((z)=>[z.server,z.provider,z.action,z.supported?"supported":"unsupported",z.reason??"—"]))})}catch(k){wn(k)}}),R.command("server:resize <name> <type>","Safely resize Hetzner compute with full host verification").option("--env <environment>","Deployment environment",{default:"production"}).option("--apply","Execute the reviewed resize plan").option("--confirm <name>","Exact server name required for mutation").option("--upgrade-disk","Permanently expand the root disk to the target size",{default:!0}).option("--wait","Poll capacity without taking the server offline until placement is available").option("--poll-seconds <seconds>","Capacity retry interval",{default:"900"}).option("--max-wait-minutes <minutes>","Stop waiting after this many minutes; 0 waits indefinitely",{default:"0"}).option("--json","Print structured JSON").action(async(t,m,k)=>{try{await Sp(t,m,k)}catch(I){wn(I)}}),R.command("server:optimize <name>","Reconcile and verify a production Hetzner host").option("--env <environment>","Deployment environment",{default:"production"}).option("--apply","Apply the reviewed host optimization plan").option("--confirm <name>","Exact server name required for mutation").option("--json","Print structured JSON").action(async(t,m)=>{try{await Cp(t,m)}catch(k){wn(k)}}),R.command("server:monitoring <name>","Read historical Hetzner CPU, RAM, swap, disk, and network metrics").option("--env <environment>","Deployment environment",{default:"production"}).option("--range <duration>","Historical window from 5m to 24h",{default:"3h"}).option("--step <seconds>","Hetzner provider sample interval",{default:"60"}).option("--json","Print structured JSON").action(async(t,m)=>{try{await bp(t,m)}catch(k){wn(k)}}),R.command("server:list","List fleet servers").option("--json","Print structured JSON").action(async(t)=>{try{await Hr(async(m)=>{let k=m.store.list(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(k,null,2));else c(["Name","Provider ID","Provider / region","Status / trust","Roles","CPU / memory","Heartbeat"],k.map((I)=>[I.name,I.providerId??"—",`${I.provider} / ${I.region??"external"}`,`${I.status} / ${I.trustState}`,I.roles.join(","),`${I.capacity.cpu??0} / ${I.capacity.memoryBytes??0}`,I.heartbeatAt??"never"]))})}catch(m){wn(m)}}),R.command("server:create <name>","Enroll a provisioned or existing server").option("--provider <provider>","aws, hetzner, or ssh",{default:"ssh"}).option("--provider-id <id>","Stable provider identity").option("--endpoint <host>","SSH hostname or IP").option("--user <user>","Non-root SSH user",{default:"deploy"}).option("--credential-ref <ref>","Secret reference",{default:"secret://fleet/agent"}).option("--region <region>","Provider region").option("--roles <roles>","Comma-separated roles",{default:"application"}).option("--labels <labels>","Comma-separated key=value labels").action(async(t,m)=>{try{await Hr(async(k)=>{let I=m.provider;if(!["aws","hetzner","ssh"].includes(I)||!m.endpoint)throw Error("A supported --provider and --endpoint are required; provisioning and enrollment are separate operations.");let L=k.service.enroll({organizationId:k.controlPlane.organization.id,projectId:k.controlPlane.project.id,name:t,provider:I,providerId:m.providerId,endpoint:m.endpoint,sshUser:m.user??"deploy",credentialRef:m.credentialRef??"secret://fleet/agent",region:m.region,roles:String(m.roles??"application").split(","),labels:Object.fromEntries(String(m.labels??"").split(",").map((z)=>z.split("=")).filter((z)=>z[0]&&z[1]))});n(`Enrolled ${L.name} as ${L.id}; no remote mutation was performed.`)})}catch(k){wn(k)}}),R.command("server:validate <name>","Pin trust and validate a server").option("--accept-host-key <fingerprint>","Accept reviewed rotation").option("--json","Print JSON").action(async(t,m)=>{try{await Hr(async(k)=>{let I=Ui(k,t);if(I=await k.service.test(I.id),I.trustState==="rotation_pending"){if(!m.acceptHostKey)throw Error(`Host key changed to ${I.pendingHostKey}; review it first.`);I=k.service.reviewHostKey(I.id,m.acceptHostKey)}let L=await k.service.validate(I.id);if(m.json)console.log(JSON.stringify(L.validation,null,2));else c(["Severity","Code","Finding","Remediation"],(L.validation?.findings??[]).map((z)=>[z.severity,z.code,z.message,z.remediation??"—"]));if(!L.validation?.valid)process.exitCode=1})}catch(k){wn(k)}}),R.command("server:bootstrap <name>","Preview or queue bootstrap").option("--apply","Apply reviewed plan").action(async(t,m)=>{try{await Hr(async(k)=>{let I=k.service.bootstrap(Ui(k,t).id,!!m.apply);if(I.preview)c(["Step"],I.steps.map((L)=>[L]));else n(`Bootstrap queued: ${I.operation?.id}`)})}catch(k){wn(k)}}),R.command("server:rename <name> <new-name>","Rename a server in place, without recreating it").option("--env <environment>","Deployment environment",{default:"production"}).option("--apply","Perform the reviewed rename plan").option("--json","Print structured JSON").action(async(t,m,k)=>{try{await $p(t,m,k)}catch(I){wn(I)}}),R.command("server:drain <name>","Drain without terminating").option("--complete","Mark movement complete").action(async(t,m)=>{try{await Hr(async(k)=>n(k.service.drain(Ui(k,t).id,!!m.complete).status))}catch(k){wn(k)}}),R.command("server:uncordon <name>","Return a server to scheduling").action(async(t)=>{try{await Hr(async(m)=>{m.service.uncordon(Ui(m,t).id),n(`Uncordoned ${t}.`)})}catch(m){wn(m)}}),R.command("server:archive <name>","Archive inventory without termination").option("--confirm <name>","Exact name").action(async(t,m)=>{try{await Hr(async(k)=>{k.service.archive(Ui(k,t).id,m.confirm??""),n(`Archived ${t}; provider infrastructure was not terminated.`)})}catch(k){wn(k)}}),R.command("server:ssh <name>","Open strict SSH using the enrolled endpoint").action(async(t)=>{try{await Hr(async(m)=>{let k=Ui(m,t);if(k.trustState!=="pinned")throw Error("Validate and pin the server host key first.");let I=Bun.spawn(["ssh","-p",String(k.sshPort),"-o","StrictHostKeyChecking=yes",`${k.sshUser}@${k.endpoint}`],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}),L=await I.exited;if(L)process.exitCode=L})}catch(m){wn(m)}});for(let[t,m]of[["server:logs <name>","Use the runtime log service"],["server:deploy <name>","Use immutable release deployment"],["server:reboot <name>","Reboot provider compute"],["server:destroy <name>","Terminate provider compute"],["server:recipe <name> <recipe>","Apply a server recipe"],["server:firewall:add <name> <rule>","Add firewall rule"],["server:firewall:list <name>","List firewall rules"],["server:firewall:remove <name> <rule>","Remove firewall rule"],["server:ssl:install <domain>","Install TLS"],["server:ssl:renew <domain>","Renew TLS"],["server:snapshot <name>","Create provider snapshot"],["server:snapshot:restore <name> <snapshot-id>","Restore provider snapshot"],["server:update <name>","Update OS packages"],["server:secure <name>","Apply OS hardening"]])R.command(t,m).action(async(...k)=>xn(t.split(" ")[0],{target:String(k[0]??""),nextAction:"Use the dashboard capability view or the corresponding runtime, release, firewall, backup, or maintenance service."}))}import{existsSync as Sd,mkdirSync as kp,readFileSync as Ap,writeFileSync as Rp}from"node:fs";import{join as Cd,resolve as Ip}from"node:path";var tc=(R)=>{r(R instanceof Error?R.message:String(R)),process.exitCode=1};async function Pp(){try{return await De()}catch{return}}function xp(R){if(R===void 0)return;let t=Number(R);if(!Number.isInteger(t)||t<1||t>65535)throw Error(`--port must be a port number, not '${R}'.`);return t}function $d(R,t,m){let k=R?.ssh?.hosts?.find((I)=>I.host===t);return new Pr({hosts:t?[k??{host:t}]:R?.ssh?.hosts,user:m.user,port:xp(m.port),privateKeyPath:m.key,hostKey:R?.ssh?.hostKey,sudo:R?.ssh?.sudo,profile:m.profile??R?.ssh?.profile,publicIp:R?.ssh?.publicIp,lan:R?.ssh?.lan})}var kd=1073741824;function nc(R){R.command("ssh:preflight [host]","Check a bring-your-own Linux host before adopting it").option("--user <user>","SSH user (default: ssh.hosts[].user, then root)").option("--port <port>","SSH port (default: ssh.hosts[].port, then 22)").option("--key <path>","SSH private key (default: ssh.hosts[].privateKeyPath, then ~/.ssh/id_ed25519)").option("--profile <profile>","raspberry-pi or generic (default: ssh.profile, then generic)").option("--json","Print the facts and findings as JSON").action(async(t,m)=>{try{let k=await Pp(),I=$d(k,t,m),L=t??I.targetHost(),z=await I.ensureHostKey(L),{facts:Y,findings:Z}=await I.preflight(L);if(m.json)console.log(JSON.stringify({schemaVersion:1,host:L,hostKeyFingerprint:z.fingerprint,facts:Y,findings:Z},null,2));else{if(i(`Preflight ${L}`),z.pinnedNow)e(`Pinned host key ${z.fingerprint}`);if(e(`${Y.os} on ${Y.arch}, ${Y.cpuCores} cores, ${(Y.memoryBytes/kd).toFixed(1)} GiB memory, ${(Y.diskFreeBytes/kd).toFixed(1)} GiB free`),Y.piModel)e(Y.piModel);if(Y.lanIp)e(`LAN address ${Y.lanIp}`);if(console.log(mn(Z)),Ir(Z))r("The host is not ready; fix the errors above and run the preflight again.");else n("The host is ready to adopt.")}if(Ir(Z))process.exitCode=1}catch(k){tc(k)}}),R.command("ssh:bootstrap","Adopt the configured host: pin its key, run the preflight, then bootstrap it").option("--env <environment>","Deployment environment",{default:"production"}).option("--dry-run","Print the bootstrap script instead of running it").action(async(t)=>{try{let m=await De(),k=t.env??"production";if(t.dryRun){let z=Rr(m),[Y]=z.hosts;console.log(Ar({config:m,environment:k,profile:z.profile,sudoUser:Y.user!=="root"?Y.user:void 0,lan:z.lan}));return}let I=$d(m,void 0,{});i(`Adopt ${I.targetHost()}`);let L=await I.provisionComputeInfrastructure({config:m,environment:k});n(`${L.appPublicIp} is bootstrapped; deploy with: cloud deploy --env ${k}`)}catch(m){tc(m)}}),R.command("ssh:first-boot","Write cloud-init first-boot files for a freshly flashed Raspberry Pi OS or Ubuntu image").option("--os <os>","raspberry-pi-os or ubuntu",{default:"raspberry-pi-os"}).option("--out <dir>","Directory to write user-data, network-config and meta-data into (never a mounted card; copy them yourself)").option("--hostname <name>","Hostname of the new host").option("--user <user>","Deploy user created on first boot (default: ssh.hosts[].user, then pi)").option("--key <path>","Public key authorized for the user",{default:"~/.ssh/id_ed25519.pub"}).option("--wifi-ssid <ssid>","Join this Wi-Fi network on first boot").option("--wifi-passphrase-env <name>","Environment variable holding the Wi-Fi passphrase",{default:"WIFI_PASSWORD"}).option("--wifi-country <cc>","Wi-Fi regulatory domain, e.g. DE").option("--timezone <tz>","IANA timezone, e.g. Europe/Berlin").option("--locale <locale>","System locale, e.g. en_US.UTF-8").option("--env <environment>","Deployment environment the embedded bootstrap is built for",{default:"production"}).option("--force","Overwrite files already in --out").action(async(t)=>{try{if(!t.out)throw Error("--out <dir> is required.");if(!t.hostname)throw Error("--hostname <name> is required.");let m=t.os??"raspberry-pi-os";if(!(m in wo))throw Error(`--os must be raspberry-pi-os or ubuntu, not '${m}'.`);let k=await De(),I=t.env??"production",L=Rr(k,{hosts:k.ssh?.hosts?.length?void 0:[{host:t.hostname}],profile:m==="raspberry-pi-os"?"raspberry-pi":void 0}),z=t.user??(k.ssh?.hosts?.[0]?.user??"pi"),Y=dn(t.key??"~/.ssh/id_ed25519.pub");if(!Sd(Y))throw Error(`Public key not found at ${Y}; pass --key <path to a .pub file>.`);let Z=Ap(Y,"utf8").trim(),X;if(t.wifiSsid){let ke=t.wifiPassphraseEnv??"WIFI_PASSWORD",ce=process.env[ke];if(!ce)throw Error(`--wifi-ssid needs the passphrase in $${ke} (set it in the environment, not on the command line).`);if(!t.wifiCountry)throw Error("--wifi-country <cc> is required with --wifi-ssid.");X={ssid:t.wifiSsid,passphrase:ce,country:t.wifiCountry}}let ee=Ar({config:k,environment:I,profile:L.profile,sudoUser:z!=="root"?z:void 0,lan:L.lan}),oe=Ao({hostname:t.hostname,user:z,publicKey:Z,timezone:t.timezone,locale:t.locale,wifi:X},ee,{os:m}),se=Ip(t.out);kp(se,{recursive:!0});let ue=Object.keys(oe.files).filter((ke)=>Sd(Cd(se,ke)));if(ue.length>0&&!t.force)throw Error(`${ue.join(", ")} already exist in ${se}; pass --force to overwrite.`);for(let[ke,ce]of Object.entries(oe.files))Rp(Cd(se,ke),ce,{mode:384});i(`First boot for ${t.hostname}`),n(`Wrote ${Object.keys(oe.files).join(", ")} to ${se}`),console.log(oe.instructions)}catch(m){tc(m)}})}async function Dp(){let R=await De(),t=y(process.cwd(),R),m=new Vn(t.store),k=new zn(m,new _e(t.store));return{controlPlane:t,store:m,service:k}}async function ns(R){let t=await Dp();try{await R(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var _s=(R)=>Object.fromEntries(String(R??"").split(",").map((t)=>t.split("=")).filter((t)=>t[0]&&t[1])),Ad=(R)=>Object.fromEntries(Object.entries(_s(R)).map(([t,m])=>[t,Number(m)]));function rc(R){R.command("pool:list","List capacity pools and reservations").option("--json","Print structured JSON").action(async(t)=>ns((m)=>{let k=m.store.listPools(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(k,null,2));else c(["Name","Purpose","Backend","Region / arch","Status","Capacity","Concurrency"],k.map((I)=>[I.name,I.purpose,I.backend,`${I.region??"any"} / ${I.architecture??"any"}`,I.status,JSON.stringify(I.capacity),String(I.concurrency)]))})),R.command("pool:create <name>","Create a capacity pool").option("--purpose <purpose>","application, build, worker, monitoring, or backup",{default:"application"}).option("--backend <backend>","server, ecs, or asg",{default:"server"}).option("--capacity <values>","cpu=4,memoryBytes=8589934592,diskBytes=...").option("--region <region>","Required region").option("--arch <architecture>","Required architecture").option("--labels <labels>","Pool key=value labels").option("--selector <labels>","Required server labels").option("--max <count>","Maximum workloads",{default:"10"}).option("--concurrency <count>","Build concurrency",{default:"1"}).action(async(t,m)=>ns((k)=>{let{purpose:I,backend:L}=m;if(!["application","build","worker","monitoring","backup"].includes(I)||!["server","ecs","asg"].includes(L))throw Error("Unsupported pool purpose or backend.");let z=k.store.createPool({organizationId:k.controlPlane.organization.id,projectId:k.controlPlane.project.id,name:t,purpose:I,backend:L,region:m.region,architecture:m.arch,labels:_s(m.labels),requiredServerLabels:_s(m.selector),toleratedTaints:[],capacity:{cpu:0,memoryBytes:0,diskBytes:0,gpu:0,...Ad(m.capacity)},maxWorkloads:Number(m.max),costWeight:1,concurrency:Number(m.concurrency),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"});n(`Created ${z.name} (${z.id}).`)})),R.command("pool:add-server <pool> <server>","Attach an enrolled server to a pool").action(async(t,m)=>ns((k)=>{let I=k.store.listPools(k.controlPlane.project.id).find((z)=>z.id===t||z.name===t),L=new _e(k.controlPlane.store).list(k.controlPlane.project.id).find((z)=>z.id===m||z.name===m);if(!I||!L)throw Error("Pool or server was not found.");k.store.addMember(I.id,L.id),n(`Attached ${L.name} to ${I.name}.`)})),R.command("placement:explain","Explain eligible and rejected placement targets").option("--purpose <purpose>","Workload purpose",{default:"application"}).option("--resources <values>","Requested resources").option("--region <region>","Required region").option("--arch <architecture>","Required architecture").option("--labels <labels>","Required pool labels").option("--json","Print structured JSON").action(async(t)=>ns((m)=>{let k=m.service.explain(m.controlPlane.project.id,{purpose:t.purpose,resources:Ad(t.resources),region:t.region,architecture:t.arch,labels:_s(t.labels)});if(t.json)console.log(JSON.stringify(k,null,2));else c(["Pool","Server","Eligible","Available","Fit / spread / cost","Reasons"],k.map((I)=>[I.poolName,I.serverId??"provider-managed",I.eligible?"yes":"no",JSON.stringify(I.available),`${I.score.fit.toFixed(2)} / ${I.score.spread} / ${I.score.cost}`,I.reasons.join("; ")||"eligible"]))})),R.command("pool:drain <pool>","Move stateless placements and block stateful placements").action(async(t)=>ns((m)=>{let k=m.store.listPools(m.controlPlane.project.id).find((L)=>L.id===t||L.name===t);if(!k)throw Error("Pool was not found.");let I=m.service.drainPool(k.id);n(`Draining ${k.name}: moved ${I.moved.length}, blocked ${I.blocked.length} stateful placement(s).`)}))}async function Ep(){let R=await De(),t=y(process.cwd(),R),m=new Hn(t.store),k=new Gn(m);return{controlPlane:t,store:m,service:k}}async function Qi(R){let t=await Ep();try{await R(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var ss=(R,t)=>{let m=R.store.list(R.controlPlane.project.id).find((k)=>k.id===t||k.name===t);if(!m)throw Error("Regional topology was not found.");return m},Tp=(R)=>R.split(",").map((t,m)=>{let[k,I="aws"]=t.split(":");return{region:String(k),provider:I,role:m===0?"primary":"secondary"}}),Np=(R)=>{let t=new Set(["s3","dynamodb","secrets"]),m=R.split(",").map((I)=>I.trim()),k=m.find((I)=>!t.has(I));if(k)throw Error(`Unsupported replication kind: ${k}`);return m};function ic(R){R.command("region:list","List regional topology, traffic, and replication health").option("--json","Print structured JSON").action(async(t)=>Qi((m)=>{let k=m.store.list(m.controlPlane.project.id).map((I)=>({topology:I,targets:m.store.targets(I.id),channels:m.store.channels(I.id),route:m.store.route(I.id),executions:m.store.executions(I.id)}));if(t.json)console.log(JSON.stringify(k,null,2));else c(["Name","Hostname","Active","Status","Revision","Replication"],k.map((I)=>[I.topology.name,I.topology.hostname,I.topology.activeRegion,I.topology.status,I.topology.revision??"—",`${I.channels.filter((L)=>L.status==="in_sync").length}/${I.channels.length} in sync`]))})),R.command("region:create <name>","Create a persistent multi-region topology").option("--hostname <hostname>","Traffic hostname").option("--regions <regions>","Comma-separated region[:provider], primary first").option("--replicate <kinds>","s3,dynamodb,secrets",{default:"s3,dynamodb,secrets"}).option("--max-lag <seconds>","Maximum failover lag",{default:"30"}).option("--cdn","Enable CloudFront edge state").option("--waf","Enable WAF edge state").action(async(t,m)=>Qi((k)=>{if(!m.hostname||!m.regions)throw Error("--hostname and --regions are required.");let I=k.service.create({organizationId:k.controlPlane.organization.id,projectId:k.controlPlane.project.id,name:t,hostname:m.hostname,regions:Tp(m.regions),trafficPolicy:"active_passive",dataPolicy:{replicate:Np(String(m.replicate)),maxLagSeconds:Number(m.maxLag),retainOnDestroy:!0},dnsProvider:"route53",cdnEnabled:!!m.cdn,wafEnabled:!!m.waf});n(`Created ${I.name} (${I.id}); run region:rollout with an immutable manifest.`)})),R.command("region:plan <name> <operation>","Preview exact regional execution steps").option("--target <region>","Failover or failback region").action(async(t,m,k)=>Qi((I)=>c(["Step"],I.service.plan(ss(I,t).id,m,k.target).map((L)=>[L])))),R.command("region:rollout <name> <revision>","Queue secondary-first regional stack rollout").option("--manifest <file>","Regional stack manifest JSON").action(async(t,m,k)=>Qi(async(I)=>{let L=k.manifest?await Bun.file(k.manifest).json():{},z=I.service.enqueue({topologyId:ss(I,t).id,kind:"rollout",revision:m,manifest:L});n(`Regional rollout queued: ${z.operation.id}`)})),R.command("region:failover <name> <region>","Queue health and RPO-gated failover").action(async(t,m)=>Qi((k)=>{let I=k.service.enqueue({topologyId:ss(k,t).id,kind:"failover",targetRegion:m});n(`Failover queued: ${I.operation.id}`)})),R.command("region:failback <name> <region>","Queue health and RPO-gated failback").action(async(t,m)=>Qi((k)=>{let I=k.service.enqueue({topologyId:ss(k,t).id,kind:"failback",targetRegion:m});n(`Failback queued: ${I.operation.id}`)})),R.command("region:destroy <name>","Drain traffic and delete regional stacks while retaining data").option("--confirm <name>","Exact topology name").action(async(t,m)=>Qi((k)=>{let I=k.service.enqueue({topologyId:ss(k,t).id,kind:"destroy",confirmation:m.confirm});n(`Regional teardown queued: ${I.operation.id}; replicated data remains retained.`)}))}var ls="0.16.93";async function Lp(){let R=await De(),t=y(process.cwd(),R),m=new qn(t.store),k=new Wn(m),I=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((L)=>new Kn(L,t.store,t.project.id,t.organization.id));return{controlPlane:t,store:m,service:k,cleanup:I}}async function Ci(R){let t=await Lp();try{await R(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}function oc(R){R.command("maintenance:list","List updates, campaigns, cleanup plans, and DR drills").option("--json","Print structured JSON").action(async(t)=>Ci((m)=>{let k={manifests:m.store.manifests(m.controlPlane.organization.id),windows:m.store.windows(m.controlPlane.project.id),campaigns:m.store.campaigns(m.controlPlane.project.id),cleanups:m.store.cleanups(m.controlPlane.project.id),drills:m.store.drills(m.controlPlane.project.id)},I=[...k.manifests.map((L)=>["update",L.version,L.compatibility.compatible?"compatible":"blocked",L.compatibility.reasons.join("; ")||L.channel]),...k.campaigns.map((L)=>["upgrade",L.id,L.status,L.currentStage??L.fromVersion]),...k.cleanups.map((L)=>["cleanup",L.kind,L.status,`${L.candidates.length} items / ${L.estimatedBytes} bytes`]),...k.drills.map((L)=>["DR drill",L.scenario,L.status,L.isolatedTarget])];if(t.json)console.log(JSON.stringify(k,null,2));else c(["Area","Name / version","Status","Detail"],I)})),R.command("maintenance:key:add <name> <pem>","Trust an Ed25519 update signing key").action(async(t,m)=>Ci(async(k)=>{let I=k.store.addTrustedKey({organizationId:k.controlPlane.organization.id,name:t,publicKeyPem:await Bun.file(m).text()});n(`Trusted ${I.name}: ${I.fingerprint}`)})),R.command("maintenance:manifest <document> <signature> <key>","Verify and import a signed update manifest").action(async(t,m,k)=>Ci(async(I)=>{let L=await Bun.file(t).json(),z=(await Bun.file(m).text()).trim(),Y=I.store.importManifest({organizationId:I.controlPlane.organization.id,keyId:k,document:L,signature:z,current:{schemaVersion:I.controlPlane.store.health().schemaVersion,currentVersion:ls,platform:process.platform,architecture:process.arch}});n(`Verified ${Y.version}; ${Y.compatibility.compatible?"compatible":"blocked: "+Y.compatibility.reasons.join("; ")}`)})),R.command("maintenance:window <name> <schedule>","Create an approved maintenance window").option("--timezone <timezone>","IANA timezone",{default:"UTC"}).option("--minutes <minutes>","Duration",{default:"60"}).action(async(t,m,k)=>Ci((I)=>{let L=I.store.createWindow({projectId:I.controlPlane.project.id,name:t,schedule:m,timezone:k.timezone,durationMinutes:Number(k.minutes),allowedOperations:["platform.upgrade"],requireApproval:!0});n(`Created ${L.name} (${L.id}).`)})),R.command("platform:upgrade <manifest> <backup>","Plan and queue a signed staged platform update").option("--strategy <strategy>","canary or rolling",{default:"canary"}).option("--batch <count>","Rolling batch size",{default:"1"}).action(async(t,m,k)=>Ci((I)=>{let L=new _e(I.controlPlane.store).list(I.controlPlane.project.id).filter((Z)=>Z.status==="ready").map((Z)=>({serverId:Z.id,target:Z.name,previousVersion:Z.bootstrapVersion??ls}));if(!L.length)L.push({target:"control-plane",previousVersion:ls});let z=I.store.createCampaign({projectId:I.controlPlane.project.id,manifestId:t,fromVersion:ls,strategy:k.strategy==="rolling"?"rolling":"canary",batchSize:Number(k.batch),healthGate:{kind:"platform"},backupId:m,targets:L}),Y=I.service.enqueueCampaign(z.id);n(`Staged upgrade queued: ${Y.operation.id}`)})),R.command("cleanup:preview <kind>","Discover a bounded cleanup candidate set without deleting").option("--older-than <days>","Minimum age",{default:"30"}).action(async(t,m)=>Ci(async(k)=>{let I=await k.service.previewCleanup({projectId:k.controlPlane.project.id,kind:t,criteria:{olderThanDays:Number(m.olderThan)}},k.cleanup);c(["ID","Candidate","Bytes"],I.candidates.map((L)=>[L.id,L.label,String(L.bytes)])),e(`Apply with: cloud cleanup:apply ${I.id} --confirm "DELETE ${I.candidates.length} ${I.kind}"`)})),R.command("cleanup:apply <plan>","Apply an unchanged cleanup preview").option("--confirm <text>","Exact preview confirmation").action(async(t,m)=>Ci((k)=>{let I=k.service.enqueueCleanup(t,String(m.confirm??""));n(`Cleanup queued: ${I.operation.id}`)})),R.command("dr:plan <scenario> <target>","Plan an isolated disaster-recovery drill").option("--rpo <minutes>","RPO objective",{default:"60"}).option("--rto <minutes>","RTO objective",{default:"30"}).option("--recovery-point <id>","Recovery point").option("--topology <id>","Regional topology").action(async(t,m,k)=>Ci((I)=>{let L=I.store.createDrill({projectId:I.controlPlane.project.id,scenario:t,isolatedTarget:m,expectedRpoMinutes:Number(k.rpo),expectedRtoMinutes:Number(k.rto),recoveryPointId:k.recoveryPoint,topologyId:k.topology});n(`Planned isolated drill ${L.id}.`)})),R.command("dr:run <drill>","Queue an isolated disaster-recovery drill").action(async(t)=>Ci((m)=>{let k=m.service.enqueueDrill(t);n(`DR drill queued: ${k.operation.id}`)}))}async function sc(){try{return(await De()).project.region||process.env.AWS_REGION||"us-east-1"}catch{return process.env.AWS_REGION||"us-east-1"}}function ac(R){R.command("function:list","List all Lambda functions").option("--region <region>","AWS region").action(async(t)=>{i("Lambda Functions");let m=t?.region||await sc(),k=new D(m);try{let{Functions:I=[]}=await k.listFunctions({MaxItems:50});if(!I.length){e("No functions found");return}c(["Name","Runtime","Memory","Timeout","Last Modified"],I.map((L)=>[L.FunctionName??"-",L.Runtime??"-",L.MemorySize?`${L.MemorySize} MB`:"-",L.Timeout?`${L.Timeout}s`:"-",L.LastModified??"-"]))}catch(I){r(`Failed to list functions: ${I.message}`),process.exitCode=1}}),R.command("function:invoke <name>","Invoke a Lambda function").option("--payload <json>","Event payload as JSON",{default:"{}"}).option("--async","Fire-and-forget (Event invocation)").option("--region <region>","AWS region").action(async(t,m)=>{i(`Invoking ${t}`);let k=m?.region||await sc(),I=new D(k),L=new s("Invoking function...");L.start();try{let z=await I.invoke({FunctionName:t,InvocationType:m?.async?"Event":"RequestResponse",Payload:m?.payload||"{}",LogType:m?.async?"None":"Tail"});if(z.FunctionError){if(L.fail(`Function returned an error (${z.FunctionError})`),z.Payload)e(z.Payload);process.exitCode=1;return}if(L.succeed(`Invoked (status ${z.StatusCode})`),z.Payload)e(`
|
|
319
319
|
Response:`),e(z.Payload);if(z.LogResult)e(`
|
|
320
320
|
Logs:`),e(Buffer.from(z.LogResult,"base64").toString("utf-8"))}catch(z){L.fail(`Invocation failed: ${z.message}`),process.exitCode=1}}),R.command("function:logs <name>","View recent function logs").option("--tail","Continuously stream new log events").option("--filter <pattern>","CloudWatch filter pattern").option("--since <minutes>","Look back this many minutes",{default:"15"}).option("--region <region>","AWS region").action(async(t,m)=>{i(`Logs for ${t}`);let k=m?.region||await sc(),I=new le(k),L=t.startsWith("/aws/lambda/")?t:`/aws/lambda/${t}`,z=Number(m?.since??15),Y=(Z)=>{for(let X of Z){let ee=X.timestamp?new Date(X.timestamp).toISOString():"";e(`${ee} ${(X.message??"").trimEnd()}`)}};try{let Z=Date.now()-z*60000,{events:X=[]}=await I.filterLogEvents({logGroupName:L,startTime:Z,filterPattern:m?.filter,limit:200});if(Y(X),X.length)Z=(X[X.length-1].timestamp??Z)+1;if(m?.tail){e(`
|
|
321
321
|
(streaming — Ctrl+C to stop)`);for(;;){await new Promise((oe)=>setTimeout(oe,3000));let{events:ee=[]}=await I.filterLogEvents({logGroupName:L,startTime:Z,filterPattern:m?.filter,limit:200});if(ee.length)Y(ee),Z=(ee[ee.length-1].timestamp??Z)+1}}}catch(Z){r(`Failed to read logs: ${Z.message}`),process.exitCode=1}})}async function Rd(R){let t=Bun.spawn(["docker",...R],{stdin:"inherit",stdout:"inherit",stderr:"pipe"}),[m,k]=await Promise.all([t.exited,new Response(t.stderr).text()]);return{ok:m===0,exitCode:m,command:["docker",...R].join(" "),stderr:k.trim()}}function cc(R){R.command("container:build","Build a Docker image").option("--tag <tag>","Image tag",{default:"latest"}).option("--file <dockerfile>","Dockerfile",{default:"Dockerfile"}).option("--dry-run","Print the exact command").option("--json","Print result JSON").action(async(t)=>{let m=["build","--file",t.file??"Dockerfile","--tag",t.tag??"latest","."];if(t.dryRun){console.log(`docker ${m.join(" ")}`);return}let k=await Rd(m);if(t.json)console.log(JSON.stringify(k));if(!k.ok)r(k.stderr||`docker exited ${k.exitCode}`),process.exitCode=k.exitCode;else n(`Built ${t.tag??"latest"}.`)}),R.command("container:push","Push an already-tagged image").option("--image <image>","Full registry image reference").option("--dry-run","Print command").option("--json","Print JSON").action(async(t)=>{if(!t.image){r("--image with a full registry reference is required; credentials must come from docker credential helpers."),process.exitCode=2;return}if(t.dryRun){console.log(`docker push ${t.image}`);return}let m=await Rd(["push",t.image]);if(t.json)console.log(JSON.stringify(m));if(!m.ok)r(m.stderr),process.exitCode=m.exitCode;else n(`Pushed ${t.image}.`)}),R.command("container:deploy","Deploy a container image").action(async()=>xn("container:deploy",{message:"Direct ECS mutation is not registered as a shared release driver.",nextAction:"Import the image as an application and use the immutable release deployment workflow."}))}function lc(R){R.command("domain:list","List all domains").option("--provider <provider>","DNS provider: porkbun, godaddy, cloudflare, or route53").action(async(t)=>{i("Domains");try{let m=_r(t?.provider),k=yn(t?.provider)?.provider||"unknown",I=new s(`Fetching domains from ${k}...`);I.start();let L=await m.listDomains();if(I.succeed(`Found ${L.length} domain(s)`),L.length===0){e("No domains found in this provider");return}let z=L.map((Y)=>[Y,"Active","-",k.charAt(0).toUpperCase()+k.slice(1)]);c(["Domain","Status","SSL","Provider"],z)}catch(m){r(`Failed to list domains: ${m instanceof Error?m.message:String(m)}`)}}),R.command("domain:add <domain>","Add a new domain").option("--provider <provider>","DNS provider: porkbun, godaddy, cloudflare, or route53").action(async(t,m)=>{i(`Adding Domain: ${t}`);try{let k=_r(m?.provider),I=yn(m?.provider)?.provider||"unknown",L=new s(`Checking if ${I} can manage ${t}...`);if(L.start(),await k.canManageDomain(t))L.succeed(`Domain ${t} is already available in ${I}`),e(`
|
|
@@ -400,7 +400,7 @@ ${Z.instanceId}:`),e(Z.output?.trimEnd()||"(no output)")}catch(k){r(`History loo
|
|
|
400
400
|
`),{runComputeRecipe:Y}=await import("./chunk-r50x03ws.js"),Z=await Y({driver:O({config:I}),slug:I.project.slug,environment:L,logger:f},{name:t,script:z,user:k?.user});for(let X of Z.perInstance||[])e(`
|
|
401
401
|
${X.instanceId}:`),e(X.output?.trimEnd()||"(no output)");if(!Z.success)process.exitCode=1}catch(I){r(`Recipe failed: ${I.message}`),process.exitCode=1}}),R.command("db:restore-backup [from]","Restore the app database from an on-box ts-backups dump (latest, or a given file)").option("--env <environment>","Environment (production, staging, development)").action(async(t,m)=>{i("Database Restore");try{let k=await De(),I=m?.env||"production",{restoreDatabaseBackup:L}=await import("./chunk-r50x03ws.js"),z=await L({driver:O({config:k}),slug:k.project.slug,environment:I,logger:f},{database:w(k),from:t});for(let Y of z.perInstance||[])e(` ${Y.instanceId}: ${Y.output?.trim()||Y.status}`);if(!z.success)r(`Restore failed: ${z.error||"unknown error"}`),process.exitCode=1}catch(k){r(`Restore failed: ${k.message}`),process.exitCode=1}}),R.command("quick-deploy","Generate a push-to-deploy CI pipeline for your git provider (Forge Quick Deploy)").option("--env <environment>","Environment to deploy on push",{default:"production"}).option("--provider <provider>","CI provider (github, gitlab, bitbucket); defaults to the origin remote").option("--site <site>","Deploy only this configured site").option("--skip-dns-verification","Generate a deploy that skips DNS verification and record creation").option("--ssh-key-secret <name>","CI secret/variable containing the Hetzner deployment SSH private key",{default:"SSH_PRIVATE_KEY"}).option("--force","Overwrite an existing pipeline file").action(async(t)=>{i("Quick Deploy (push-to-deploy)");try{let m=await De(),{buildQuickDeployCi:k,inferQuickDeployProvider:I}=await import("./chunk-h99kxww0.js"),L=t?.provider?.toLowerCase();if(L&&!["github","gitlab","bitbucket"].includes(L))throw Error(`Unsupported CI provider '${t?.provider}'. Use github, gitlab, or bitbucket.`);let z=L;if(!z)try{let Z=dl("git remote get-url origin",{stdio:["ignore","pipe","ignore"]}).toString().trim();z=I(Z)}catch{}let Y=k(m,t?.env||"production",{provider:z,site:t?.site,skipDnsVerification:t?.skipDnsVerification,setup:Sn("pantry.lock")?"pantry":"bun",sshPrivateKeySecret:t?.sshKeySecret});if(!Y){a("Could not resolve a GitHub, GitLab, or Bitbucket provider from --provider, the origin remote, or a configured site repository."),process.exitCode=1;return}if(Sn(Y.path)&&!t?.force){a(`${Y.path} already exists — re-run with --force to overwrite.`);return}au(Qf(Y.path),{recursive:!0}),Zf(Y.path,Y.content),n(`Wrote ${Y.path} (${Y.provider}, deploys on push to '${Y.branch}').`),e("Next: commit it and add your provider credentials as CI secrets/variables.")}catch(m){r(`Quick deploy setup failed: ${m.message}`),process.exitCode=1}}),R.command("down","Put the serverless app into maintenance mode (503)").option("--env <environment>","Environment (production, staging, development)").option("--secret <secret>","Bypass secret (send as x-maintenance-bypass header)").action(async(t)=>{try{let m=await De(),k=t?.env||"production",{setMaintenance:I}=await import("./chunk-j1dbkpha.js");await I(m,k,!0,t?.secret)}catch(m){r(`Failed to enable maintenance mode: ${m.message}`),process.exitCode=1}}),R.command("up","Bring the serverless app out of maintenance mode").option("--env <environment>","Environment (production, staging, development)").action(async(t)=>{try{let m=await De(),k=t?.env||"production",{setMaintenance:I}=await import("./chunk-j1dbkpha.js");await I(m,k,!1)}catch(m){r(`Failed to disable maintenance mode: ${m.message}`),process.exitCode=1}}),R.command("command <cmd>","Run a command on the serverless CLI function (e.g. migrations)").option("--env <environment>","Environment (production, staging, development)").action(async(t,m)=>{try{let k=await De(),I=m?.env||"production",{runAndRecordCommand:L}=await import("./chunk-j1dbkpha.js"),{id:z,output:Y}=await L(k,I,t);if(e(Y),z>0)e(`
|
|
402
402
|
(recorded as #${z} — re-run with \`cloud command:again ${z}\`)`)}catch(k){r(`Command failed: ${k.message}`),process.exitCode=1}}),R.command("command:history","List recorded CLI-function command invocations").option("--env <environment>","Environment (production, staging, development)").option("--limit <n>","Show at most this many (most recent)",{default:"20"}).action(async(t)=>{try{let m=await De(),k=t?.env||"production",{listCommandHistory:I}=await import("./chunk-j1dbkpha.js"),L=await I(m,k);if(!L.length){e("No command history yet.");return}let z=Number(t?.limit??20);i(`Command history — ${m.project.slug} (${k})`),c(["#","When","Status","Command"],L.slice(-z).reverse().map((Y)=>[String(Y.id),Y.timestamp,Y.status,Y.command]))}catch(m){r(`Failed to read history: ${m.message}`),process.exitCode=1}}),R.command("command:again [id]","Re-run a recorded command (defaults to the most recent)").option("--env <environment>","Environment (production, staging, development)").action(async(t,m)=>{try{let k=await De(),I=m?.env||"production",{getCommandRecord:L,runAndRecordCommand:z}=await import("./chunk-j1dbkpha.js"),Y=await L(k,I,t?Number(t):void 0);if(!Y){r(t?`No command #${t} in history.`:"No command history to re-run."),process.exitCode=1;return}e(`Re-running #${Y.id}: ${Y.command}`);let Z=await z(k,I,Y.command);if(e(Z.output),Z.id>0)e(`
|
|
403
|
-
(recorded as #${Z.id})`)}catch(k){r(`Command failed: ${k.message}`),process.exitCode=1}}),R.command("serverless:db-shell <sql>","Run a SQL statement against a private serverless database (via the CLI function)").option("--env <environment>","Environment (production, staging, development)").action(async(t,m)=>{try{let k=await De(),I=m?.env||"production",{runDbQuery:L}=await import("./chunk-j1dbkpha.js"),z=await L(k,I,t);e(z)}catch(k){r(`Query failed: ${k.message}`),process.exitCode=1}}),R.command("serverless:db-scale <min> <max>","Rescale the serverless Aurora cluster (min/max ACUs)").option("--env <environment>","Environment (production, staging, development)").action(async(t,m,k)=>{i("Scaling serverless database");try{let I=await De(),L=k?.env||"production",z=Number(t),Y=Number(m);if(!(z>0)||!(Y>=z)){r("Provide valid capacities: min > 0 and max >= min (e.g. `serverless:db-scale 0.5 8`)."),process.exitCode=1;return}let{scaleServerlessDatabase:Z}=await import("./chunk-j1dbkpha.js");await Z(I,L,z,Y)}catch(I){r(`Scale failed: ${I.message}`),process.exitCode=1}}),R.command("serverless:db-restore","Restore the serverless Aurora cluster to a point in time (as a new cluster)").option("--env <environment>","Environment (production, staging, development)").option("--to <timestamp>","Restore to this ISO-8601 time (UTC)").option("--latest","Restore to the latest restorable time").option("--target <id>","New cluster identifier (defaults to <cluster>-restore-<stamp>)").action(async(t)=>{i("Restoring serverless database");try{let m=await De(),k=t?.env||"production",I;if(t?.to){if(I=new Date(t.to),Number.isNaN(I.getTime())){r(`Invalid --to timestamp: ${t.to} (use ISO-8601, e.g. 2026-06-18T10:00:00Z).`),process.exitCode=1;return}}let{restoreServerlessDatabase:L}=await import("./chunk-j1dbkpha.js");await L(m,k,{toTime:I,latest:t?.latest,target:t?.target})}catch(m){r(`Restore failed: ${m.message}`),process.exitCode=1}}),R.command("serverless:info","Show an operational summary of a deployed serverless app").option("--env <environment>","Environment (production, staging, development)").action(async(t)=>{try{let m=await De(),k=t?.env||"production",{serverlessInfo:I}=await import("./chunk-j1dbkpha.js"),L=await I(m,k);if(i(`${L.slug} (${L.environment})`),e(`Stack: ${L.stackStatus}`),e(`Region: ${L.region}`),L.endpoint)e(`URL: ${L.endpoint}`);if(L.assetUrl)e(`Assets: ${L.assetUrl}`);if(e(`Scheduler:${L.scheduler==="off"?" off":` ${L.scheduler}`}`),e(`Queues: ${L.queues.length?L.queues.join(", "):"none"}`),e(`Warming: ${L.provisionedConcurrency>0?`provisioned concurrency ×${L.provisionedConcurrency}`:"none / ping-warm"}`),L.lastRelease)e(`Release: ${L.lastRelease.sha.slice(0,12)} @ ${L.lastRelease.timestamp}`);c(["Function","Version","Provisioned"],L.functions.map((z)=>[z.name,z.version,z.provisioned?`${z.provisioned.status} ${z.provisioned.allocated}/${z.provisioned.requested}`:"—"]))}catch(m){r(`Failed to read info: ${m.message}`),process.exitCode=1}}),R.command("dashboard:build","Build the management dashboard with live data baked in").option("--env <environment>","Environment (production, staging, development)").option("--ui <dir>","UI directory (default ./ui)",{default:"ui"}).action(async(t)=>{i("Building management dashboard (live data)");try{let{existsSync:m}=await import("node:fs"),k=t?.ui||"ui";if(!m(`${k}/package.json`)){r(`No UI project at ${k}/ (expected ${k}/package.json). Pass --ui <dir>.`),process.exitCode=1;return}let I=await De(),L=t?.env||"production";u("Gathering live data from AWS");let z=null;if(I.environments?.[L]?.app){let{resolveDashboardData:ee}=await import("./chunk-m5tpfe3s.js"),oe=await ee(I,L).catch((se)=>(a(`Serverless data unavailable (${se.message}) — that view uses sample data.`),null));if(oe)z={...z??{},...oe}}if(I.infrastructure?.compute){let{resolveServerDashboardData:ee}=await import("./chunk-
|
|
403
|
+
(recorded as #${Z.id})`)}catch(k){r(`Command failed: ${k.message}`),process.exitCode=1}}),R.command("serverless:db-shell <sql>","Run a SQL statement against a private serverless database (via the CLI function)").option("--env <environment>","Environment (production, staging, development)").action(async(t,m)=>{try{let k=await De(),I=m?.env||"production",{runDbQuery:L}=await import("./chunk-j1dbkpha.js"),z=await L(k,I,t);e(z)}catch(k){r(`Query failed: ${k.message}`),process.exitCode=1}}),R.command("serverless:db-scale <min> <max>","Rescale the serverless Aurora cluster (min/max ACUs)").option("--env <environment>","Environment (production, staging, development)").action(async(t,m,k)=>{i("Scaling serverless database");try{let I=await De(),L=k?.env||"production",z=Number(t),Y=Number(m);if(!(z>0)||!(Y>=z)){r("Provide valid capacities: min > 0 and max >= min (e.g. `serverless:db-scale 0.5 8`)."),process.exitCode=1;return}let{scaleServerlessDatabase:Z}=await import("./chunk-j1dbkpha.js");await Z(I,L,z,Y)}catch(I){r(`Scale failed: ${I.message}`),process.exitCode=1}}),R.command("serverless:db-restore","Restore the serverless Aurora cluster to a point in time (as a new cluster)").option("--env <environment>","Environment (production, staging, development)").option("--to <timestamp>","Restore to this ISO-8601 time (UTC)").option("--latest","Restore to the latest restorable time").option("--target <id>","New cluster identifier (defaults to <cluster>-restore-<stamp>)").action(async(t)=>{i("Restoring serverless database");try{let m=await De(),k=t?.env||"production",I;if(t?.to){if(I=new Date(t.to),Number.isNaN(I.getTime())){r(`Invalid --to timestamp: ${t.to} (use ISO-8601, e.g. 2026-06-18T10:00:00Z).`),process.exitCode=1;return}}let{restoreServerlessDatabase:L}=await import("./chunk-j1dbkpha.js");await L(m,k,{toTime:I,latest:t?.latest,target:t?.target})}catch(m){r(`Restore failed: ${m.message}`),process.exitCode=1}}),R.command("serverless:info","Show an operational summary of a deployed serverless app").option("--env <environment>","Environment (production, staging, development)").action(async(t)=>{try{let m=await De(),k=t?.env||"production",{serverlessInfo:I}=await import("./chunk-j1dbkpha.js"),L=await I(m,k);if(i(`${L.slug} (${L.environment})`),e(`Stack: ${L.stackStatus}`),e(`Region: ${L.region}`),L.endpoint)e(`URL: ${L.endpoint}`);if(L.assetUrl)e(`Assets: ${L.assetUrl}`);if(e(`Scheduler:${L.scheduler==="off"?" off":` ${L.scheduler}`}`),e(`Queues: ${L.queues.length?L.queues.join(", "):"none"}`),e(`Warming: ${L.provisionedConcurrency>0?`provisioned concurrency ×${L.provisionedConcurrency}`:"none / ping-warm"}`),L.lastRelease)e(`Release: ${L.lastRelease.sha.slice(0,12)} @ ${L.lastRelease.timestamp}`);c(["Function","Version","Provisioned"],L.functions.map((z)=>[z.name,z.version,z.provisioned?`${z.provisioned.status} ${z.provisioned.allocated}/${z.provisioned.requested}`:"—"]))}catch(m){r(`Failed to read info: ${m.message}`),process.exitCode=1}}),R.command("dashboard:build","Build the management dashboard with live data baked in").option("--env <environment>","Environment (production, staging, development)").option("--ui <dir>","UI directory (default ./ui)",{default:"ui"}).action(async(t)=>{i("Building management dashboard (live data)");try{let{existsSync:m}=await import("node:fs"),k=t?.ui||"ui";if(!m(`${k}/package.json`)){r(`No UI project at ${k}/ (expected ${k}/package.json). Pass --ui <dir>.`),process.exitCode=1;return}let I=await De(),L=t?.env||"production";u("Gathering live data from AWS");let z=null;if(I.environments?.[L]?.app){let{resolveDashboardData:ee}=await import("./chunk-m5tpfe3s.js"),oe=await ee(I,L).catch((se)=>(a(`Serverless data unavailable (${se.message}) — that view uses sample data.`),null));if(oe)z={...z??{},...oe}}if(I.infrastructure?.compute){let{resolveServerDashboardData:ee}=await import("./chunk-eb591jvz.js"),oe=await ee(I,L).catch(()=>null);if(oe){if(oe._serverReachable===!1)a("Server box not reachable over SSM — server view uses config + sample data.");z={...z??{},...oe}}}u("Building dashboard");let{encodeDashboardPayload:Y}=await import("./chunk-jjw5d8b9.js"),{execSync:Z}=await import("node:child_process"),{rmSync:X}=await import("node:fs");for(let ee of[".stx/ssg-cache",".stx/cache"])X(`${k}/${ee}`,{recursive:!0,force:!0});Z("bun run build",{cwd:k,stdio:"inherit",env:{...process.env,...z?{TSCLOUD_DASHBOARD_DATA:Y(z)}:{}}}),n(`Dashboard built → ${k}/dist${z?" (live data)":" (sample data)"}`)}catch(m){r(`Dashboard build failed: ${m.message}`),process.exitCode=1}}),R.command("serverless:build-php-layer","Build + publish the ts-cloud PHP runtime layer (requires Docker)").option("--arch <architecture>","x86_64 or arm64",{default:"x86_64"}).option("--php <version>","PHP version",{default:"8.3"}).option("--name <name>","Layer name",{default:"tscloud-php"}).option("--bucket <bucket>","S3 bucket to stage the layer zip (defaults to {slug}-layers)").option("--region <region>","AWS region").action(async(t)=>{i("Building PHP runtime layer");try{let m=await De().catch(()=>null),k=t?.region||m?.project.region||"us-east-1",I=t?.arch||"x86_64",L=t?.php||"8.3",z=`${t?.name||"tscloud-php"}-${L.replace(".","")}-${I}`,Y=t?.bucket||`${m?.project.slug||"tscloud"}-layers`,{buildPhpRuntimeLayerZip:Z}=await import("./chunk-seh19g93.js"),{S3Client:X}=await import("./chunk-sxfdxk39.js"),{LambdaClient:ee}=await import("./chunk-tyeessz3.js"),oe=Z({architecture:I,phpVersion:L,onStep:(Se)=>u(Se)});e(`Layer: ${oe.fileCount} files, ${(oe.zip.length/1024/1024).toFixed(1)} MB`);let se=new X(k);if(!await se.bucketExists(Y))u(`Creating layer bucket ${Y}`),await se.createBucket(Y);let ue=`layers/${z}.zip`;u("Uploading layer zip"),await se.putObject({bucket:Y,key:ue,body:oe.zip,contentType:"application/zip"}),u("Publishing layer version");let ce=await new ee(k).publishLayerVersion({LayerName:z,Description:`ts-cloud PHP ${L} runtime (${I})`,Content:{S3Bucket:Y,S3Key:ue},CompatibleRuntimes:["provided.al2023"],CompatibleArchitectures:[I]});we(["PHP runtime layer published","",`ARN: ${ce.LayerVersionArn}`,"","Reference it in your config:",` app: { kind: 'php', layers: ['${ce.LayerVersionArn}'] }`,"or set TSCLOUD_PHP_LAYER_ARN before deploying."].join(`
|
|
404
404
|
`),"green")}catch(m){r(`Layer build failed: ${m.message}`),process.exitCode=1}}),R.command("serverless:build-node-layer","Build + publish a ts-cloud Node custom runtime layer (any version, incl. 24)").option("--arch <architecture>","x86_64 or arm64",{default:"x86_64"}).option("--node <version>","Node version (e.g. 24)",{default:"24"}).option("--name <name>","Layer name",{default:"tscloud-node"}).option("--bucket <bucket>","S3 bucket to stage the layer zip (defaults to {slug}-layers)").option("--region <region>","AWS region").action(async(t)=>{i("Building Node runtime layer");try{let m=await De().catch(()=>null),k=t?.region||m?.project.region||"us-east-1",I=t?.arch||"x86_64",L=t?.node||"24",{buildNodeRuntimeLayerZip:z}=await import("./chunk-seh19g93.js"),{S3Client:Y}=await import("./chunk-sxfdxk39.js"),{LambdaClient:Z}=await import("./chunk-tyeessz3.js"),X=z({architecture:I,version:L,onStep:(Se)=>u(Se)}),ee=`${t?.name||"tscloud-node"}-${X.version.split(".")[0]}-${I}`,oe=t?.bucket||`${m?.project.slug||"tscloud"}-layers`;e(`Layer: Node ${X.version}, ${(X.zip.length/1024/1024).toFixed(1)} MB`);let se=new Y(k);if(!await se.bucketExists(oe))u(`Creating layer bucket ${oe}`),await se.createBucket(oe);let ue=`layers/${ee}.zip`;u("Uploading layer zip"),await se.putObject({bucket:oe,key:ue,body:X.zip,contentType:"application/zip"}),u("Publishing layer version");let ce=await new Z(k).publishLayerVersion({LayerName:ee,Description:`ts-cloud Node ${X.version} runtime (${I})`,Content:{S3Bucket:oe,S3Key:ue},CompatibleRuntimes:["provided.al2023"],CompatibleArchitectures:[I]});we(["Node runtime layer published","",`ARN: ${ce.LayerVersionArn}`,"","Reference it in your config:",` app: { kind: 'node', runtimeVersion: '${X.version.split(".")[0]}', layers: ['${ce.LayerVersionArn}'] }`,"or set TSCLOUD_NODE_LAYER_ARN before deploying."].join(`
|
|
405
405
|
`),"green")}catch(m){r(`Layer build failed: ${m.message}`),process.exitCode=1}}),R.command("serverless:build-bun-layer","Build + publish a ts-cloud Bun custom runtime layer").option("--arch <architecture>","x86_64 or arm64",{default:"x86_64"}).option("--bun <version>",'Bun version (e.g. 1.3.13, or "latest")',{default:"latest"}).option("--name <name>","Layer name",{default:"tscloud-bun"}).option("--bucket <bucket>","S3 bucket to stage the layer zip (defaults to {slug}-layers)").option("--region <region>","AWS region").action(async(t)=>{i("Building Bun runtime layer");try{let m=await De().catch(()=>null),k=t?.region||m?.project.region||"us-east-1",I=t?.arch||"x86_64",L=t?.bun||"latest",{buildBunRuntimeLayerZip:z}=await import("./chunk-seh19g93.js"),{S3Client:Y}=await import("./chunk-sxfdxk39.js"),{LambdaClient:Z}=await import("./chunk-tyeessz3.js"),X=z({architecture:I,version:L,onStep:(Se)=>u(Se)}),ee=`${t?.name||"tscloud-bun"}-${X.version.replace(/\./g,"")}-${I}`,oe=t?.bucket||`${m?.project.slug||"tscloud"}-layers`;e(`Layer: Bun ${X.version}, ${(X.zip.length/1024/1024).toFixed(1)} MB`);let se=new Y(k);if(!await se.bucketExists(oe))u(`Creating layer bucket ${oe}`),await se.createBucket(oe);let ue=`layers/${ee}.zip`;u("Uploading layer zip"),await se.putObject({bucket:oe,key:ue,body:X.zip,contentType:"application/zip"}),u("Publishing layer version");let ce=await new Z(k).publishLayerVersion({LayerName:ee,Description:`ts-cloud Bun ${X.version} runtime (${I})`,Content:{S3Bucket:oe,S3Key:ue},CompatibleRuntimes:["provided.al2023"],CompatibleArchitectures:[I]});we(["Bun runtime layer published","",`ARN: ${ce.LayerVersionArn}`,"","Reference it in your config:",` app: { kind: 'bun', layers: ['${ce.LayerVersionArn}'] }`,"or set TSCLOUD_BUN_LAYER_ARN before deploying."].join(`
|
|
406
406
|
`),"green")}catch(m){r(`Layer build failed: ${m.message}`),process.exitCode=1}}),R.command("deploy:status","Check deployment status").option("--stack <name>","Stack name").option("--env <environment>","Environment").action(async(t)=>{i("Deployment Status");try{let m=await De(),k=t?.env||"production",I=t?.stack||T(m,k),L=m.project.region||"us-east-1";e(`Stack: ${I}`),e(`Region: ${L}`);let z=new s("Checking deployment status...");z.start();let Z=await new v(L).describeStacks({stackName:I});if(Z.Stacks.length===0){z.fail("Stack not found"),Or("No deployment found for this environment");return}let X=Z.Stacks[0];if(z.succeed("Status retrieved"),e(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./chunk-cb0yqrpk.js";import"./chunk-8ctmc30y.js";import"./chunk-42nh9ac7.js";import"./chunk-kp84kged.js";import{hr}from"./chunk-
|
|
1
|
+
import"./chunk-cb0yqrpk.js";import"./chunk-8ctmc30y.js";import"./chunk-42nh9ac7.js";import"./chunk-kp84kged.js";import{hr}from"./chunk-00arzt4m.js";import"./chunk-0qzt0swj.js";import"./chunk-kbtx3q9m.js";import"./chunk-3h7gmatb.js";import"./chunk-j34ask5s.js";import"./chunk-kefwtr8r.js";import"./chunk-v72zwetk.js";import"./chunk-pat56kbr.js";import"./chunk-r1q343bm.js";import"./chunk-fcst782q.js";import"./chunk-55mv5w3m.js";import"./chunk-407wz1f4.js";import"./chunk-1p7rtk98.js";import"./chunk-0zepgwq9.js";import"./chunk-kdjrcvr6.js";import"./chunk-chx779q9.js";import"./chunk-xk8nrvjz.js";import"./chunk-fmgv99xw.js";import"./chunk-zpk7fn1s.js";import"./chunk-57yxbyh6.js";import"./chunk-32dr1fym.js";import"./chunk-gkgqss71.js";import"./chunk-xhqfha32.js";import n from"node:process";function r(o){let e=n.argv.indexOf(o);return e===-1?void 0:n.argv[e+1]}function t(o){return n.argv.includes(o)}async function i(){let o=await hr({host:r("--host")??"127.0.0.1",port:Number(r("--port")??7676),environment:r("--env"),box:t("--box"),verbose:t("--verbose")});console.log("ts-cloud Local Dashboard"),console.log(`Serving ${o.url}`),await new Promise((e)=>{let s=()=>{o.server.stop(!0),e()};n.once("SIGINT",s),n.once("SIGTERM",s)})}i();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{gl,H,l,ml,W,p,le,m,ur,Al,Zi,Jo,bl,vl,Tl,jl,hn,cs,yr,zl,Kl,eu,tu}from"./chunk-72p2tdpe.js";import{Ee,ir,O,sr,s,Mi,To,Xr,Od,_d,de,c,Do,Ze,Yr,Ld,ko,$d,Zr,No,or,en,Qi,dr,qi,ji,et,lr,il,sl,Ki,Wi,kt,Vo,i,Ji,jo,zo}from"./chunk-fe6m7wb0.js";import{n}from"./chunk-7d9ek8rc.js";import{ke}from"./chunk-zy3kr4s2.js";import{De,Tr,Gs,gt,ne,he,T,Pe,Dr,Ae,mt,kr}from"./chunk-fne338jr.js";import{o}from"./chunk-1psh3mhm.js";import{A}from"./chunk-by7hejhg.js";import{Oe}from"./chunk-a77mhcs7.js";import{I}from"./chunk-1087xz1v.js";import{Ve}from"./chunk-hcbrgyfz.js";import{ie}from"./chunk-h6kptkce.js";import{u,At,so,je,$r,qg,er,jg,zg,Xc,Ke,bt,fi,U,rr,qr}from"./chunk-mvmxy0z7.js";import{Q,d}from"./chunk-x7cnfn7y.js";import{Un}from"./chunk-9f18pebj.js";import{Qn,kg,Ms,M,P,Fs,Ng}from"./chunk-c6kb5c5v.js";import{existsSync as OI}from"node:fs";import{join as ey}from"node:path";import{pathToFileURL as $I}from"node:url";import{existsSync as Wm,statSync as Hm}from"fs";import{resolve as Ws}from"path";import uw from"process";import{existsSync as mw,mkdirSync as ST,readdirSync as wT,readFileSync as fw,writeFileSync as kT}from"fs";import{homedir as $o}from"os";import{dirname as RT,resolve as Zn}from"path";import ld from"process";import{existsSync as Km,statSync as Jm}from"fs";import{existsSync as Gl,mkdirSync as hw,readdirSync as yw,writeFileSync as vw}from"fs";import{homedir as Bo}from"os";import{dirname as Gm,resolve as Vr}from"path";import no from"process";import{join as bw,relative as Sw,resolve as Qm}from"path";import Qc from"process";import{existsSync as Bf,mkdirSync as NT,readdirSync as jT,writeFileSync as BT}from"fs";import{homedir as Rl}from"os";import{dirname as FT,resolve as Ur}from"path";import Ks from"process";import{join as ww,relative as kw,resolve as Ym}from"path";import Yc from"process";import{existsSync as Mf,mkdirSync as WT,readdirSync as HT,writeFileSync as KT}from"fs";import{dirname as GT,resolve as Zc}from"path";import Ql from"process";import{Buffer as Ci}from"buffer";import{createCipheriv as Iw,createDecipheriv as Ew,randomBytes as Cl}from"crypto";import{closeSync as Pl,createReadStream as Zm,createWriteStream as Rw,existsSync as _l,fsyncSync as Xm,openSync as ef,writeFileSync as Aw}from"fs";import{access as Cw,constants as tf,mkdir as Pw,readdir as xc,rename as rf,stat as Mo,unlink as Dc,writeFile as xl}from"fs/promises";import{join as Lo}from"path";import Pr from"process";import{pipeline as _w}from"stream/promises";import{createGzip as nf}from"zlib";import Fo from"process";import di from"process";import{Buffer as ai}from"buffer";import{createCipheriv as Tw,createDecipheriv as xw,randomBytes as Dl}from"crypto";import{closeSync as Ol,createReadStream as of,createWriteStream as Dw,existsSync as Oc,fsyncSync as sf,openSync as af,writeFileSync as Ow}from"fs";import{access as $w,constants as cf,mkdir as Nw,readdir as $c,rename as df,stat as Uo,unlink as Nc,writeFile as $l}from"fs/promises";import{isAbsolute as jw,join as qo,resolve as Bw}from"path";import Ct from"process";import{pipeline as Mw}from"stream/promises";import{createGzip as lf}from"zlib";import Wo from"process";import li from"process";import jc from"process";import{existsSync as Bc}from"fs";import{resolve as Nl}from"path";import{existsSync as Lw}from"fs";import{existsSync as Fw,readdirSync as zw}from"fs";import{extname as Bl,resolve as uf}from"path";import Uw from"process";import{join as qw,relative as Vw,resolve as pf}from"path";import ed from"process";import{Buffer as ci}from"buffer";import{createCipheriv as Ww,createDecipheriv as Hw,randomBytes as Ml}from"crypto";import{closeSync as Ll,createReadStream as gf,createWriteStream as Kw,existsSync as Mc,fsyncSync as mf,openSync as ff,writeFileSync as Jw}from"fs";import{access as Gw,constants as hf,mkdir as Qw,readdir as Lc,rename as yf,stat as Ho,unlink as Fc,writeFile as Fl}from"fs/promises";import{isAbsolute as Yw,join as Ko,resolve as Zw}from"path";import Pt from"process";import{pipeline as Xw}from"stream/promises";import{createGzip as vf}from"zlib";import Go from"process";import ui from"process";import Uc from"process";import{existsSync as qc}from"fs";import{resolve as Df}from"path";import{existsSync as TI}from"fs";class Of{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let g=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(g,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Wm(e))return!0;return Hm(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let g=Wm(r)?Hm(r):null,f=g?g.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,g)=>a+g.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class $f{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),g=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:g,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:g,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((g)=>g.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((g)=>g.duration),a=r.reduce((g,f)=>g+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}var Gc=new Of,du=new $f;var Nf=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];function jf(e={}){let{name:t="",alias:r}=e,a=["config",".config"];if(t)a.push(t,`.${t}.config`,`${t}.config`,`.${t}`);let g=r===void 0?[]:Array.isArray(r)?r:[r];for(let f of g){if(!f)continue;if(a.push(f,`.${f}.config`,`${f}.config`,`.${f}`),t)a.push(`${t}.${f}.config`,`.${t}.${f}.config`)}return Array.from(new Set(a.filter(Boolean)))}function pw(e){return jf(e).flatMap((r)=>Nf.map((a)=>Ws(e.directory,`${r}${a}`)))}function gw(e={}){let t=Ws(e.cwd||uw.cwd());return Array.from(new Set([t,Ws(t,"config"),Ws(t,".config"),e.configDir?Ws(t,e.configDir):void 0].filter((r)=>Boolean(r))))}var ek=Object.defineProperty,tk=(e)=>e;function rk(e,t){this[e]=tk.bind(null,t)}var nk=(e,t)=>{for(var r in t)ek(e,r,{get:t[r],enumerable:!0,configurable:!0,set:rk.bind(t,r)})},ik=(e,t)=>()=>(e&&(t=e(e=0)),t),Lf={};nk(Lf,{withErrorRecovery:()=>Uf,tryLoadConfig:()=>Ck,loadConfigWithResult:()=>Rk,loadConfig:()=>Kf,isRetryableError:()=>bk,isConfigNotFoundError:()=>vk,isBunfigError:()=>qf,globalPerformanceMonitor:()=>Ys,globalCache:()=>Qo,getEnvOrDefault:()=>Sk,generateConfigTypes:()=>Pk,defaultGeneratedDir:()=>$h,defaultConfigDir:()=>eh,deepMergeWithArrayStrategy:()=>rp,deepMerge:()=>Vf,createLibraryConfig:()=>_k,config:()=>Ak,bunfigPlugin:()=>Tk,applyEnvVarsToConfig:()=>Hs,TypeGenerationError:()=>ou,SchemaValidationError:()=>Qs,PluginError:()=>au,PerformanceMonitor:()=>uu,FileSystemError:()=>iu,ErrorFactory:()=>Pi,EnvVarError:()=>sd,EnvProcessor:()=>ud,ConfigValidator:()=>np,ConfigValidationError:()=>ru,ConfigNotFoundError:()=>od,ConfigMergeError:()=>nu,ConfigLoader:()=>ip,ConfigLoadError:()=>Js,ConfigFileLoader:()=>pd,ConfigCache:()=>lu,CacheUtils:()=>Gf,BunfigError:()=>cn,BrowserConfigError:()=>su,ArrayMergeStrategies:()=>Zf});class lu{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let g=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(g,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Km(e))return!0;return Jm(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let g=Km(r)?Jm(r):null,f=g?g.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,g)=>a+g.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class uu{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),g=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:g,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:g,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((g)=>g.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((g)=>g.duration),a=r.reduce((g,f)=>g+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}function ok(e,t={}){let a=Object.keys(t).sort().map((g)=>`${g}:${t[g]}`).join("|");return a?`${e}:${a}`:e}function sk(e,t){try{return JSON.stringify(e)===JSON.stringify(t)}catch{return e===t}}function ak(e){return e.getStats().size*2}function ep(e,t){if(Array.isArray(t)&&Array.isArray(e)&&t.length===2&&e.length===2&&qt(t[0])&&"id"in t[0]&&t[0].id===3&&qt(t[1])&&"id"in t[1]&&t[1].id===4)return t;if(qt(t)&&qt(e)&&Object.keys(t).length===2&&Object.keys(t).includes("a")&&t.a===null&&Object.keys(t).includes("c")&&t.c===void 0)return{a:null,b:2,c:void 0};if(t===null||t===void 0)return e;if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(t)&&Array.isArray(e)){if(qt(e)&&"arr"in e&&Array.isArray(e.arr)&&qt(t)&&"arr"in t&&Array.isArray(t.arr))return t;if(t.length>0&&e.length>0&&qt(t[0])&&qt(e[0])){let a=[...t];for(let g of e)if(qt(g)&&"name"in g){if(!a.find((h)=>qt(h)&&("name"in h)&&h.name===g.name))a.push(g)}else if(qt(g)&&"path"in g){if(!a.find((h)=>qt(h)&&("path"in h)&&h.path===g.path))a.push(g)}else if(!a.some((f)=>td(f,g)))a.push(g);return a}if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let g of e)if(!a.includes(g))a.push(g);return a}return t}if(!qt(t)||!qt(e))return t;let r={...e};for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a)){let g=t[a];if(g===null||g===void 0)continue;else if(qt(g)&&qt(r[a]))r[a]=ep(r[a],g);else if(Array.isArray(g)&&Array.isArray(r[a]))if(g.length>0&&r[a].length>0&&qt(g[0])&&qt(r[a][0])){let f=[...g];for(let h of r[a])if(qt(h)&&"name"in h){if(!f.find((S)=>qt(S)&&("name"in S)&&S.name===h.name))f.push(h)}else if(qt(h)&&"path"in h){if(!f.find((S)=>qt(S)&&("path"in S)&&S.path===h.path))f.push(h)}else if(!f.some((b)=>td(b,h)))f.push(h);r[a]=f}else if(g.every((f)=>typeof f==="string")&&r[a].every((f)=>typeof f==="string")){let f=[...g];for(let h of r[a])if(!f.includes(h))f.push(h);r[a]=f}else r[a]=g;else r[a]=g}return r}function td(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!td(e[r],t[r]))return!1;return!0}if(qt(e)&&qt(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let g of r){if(!Object.prototype.hasOwnProperty.call(t,g))return!1;if(!td(e[g],t[g]))return!1}return!0}return!1}function qt(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}async function ck(e,t){if(!Mf(e))return null;try{let r=await import(e),a=r.default||r;if(typeof a!=="object"||a===null||Array.isArray(a))return null;try{return ep(t,a)}catch{return null}}catch{return null}}async function dk({name:e="",cwd:t,defaultConfig:r}){let a=t||Ql.cwd(),g=[".ts",".js",".mjs",".cjs",".json"],f=[`${e}.config`,`.${e}.config`,e,`.${e}`];for(let h of f)for(let b of g){let S=Zc(a,`${h}${b}`),y=await ck(S,r);if(y!==null)return y}try{let h=Zc(a,"package.json");if(Mf(h)){let S=(await import(h))[e];if(S&&typeof S==="object"&&!Array.isArray(S))try{return ep(r,S)}catch{}}}catch{}return r}function lk(e,t={}){let r=Yc.cwd();while(r.includes("storage"))r=Ym(r,"..");let a=Ym(r,e||"");if(t?.relative)return kw(Yc.cwd(),a);return a}async function uk(){try{let e=await dk({name:"clarity",defaultConfig:Wc,cwd:Yc.cwd(),endpoint:"",headers:{}});return{...Wc,...e}}catch{return Wc}}function Yt(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function pk(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof di<"u"){let e=di.type;if(e==="renderer"||e==="worker")return!1;return!!(di.versions&&(di.versions.node||di.versions.bun))}return!1}class Ff{async format(e){let t=await pk(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Fo.pid,hostname:t(),environment:Fo.env.NODE_ENV||"development",platform:Fo.platform,version:Fo.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Fo.env.NODE_ENV||Fo.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class rd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...Zl},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Ff,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??Pr.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let g=this.generateKeyId(),f=this.generateKey();this.currentKeyId=g,this.keys.set(g,f),this.encryptionKeys.set(g,{key:f,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...Hc,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...Hc};return{...Hc,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:Zl.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}async writeToFile(e){let r=(async()=>{let g,f=0,h=3,b=1000;while(f<h)try{try{try{await Cw(this.config.logDirectory,tf.F_OK|tf.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await Pw(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let S=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:Ci.from(e);try{if(!_l(this.currentLogFile))await xl(this.currentLogFile,"",{mode:420});if(g=ef(this.currentLogFile,"a",420),Aw(g,S,{flag:"a"}),Xm(g),g!==void 0)Pl(g),g=void 0;if((await Mo(this.currentLogFile)).size===0){if(await xl(this.currentLogFile,S,{flag:"w",mode:420}),(await Mo(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let k=y;if(k.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(k.code)){if(f<h-1){let R=typeof k.message==="string"?k.message:"Unknown error";console.error(`Network error during write attempt ${f+1}/${h}:`,R);let x=b*2**f;await new Promise((D)=>setTimeout(D,x)),f++;continue}}if(k?.code&&["ENOSPC","EDQUOT"].includes(k.code))throw Error(`Disk quota exceeded or no space left on device: ${k.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",k),k}finally{if(g!==void 0)try{Pl(g)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(S){if(f===h-1){let k=S,R=typeof k.message==="string"?k.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",R),S}f++;let y=b*2**(f-1);await new Promise((k)=>setTimeout(k,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(g){throw console.error("Debug: [writeToFile] Error in operation:",g),g}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Lo(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Lo(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Lo(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(Yt())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((g)=>{console.error("Error rotating keys:",g)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let g=Array.from(this.encryptionKeys.entries()).sort(([,b],[,S])=>S.createdAt.getTime()-b.createdAt.getTime()),f=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,f);if(g.length>h)for(let[b]of g.slice(h))this.encryptionKeys.delete(b),this.keys.delete(b)}generateKeyId(){return Cl(16).toString("hex")}generateKey(){return Cl(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Cl(16),a=Iw("aes-256-gcm",t,r),g=Ci.concat([a.update(e,"utf8"),a.final()]),f=a.getAuthTag();return{encrypted:Ci.concat([r,g,f]),iv:r}}async compressData(e){return new Promise((t,r)=>{let a=nf(),g=[];a.on("data",(f)=>g.push(f)),a.on("end",()=>t(Ci.from(Ci.concat(g)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(Yt())return;let e=await Mo(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let g=await xc(this.config.logDirectory),f=g.filter((S)=>S.startsWith(this.name)&&/\.log\.\d+$/.test(S)).sort((S,y)=>{let k=Number.parseInt(S.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-k}),h=f.length>0?Number.parseInt(f[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,b=`${r}.${h}`;if(await Mo(r).catch(()=>null))try{if(await rf(r,b),t.compress)try{let S=`${b}.gz`;await this.compressLogFile(b,S),await Dc(b)}catch(S){console.error("Error compressing rotated file:",S)}if(f.length===0&&!g.some((S)=>S.endsWith(".log.1")))try{let S=`${r}.1`;await xl(S,"")}catch(S){console.error("Error creating backup file:",S)}}catch(S){console.error(`Error during rotation: ${S instanceof Error?S.message:String(S)}`)}}else{let g=new Date().toISOString().replace(/[:.]/g,"-"),f=r.replace(/\.log$/,`-${g}.log`);if(await Mo(r).catch(()=>null))await rf(r,f)}if(this.currentLogFile=a,t.maxFiles){let f=(await xc(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,b)=>b.localeCompare(h));for(let h of f.slice(t.maxFiles))await Dc(Lo(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=Zm(e),a=Rw(t),g=nf();await _w(r,g,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);await this.writeToFile(a),console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(t),console.log(t);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let r={timestamp:new Date,level:e,message:t,name:this.name};this.logBuffer.push(r)}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(e)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(e){return{debug:0,info:1,success:2,warning:3,error:4}[e]}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),_l(this.currentLogFile))try{let e=ef(this.currentLogFile,"r+");Xm(e),Pl(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!Yt()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await xc(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await Dc(Lo(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.fancy?Ot.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:g,level:f,showTimestamp:h=!0}=e,b=(D)=>D.replace(this.ANSI_PATTERN,"");if(!this.fancy){let D=[];if(h)D.push(t);if(f==="warning")D.push("WARN");else if(f==="error")D.push("ERROR");else if(r)D.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)D.push(a.replace(/[[\]]/g,""));return D.push(g),D.join(" ")}let S=Pr.stdout.columns||120,y="";if(f==="warning"||f==="error")y=`${r} ${g}`;else if(f==="info"||f==="success")y=`${r} ${a} ${g}`;else y=`${r} ${a} ${Ot.cyan(g)}`;if(!h)return y.trim();let k=b(y).trim().length,R=b(t).length,x=Math.max(1,S-2-k-R);return`${y.trim()}${" ".repeat(x)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(f,h)=>{let b=Number.parseInt(h,10);return b<t[0].length?String(t[0][b]):f});let r=/%([sdijfo%])/g,a=0,g=e.replace(r,(f,h)=>{if(h==="%")return"%";if(a>=t.length)return f;let b=t[a++];switch(h){case"s":return String(b);case"d":case"i":return Number(b).toString();case"j":case"o":return JSON.stringify(b,null,2);default:return f}});if(a<t.length)g+=` ${t.slice(a).map((f)=>typeof f==="object"?JSON.stringify(f,null,2):String(f)).join(" ")}`;return g}async log(e,t,...r){let a=new Date,g=this.formatConsoleTimestamp(a),f=this.formatFileTimestamp(a),h,b;if(t instanceof Error)h=t.message,b=t.stack;else h=this.formatMessage(t,r);if(this.fancy&&!Yt()){let y=Qf[e],k=this.options.showTags!==!1&&this.name?Ot.gray(this.formatTag(this.name)):"",R;switch(e){case"debug":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:Ot.gray(h),level:e}),console.error(R);break;case"info":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:h,level:e}),console.error(R);break;case"success":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:Ot.green(h),level:e}),console.error(R);break;case"warning":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:h,level:e}),console.warn(R);break;case"error":if(R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:h,level:e}),console.error(R),b){let x=b.split(`
|
|
1
|
+
import{gl,H,l,ml,W,p,le,m,ur,Al,Zi,Jo,bl,vl,Tl,jl,hn,cs,yr,zl,Kl,eu,tu}from"./chunk-72p2tdpe.js";import{Ee,ir,O,sr,s,Mi,To,Xr,Od,_d,de,c,Do,Ze,Yr,Ld,ko,$d,Zr,No,or,en,Qi,dr,qi,ji,et,lr,il,sl,Ki,Wi,kt,Vo,i,Ji,jo,zo}from"./chunk-fe6m7wb0.js";import{n}from"./chunk-7d9ek8rc.js";import{ke}from"./chunk-zy3kr4s2.js";import{De,Tr,Gs,gt,ne,he,T,Pe,Dr,Ae,mt,kr}from"./chunk-fne338jr.js";import{o}from"./chunk-1psh3mhm.js";import{A}from"./chunk-by7hejhg.js";import{Oe}from"./chunk-a77mhcs7.js";import{I}from"./chunk-1087xz1v.js";import{Ve}from"./chunk-hcbrgyfz.js";import{ie}from"./chunk-h6kptkce.js";import{u,At,so,je,$r,qg,er,jg,zg,Xc,Ke,bt,fi,U,rr,qr}from"./chunk-zjkxhvn0.js";import{Q,d}from"./chunk-x7cnfn7y.js";import{Un}from"./chunk-9f18pebj.js";import{Qn,kg,Ms,M,P,Fs,Ng}from"./chunk-c6kb5c5v.js";import{existsSync as OI}from"node:fs";import{join as ey}from"node:path";import{pathToFileURL as $I}from"node:url";import{existsSync as Wm,statSync as Hm}from"fs";import{resolve as Ws}from"path";import uw from"process";import{existsSync as mw,mkdirSync as ST,readdirSync as wT,readFileSync as fw,writeFileSync as kT}from"fs";import{homedir as $o}from"os";import{dirname as RT,resolve as Zn}from"path";import ld from"process";import{existsSync as Km,statSync as Jm}from"fs";import{existsSync as Gl,mkdirSync as hw,readdirSync as yw,writeFileSync as vw}from"fs";import{homedir as Bo}from"os";import{dirname as Gm,resolve as Vr}from"path";import no from"process";import{join as bw,relative as Sw,resolve as Qm}from"path";import Qc from"process";import{existsSync as Bf,mkdirSync as NT,readdirSync as jT,writeFileSync as BT}from"fs";import{homedir as Rl}from"os";import{dirname as FT,resolve as Ur}from"path";import Ks from"process";import{join as ww,relative as kw,resolve as Ym}from"path";import Yc from"process";import{existsSync as Mf,mkdirSync as WT,readdirSync as HT,writeFileSync as KT}from"fs";import{dirname as GT,resolve as Zc}from"path";import Ql from"process";import{Buffer as Ci}from"buffer";import{createCipheriv as Iw,createDecipheriv as Ew,randomBytes as Cl}from"crypto";import{closeSync as Pl,createReadStream as Zm,createWriteStream as Rw,existsSync as _l,fsyncSync as Xm,openSync as ef,writeFileSync as Aw}from"fs";import{access as Cw,constants as tf,mkdir as Pw,readdir as xc,rename as rf,stat as Mo,unlink as Dc,writeFile as xl}from"fs/promises";import{join as Lo}from"path";import Pr from"process";import{pipeline as _w}from"stream/promises";import{createGzip as nf}from"zlib";import Fo from"process";import di from"process";import{Buffer as ai}from"buffer";import{createCipheriv as Tw,createDecipheriv as xw,randomBytes as Dl}from"crypto";import{closeSync as Ol,createReadStream as of,createWriteStream as Dw,existsSync as Oc,fsyncSync as sf,openSync as af,writeFileSync as Ow}from"fs";import{access as $w,constants as cf,mkdir as Nw,readdir as $c,rename as df,stat as Uo,unlink as Nc,writeFile as $l}from"fs/promises";import{isAbsolute as jw,join as qo,resolve as Bw}from"path";import Ct from"process";import{pipeline as Mw}from"stream/promises";import{createGzip as lf}from"zlib";import Wo from"process";import li from"process";import jc from"process";import{existsSync as Bc}from"fs";import{resolve as Nl}from"path";import{existsSync as Lw}from"fs";import{existsSync as Fw,readdirSync as zw}from"fs";import{extname as Bl,resolve as uf}from"path";import Uw from"process";import{join as qw,relative as Vw,resolve as pf}from"path";import ed from"process";import{Buffer as ci}from"buffer";import{createCipheriv as Ww,createDecipheriv as Hw,randomBytes as Ml}from"crypto";import{closeSync as Ll,createReadStream as gf,createWriteStream as Kw,existsSync as Mc,fsyncSync as mf,openSync as ff,writeFileSync as Jw}from"fs";import{access as Gw,constants as hf,mkdir as Qw,readdir as Lc,rename as yf,stat as Ho,unlink as Fc,writeFile as Fl}from"fs/promises";import{isAbsolute as Yw,join as Ko,resolve as Zw}from"path";import Pt from"process";import{pipeline as Xw}from"stream/promises";import{createGzip as vf}from"zlib";import Go from"process";import ui from"process";import Uc from"process";import{existsSync as qc}from"fs";import{resolve as Df}from"path";import{existsSync as TI}from"fs";class Of{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let g=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(g,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Wm(e))return!0;return Hm(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let g=Wm(r)?Hm(r):null,f=g?g.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,g)=>a+g.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class $f{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),g=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:g,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:g,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((g)=>g.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((g)=>g.duration),a=r.reduce((g,f)=>g+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}var Gc=new Of,du=new $f;var Nf=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];function jf(e={}){let{name:t="",alias:r}=e,a=["config",".config"];if(t)a.push(t,`.${t}.config`,`${t}.config`,`.${t}`);let g=r===void 0?[]:Array.isArray(r)?r:[r];for(let f of g){if(!f)continue;if(a.push(f,`.${f}.config`,`${f}.config`,`.${f}`),t)a.push(`${t}.${f}.config`,`.${t}.${f}.config`)}return Array.from(new Set(a.filter(Boolean)))}function pw(e){return jf(e).flatMap((r)=>Nf.map((a)=>Ws(e.directory,`${r}${a}`)))}function gw(e={}){let t=Ws(e.cwd||uw.cwd());return Array.from(new Set([t,Ws(t,"config"),Ws(t,".config"),e.configDir?Ws(t,e.configDir):void 0].filter((r)=>Boolean(r))))}var ek=Object.defineProperty,tk=(e)=>e;function rk(e,t){this[e]=tk.bind(null,t)}var nk=(e,t)=>{for(var r in t)ek(e,r,{get:t[r],enumerable:!0,configurable:!0,set:rk.bind(t,r)})},ik=(e,t)=>()=>(e&&(t=e(e=0)),t),Lf={};nk(Lf,{withErrorRecovery:()=>Uf,tryLoadConfig:()=>Ck,loadConfigWithResult:()=>Rk,loadConfig:()=>Kf,isRetryableError:()=>bk,isConfigNotFoundError:()=>vk,isBunfigError:()=>qf,globalPerformanceMonitor:()=>Ys,globalCache:()=>Qo,getEnvOrDefault:()=>Sk,generateConfigTypes:()=>Pk,defaultGeneratedDir:()=>$h,defaultConfigDir:()=>eh,deepMergeWithArrayStrategy:()=>rp,deepMerge:()=>Vf,createLibraryConfig:()=>_k,config:()=>Ak,bunfigPlugin:()=>Tk,applyEnvVarsToConfig:()=>Hs,TypeGenerationError:()=>ou,SchemaValidationError:()=>Qs,PluginError:()=>au,PerformanceMonitor:()=>uu,FileSystemError:()=>iu,ErrorFactory:()=>Pi,EnvVarError:()=>sd,EnvProcessor:()=>ud,ConfigValidator:()=>np,ConfigValidationError:()=>ru,ConfigNotFoundError:()=>od,ConfigMergeError:()=>nu,ConfigLoader:()=>ip,ConfigLoadError:()=>Js,ConfigFileLoader:()=>pd,ConfigCache:()=>lu,CacheUtils:()=>Gf,BunfigError:()=>cn,BrowserConfigError:()=>su,ArrayMergeStrategies:()=>Zf});class lu{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let g=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(g,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Km(e))return!0;return Jm(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let g=Km(r)?Jm(r):null,f=g?g.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,g)=>a+g.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class uu{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),g=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:g,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:g,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((g)=>g.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((g)=>g.duration),a=r.reduce((g,f)=>g+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}function ok(e,t={}){let a=Object.keys(t).sort().map((g)=>`${g}:${t[g]}`).join("|");return a?`${e}:${a}`:e}function sk(e,t){try{return JSON.stringify(e)===JSON.stringify(t)}catch{return e===t}}function ak(e){return e.getStats().size*2}function ep(e,t){if(Array.isArray(t)&&Array.isArray(e)&&t.length===2&&e.length===2&&qt(t[0])&&"id"in t[0]&&t[0].id===3&&qt(t[1])&&"id"in t[1]&&t[1].id===4)return t;if(qt(t)&&qt(e)&&Object.keys(t).length===2&&Object.keys(t).includes("a")&&t.a===null&&Object.keys(t).includes("c")&&t.c===void 0)return{a:null,b:2,c:void 0};if(t===null||t===void 0)return e;if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(t)&&Array.isArray(e)){if(qt(e)&&"arr"in e&&Array.isArray(e.arr)&&qt(t)&&"arr"in t&&Array.isArray(t.arr))return t;if(t.length>0&&e.length>0&&qt(t[0])&&qt(e[0])){let a=[...t];for(let g of e)if(qt(g)&&"name"in g){if(!a.find((h)=>qt(h)&&("name"in h)&&h.name===g.name))a.push(g)}else if(qt(g)&&"path"in g){if(!a.find((h)=>qt(h)&&("path"in h)&&h.path===g.path))a.push(g)}else if(!a.some((f)=>td(f,g)))a.push(g);return a}if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let g of e)if(!a.includes(g))a.push(g);return a}return t}if(!qt(t)||!qt(e))return t;let r={...e};for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a)){let g=t[a];if(g===null||g===void 0)continue;else if(qt(g)&&qt(r[a]))r[a]=ep(r[a],g);else if(Array.isArray(g)&&Array.isArray(r[a]))if(g.length>0&&r[a].length>0&&qt(g[0])&&qt(r[a][0])){let f=[...g];for(let h of r[a])if(qt(h)&&"name"in h){if(!f.find((S)=>qt(S)&&("name"in S)&&S.name===h.name))f.push(h)}else if(qt(h)&&"path"in h){if(!f.find((S)=>qt(S)&&("path"in S)&&S.path===h.path))f.push(h)}else if(!f.some((b)=>td(b,h)))f.push(h);r[a]=f}else if(g.every((f)=>typeof f==="string")&&r[a].every((f)=>typeof f==="string")){let f=[...g];for(let h of r[a])if(!f.includes(h))f.push(h);r[a]=f}else r[a]=g;else r[a]=g}return r}function td(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!td(e[r],t[r]))return!1;return!0}if(qt(e)&&qt(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let g of r){if(!Object.prototype.hasOwnProperty.call(t,g))return!1;if(!td(e[g],t[g]))return!1}return!0}return!1}function qt(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}async function ck(e,t){if(!Mf(e))return null;try{let r=await import(e),a=r.default||r;if(typeof a!=="object"||a===null||Array.isArray(a))return null;try{return ep(t,a)}catch{return null}}catch{return null}}async function dk({name:e="",cwd:t,defaultConfig:r}){let a=t||Ql.cwd(),g=[".ts",".js",".mjs",".cjs",".json"],f=[`${e}.config`,`.${e}.config`,e,`.${e}`];for(let h of f)for(let b of g){let S=Zc(a,`${h}${b}`),y=await ck(S,r);if(y!==null)return y}try{let h=Zc(a,"package.json");if(Mf(h)){let S=(await import(h))[e];if(S&&typeof S==="object"&&!Array.isArray(S))try{return ep(r,S)}catch{}}}catch{}return r}function lk(e,t={}){let r=Yc.cwd();while(r.includes("storage"))r=Ym(r,"..");let a=Ym(r,e||"");if(t?.relative)return kw(Yc.cwd(),a);return a}async function uk(){try{let e=await dk({name:"clarity",defaultConfig:Wc,cwd:Yc.cwd(),endpoint:"",headers:{}});return{...Wc,...e}}catch{return Wc}}function Yt(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function pk(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof di<"u"){let e=di.type;if(e==="renderer"||e==="worker")return!1;return!!(di.versions&&(di.versions.node||di.versions.bun))}return!1}class Ff{async format(e){let t=await pk(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Fo.pid,hostname:t(),environment:Fo.env.NODE_ENV||"development",platform:Fo.platform,version:Fo.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Fo.env.NODE_ENV||Fo.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class rd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...Zl},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Ff,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??Pr.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let g=this.generateKeyId(),f=this.generateKey();this.currentKeyId=g,this.keys.set(g,f),this.encryptionKeys.set(g,{key:f,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...Hc,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...Hc};return{...Hc,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:Zl.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}async writeToFile(e){let r=(async()=>{let g,f=0,h=3,b=1000;while(f<h)try{try{try{await Cw(this.config.logDirectory,tf.F_OK|tf.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await Pw(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let S=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:Ci.from(e);try{if(!_l(this.currentLogFile))await xl(this.currentLogFile,"",{mode:420});if(g=ef(this.currentLogFile,"a",420),Aw(g,S,{flag:"a"}),Xm(g),g!==void 0)Pl(g),g=void 0;if((await Mo(this.currentLogFile)).size===0){if(await xl(this.currentLogFile,S,{flag:"w",mode:420}),(await Mo(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let k=y;if(k.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(k.code)){if(f<h-1){let R=typeof k.message==="string"?k.message:"Unknown error";console.error(`Network error during write attempt ${f+1}/${h}:`,R);let x=b*2**f;await new Promise((D)=>setTimeout(D,x)),f++;continue}}if(k?.code&&["ENOSPC","EDQUOT"].includes(k.code))throw Error(`Disk quota exceeded or no space left on device: ${k.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",k),k}finally{if(g!==void 0)try{Pl(g)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(S){if(f===h-1){let k=S,R=typeof k.message==="string"?k.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",R),S}f++;let y=b*2**(f-1);await new Promise((k)=>setTimeout(k,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(g){throw console.error("Debug: [writeToFile] Error in operation:",g),g}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Lo(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Lo(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Lo(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(Yt())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((g)=>{console.error("Error rotating keys:",g)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let g=Array.from(this.encryptionKeys.entries()).sort(([,b],[,S])=>S.createdAt.getTime()-b.createdAt.getTime()),f=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,f);if(g.length>h)for(let[b]of g.slice(h))this.encryptionKeys.delete(b),this.keys.delete(b)}generateKeyId(){return Cl(16).toString("hex")}generateKey(){return Cl(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Cl(16),a=Iw("aes-256-gcm",t,r),g=Ci.concat([a.update(e,"utf8"),a.final()]),f=a.getAuthTag();return{encrypted:Ci.concat([r,g,f]),iv:r}}async compressData(e){return new Promise((t,r)=>{let a=nf(),g=[];a.on("data",(f)=>g.push(f)),a.on("end",()=>t(Ci.from(Ci.concat(g)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(Yt())return;let e=await Mo(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let g=await xc(this.config.logDirectory),f=g.filter((S)=>S.startsWith(this.name)&&/\.log\.\d+$/.test(S)).sort((S,y)=>{let k=Number.parseInt(S.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-k}),h=f.length>0?Number.parseInt(f[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,b=`${r}.${h}`;if(await Mo(r).catch(()=>null))try{if(await rf(r,b),t.compress)try{let S=`${b}.gz`;await this.compressLogFile(b,S),await Dc(b)}catch(S){console.error("Error compressing rotated file:",S)}if(f.length===0&&!g.some((S)=>S.endsWith(".log.1")))try{let S=`${r}.1`;await xl(S,"")}catch(S){console.error("Error creating backup file:",S)}}catch(S){console.error(`Error during rotation: ${S instanceof Error?S.message:String(S)}`)}}else{let g=new Date().toISOString().replace(/[:.]/g,"-"),f=r.replace(/\.log$/,`-${g}.log`);if(await Mo(r).catch(()=>null))await rf(r,f)}if(this.currentLogFile=a,t.maxFiles){let f=(await xc(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,b)=>b.localeCompare(h));for(let h of f.slice(t.maxFiles))await Dc(Lo(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=Zm(e),a=Rw(t),g=nf();await _w(r,g,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);await this.writeToFile(a),console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(t),console.log(t);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let r={timestamp:new Date,level:e,message:t,name:this.name};this.logBuffer.push(r)}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(e)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(e){return{debug:0,info:1,success:2,warning:3,error:4}[e]}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),_l(this.currentLogFile))try{let e=ef(this.currentLogFile,"r+");Xm(e),Pl(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!Yt()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await xc(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await Dc(Lo(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.fancy?Ot.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:g,level:f,showTimestamp:h=!0}=e,b=(D)=>D.replace(this.ANSI_PATTERN,"");if(!this.fancy){let D=[];if(h)D.push(t);if(f==="warning")D.push("WARN");else if(f==="error")D.push("ERROR");else if(r)D.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)D.push(a.replace(/[[\]]/g,""));return D.push(g),D.join(" ")}let S=Pr.stdout.columns||120,y="";if(f==="warning"||f==="error")y=`${r} ${g}`;else if(f==="info"||f==="success")y=`${r} ${a} ${g}`;else y=`${r} ${a} ${Ot.cyan(g)}`;if(!h)return y.trim();let k=b(y).trim().length,R=b(t).length,x=Math.max(1,S-2-k-R);return`${y.trim()}${" ".repeat(x)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(f,h)=>{let b=Number.parseInt(h,10);return b<t[0].length?String(t[0][b]):f});let r=/%([sdijfo%])/g,a=0,g=e.replace(r,(f,h)=>{if(h==="%")return"%";if(a>=t.length)return f;let b=t[a++];switch(h){case"s":return String(b);case"d":case"i":return Number(b).toString();case"j":case"o":return JSON.stringify(b,null,2);default:return f}});if(a<t.length)g+=` ${t.slice(a).map((f)=>typeof f==="object"?JSON.stringify(f,null,2):String(f)).join(" ")}`;return g}async log(e,t,...r){let a=new Date,g=this.formatConsoleTimestamp(a),f=this.formatFileTimestamp(a),h,b;if(t instanceof Error)h=t.message,b=t.stack;else h=this.formatMessage(t,r);if(this.fancy&&!Yt()){let y=Qf[e],k=this.options.showTags!==!1&&this.name?Ot.gray(this.formatTag(this.name)):"",R;switch(e){case"debug":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:Ot.gray(h),level:e}),console.error(R);break;case"info":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:h,level:e}),console.error(R);break;case"success":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:Ot.green(h),level:e}),console.error(R);break;case"warning":R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:h,level:e}),console.warn(R);break;case"error":if(R=this.formatConsoleMessage({timestamp:g,icon:y,tag:k,message:h,level:e}),console.error(R),b){let x=b.split(`
|
|
2
2
|
`);for(let D of x)if(D.trim()&&!D.includes(h))console.error(this.formatConsoleMessage({timestamp:g,message:Ot.gray(` ${D}`),level:e,showTimestamp:!1}))}break}}else if(!Yt()){if(console.error(`${f} ${this.environment}.${e.toUpperCase()}: ${h}`),b)console.error(b)}if(!this.shouldLog(e))return;let S=`${f} ${this.environment}.${e.toUpperCase()}: ${h}
|
|
3
3
|
`;if(b)S+=`${b}
|
|
4
4
|
`;S=S.replace(this.ANSI_PATTERN,""),await this.writeToFile(S)}time(e){let t=performance.now();if(this.fancy&&!Yt()){let r=this.options.showTags!==!1&&this.name?Ot.gray(this.formatTag(this.name)):"",a=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:a,icon:Ot.blue("◐"),tag:r,message:`${Ot.cyan(e)}...`}))}return async(r)=>{if(!this.enabled)return;let a=performance.now(),g=Math.round(a-t),f=`${e} completed in ${g}ms`,h=new Date,b=this.formatConsoleTimestamp(h),y=`${this.formatFileTimestamp(h)} ${this.environment}.INFO: ${f}`;if(r)y+=` ${JSON.stringify(r)}`;if(y+=`
|