@stacksjs/ts-cloud 0.16.38 → 0.16.39

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.
Files changed (64) hide show
  1. package/dist/aws/bedrock.d.ts +110 -9
  2. package/dist/aws/index.js +1 -1
  3. package/dist/bin/{chunk-8496fsmq.js → chunk-ehnevjt4.js} +31 -31
  4. package/dist/bin/cli.js +3 -3
  5. package/dist/bin/dashboard-server.js +1 -1
  6. package/dist/{chunk-ej9dqt2r.js → chunk-0rvnerbw.js} +1 -1
  7. package/dist/{chunk-t80x808z.js → chunk-ffjgw5m6.js} +1 -1
  8. package/dist/deploy/index.js +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/ui/404.html +1 -1
  11. package/dist/ui/accept-invitation.html +1 -1
  12. package/dist/ui/access-denied.html +1 -1
  13. package/dist/ui/account/automation.html +6 -6
  14. package/dist/ui/account/security.html +2 -2
  15. package/dist/ui/applications/compose.html +6 -6
  16. package/dist/ui/applications/new.html +2 -2
  17. package/dist/ui/data/backups.html +6 -6
  18. package/dist/ui/data/services.html +6 -6
  19. package/dist/ui/data/volumes.html +6 -6
  20. package/dist/ui/index.html +6 -6
  21. package/dist/ui/infrastructure/topology.html +6 -6
  22. package/dist/ui/integrations.html +2 -2
  23. package/dist/ui/operations/alerts.html +6 -6
  24. package/dist/ui/operations/configuration.html +6 -6
  25. package/dist/ui/operations/jobs.html +6 -6
  26. package/dist/ui/operations/maintenance.html +5 -5
  27. package/dist/ui/operations/observability.html +6 -6
  28. package/dist/ui/operations/previews.html +6 -6
  29. package/dist/ui/operations/queue.html +6 -6
  30. package/dist/ui/operations/regions.html +5 -5
  31. package/dist/ui/operations/releases.html +6 -6
  32. package/dist/ui/operations/spend.html +6 -6
  33. package/dist/ui/operations/workloads.html +6 -6
  34. package/dist/ui/security.html +2 -2
  35. package/dist/ui/server/actions.html +6 -6
  36. package/dist/ui/server/activity.html +1 -1
  37. package/dist/ui/server/capacity.html +6 -6
  38. package/dist/ui/server/database.html +6 -6
  39. package/dist/ui/server/deployments.html +5 -5
  40. package/dist/ui/server/diagnostics.html +2 -2
  41. package/dist/ui/server/firewall.html +6 -6
  42. package/dist/ui/server/fleet.html +6 -6
  43. package/dist/ui/server/logs.html +6 -6
  44. package/dist/ui/server/metrics.html +5 -5
  45. package/dist/ui/server/security.html +1 -1
  46. package/dist/ui/server/services.html +2 -2
  47. package/dist/ui/server/sites.html +6 -6
  48. package/dist/ui/server/ssh-keys.html +6 -6
  49. package/dist/ui/server/team.html +5 -5
  50. package/dist/ui/server/terminal.html +2 -2
  51. package/dist/ui/serverless/alarms.html +6 -6
  52. package/dist/ui/serverless/assets.html +2 -2
  53. package/dist/ui/serverless/cost.html +2 -2
  54. package/dist/ui/serverless/data.html +6 -6
  55. package/dist/ui/serverless/deployments.html +2 -2
  56. package/dist/ui/serverless/firewall.html +1 -1
  57. package/dist/ui/serverless/functions.html +6 -6
  58. package/dist/ui/serverless/logs.html +6 -6
  59. package/dist/ui/serverless/metrics.html +2 -2
  60. package/dist/ui/serverless/queues.html +5 -5
  61. package/dist/ui/serverless/secrets.html +5 -5
  62. package/dist/ui/serverless/traces.html +6 -6
  63. package/dist/ui/serverless.html +6 -6
  64. package/package.json +3 -3
package/dist/bin/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bun
2
- import{C,jt,n,r,a,Er,e,p,i,s,R,d,Ao,c,an,ve,_s,Os,$s,Ls,f}from"./chunk-e6mfcw0v.js";import{ra,H,xr,w,B,Lo,l,o,T,oa,sa,aa,ke,Fe,tt,Uo,fn,Pi,hn,Fo,ua,pa,ma,ga,ha,j,b,L,rt,N,ge,jo,je,Gt,Di,we,Vo,Ni,qt,At,ya,ba}from"./chunk-q8hp4dfy.js";import"./chunk-55cckkb2.js";import{_e,x,An,y,Rn,Bi,In,Xo,Mr,it,De,Pn,Dn,Nn,kn,xn,_n,On,$n,ie,Zt,er,Ln,Ur,Mn,Un,Bn,jn,Vn,zn,Hn,Gn,ot,tr,rr,Dt,Fr,nr,ir,ji,Nt,qn,ce,Wn,Kn,Jn,Br,jr,Xn,Vr,or,sr,st,kt,xt,zr,le,Qn,nc,ic,ar,oc,G,Vi,Ve,at,ct,Yn,Hr,Gr,Zn,ei,ti,qr,Qo,de,ye,Oe,be,ri,cr}from"./chunk-8496fsmq.js";import{u,Qs}from"./chunk-dmwfnbg0.js";import{ae,h,kr}from"./chunk-6r5mehaj.js";import{Rr,Tt,Ir,Pr,Dr,Nr,un}from"./chunk-hjq05rxh.js";import{S,Ot,li,us,hr,mc,gc,fc,di,ui,mt,en,$t,tn,gt,Ke,Le,Je,ft,yr,Me,Xe,pi,mi,Qe,rn,nn,ro,io,vr,Lt,ht,Mt,ee,co,hi,yi,Es}from"./chunk-e0kapeev.js";import{Ye,Ut,Rs,Is,Ze,mo,go,fo,ho,yo,bo,W,Ft,M,bi}from"./chunk-w8jfw39t.js";import{J,P,Ro,Bs,js,Uc,Fc,Ci,vt,Ti}from"./chunk-ygsdntxq.js";import{v}from"./chunk-0ynfqf9t.js";import{Q}from"./chunk-dnmb3sr0.js";import{Ct,g}from"./chunk-tt3m3fda.js";import{He,Yo,ue,zi,ii,Hi,Gi,Wr,qi,Wi,Se,Z,Ge,Ne,Kr,lr,qe,dr,Jr,dt,pe,ut,pr,mr,gr,Xr,fr,O,Ji,Xi,oi,Zo,Qr,es,ts,cc,Qi,rs,ns,is,os,pt,ss,Yi,Zi}from"./chunk-pyr0dc6j.js";import"./chunk-cqhtnsby.js";import{I}from"./chunk-wga7gj0h.js";import{me}from"./chunk-x0ywfbk5.js";import{K,bt,Eo}from"./chunk-48nz63ab.js";import{oe,q,sc,ac,ze}from"./chunk-4h60xsat.js";import{Qt,En,Yt,Ui,wn,Jo}from"./chunk-w6yx9bhb.js";import"./chunk-85k5gvnc.js";import{E}from"./chunk-5wqjqh6c.js";import{lt}from"./chunk-r0yapyqc.js";import{te,Ce}from"./chunk-8zn63v9h.js";import{V}from"./chunk-sqmays54.js";import"./chunk-7rpj0qhb.js";import{Fi}from"./chunk-0c1fv0xt.js";import"./chunk-4bp4k1x2.js";import"./chunk-d8x60kvn.js";import{ci}from"./chunk-07qwk0sj.js";import{Cr}from"./chunk-mbr9j2fw.js";import{yt}from"./chunk-c7z8et78.js";import{F}from"./chunk-gc8p1tdr.js";import{k}from"./chunk-cvc9bxd4.js";import{existsSync as Jd}from"node:fs";import ta from"node:fs/promises";import ml from"node:os";import na from"node:path";import to from"node:process";import{EventEmitter as Yd}from"node:events";import Ei from"node:process";import fl from"node:process";import la from"node:process";import bs from"node:process";import Oo from"node:process";import vl from"node:tty";import Bu,{stdin as Bg,stdout as Mg}from"node:process";class bl{configPath;config=null;events=[];retryCount=0;maxRetries=3;retryDelayMs=1000;constructor(){let D=ml.homedir(),t=na.join(D,".config","clapp");this.configPath=na.join(t,"telemetry.json")}async isEnabled(){if(to.env.DO_NOT_TRACK==="1"||to.env.DO_NOT_TRACK==="true")return!1;if(to.env.NO_TELEMETRY==="1"||to.env.NO_TELEMETRY==="true")return!1;return(await this.loadConfig()).enabled}async enable(){let D=await this.loadConfig();if(D.enabled=!0,!D.userId)D.userId=this.generateUserId();await this.saveConfig(D)}async disable(){let D=await this.loadConfig();D.enabled=!1,await this.saveConfig(D)}async track(D,t){if(!await this.isEnabled())return;let A={event:D,...t,timestamp:Date.now(),platform:ml.platform(),nodeVersion:to.version};if(this.events.push(A),this.events.length>=10)await this.send()}async trackCommand(D,t){await this.track("command",{command:D,duration:t})}async trackError(D,t){await this.track("error",{error:D,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(D){return new Promise((t)=>setTimeout(t,D))}async status(){let D=await this.loadConfig();return{enabled:D.enabled,doNotTrack:to.env.DO_NOT_TRACK==="1"||to.env.DO_NOT_TRACK==="true",eventsQueued:this.events.length,lastSent:D.lastSent}}async loadConfig(){if(this.config)return this.config;try{if(Jd(this.configPath)){let D=await ta.readFile(this.configPath,"utf-8");return this.config=JSON.parse(D),this.config}}catch{}return this.config={enabled:!1},this.config}async saveConfig(D){this.config=D;try{let t=na.dirname(this.configPath);await ta.mkdir(t,{recursive:!0}),await ta.writeFile(this.configPath,JSON.stringify(D,null,2),"utf-8")}catch{}}generateUserId(){let D=Math.random().toString(36).substring(2,15),t=Date.now().toString(36);return`${D}-${t}`}}var kg=new bl;function ca(D){return D.replace(/[<[].+/,"").trim()}function Zd(D){let t=/<([^>]+)>/g,m=/\[([^\]]+)\]/g,A=[],_=(Y)=>{let X=!1,ne=Y[1];if(ne.startsWith("..."))ne=ne.slice(3),X=!0;return{required:Y[0].startsWith("<"),value:ne,variadic:X}},z;while(z=t.exec(D))A.push(_(z));let U;while(U=m.exec(D))A.push(_(U));return A}function Qd(D){let t={alias:{},boolean:[]};for(let[m,A]of D.entries()){if(A.names.length>1)t.alias[A.names[0]]=A.names.slice(1);if(A.isBoolean)if(A.negated){if(!D.some((z,U)=>U!==m&&z.names.some((Y)=>A.names.includes(Y))&&typeof z.required==="boolean"))t.boolean.push(A.names[0])}else t.boolean.push(A.names[0])}return t}function gl(D){return D.reduce((t,m)=>t.length>=m.length?t:m,"")}function ia(D,t){return D.length>=t?D:`${D}${" ".repeat(t-D.length)}`}function vs(D){return D.replace(/([a-z])-([a-z])/g,(t,m,A)=>m+A.toUpperCase())}function Xd(D,t,m){let A=0,_=t.length,z=D,U;for(;A<_;++A)U=z[t[A]],z=z[t[A]]=A===_-1?m:U!=null?U:!!~t[A+1].indexOf(".")||!(+t[A+1]>-1)?{}:[]}function eu(D,t){for(let m of Object.keys(t)){let A=t[m];if(A.shouldTransform){if(D[m]=Array.prototype.concat.call([],D[m]),typeof A.transformFunction==="function")D[m]=D[m].map(A.transformFunction)}}}function tu(D){let t=/([^\\/]+)$/.exec(D);return t?t[1]:""}function Bo(D){return D.split(".").map((t,m)=>m===0?vs(t):t).join(".")}class Mo extends Error{exitCode=2;isUsageError=!0;usage;constructor(D,t){super(D);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(D).stack}format(D=!1){if(D&&this.stack)return`${this.message}
2
+ import{C,jt,n,r,a,Er,e,p,i,s,R,d,Ao,c,an,ve,_s,Os,$s,Ls,f}from"./chunk-e6mfcw0v.js";import{ra,H,xr,w,B,Lo,l,o,T,oa,sa,aa,ke,Fe,tt,Uo,fn,Pi,hn,Fo,ua,pa,ma,ga,ha,j,b,L,rt,N,ge,jo,je,Gt,Di,we,Vo,Ni,qt,At,ya,ba}from"./chunk-q8hp4dfy.js";import"./chunk-55cckkb2.js";import{_e,x,An,y,Rn,Bi,In,Xo,Mr,it,De,Pn,Dn,Nn,kn,xn,_n,On,$n,ie,Zt,er,Ln,Ur,Mn,Un,Bn,jn,Vn,zn,Hn,Gn,ot,tr,rr,Dt,Fr,nr,ir,ji,Nt,qn,ce,Wn,Kn,Jn,Br,jr,Xn,Vr,or,sr,st,kt,xt,zr,le,Qn,nc,ic,ar,oc,G,Vi,Ve,at,ct,Yn,Hr,Gr,Zn,ei,ti,qr,Qo,de,ye,Oe,be,ri,cr}from"./chunk-ehnevjt4.js";import{u,Qs}from"./chunk-dmwfnbg0.js";import{ae,h,kr}from"./chunk-6r5mehaj.js";import{Rr,Tt,Ir,Pr,Dr,Nr,un}from"./chunk-hjq05rxh.js";import{S,Ot,li,us,hr,mc,gc,fc,di,ui,mt,en,$t,tn,gt,Ke,Le,Je,ft,yr,Me,Xe,pi,mi,Qe,rn,nn,ro,io,vr,Lt,ht,Mt,ee,co,hi,yi,Es}from"./chunk-e0kapeev.js";import{Ye,Ut,Rs,Is,Ze,mo,go,fo,ho,yo,bo,W,Ft,M,bi}from"./chunk-w8jfw39t.js";import{J,P,Ro,Bs,js,Uc,Fc,Ci,vt,Ti}from"./chunk-ygsdntxq.js";import{v}from"./chunk-0ynfqf9t.js";import{Q}from"./chunk-dnmb3sr0.js";import{Ct,g}from"./chunk-tt3m3fda.js";import{He,Yo,ue,zi,ii,Hi,Gi,Wr,qi,Wi,Se,Z,Ge,Ne,Kr,lr,qe,dr,Jr,dt,pe,ut,pr,mr,gr,Xr,fr,O,Ji,Xi,oi,Zo,Qr,es,ts,cc,Qi,rs,ns,is,os,pt,ss,Yi,Zi}from"./chunk-pyr0dc6j.js";import"./chunk-cqhtnsby.js";import{I}from"./chunk-wga7gj0h.js";import{me}from"./chunk-x0ywfbk5.js";import{K,bt,Eo}from"./chunk-48nz63ab.js";import{oe,q,sc,ac,ze}from"./chunk-4h60xsat.js";import{Qt,En,Yt,Ui,wn,Jo}from"./chunk-w6yx9bhb.js";import"./chunk-85k5gvnc.js";import{E}from"./chunk-5wqjqh6c.js";import{lt}from"./chunk-r0yapyqc.js";import{te,Ce}from"./chunk-8zn63v9h.js";import{V}from"./chunk-sqmays54.js";import"./chunk-7rpj0qhb.js";import{Fi}from"./chunk-0c1fv0xt.js";import"./chunk-4bp4k1x2.js";import"./chunk-d8x60kvn.js";import{ci}from"./chunk-07qwk0sj.js";import{Cr}from"./chunk-mbr9j2fw.js";import{yt}from"./chunk-c7z8et78.js";import{F}from"./chunk-gc8p1tdr.js";import{k}from"./chunk-cvc9bxd4.js";import{existsSync as Jd}from"node:fs";import ta from"node:fs/promises";import ml from"node:os";import na from"node:path";import to from"node:process";import{EventEmitter as Yd}from"node:events";import Ei from"node:process";import fl from"node:process";import la from"node:process";import bs from"node:process";import Oo from"node:process";import vl from"node:tty";import Bu,{stdin as Bg,stdout as Mg}from"node:process";class bl{configPath;config=null;events=[];retryCount=0;maxRetries=3;retryDelayMs=1000;constructor(){let D=ml.homedir(),t=na.join(D,".config","clapp");this.configPath=na.join(t,"telemetry.json")}async isEnabled(){if(to.env.DO_NOT_TRACK==="1"||to.env.DO_NOT_TRACK==="true")return!1;if(to.env.NO_TELEMETRY==="1"||to.env.NO_TELEMETRY==="true")return!1;return(await this.loadConfig()).enabled}async enable(){let D=await this.loadConfig();if(D.enabled=!0,!D.userId)D.userId=this.generateUserId();await this.saveConfig(D)}async disable(){let D=await this.loadConfig();D.enabled=!1,await this.saveConfig(D)}async track(D,t){if(!await this.isEnabled())return;let A={event:D,...t,timestamp:Date.now(),platform:ml.platform(),nodeVersion:to.version};if(this.events.push(A),this.events.length>=10)await this.send()}async trackCommand(D,t){await this.track("command",{command:D,duration:t})}async trackError(D,t){await this.track("error",{error:D,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(D){return new Promise((t)=>setTimeout(t,D))}async status(){let D=await this.loadConfig();return{enabled:D.enabled,doNotTrack:to.env.DO_NOT_TRACK==="1"||to.env.DO_NOT_TRACK==="true",eventsQueued:this.events.length,lastSent:D.lastSent}}async loadConfig(){if(this.config)return this.config;try{if(Jd(this.configPath)){let D=await ta.readFile(this.configPath,"utf-8");return this.config=JSON.parse(D),this.config}}catch{}return this.config={enabled:!1},this.config}async saveConfig(D){this.config=D;try{let t=na.dirname(this.configPath);await ta.mkdir(t,{recursive:!0}),await ta.writeFile(this.configPath,JSON.stringify(D,null,2),"utf-8")}catch{}}generateUserId(){let D=Math.random().toString(36).substring(2,15),t=Date.now().toString(36);return`${D}-${t}`}}var kg=new bl;function ca(D){return D.replace(/[<[].+/,"").trim()}function Zd(D){let t=/<([^>]+)>/g,m=/\[([^\]]+)\]/g,A=[],_=(Y)=>{let X=!1,ne=Y[1];if(ne.startsWith("..."))ne=ne.slice(3),X=!0;return{required:Y[0].startsWith("<"),value:ne,variadic:X}},z;while(z=t.exec(D))A.push(_(z));let U;while(U=m.exec(D))A.push(_(U));return A}function Qd(D){let t={alias:{},boolean:[]};for(let[m,A]of D.entries()){if(A.names.length>1)t.alias[A.names[0]]=A.names.slice(1);if(A.isBoolean)if(A.negated){if(!D.some((z,U)=>U!==m&&z.names.some((Y)=>A.names.includes(Y))&&typeof z.required==="boolean"))t.boolean.push(A.names[0])}else t.boolean.push(A.names[0])}return t}function gl(D){return D.reduce((t,m)=>t.length>=m.length?t:m,"")}function ia(D,t){return D.length>=t?D:`${D}${" ".repeat(t-D.length)}`}function vs(D){return D.replace(/([a-z])-([a-z])/g,(t,m,A)=>m+A.toUpperCase())}function Xd(D,t,m){let A=0,_=t.length,z=D,U;for(;A<_;++A)U=z[t[A]],z=z[t[A]]=A===_-1?m:U!=null?U:!!~t[A+1].indexOf(".")||!(+t[A+1]>-1)?{}:[]}function eu(D,t){for(let m of Object.keys(t)){let A=t[m];if(A.shouldTransform){if(D[m]=Array.prototype.concat.call([],D[m]),typeof A.transformFunction==="function")D[m]=D[m].map(A.transformFunction)}}}function tu(D){let t=/([^\\/]+)$/.exec(D);return t?t[1]:""}function Bo(D){return D.split(".").map((t,m)=>m===0?vs(t):t).join(".")}class Mo extends Error{exitCode=2;isUsageError=!0;usage;constructor(D,t){super(D);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(D).stack}format(D=!1){if(D&&this.stack)return`${this.message}
3
3
 
4
4
  Stack trace:
5
5
  ${this.stack}`;return this.message}}function nu(D){if(D instanceof Mo)return!0;return!!D&&typeof D==="object"&&D.name==="ClappError"&&typeof D.message==="string"}function ru(){let{env:D}=fl,{TERM:t,TERM_PROGRAM:m}=D;if(fl.platform!=="win32")return t!=="linux";return Boolean(D.WT_SESSION)||Boolean(D.TERMINUS_SUBLIME)||D.ConEmuTask==="{cmd::Cmder}"||m==="Terminus-Sublime"||m==="vscode"||t==="xterm-256color"||t==="alacritty"||t==="rxvt-unicode"||t==="rxvt-unicode-256color"||D.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var ws="\x1B",cn=`${ws}[`;var hl={to(D,t){if(!t)return`${cn}${D+1}G`;return`${cn}${t+1};${D+1}H`},move(D,t){let m="";if(D<0)m+=`${cn}${-D}D`;else if(D>0)m+=`${cn}${D}C`;if(t<0)m+=`${cn}${-t}A`;else if(t>0)m+=`${cn}${t}B`;return m},up:(D=1)=>`${cn}${D}A`,down:(D=1)=>`${cn}${D}B`,forward:(D=1)=>`${cn}${D}C`,backward:(D=1)=>`${cn}${D}D`,nextLine:(D=1)=>`${cn}E`.repeat(D),prevLine:(D=1)=>`${cn}F`.repeat(D),left:`${cn}G`,hide:`${cn}?25l`,show:`${cn}?25h`,save:`${ws}7`,restore:`${ws}8`};var xg={screen:`${cn}2J`,up:(D=1)=>`${cn}1J`.repeat(D),down:(D=1)=>`${cn}J`.repeat(D),line:`${cn}2K`,lineEnd:`${cn}K`,lineStart:`${cn}1K`,lines(D){let t="";for(let m=0;m<D;m++)t+=this.line+(m<D-1?hl.up():"");if(D)t+=hl.left;return t}},Dg={screen:`${ws}c`};function iu(D,t){let m=[];for(let A=0;A<=t.length;A++)m[A]=[A];for(let A=0;A<=D.length;A++)m[0][A]=A;for(let A=1;A<=t.length;A++)for(let _=1;_<=D.length;_++)if(t.charAt(A-1)===D.charAt(_-1))m[A][_]=m[A-1][_-1];else m[A][_]=Math.min(m[A-1][_-1]+1,m[A][_-1]+1,m[A-1][_]+1);return m[t.length][D.length]}function wl(D,t,m=2,A=3){return t.map((_)=>({cmd:_,distance:iu(D,_)})).filter(({distance:_})=>_<=m).sort((_,z)=>_.distance-z.distance).slice(0,A).map(({cmd:_})=>_)}function ou(D,t={}){let m={_:[]},A=t.alias||{},_=new Set(t.boolean||[]),z={};for(let X of Object.keys(A))for(let ne of A[X])z[ne]=X;for(let X of _)if(A[X])for(let ne of A[X])_.add(ne);function U(X,ne){if(X===void 0)return ne;if(typeof ne==="boolean")return ne;return Array.isArray(X)?[...X,ne]:[X,ne]}function Y(X,ne){let re=z[X]||X,se=U(m[re],ne);if(m[re]=se,A[re])for(let fe of A[re])m[fe]=se;if(z[X]&&A[z[X]])for(let fe of A[z[X]])m[fe]=se;m[X]=se}for(let X=0;X<D.length;X++){let ne=D[X];if(ne==="--"){m._.push(...D.slice(X+1));break}if(ne.startsWith("--")){let re=ne.indexOf("=");if(re!==-1){let se=vs(ne.slice(2,re)),fe=ne.slice(re+1);Y(se,fe)}else{let se=ne.slice(2);if(se.startsWith("no-")){let Ie=vs(se.slice(3));Y(Ie,!1);continue}let fe=vs(se),$e=z[fe]||fe;if(_.has($e)||_.has(fe))Y(fe,!0);else{let Ie=D[X+1];if(Ie!==void 0&&!Ie.startsWith("-"))Y(fe,Ie),X++;else Y(fe,!0)}}}else if(ne.startsWith("-")&&ne.length>1){let re=ne.slice(1);for(let se=0;se<re.length;se++){let fe=re[se],$e=z[fe]||fe;if(se===re.length-1&&!_.has($e)&&!_.has(fe)){let Ie=D[X+1];if(Ie!==void 0&&!Ie.startsWith("-"))Y(fe,Ie),X++;else Y(fe,!0)}else Y(fe,!0)}}else m._.push(ne)}return m}class Sl{rawName;description;name;names;isBoolean;required;config;negated;constructor(D,t,m){if(this.rawName=D,this.description=t,this.config=Object.assign({},m),D=D.replace(/\.\*/g,""),this.negated=!1,this.names=ca(D).split(",").map((A)=>{let _=A.trim().replace(/^-{1,2}/,"");if(_.startsWith("no-"))this.negated=!0,_=_.replace(/^no-/,"");return Bo(_)}).sort((A,_)=>A.length>_.length?1:-1),this.name=this.names[this.names.length-1],this.negated&&this.config.default==null)this.config.default=!0;if(D.includes("<"))this.required=!0;else if(D.includes("["))this.required=!1;else this.isBoolean=!0}}var Tg=la.argv,su=`${la.platform}-${la.arch} bun-v${typeof Bun<"u"?Bun.version:"unknown"}`,yl=bs.argv,au=`${bs.platform}-${bs.arch} node-${bs.version}`;class da{rawName;description;config;cli;options;aliasNames;name;namespace;args;commandAction;usageText;versionNumber;examples;helpCallback;globalCommand;beforeHooks;afterHooks;middleware;constructor(D,t,m,A){this.rawName=D,this.description=t,this.config=m,this.cli=A,this.options=[],this.aliasNames=[],this.name=ca(D);let _=ca(D),z=_.indexOf(":");if(z>0)this.namespace=_.substring(0,z),this.name=_.substring(z+1);if(this.args=Zd(D),this.examples=[],this.beforeHooks=[],this.afterHooks=[],this.middleware=[],!m)this.config={}}usage(D){return this.usageText=D,this}allowUnknownOptions(){return this.config.allowUnknownOptions=!0,this}ignoreOptionDefaultValue(){return this.config.ignoreOptionDefaultValue=!0,this}version(D,t="-v, --version"){return this.versionNumber=D,this.option(t,"Display version number"),this}example(D){return this.examples.push(D),this}option(D,t,m){let A=new Sl(D,t,m);return this.options.push(A),this}alias(D){return this.aliasNames.push(D),this}action(D){return this.commandAction=D,this}before(D){return this.beforeHooks.push(D),this}after(D){return this.afterHooks.push(D),this}use(D){return this.middleware.push(D),this}isMatched(D){if(this.aliasNames.includes(D))return!0;if(this.namespace)return`${this.namespace}:${this.name}`===D;return this.name===D}get isDefaultCommand(){return this.name===""||this.aliasNames.includes("!")}get isGlobalCommand(){return this instanceof fa}get displayName(){return this.namespace?`${this.namespace}:${this.name}`:this.name}hasOption(D){let t=Bo(D.split(".")[0]);return!!this.options.find((m)=>m.names.some((A)=>Bo(A)===t))}outputHelp(){let{name:D,commands:t}=this.cli,{versionNumber:m,options:A,helpCallback:_}=this.cli.globalCommand,z=[{body:`${D}${m?`/${m}`:""}`}];if(z.push({title:"Usage",body:` $ ${D} ${this.usageText||this.rawName}`}),(this.isGlobalCommand||this.isDefaultCommand)&&t.length>0){let ne=gl(t.map((Ie)=>Ie.rawName)),re=new Map,se=[];for(let Ie of t)if(Ie.namespace){if(!re.has(Ie.namespace))re.set(Ie.namespace,[]);re.get(Ie.namespace).push(Ie)}else se.push(Ie);let fe="";if(se.sort((Ie,he)=>Ie.rawName<he.rawName?-1:Ie.rawName>he.rawName?1:0),se.length>0)fe+=se.map((Ie)=>` ${ia(Ie.rawName,ne.length)} ${Ie.description}`).join(`
@@ -28,7 +28,7 @@ Received ${m}, cleaning up...`),D)try{await D()}catch(A){console.error("Error du
28
28
  `)),this.enableDidYouMean){let t=[];for(let A of this.commands){if(A.displayName)t.push(A.displayName);if(A.aliasNames)t.push(...A.aliasNames)}let m=wl(D,t);if(m.length>0)console.log(No.yellow("Did you mean one of these?")),m.forEach((A)=>console.log(` ${No.dim("•")} ${this.name} ${A}`)),console.log("")}console.log(No.dim("Run"),`${this.name} --help`,No.dim("to see all available commands")),Ei.exit(1)}async parse(D=yl,t={}){let{run:m=!0,exitOnError:A=!1}=t;if(A)try{return await this.parse(D,{run:m})}catch(X){throw this.handleUsageError(X),X}if(this.rawArgs=D,!this.name)this.name=D[1]?tu(D[1]):"cli";let _=!0,z=D.slice(2),U=z[0];if(U&&!U.startsWith("-")){for(let X of this.commands)if(X.isMatched(U)){let ne=this.mri(z,X);_=!1;let re={...ne,args:ne.args.slice(1)};this.setParsedInfo(re,X,U),this.emit(`command:${U}`,X);break}if(_){let X=z[1];if(X&&!X.startsWith("-")){let ne=`${U}:${X}`;for(let re of this.commands)if(re.isMatched(ne)){let se=this.mri(z,re);_=!1;let fe={...se,args:se.args.slice(2)};this.setParsedInfo(fe,re,ne),this.emit(`command:${ne}`,re);break}}}}if(_){for(let X of this.commands)if(X.name===""){_=!1;let ne=this.mri(z,X);this.setParsedInfo(ne,X),this.emit("command:!",X);break}}if(_){let X=this.mri(D.slice(2));this.setParsedInfo(X)}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(D,t){let m=[...this.globalCommand.options,...t?t.options:[]],A=Qd(m),_=[],z=D.indexOf("--");if(z>-1)_=D.slice(z+1),D=D.slice(0,z);let U=ou(D,A),Y={_:U._};for(let fe of Object.keys(U))if(fe!=="_")Y[Bo(fe)]=U[fe];let X=Y._,ne={"--":_},re=t&&t.config.ignoreOptionDefaultValue?t.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,se=Object.create(null);for(let fe of m){if(!re&&fe.config.default!==void 0)for(let $e of fe.names)ne[$e]=fe.config.default;if(Array.isArray(fe.config.type)){if(se[fe.name]===void 0)se[fe.name]={shouldTransform:!0,transformFunction:fe.config.type[0]}}}for(let fe of Object.keys(Y))if(fe!=="_"){let $e=fe.split(".");Xd(ne,$e,Y[fe]),eu(ne,se)}return{args:X,options:ne}}async run(D=yl){return this.parse(D,{run:!0,exitOnError:!0})}handleUsageError(D){if(!nu(D)||D.isUsageError===!1)return;let t=D.message||"command-line error",m=this.name?`${this.name}: `:"",A=/--help/.test(t)?"":D.usage?`
29
29
  Usage: ${D.usage}`:`
30
30
  Run \`${this.name??"cli"} --help\` for usage.`;Ei.stderr.write(`${m}${t}${A}
31
- `),Ei.exit(D.exitCode??2)}async runMatchedCommand(){let{args:D,options:t,matchedCommand:m}=this;if(!m||!m.commandAction)return;m.checkUnknownOptions(),m.checkOptionValue(),m.checkRequiredArgs();let A=[];m.args.forEach((Y,X)=>{if(Y.variadic)A.push(D.slice(X));else A.push(D[X])}),A.push(t);let _={command:m,args:A,options:t};for(let Y of m.beforeHooks)await Y(_);let z,U=async()=>{let Y=m.commandAction.apply(this,A);if(Y instanceof Promise)z=await Y;else z=Y;return z};if(m.middleware.length>0){let Y=0,X=async()=>{if(Y<m.middleware.length){let ne=m.middleware[Y++];await ne({..._,next:X})}else await U()};await X()}else await U();for(let Y of m.afterHooks)await Y(_);return z}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return Ei.removeAllListeners("SIGINT"),Ei.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 $l{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(D){if(!this.enabled){this.misses++;return}let t=this.cache.get(D);if(!t){this.misses++;return}if(Date.now()-t.timestamp>t.ttl){this.cache.delete(D),this.misses++;return}return this.hits++,t.value}set(D,t,m=5000){if(!this.enabled)return;this.cache.set(D,{value:t,timestamp:Date.now(),ttl:m})}has(D){if(!this.enabled)return!1;let t=this.cache.get(D);if(!t)return!1;if(Date.now()-t.timestamp>t.ttl)return this.cache.delete(D),!1;return!0}delete(D){this.cache.delete(D)}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 D=Date.now();for(let[t,m]of this.cache.entries())if(D-m.timestamp>m.ttl)this.cache.delete(t)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var Og=new $l;function uu(){if("FORCE_COLOR"in Oo.env)return Oo.env.FORCE_COLOR!=="0";if("NO_COLOR"in Oo.env||Oo.env.TERM==="dumb")return!1;if(Oo.platform==="win32")return!0;return vl.isatty(1)&&vl.isatty(2)}var Cl=uu();function sn(D,t){if(!Cl)return(m)=>m;return(m)=>D+m+t}var pu=sn("\x1B[0m","\x1B[0m"),mu=sn("\x1B[31m","\x1B[39m"),fu=sn("\x1B[32m","\x1B[39m"),gu=sn("\x1B[33m","\x1B[39m"),hu=sn("\x1B[34m","\x1B[39m"),yu=sn("\x1B[35m","\x1B[39m"),vu=sn("\x1B[36m","\x1B[39m"),bu=sn("\x1B[37m","\x1B[39m"),wu=sn("\x1B[90m","\x1B[39m"),Su=sn("\x1B[1m","\x1B[22m"),$u=sn("\x1B[3m","\x1B[23m"),Cu=sn("\x1B[4m","\x1B[24m"),Au=sn("\x1B[2m","\x1B[22m"),ku=sn("\x1B[7m","\x1B[27m"),Ru=sn("\x1B[8m","\x1B[28m"),Iu=sn("\x1B[9m","\x1B[29m"),Pu=sn("\x1B[41m","\x1B[49m"),xu=sn("\x1B[42m","\x1B[49m"),Du=sn("\x1B[43m","\x1B[49m"),Eu=sn("\x1B[44m","\x1B[49m"),Tu=sn("\x1B[45m","\x1B[49m"),Nu=sn("\x1B[46m","\x1B[49m"),Ou=sn("\x1B[47m","\x1B[49m"),Lu=Cl,ju={reset:pu,red:mu,green:fu,yellow:gu,blue:hu,magenta:yu,cyan:vu,white:bu,gray:wu,bold:Su,italic:$u,underline:Cu,dim:Au,inverse:ku,hidden:Ru,strikethrough:Iu,bgRed:Pu,bgGreen:xu,bgYellow:Du,bgBlue:Eu,bgMagenta:Tu,bgCyan:Nu,bgWhite:Ou,isColorSupported:Lu},Fu=ju,Mu=["up","down","left","right","space","enter","cancel"],_g={actions:new Set(Mu),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};var zg=Bu.platform.startsWith("win"),Ug=Symbol("clapp:cancel");var _u=ru();var on=(D,t)=>_u?D:t,Vg=on("◆","*"),Wg=on("■","x"),qg=on("▲","x"),Gg=on("◇","o"),Hg=on("┌","T"),zu=on("│","|"),Kg=on("└","—"),Jg=on("●",">"),Yg=on("○"," "),Zg=on("◻","[•]"),Qg=on("◼","[+]"),Xg=on("◻","[ ]"),eh=on("▪","•"),th=on("─","-"),nh=on("╮","+"),rh=on("├","+"),ih=on("╯","+"),oh=on("●","•"),sh=on("◆","*"),ah=on("▲","!"),ch=on("■","x");var lh={light:on("─","-"),heavy:on("━","="),block:on("█","#")};function Uu(){return`${Fu.gray(zu)} `}var dh=Uu();var wa="0.16.38";function Al(D,t,m=process.env){let A=t?.options.find((U)=>U.name==="profile");if((!A||/\baws\b/i.test(A.description))&&typeof D.profile==="string"&&D.profile)m.AWS_PROFILE=D.profile,delete m.AWS_ACCESS_KEY_ID,delete m.AWS_SECRET_ACCESS_KEY,delete m.AWS_SESSION_TOKEN;if(!t?.options.some((U)=>U.name==="region")&&typeof D.region==="string"&&D.region)m.AWS_REGION=D.region,m.AWS_DEFAULT_REGION=D.region}import{existsSync as Sa}from"node:fs";import{mkdir as Wu,writeFile as kl}from"node:fs/promises";function $a(D){D.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"),Sa("cloud.config.ts")){if(!await d("cloud.config.ts already exists. Overwrite?",!1)){e("Initialization cancelled");return}}let m=t?.name||await R("Project name","my-app"),A=t?.mode||await Ao("Select deployment mode",["serverless","server"]),_=t?.region||await Ao("Select AWS region",["us-east-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1"]),z=new s("Creating configuration file...");z.start();let U=`import { defineConfig } from '@ts-cloud/core'
31
+ `),Ei.exit(D.exitCode??2)}async runMatchedCommand(){let{args:D,options:t,matchedCommand:m}=this;if(!m||!m.commandAction)return;m.checkUnknownOptions(),m.checkOptionValue(),m.checkRequiredArgs();let A=[];m.args.forEach((Y,X)=>{if(Y.variadic)A.push(D.slice(X));else A.push(D[X])}),A.push(t);let _={command:m,args:A,options:t};for(let Y of m.beforeHooks)await Y(_);let z,U=async()=>{let Y=m.commandAction.apply(this,A);if(Y instanceof Promise)z=await Y;else z=Y;return z};if(m.middleware.length>0){let Y=0,X=async()=>{if(Y<m.middleware.length){let ne=m.middleware[Y++];await ne({..._,next:X})}else await U()};await X()}else await U();for(let Y of m.afterHooks)await Y(_);return z}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return Ei.removeAllListeners("SIGINT"),Ei.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 $l{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(D){if(!this.enabled){this.misses++;return}let t=this.cache.get(D);if(!t){this.misses++;return}if(Date.now()-t.timestamp>t.ttl){this.cache.delete(D),this.misses++;return}return this.hits++,t.value}set(D,t,m=5000){if(!this.enabled)return;this.cache.set(D,{value:t,timestamp:Date.now(),ttl:m})}has(D){if(!this.enabled)return!1;let t=this.cache.get(D);if(!t)return!1;if(Date.now()-t.timestamp>t.ttl)return this.cache.delete(D),!1;return!0}delete(D){this.cache.delete(D)}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 D=Date.now();for(let[t,m]of this.cache.entries())if(D-m.timestamp>m.ttl)this.cache.delete(t)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var Og=new $l;function uu(){if("FORCE_COLOR"in Oo.env)return Oo.env.FORCE_COLOR!=="0";if("NO_COLOR"in Oo.env||Oo.env.TERM==="dumb")return!1;if(Oo.platform==="win32")return!0;return vl.isatty(1)&&vl.isatty(2)}var Cl=uu();function sn(D,t){if(!Cl)return(m)=>m;return(m)=>D+m+t}var pu=sn("\x1B[0m","\x1B[0m"),mu=sn("\x1B[31m","\x1B[39m"),fu=sn("\x1B[32m","\x1B[39m"),gu=sn("\x1B[33m","\x1B[39m"),hu=sn("\x1B[34m","\x1B[39m"),yu=sn("\x1B[35m","\x1B[39m"),vu=sn("\x1B[36m","\x1B[39m"),bu=sn("\x1B[37m","\x1B[39m"),wu=sn("\x1B[90m","\x1B[39m"),Su=sn("\x1B[1m","\x1B[22m"),$u=sn("\x1B[3m","\x1B[23m"),Cu=sn("\x1B[4m","\x1B[24m"),Au=sn("\x1B[2m","\x1B[22m"),ku=sn("\x1B[7m","\x1B[27m"),Ru=sn("\x1B[8m","\x1B[28m"),Iu=sn("\x1B[9m","\x1B[29m"),Pu=sn("\x1B[41m","\x1B[49m"),xu=sn("\x1B[42m","\x1B[49m"),Du=sn("\x1B[43m","\x1B[49m"),Eu=sn("\x1B[44m","\x1B[49m"),Tu=sn("\x1B[45m","\x1B[49m"),Nu=sn("\x1B[46m","\x1B[49m"),Ou=sn("\x1B[47m","\x1B[49m"),Lu=Cl,ju={reset:pu,red:mu,green:fu,yellow:gu,blue:hu,magenta:yu,cyan:vu,white:bu,gray:wu,bold:Su,italic:$u,underline:Cu,dim:Au,inverse:ku,hidden:Ru,strikethrough:Iu,bgRed:Pu,bgGreen:xu,bgYellow:Du,bgBlue:Eu,bgMagenta:Tu,bgCyan:Nu,bgWhite:Ou,isColorSupported:Lu},Fu=ju,Mu=["up","down","left","right","space","enter","cancel"],_g={actions:new Set(Mu),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};var zg=Bu.platform.startsWith("win"),Ug=Symbol("clapp:cancel");var _u=ru();var on=(D,t)=>_u?D:t,Vg=on("◆","*"),Wg=on("■","x"),qg=on("▲","x"),Gg=on("◇","o"),Hg=on("┌","T"),zu=on("│","|"),Kg=on("└","—"),Jg=on("●",">"),Yg=on("○"," "),Zg=on("◻","[•]"),Qg=on("◼","[+]"),Xg=on("◻","[ ]"),eh=on("▪","•"),th=on("─","-"),nh=on("╮","+"),rh=on("├","+"),ih=on("╯","+"),oh=on("●","•"),sh=on("◆","*"),ah=on("▲","!"),ch=on("■","x");var lh={light:on("─","-"),heavy:on("━","="),block:on("█","#")};function Uu(){return`${Fu.gray(zu)} `}var dh=Uu();var wa="0.16.39";function Al(D,t,m=process.env){let A=t?.options.find((U)=>U.name==="profile");if((!A||/\baws\b/i.test(A.description))&&typeof D.profile==="string"&&D.profile)m.AWS_PROFILE=D.profile,delete m.AWS_ACCESS_KEY_ID,delete m.AWS_SECRET_ACCESS_KEY,delete m.AWS_SESSION_TOKEN;if(!t?.options.some((U)=>U.name==="region")&&typeof D.region==="string"&&D.region)m.AWS_REGION=D.region,m.AWS_DEFAULT_REGION=D.region}import{existsSync as Sa}from"node:fs";import{mkdir as Wu,writeFile as kl}from"node:fs/promises";function $a(D){D.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"),Sa("cloud.config.ts")){if(!await d("cloud.config.ts already exists. Overwrite?",!1)){e("Initialization cancelled");return}}let m=t?.name||await R("Project name","my-app"),A=t?.mode||await Ao("Select deployment mode",["serverless","server"]),_=t?.region||await Ao("Select AWS region",["us-east-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1"]),z=new s("Creating configuration file...");z.start();let U=`import { defineConfig } from '@ts-cloud/core'
32
32
 
33
33
  export default defineConfig({
34
34
  project: {
@@ -315,7 +315,7 @@ Resources to create: ${xe}`);let We={};for(let Be of Object.values(ne.Resources|
315
315
  No changes detected - infrastructure is up to date`);return}if(e(`
316
316
  Changes detected:
317
317
  `),Re.length>0){n(`Resources to add (${Re.length}):`);for(let Pe of Re){let xe=$e[Pe].Type;e(` + ${Pe} (${xe})`)}console.log()}if(Te.length>0){r(`Resources to remove (${Te.length}):`);for(let Pe of Te){let xe=fe[Pe].Type;e(` - ${Pe} (${xe})`)}console.log()}if(Ae.length>0){a(`Resources to modify (${Ae.length}):`);for(let Pe of Ae){let xe=$e[Pe].Type;e(` ~ ${Pe} (${xe})`)}console.log()}e("Summary:"),e(` - Add: ${Re.length}`),e(` - Remove: ${Te.length}`),e(` - Modify: ${Ae.length}`),e("\nRun `cloud deploy` to apply these changes")}catch(m){r(`Diff failed: ${m.message}`)}})}function Li(D,t=0){let m=Number(D);return Number.isFinite(m)?m:t}function xa(D){return Li(D)*1024}function $p(D){let t=D?.date?.trim(),m=D?.time?.trim();if(!t||!m)return null;let A=new Date(`${t}T${m}Z`);return Number.isFinite(A.getTime())?A.toISOString():null}function Cp(D,t,m){let A;try{A=JSON.parse(D)}catch{return[]}let _=(A?.sysstat?.hosts??[]).flatMap((U)=>U.statistics??[]),z=[];for(let U of _){let Y=$p(U.timestamp);if(!Y)continue;let X=new Date(Y).getTime();if(X<t.getTime()||X>m.getTime())continue;let ne=U["cpu-load"]?.find((se)=>se.cpu==="all")??U["cpu-load"]?.[0],re=Li(ne?.idle,100);z.push({timestamp:Y,cpuUsedPercent:Math.max(0,Math.min(100,100-re)),cpuUserPercent:Li(ne?.user),cpuSystemPercent:Li(ne?.system),cpuIowaitPercent:Li(ne?.iowait),memoryUsedPercent:Li(U.memory?.["memused-percent"]),memoryUsedBytes:xa(U.memory?.memused),memoryAvailableBytes:xa(U.memory?.avail),swapUsedPercent:Li(U.memory?.["swpused-percent"]),swapUsedBytes:xa(U.memory?.swpused)})}return z.sort((U,Y)=>U.timestamp.localeCompare(Y.timestamp))}function Ap(D){return Object.fromEntries(Object.entries(D.time_series??{}).map(([t,m])=>[t,(m.values??[]).map(([A,_])=>({timestamp:new Date(Number(A)*1000).toISOString(),value:Li(_,Number.NaN)})).filter((A)=>Number.isFinite(A.value))]))}function Ml(D){return D.length?D.reduce((t,m)=>t+m,0)/D.length:null}function Da(D){return D.length?Math.max(...D):null}function kp(D){return D.length?Math.min(...D):null}async function _l(D){let[t,m]=await Promise.all([D.client.getServerMetrics(D.serverId,{types:["cpu","disk","network"],start:D.from,end:D.to,step:D.step}),Ne(D.remote.host,"LC_ALL=C sadf -j -- -u -r -S",D.remote).catch(()=>"")]),A=Cp(m,D.from,D.to),_=Ap(t),U=(_.cpu??[]).map((se)=>Math.max(0,Math.min(100,se.value/Math.max(1,D.cores)))),Y=A.map((se)=>se.cpuUsedPercent),X=U.length?U:Y,ne=A.map((se)=>se.memoryUsedPercent),re=A.map((se)=>se.swapUsedPercent);return{from:D.from.toISOString(),to:D.to.toISOString(),cores:D.cores,host:A,provider:_,summary:{cpuAveragePercent:Ml(X),cpuPeakPercent:Da(X),memoryAveragePercent:Ml(ne),memoryPeakPercent:Da(ne),memoryMinimumAvailableBytes:kp(A.map((se)=>se.memoryAvailableBytes)),swapPeakPercent:Da(re)}}}function Rp(D){if(D.length===0)throw Error("A server name cannot be empty.");if(D.length>253)throw Error(`'${D}' is longer than the 253 characters a hostname allows.`);for(let t of D.split(".")){if(t.length===0)throw Error(`'${D}' 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 zl(D,t,m){if(Rp(t),D===t)throw Error(`'${D}' is already named that.`);if((await m.takenNames()).some((z)=>z===t&&z!==D))throw Error(`'${t}' is already taken. Server names have to be unique within a provider project.`);let _=[];if(m.providerName&&m.renameProvider){let{providerName:z,renameProvider:U}=m;_.push({id:"provider",title:"Rename the server at the provider",change:{from:D,to:t},satisfied:async()=>await z()===t,apply:()=>U(t)})}if(m.stateName&&m.writeStateName){let{stateName:z,writeStateName:U}=m;_.push({id:"state-pin",title:"Update the recorded name in the local driver state",change:{from:D,to:t},satisfied:async()=>{let Y=await z();return Y===void 0||Y===t},apply:()=>U(t)})}if(m.remoteHostname&&m.setRemoteHostname){let{remoteHostname:z,setRemoteHostname:U}=m;_.push({id:"hostname",title:"Set the hostname on the box",change:{from:D,to:t},satisfied:async()=>await z()===t,apply:()=>U(t)})}return _.push({id:"inventory",title:"Rename the fleet inventory record",change:{from:D,to:t},satisfied:async()=>m.inventoryName()===t,apply:async()=>{await m.renameInventory(t)}}),{operation:"server:rename",target:D,steps:_}}function Ul(D){let t=`'${D.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${D}/" /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 Ip(){let D=await Ee(),t=y(process.cwd(),D),m=new De(t.store),A=new Pn(m,[new it("aws"),new it("hetzner"),new it("ssh")]);return{controlPlane:t,store:m,service:A}}async function gi(D){let t=await Ip();try{return await D(t)}finally{t.controlPlane.store.close()}}var Mi=(D,t)=>{let m=D.store.list(D.controlPlane.project.id).find((A)=>A.id===t||A.name===t);if(!m)throw Error(`Server ${t} was not found.`);return m},vn=(D)=>{r(D instanceof Error?D.message:String(D)),process.exitCode=1};function Ea(D,t){let m=Number.parseInt(D??"",10);return Number.isFinite(m)&&m>=0?m:t}function Pp(D="3h"){let t=D.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 qo(D,t="%"){return D==null?"unavailable":`${D.toFixed(1)}${t}`}async function xp(D,t){let m=await Ee();if(m.cloud?.provider!=="hetzner")throw Error("server:monitoring currently requires the Hetzner provider.");let A=t.env??process.env.CLOUD_ENV??"production",_=T(m,A),z=await pe(_);if(!z?.serverId)throw Error(`No pinned Hetzner server was found for ${_}.`);if(![z.serverName,String(z.serverId),z.stackName].includes(D))throw Error(`Refusing to read ${D}: project state is pinned to ${z.serverName}.`);let U=lr(m),Y=new qe({apiToken:dr(U.apiToken,m)}),X=await Y.getServer(z.serverId),ne=z.publicIp??X.public_net.ipv4?.ip;if(!ne)throw Error(`Server ${X.name} has no public IPv4 address.`);let re=new Date,se=new Date(re.getTime()-Pp(t.range)),fe=Math.min(3600,Math.max(60,Ea(t.step,60))),$e=await _l({client:Y,serverId:X.id,cores:Math.max(1,Number(X.server_type.cores)||1),from:se,to:re,step:fe,remote:{host:ne,user:z.sshUser??U.sshUser,identityFile:U.sshPrivateKeyPath,connectTimeoutSec:15}});if(t.json){console.log(JSON.stringify({schemaVersion:1,server:X.name,result:$e},null,2));return}c(["Server","Window","CPU average / peak","RAM average / peak","Minimum available","Swap peak"],[[X.name,`${$e.from} to ${$e.to}`,`${qo($e.summary.cpuAveragePercent)} / ${qo($e.summary.cpuPeakPercent)}`,`${qo($e.summary.memoryAveragePercent)} / ${qo($e.summary.memoryPeakPercent)}`,$e.summary.memoryMinimumAvailableBytes==null?"unavailable":`${($e.summary.memoryMinimumAvailableBytes/1073741824).toFixed(2)} GB`,qo($e.summary.swapPeakPercent)]])}function Vl(D){let t=D.targetType.prices?.find((m)=>m.location===D.location);return{serverId:D.serverId,serverName:D.serverName,location:D.location,from:D.currentType.name,to:D.targetType.name,capacityAvailable:D.capacityAvailable,alreadyComplete:D.alreadyComplete,upgradeDisk:D.upgradeDisk,target:{cores:D.targetType.cores,memoryGb:D.targetType.memory,diskGb:D.targetType.disk,architecture:D.targetType.architecture,cpuType:D.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 Dp(D){let t=Vl(D);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 Ep(D,t,m){let A=await Ee();if(A.cloud?.provider!=="hetzner")throw Error("server:resize currently requires the Hetzner provider.");let _=m.env??process.env.CLOUD_ENV??"production",z=T(A,_),U=await pe(z),Y=lr(A),X=new qe({apiToken:dr(Y.apiToken,A)}),re=U&&(D===U.serverName||D===String(U.serverId)||D===U.stackName)?await X.getServer(U.serverId):(await X.listServers()).find((Be)=>Be.name===D||String(Be.id)===D);if(!re)throw Error(`Hetzner server ${D} was not found.`);if(U?.serverId&&U.serverId!==re.id)throw Error(`Refusing to resize ${D}: project state is pinned to server ${U.serverId}.`);let se=dt(t),fe=m.upgradeDisk!==!1,$e=await oi(X,re.id,se,fe);if(m.json)console.log(JSON.stringify({schemaVersion:1,plan:Vl($e)},null,2));else Dp($e);if(!m.apply){if(!m.json)e(`Preview only. Re-run with --apply --confirm ${re.name} to execute.`);return}if(m.confirm!==re.name)throw Error(`Resize requires --confirm ${re.name}.`);let Ie=U?.publicIp??re.public_net.ipv4?.ip;if(!Ie)throw Error(`Server ${re.name} has no public IPv4 address for verification.`);let he={host:Ie,user:U?.sshUser??Y.sshUser,identityFile:Y.sshPrivateKeyPath,connectTimeoutSec:15,sshTimeoutMs:600000,routeTimeoutMs:20000},Re=await os(z),Te=new Date().toISOString(),Ae={schemaVersion:1,operationId:Re?.targetType===se&&Re.serverId===re.id?Re.operationId:crypto.randomUUID(),stackName:z,serverId:re.id,serverName:re.name,sourceType:$e.currentType.name,targetType:se,upgradeDisk:fe,phase:"planning",status:"running",attempts:Re?.targetType===se?Re.attempts:0,startedAt:Re?.targetType===se?Re.startedAt:Te,updatedAt:Te,manifest:Re?.targetType===se?Re.manifest:void 0};await pt(Ae);let Pe=Ea(m.pollSeconds,900)*1000,xe=Ea(m.maxWaitMinutes,0)*60000,We=Date.now();for(;;){let Be=await oi(X,re.id,se,fe);if(!Be.capacityAvailable&&!Be.alreadyComplete){if(Ae={...Ae,phase:"waiting-capacity",status:"waiting-capacity",updatedAt:new Date().toISOString()},await pt(Ae),!m.wait){if(!m.json)e(`${se} has no capacity in ${Be.location}. The server remains running and unchanged. Use --wait to poll safely.`);return}if(xe>0&&Date.now()-We>=xe)throw Error(`Timed out waiting for ${se} capacity in ${Be.location}.`);if(!m.json)e(`Waiting ${Math.round(Pe/1000)} seconds for ${se} capacity...`);await Bun.sleep(Pe);continue}let Ue=await ss(z);try{let et=await(async()=>{try{return Ae={...Ae,status:"running",attempts:Ae.attempts+1,updatedAt:new Date().toISOString()},await pt(Ae),await Zo({client:X,serverId:re.id,targetType:se,upgradeDisk:fe,resumeFromOff:Ae.phase==="shutting-down"||Ae.phase==="resizing"||Ae.phase==="powering-on"||Ae.phase==="verifying",manifest:Ae.manifest,hooks:{preflight:async()=>{let Rt=await es(he);return Ae={...Ae,manifest:Rt,updatedAt:new Date().toISOString()},await pt(Ae),Rt},afterBoot:async(Rt,Et,wt,Pt)=>ts(he,Et,wt,Pt),onPhase:async(Rt,Et)=>{if(Ae={...Ae,phase:Rt,status:Rt==="waiting-capacity"?"waiting-capacity":Rt==="complete"?"completed":"running",updatedAt:new Date().toISOString()},await pt(Ae),!m.json)e(`${Rt}${Et?` ${JSON.stringify(Et)}`:""}`)}}})}finally{await Ue()}})();if(Ae={...Ae,status:et.status==="completed"||et.status==="already-complete"?"completed":et.status==="recovered"?"recovered":"waiting-capacity",lastError:et.status==="recovered"?et.error:void 0,updatedAt:new Date().toISOString()},await pt(Ae),m.json)console.log(JSON.stringify({schemaVersion:1,result:et},null,2));else if(et.status==="completed"||et.status==="already-complete")n(`${re.name} is on ${se} and passed full post-boot verification.`);else if(et.status==="recovered"&&et.retryable&&m.wait){e(`Capacity race recovered safely. Waiting ${Math.round(Pe/1000)} seconds before retry.`),await Bun.sleep(Pe);continue}else if(et.status==="recovered")throw Error(`Resize did not complete and the original server was recovered: ${et.error}`);return}catch(et){throw Ae={...Ae,status:"failed",lastError:et instanceof Error?et.message:String(et),updatedAt:new Date().toISOString()},await pt(Ae),et}}}async function Tp(D,t){let m=await Ee();if(m.cloud?.provider!=="hetzner")throw Error("server:optimize currently requires the Hetzner provider.");let A=t.env??process.env.CLOUD_ENV??"production",_=T(m,A),z=await pe(_);if(!z?.serverId)throw Error(`No pinned Hetzner server was found for ${_}.`);if(![z.serverName,String(z.serverId),z.stackName].includes(D))throw Error(`Refusing to optimize ${D}: project state is pinned to ${z.serverName}.`);let U=lr(m),Y=new qe({apiToken:dr(U.apiToken,m)}),X=await Y.getServer(z.serverId),ne=z.publicIp??X.public_net.ipv4?.ip;if(!ne)throw Error(`Server ${X.name} has no public IPv4 address.`);let re=Qi(m);if(t.json)console.log(JSON.stringify({schemaVersion:1,server:X.name,plan:re},null,2));else c(["Server","Firewall ports","Monitoring","Auto updates","Swap","SSH passwords"],[[X.name,re.firewallPorts.join(","),re.monitoring?"on":"off",re.autoUpdates?"on":"off",`${re.swapGb} GB`,"disabled"]]);if(!t.apply){if(!t.json)e(`Preview only. Re-run with --apply --confirm ${X.name} to execute.`);return}if(t.confirm!==X.name)throw Error(`Optimization requires --confirm ${X.name}.`);let se={host:ne,user:z.sshUser??U.sshUser,identityFile:U.sshPrivateKeyPath,connectTimeoutSec:15},fe=await Qr(se),$e=fe.routeProbes.filter((wt)=>!wt.ok),Ie=m.infrastructure?.compute,he=Z(Ie)?new Set(["nginx.service","bun-gateway.service","ts-cloud-nginx.service"]):new Set,Re=fe.failedUnits.filter((wt)=>!he.has(wt));if(Re.length>0)throw Error(`Preflight found failed services: ${Re.join(", ")}`);if($e.length>0)throw Error(`Preflight found unhealthy routes: ${$e.map((wt)=>wt.domain).join(", ")}`);let Te=Z(Ie)?[]:Object.values(m.sites??{}).flatMap((wt)=>typeof wt?.port==="number"&&![80,443].includes(wt.port)?[wt.port]:[]),Ae=Jr({allowSsh:Ie?.allowSsh!==!1,sitePorts:Te,allowedPorts:Ie?.firewall?.allowedPorts}),Pe=(z.firewallId?(await Y.listFirewalls()).find((wt)=>wt.id===z.firewallId):void 0)??(await Y.listFirewalls()).find((wt)=>wt.name===`${m.project.slug}-${A}-app-fw`);if(!Pe)throw Error(`Managed firewall for ${X.name} was not found.`);let xe=await Y.setFirewallRules(Pe.id,Ae);await Promise.all(xe.map((wt)=>Y.waitForAction(wt.id))),await rs(m,se);let[We,Be]=await Promise.all([Qr(se),ns(se)]),Ue=is(re,Be),et=cc(fe,We),Rt=We.routeProbes.filter((wt)=>!wt.ok);if(et.stoppedServices.length>0)Ue.push(`services stopped: ${et.stoppedServices.join(", ")}`);if(et.changedRouteFragments.length>0)Ue.push(`route fragments changed: ${et.changedRouteFragments.join(", ")}`);if(et.missingRouteIds.length>0)Ue.push(`routes disappeared: ${et.missingRouteIds.join(", ")}`);if(et.changedReleaseLinks.length>0)Ue.push(`release links changed: ${et.changedReleaseLinks.join(", ")}`);if(et.missingData.length>0)Ue.push(`databases or volumes disappeared: ${et.missingData.join(", ")}`);if(Rt.length>0)Ue.push(`unhealthy routes: ${Rt.map((wt)=>wt.domain).join(", ")}`);if(Ue.length>0)throw Error(`Host optimization verification failed: ${Ue.join("; ")}`);let Et={serverId:X.id,serverName:X.name,services:We.runningServices.length,routes:We.routeIds.length,healthyDomains:We.routeProbes.length,releaseLinks:We.releaseLinks.length,databasesAndVolumes:We.dataCatalog.length,report:Be};if(t.json)console.log(JSON.stringify({schemaVersion:1,result:Et},null,2));else n(`${X.name} passed full host, rpx route, service, release, and data verification.`)}async function Np(D,t,m){let A=await Ee(),_=m.env??"production",z=T(A,_);await gi(async(U)=>{let Y=Mi(U,D),X=U.store.list(U.controlPlane.project.id,!0),ne=Y.provider==="hetzner"&&Y.providerId?(()=>{try{let Pe=lr(A);return new qe({apiToken:dr(Pe.apiToken,A)})}catch{return null}})():null,re=Y.providerId?Number(Y.providerId):Number.NaN,se=await pe(z),fe=se!=null&&se.serverId===re,$e=new Mr,Ie=Y.trustState==="pinned",he={takenNames:async()=>{let Pe=X.map((xe)=>xe.name);if(ne)Pe.push(...(await ne.listServers()).map((xe)=>xe.name));return Pe},inventoryName:()=>U.store.get(Y.id)?.name??Y.name,renameInventory:(Pe)=>{U.store.update(Y.id,{name:Pe})},...ne&&Number.isFinite(re)?{providerName:async()=>(await ne.getServer(re)).name,renameProvider:async(Pe)=>{await ne.renameServer(re,Pe)}}:{},...fe?{stateName:async()=>(await pe(z))?.serverName,writeStateName:async(Pe)=>{let xe=await pe(z);if(xe)await ut(z,{...xe,serverName:Pe})}}:{},...Ie?{remoteHostname:async()=>{let Pe=await $e.exec(Y,"hostname");return Pe.code===0?Pe.stdout.trim():void 0},setRemoteHostname:async(Pe)=>{let xe=await $e.exec(Y,Ul(Pe));if(xe.code!==0)throw Error(xe.stderr.trim()||`hostname exited ${xe.code}`)}}:{}},Re=await zl(Y.name,t,he),Te=await Cs(Re);if(!m.apply){let Pe=[ne?"":"provider record (no provider id or no API token)",fe?"":"local state pin (none points at this server)",Ie?"":"box hostname (host key is not pinned — run server:validate first)"].filter(Boolean);if(m.json){console.log(JSON.stringify({schemaVersion:1,operation:Re.operation,target:Re.target,rename:{from:Y.name,to:t},notCovered:Pe,steps:Te.map((xe)=>({id:xe.step.id,title:xe.step.title,state:xe.state,change:xe.step.change,reason:xe.reason}))},null,2));return}for(let xe of As(Re,Te))console.log(xe);for(let xe of Pe)console.log(` not covered: ${xe}`);console.log(" Re-run with --apply to perform it.");return}let Ae=await ks(Re,Te,{log:(Pe)=>e(Pe),audit:(Pe)=>U.controlPlane.store.appendEvent({projectId:U.controlPlane.project.id,resourceId:Y.resourceId,type:`${Pe.operation}.${Pe.step}.${Pe.state}`,level:Pe.state==="failed"?"error":"info",payload:{target:Pe.target,renameTo:t,...Pe.error?{error:Pe.error}:{}}})});if(m.json)console.log(JSON.stringify({schemaVersion:1,outcome:Ae},null,2));if(!Ae.success){let Pe=Ae.steps.find((xe)=>xe.state==="failed");throw Error(`${Re.operation} stopped at '${Pe?.title}': ${Pe?.error}. Earlier steps stayed applied; re-run the same command to continue from here.`)}if(!m.json)n(`Renamed ${Y.name} to ${t}.`)})}function Ta(D){D.command("capabilities [server]","Show provider and target operation support").option("--json","Print structured JSON").action(async(t,m)=>{try{await gi(async(A)=>{let _=t?[Mi(A,t)]:A.store.list(A.controlPlane.project.id),z=_.flatMap((U)=>Object.entries(U.capabilities).map(([Y,X])=>({server:U.name,provider:U.provider,action:Y,...X})));if(m.json)console.log(JSON.stringify({schemaVersion:1,targets:z},null,2));else c(["Server","Provider","Action","Support","Explanation"],z.map((U)=>[U.server,U.provider,U.action,U.supported?"supported":"unsupported",U.reason??"—"]))})}catch(A){vn(A)}}),D.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,A)=>{try{await Ep(t,m,A)}catch(_){vn(_)}}),D.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 Tp(t,m)}catch(A){vn(A)}}),D.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 xp(t,m)}catch(A){vn(A)}}),D.command("server:list","List fleet servers").option("--json","Print structured JSON").action(async(t)=>{try{await gi(async(m)=>{let A=m.store.list(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(A,null,2));else c(["Name","Provider ID","Provider / region","Status / trust","Roles","CPU / memory","Heartbeat"],A.map((_)=>[_.name,_.providerId??"—",`${_.provider} / ${_.region??"external"}`,`${_.status} / ${_.trustState}`,_.roles.join(","),`${_.capacity.cpu??0} / ${_.capacity.memoryBytes??0}`,_.heartbeatAt??"never"]))})}catch(m){vn(m)}}),D.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 gi(async(A)=>{let _=m.provider;if(!["aws","hetzner","ssh"].includes(_)||!m.endpoint)throw Error("A supported --provider and --endpoint are required; provisioning and enrollment are separate operations.");let z=A.service.enroll({organizationId:A.controlPlane.organization.id,projectId:A.controlPlane.project.id,name:t,provider:_,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((U)=>U.split("=")).filter((U)=>U[0]&&U[1]))});n(`Enrolled ${z.name} as ${z.id}; no remote mutation was performed.`)})}catch(A){vn(A)}}),D.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 gi(async(A)=>{let _=Mi(A,t);if(_=await A.service.test(_.id),_.trustState==="rotation_pending"){if(!m.acceptHostKey)throw Error(`Host key changed to ${_.pendingHostKey}; review it first.`);_=A.service.reviewHostKey(_.id,m.acceptHostKey)}let z=await A.service.validate(_.id);if(m.json)console.log(JSON.stringify(z.validation,null,2));else c(["Severity","Code","Finding","Remediation"],(z.validation?.findings??[]).map((U)=>[U.severity,U.code,U.message,U.remediation??"—"]));if(!z.validation?.valid)process.exitCode=1})}catch(A){vn(A)}}),D.command("server:bootstrap <name>","Preview or queue bootstrap").option("--apply","Apply reviewed plan").action(async(t,m)=>{try{await gi(async(A)=>{let _=A.service.bootstrap(Mi(A,t).id,!!m.apply);if(_.preview)c(["Step"],_.steps.map((z)=>[z]));else n(`Bootstrap queued: ${_.operation?.id}`)})}catch(A){vn(A)}}),D.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,A)=>{try{await Np(t,m,A)}catch(_){vn(_)}}),D.command("server:drain <name>","Drain without terminating").option("--complete","Mark movement complete").action(async(t,m)=>{try{await gi(async(A)=>n(A.service.drain(Mi(A,t).id,!!m.complete).status))}catch(A){vn(A)}}),D.command("server:uncordon <name>","Return a server to scheduling").action(async(t)=>{try{await gi(async(m)=>{m.service.uncordon(Mi(m,t).id),n(`Uncordoned ${t}.`)})}catch(m){vn(m)}}),D.command("server:archive <name>","Archive inventory without termination").option("--confirm <name>","Exact name").action(async(t,m)=>{try{await gi(async(A)=>{A.service.archive(Mi(A,t).id,m.confirm??""),n(`Archived ${t}; provider infrastructure was not terminated.`)})}catch(A){vn(A)}}),D.command("server:ssh <name>","Open strict SSH using the enrolled endpoint").action(async(t)=>{try{await gi(async(m)=>{let A=Mi(m,t);if(A.trustState!=="pinned")throw Error("Validate and pin the server host key first.");let _=Bun.spawn(["ssh","-p",String(A.sshPort),"-o","StrictHostKeyChecking=yes",`${A.sshUser}@${A.endpoint}`],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}),z=await _.exited;if(z)process.exitCode=z})}catch(m){vn(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"]])D.command(t,m).action(async(...A)=>Fn(t.split(" ")[0],{target:String(A[0]??""),nextAction:"Use the dashboard capability view or the corresponding runtime, release, firewall, backup, or maintenance service."}))}import{existsSync as Wl,mkdirSync as Op,readFileSync as Lp,writeFileSync as jp}from"node:fs";import{join as ql,resolve as Fp}from"node:path";var Na=(D)=>{r(D instanceof Error?D.message:String(D)),process.exitCode=1};async function Bp(){try{return await Ee()}catch{return}}function Mp(D){if(D===void 0)return;let t=Number(D);if(!Number.isInteger(t)||t<1||t>65535)throw Error(`--port must be a port number, not '${D}'.`);return t}function Gl(D,t,m){let A=D?.ssh?.hosts?.find((_)=>_.host===t);return new fr({hosts:t?[A??{host:t}]:D?.ssh?.hosts,user:m.user,port:Mp(m.port),privateKeyPath:m.key,hostKey:D?.ssh?.hostKey,sudo:D?.ssh?.sudo,profile:m.profile??D?.ssh?.profile,publicIp:D?.ssh?.publicIp,lan:D?.ssh?.lan})}var Hl=1073741824;function Oa(D){D.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 A=await Bp(),_=Gl(A,t,m),z=t??_.targetHost(),U=await _.ensureHostKey(z),{facts:Y,findings:X}=await _.preflight(z);if(m.json)console.log(JSON.stringify({schemaVersion:1,host:z,hostKeyFingerprint:U.fingerprint,facts:Y,findings:X},null,2));else{if(i(`Preflight ${z}`),U.pinnedNow)e(`Pinned host key ${U.fingerprint}`);if(e(`${Y.os} on ${Y.arch}, ${Y.cpuCores} cores, ${(Y.memoryBytes/Hl).toFixed(1)} GiB memory, ${(Y.diskFreeBytes/Hl).toFixed(1)} GiB free`),Y.piModel)e(Y.piModel);if(Y.lanIp)e(`LAN address ${Y.lanIp}`);if(console.log(Xr(X)),gr(X))r("The host is not ready; fix the errors above and run the preflight again.");else n("The host is ready to adopt.")}if(gr(X))process.exitCode=1}catch(A){Na(A)}}),D.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 Ee(),A=t.env??"production";if(t.dryRun){let U=mr(m),[Y]=U.hosts;console.log(pr({config:m,environment:A,profile:U.profile,sudoUser:Y.user!=="root"?Y.user:void 0,lan:U.lan}));return}let _=Gl(m,void 0,{});i(`Adopt ${_.targetHost()}`);let z=await _.provisionComputeInfrastructure({config:m,environment:A});n(`${z.appPublicIp} is bootstrapped; deploy with: cloud deploy --env ${A}`)}catch(m){Na(m)}}),D.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 Ji))throw Error(`--os must be raspberry-pi-os or ubuntu, not '${m}'.`);let A=await Ee(),_=t.env??"production",z=mr(A,{hosts:A.ssh?.hosts?.length?void 0:[{host:t.hostname}],profile:m==="raspberry-pi-os"?"raspberry-pi":void 0}),U=t.user??(A.ssh?.hosts?.[0]?.user??"pi"),Y=Kr(t.key??"~/.ssh/id_ed25519.pub");if(!Wl(Y))throw Error(`Public key not found at ${Y}; pass --key <path to a .pub file>.`);let X=Lp(Y,"utf8").trim(),ne;if(t.wifiSsid){let Ie=t.wifiPassphraseEnv??"WIFI_PASSWORD",he=process.env[Ie];if(!he)throw Error(`--wifi-ssid needs the passphrase in $${Ie} (set it in the environment, not on the command line).`);if(!t.wifiCountry)throw Error("--wifi-country <cc> is required with --wifi-ssid.");ne={ssid:t.wifiSsid,passphrase:he,country:t.wifiCountry}}let re=pr({config:A,environment:_,profile:z.profile,sudoUser:U!=="root"?U:void 0,lan:z.lan}),se=Xi({hostname:t.hostname,user:U,publicKey:X,timezone:t.timezone,locale:t.locale,wifi:ne},re,{os:m}),fe=Fp(t.out);Op(fe,{recursive:!0});let $e=Object.keys(se.files).filter((Ie)=>Wl(ql(fe,Ie)));if($e.length>0&&!t.force)throw Error(`${$e.join(", ")} already exist in ${fe}; pass --force to overwrite.`);for(let[Ie,he]of Object.entries(se.files))jp(ql(fe,Ie),he,{mode:384});i(`First boot for ${t.hostname}`),n(`Wrote ${Object.keys(se.files).join(", ")} to ${fe}`),console.log(se.instructions)}catch(m){Na(m)}})}async function _p(){let D=await Ee(),t=y(process.cwd(),D),m=new Dn(t.store),A=new Nn(m,new De(t.store));return{controlPlane:t,store:m,service:A}}async function Go(D){let t=await _p();try{await D(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var Ps=(D)=>Object.fromEntries(String(D??"").split(",").map((t)=>t.split("=")).filter((t)=>t[0]&&t[1])),Kl=(D)=>Object.fromEntries(Object.entries(Ps(D)).map(([t,m])=>[t,Number(m)]));function La(D){D.command("pool:list","List capacity pools and reservations").option("--json","Print structured JSON").action(async(t)=>Go((m)=>{let A=m.store.listPools(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(A,null,2));else c(["Name","Purpose","Backend","Region / arch","Status","Capacity","Concurrency"],A.map((_)=>[_.name,_.purpose,_.backend,`${_.region??"any"} / ${_.architecture??"any"}`,_.status,JSON.stringify(_.capacity),String(_.concurrency)]))})),D.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)=>Go((A)=>{let{purpose:_,backend:z}=m;if(!["application","build","worker","monitoring","backup"].includes(_)||!["server","ecs","asg"].includes(z))throw Error("Unsupported pool purpose or backend.");let U=A.store.createPool({organizationId:A.controlPlane.organization.id,projectId:A.controlPlane.project.id,name:t,purpose:_,backend:z,region:m.region,architecture:m.arch,labels:Ps(m.labels),requiredServerLabels:Ps(m.selector),toleratedTaints:[],capacity:{cpu:0,memoryBytes:0,diskBytes:0,gpu:0,...Kl(m.capacity)},maxWorkloads:Number(m.max),costWeight:1,concurrency:Number(m.concurrency),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"});n(`Created ${U.name} (${U.id}).`)})),D.command("pool:add-server <pool> <server>","Attach an enrolled server to a pool").action(async(t,m)=>Go((A)=>{let _=A.store.listPools(A.controlPlane.project.id).find((U)=>U.id===t||U.name===t),z=new De(A.controlPlane.store).list(A.controlPlane.project.id).find((U)=>U.id===m||U.name===m);if(!_||!z)throw Error("Pool or server was not found.");A.store.addMember(_.id,z.id),n(`Attached ${z.name} to ${_.name}.`)})),D.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)=>Go((m)=>{let A=m.service.explain(m.controlPlane.project.id,{purpose:t.purpose,resources:Kl(t.resources),region:t.region,architecture:t.arch,labels:Ps(t.labels)});if(t.json)console.log(JSON.stringify(A,null,2));else c(["Pool","Server","Eligible","Available","Fit / spread / cost","Reasons"],A.map((_)=>[_.poolName,_.serverId??"provider-managed",_.eligible?"yes":"no",JSON.stringify(_.available),`${_.score.fit.toFixed(2)} / ${_.score.spread} / ${_.score.cost}`,_.reasons.join("; ")||"eligible"]))})),D.command("pool:drain <pool>","Move stateless placements and block stateful placements").action(async(t)=>Go((m)=>{let A=m.store.listPools(m.controlPlane.project.id).find((z)=>z.id===t||z.name===t);if(!A)throw Error("Pool was not found.");let _=m.service.drainPool(A.id);n(`Draining ${A.name}: moved ${_.moved.length}, blocked ${_.blocked.length} stateful placement(s).`)}))}async function zp(){let D=await Ee(),t=y(process.cwd(),D),m=new kn(t.store),A=new xn(m);return{controlPlane:t,store:m,service:A}}async function oo(D){let t=await zp();try{await D(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var Ho=(D,t)=>{let m=D.store.list(D.controlPlane.project.id).find((A)=>A.id===t||A.name===t);if(!m)throw Error("Regional topology was not found.");return m},Up=(D)=>D.split(",").map((t,m)=>{let[A,_="aws"]=t.split(":");return{region:String(A),provider:_,role:m===0?"primary":"secondary"}}),Vp=(D)=>{let t=new Set(["s3","dynamodb","secrets"]),m=D.split(",").map((_)=>_.trim()),A=m.find((_)=>!t.has(_));if(A)throw Error(`Unsupported replication kind: ${A}`);return m};function ja(D){D.command("region:list","List regional topology, traffic, and replication health").option("--json","Print structured JSON").action(async(t)=>oo((m)=>{let A=m.store.list(m.controlPlane.project.id).map((_)=>({topology:_,targets:m.store.targets(_.id),channels:m.store.channels(_.id),route:m.store.route(_.id),executions:m.store.executions(_.id)}));if(t.json)console.log(JSON.stringify(A,null,2));else c(["Name","Hostname","Active","Status","Revision","Replication"],A.map((_)=>[_.topology.name,_.topology.hostname,_.topology.activeRegion,_.topology.status,_.topology.revision??"—",`${_.channels.filter((z)=>z.status==="in_sync").length}/${_.channels.length} in sync`]))})),D.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)=>oo((A)=>{if(!m.hostname||!m.regions)throw Error("--hostname and --regions are required.");let _=A.service.create({organizationId:A.controlPlane.organization.id,projectId:A.controlPlane.project.id,name:t,hostname:m.hostname,regions:Up(m.regions),trafficPolicy:"active_passive",dataPolicy:{replicate:Vp(String(m.replicate)),maxLagSeconds:Number(m.maxLag),retainOnDestroy:!0},dnsProvider:"route53",cdnEnabled:!!m.cdn,wafEnabled:!!m.waf});n(`Created ${_.name} (${_.id}); run region:rollout with an immutable manifest.`)})),D.command("region:plan <name> <operation>","Preview exact regional execution steps").option("--target <region>","Failover or failback region").action(async(t,m,A)=>oo((_)=>c(["Step"],_.service.plan(Ho(_,t).id,m,A.target).map((z)=>[z])))),D.command("region:rollout <name> <revision>","Queue secondary-first regional stack rollout").option("--manifest <file>","Regional stack manifest JSON").action(async(t,m,A)=>oo(async(_)=>{let z=A.manifest?await Bun.file(A.manifest).json():{},U=_.service.enqueue({topologyId:Ho(_,t).id,kind:"rollout",revision:m,manifest:z});n(`Regional rollout queued: ${U.operation.id}`)})),D.command("region:failover <name> <region>","Queue health and RPO-gated failover").action(async(t,m)=>oo((A)=>{let _=A.service.enqueue({topologyId:Ho(A,t).id,kind:"failover",targetRegion:m});n(`Failover queued: ${_.operation.id}`)})),D.command("region:failback <name> <region>","Queue health and RPO-gated failback").action(async(t,m)=>oo((A)=>{let _=A.service.enqueue({topologyId:Ho(A,t).id,kind:"failback",targetRegion:m});n(`Failback queued: ${_.operation.id}`)})),D.command("region:destroy <name>","Drain traffic and delete regional stacks while retaining data").option("--confirm <name>","Exact topology name").action(async(t,m)=>oo((A)=>{let _=A.service.enqueue({topologyId:Ho(A,t).id,kind:"destroy",confirmation:m.confirm});n(`Regional teardown queued: ${_.operation.id}; replicated data remains retained.`)}))}var Ko="0.16.38";async function qp(){let D=await Ee(),t=y(process.cwd(),D),m=new _n(t.store),A=new On(m),_=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((z)=>new $n(z,t.store,t.project.id,t.organization.id));return{controlPlane:t,store:m,service:A,cleanup:_}}async function $i(D){let t=await qp();try{await D(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}function Fa(D){D.command("maintenance:list","List updates, campaigns, cleanup plans, and DR drills").option("--json","Print structured JSON").action(async(t)=>$i((m)=>{let A={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)},_=[...A.manifests.map((z)=>["update",z.version,z.compatibility.compatible?"compatible":"blocked",z.compatibility.reasons.join("; ")||z.channel]),...A.campaigns.map((z)=>["upgrade",z.id,z.status,z.currentStage??z.fromVersion]),...A.cleanups.map((z)=>["cleanup",z.kind,z.status,`${z.candidates.length} items / ${z.estimatedBytes} bytes`]),...A.drills.map((z)=>["DR drill",z.scenario,z.status,z.isolatedTarget])];if(t.json)console.log(JSON.stringify(A,null,2));else c(["Area","Name / version","Status","Detail"],_)})),D.command("maintenance:key:add <name> <pem>","Trust an Ed25519 update signing key").action(async(t,m)=>$i(async(A)=>{let _=A.store.addTrustedKey({organizationId:A.controlPlane.organization.id,name:t,publicKeyPem:await Bun.file(m).text()});n(`Trusted ${_.name}: ${_.fingerprint}`)})),D.command("maintenance:manifest <document> <signature> <key>","Verify and import a signed update manifest").action(async(t,m,A)=>$i(async(_)=>{let z=await Bun.file(t).json(),U=(await Bun.file(m).text()).trim(),Y=_.store.importManifest({organizationId:_.controlPlane.organization.id,keyId:A,document:z,signature:U,current:{schemaVersion:_.controlPlane.store.health().schemaVersion,currentVersion:Ko,platform:process.platform,architecture:process.arch}});n(`Verified ${Y.version}; ${Y.compatibility.compatible?"compatible":"blocked: "+Y.compatibility.reasons.join("; ")}`)})),D.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,A)=>$i((_)=>{let z=_.store.createWindow({projectId:_.controlPlane.project.id,name:t,schedule:m,timezone:A.timezone,durationMinutes:Number(A.minutes),allowedOperations:["platform.upgrade"],requireApproval:!0});n(`Created ${z.name} (${z.id}).`)})),D.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,A)=>$i((_)=>{let z=new De(_.controlPlane.store).list(_.controlPlane.project.id).filter((X)=>X.status==="ready").map((X)=>({serverId:X.id,target:X.name,previousVersion:X.bootstrapVersion??Ko}));if(!z.length)z.push({target:"control-plane",previousVersion:Ko});let U=_.store.createCampaign({projectId:_.controlPlane.project.id,manifestId:t,fromVersion:Ko,strategy:A.strategy==="rolling"?"rolling":"canary",batchSize:Number(A.batch),healthGate:{kind:"platform"},backupId:m,targets:z}),Y=_.service.enqueueCampaign(U.id);n(`Staged upgrade queued: ${Y.operation.id}`)})),D.command("cleanup:preview <kind>","Discover a bounded cleanup candidate set without deleting").option("--older-than <days>","Minimum age",{default:"30"}).action(async(t,m)=>$i(async(A)=>{let _=await A.service.previewCleanup({projectId:A.controlPlane.project.id,kind:t,criteria:{olderThanDays:Number(m.olderThan)}},A.cleanup);c(["ID","Candidate","Bytes"],_.candidates.map((z)=>[z.id,z.label,String(z.bytes)])),e(`Apply with: cloud cleanup:apply ${_.id} --confirm "DELETE ${_.candidates.length} ${_.kind}"`)})),D.command("cleanup:apply <plan>","Apply an unchanged cleanup preview").option("--confirm <text>","Exact preview confirmation").action(async(t,m)=>$i((A)=>{let _=A.service.enqueueCleanup(t,String(m.confirm??""));n(`Cleanup queued: ${_.operation.id}`)})),D.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,A)=>$i((_)=>{let z=_.store.createDrill({projectId:_.controlPlane.project.id,scenario:t,isolatedTarget:m,expectedRpoMinutes:Number(A.rpo),expectedRtoMinutes:Number(A.rto),recoveryPointId:A.recoveryPoint,topologyId:A.topology});n(`Planned isolated drill ${z.id}.`)})),D.command("dr:run <drill>","Queue an isolated disaster-recovery drill").action(async(t)=>$i((m)=>{let A=m.service.enqueueDrill(t);n(`DR drill queued: ${A.operation.id}`)}))}async function Ba(){try{return(await Ee()).project.region||process.env.AWS_REGION||"us-east-1"}catch{return process.env.AWS_REGION||"us-east-1"}}function Ma(D){D.command("function:list","List all Lambda functions").option("--region <region>","AWS region").action(async(t)=>{i("Lambda Functions");let m=t?.region||await Ba(),A=new I(m);try{let{Functions:_=[]}=await A.listFunctions({MaxItems:50});if(!_.length){e("No functions found");return}c(["Name","Runtime","Memory","Timeout","Last Modified"],_.map((z)=>[z.FunctionName??"-",z.Runtime??"-",z.MemorySize?`${z.MemorySize} MB`:"-",z.Timeout?`${z.Timeout}s`:"-",z.LastModified??"-"]))}catch(_){r(`Failed to list functions: ${_.message}`),process.exitCode=1}}),D.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 A=m?.region||await Ba(),_=new I(A),z=new s("Invoking function...");z.start();try{let U=await _.invoke({FunctionName:t,InvocationType:m?.async?"Event":"RequestResponse",Payload:m?.payload||"{}",LogType:m?.async?"None":"Tail"});if(U.FunctionError){if(z.fail(`Function returned an error (${U.FunctionError})`),U.Payload)e(U.Payload);process.exitCode=1;return}if(z.succeed(`Invoked (status ${U.StatusCode})`),U.Payload)e(`
318
+ `)}async function Ip(){let D=await Ee(),t=y(process.cwd(),D),m=new De(t.store),A=new Pn(m,[new it("aws"),new it("hetzner"),new it("ssh")]);return{controlPlane:t,store:m,service:A}}async function gi(D){let t=await Ip();try{return await D(t)}finally{t.controlPlane.store.close()}}var Mi=(D,t)=>{let m=D.store.list(D.controlPlane.project.id).find((A)=>A.id===t||A.name===t);if(!m)throw Error(`Server ${t} was not found.`);return m},vn=(D)=>{r(D instanceof Error?D.message:String(D)),process.exitCode=1};function Ea(D,t){let m=Number.parseInt(D??"",10);return Number.isFinite(m)&&m>=0?m:t}function Pp(D="3h"){let t=D.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 qo(D,t="%"){return D==null?"unavailable":`${D.toFixed(1)}${t}`}async function xp(D,t){let m=await Ee();if(m.cloud?.provider!=="hetzner")throw Error("server:monitoring currently requires the Hetzner provider.");let A=t.env??process.env.CLOUD_ENV??"production",_=T(m,A),z=await pe(_);if(!z?.serverId)throw Error(`No pinned Hetzner server was found for ${_}.`);if(![z.serverName,String(z.serverId),z.stackName].includes(D))throw Error(`Refusing to read ${D}: project state is pinned to ${z.serverName}.`);let U=lr(m),Y=new qe({apiToken:dr(U.apiToken,m)}),X=await Y.getServer(z.serverId),ne=z.publicIp??X.public_net.ipv4?.ip;if(!ne)throw Error(`Server ${X.name} has no public IPv4 address.`);let re=new Date,se=new Date(re.getTime()-Pp(t.range)),fe=Math.min(3600,Math.max(60,Ea(t.step,60))),$e=await _l({client:Y,serverId:X.id,cores:Math.max(1,Number(X.server_type.cores)||1),from:se,to:re,step:fe,remote:{host:ne,user:z.sshUser??U.sshUser,identityFile:U.sshPrivateKeyPath,connectTimeoutSec:15}});if(t.json){console.log(JSON.stringify({schemaVersion:1,server:X.name,result:$e},null,2));return}c(["Server","Window","CPU average / peak","RAM average / peak","Minimum available","Swap peak"],[[X.name,`${$e.from} to ${$e.to}`,`${qo($e.summary.cpuAveragePercent)} / ${qo($e.summary.cpuPeakPercent)}`,`${qo($e.summary.memoryAveragePercent)} / ${qo($e.summary.memoryPeakPercent)}`,$e.summary.memoryMinimumAvailableBytes==null?"unavailable":`${($e.summary.memoryMinimumAvailableBytes/1073741824).toFixed(2)} GB`,qo($e.summary.swapPeakPercent)]])}function Vl(D){let t=D.targetType.prices?.find((m)=>m.location===D.location);return{serverId:D.serverId,serverName:D.serverName,location:D.location,from:D.currentType.name,to:D.targetType.name,capacityAvailable:D.capacityAvailable,alreadyComplete:D.alreadyComplete,upgradeDisk:D.upgradeDisk,target:{cores:D.targetType.cores,memoryGb:D.targetType.memory,diskGb:D.targetType.disk,architecture:D.targetType.architecture,cpuType:D.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 Dp(D){let t=Vl(D);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 Ep(D,t,m){let A=await Ee();if(A.cloud?.provider!=="hetzner")throw Error("server:resize currently requires the Hetzner provider.");let _=m.env??process.env.CLOUD_ENV??"production",z=T(A,_),U=await pe(z),Y=lr(A),X=new qe({apiToken:dr(Y.apiToken,A)}),re=U&&(D===U.serverName||D===String(U.serverId)||D===U.stackName)?await X.getServer(U.serverId):(await X.listServers()).find((Be)=>Be.name===D||String(Be.id)===D);if(!re)throw Error(`Hetzner server ${D} was not found.`);if(U?.serverId&&U.serverId!==re.id)throw Error(`Refusing to resize ${D}: project state is pinned to server ${U.serverId}.`);let se=dt(t),fe=m.upgradeDisk!==!1,$e=await oi(X,re.id,se,fe);if(m.json)console.log(JSON.stringify({schemaVersion:1,plan:Vl($e)},null,2));else Dp($e);if(!m.apply){if(!m.json)e(`Preview only. Re-run with --apply --confirm ${re.name} to execute.`);return}if(m.confirm!==re.name)throw Error(`Resize requires --confirm ${re.name}.`);let Ie=U?.publicIp??re.public_net.ipv4?.ip;if(!Ie)throw Error(`Server ${re.name} has no public IPv4 address for verification.`);let he={host:Ie,user:U?.sshUser??Y.sshUser,identityFile:Y.sshPrivateKeyPath,connectTimeoutSec:15,sshTimeoutMs:600000,routeTimeoutMs:20000},Re=await os(z),Te=new Date().toISOString(),Ae={schemaVersion:1,operationId:Re?.targetType===se&&Re.serverId===re.id?Re.operationId:crypto.randomUUID(),stackName:z,serverId:re.id,serverName:re.name,sourceType:$e.currentType.name,targetType:se,upgradeDisk:fe,phase:"planning",status:"running",attempts:Re?.targetType===se?Re.attempts:0,startedAt:Re?.targetType===se?Re.startedAt:Te,updatedAt:Te,manifest:Re?.targetType===se?Re.manifest:void 0};await pt(Ae);let Pe=Ea(m.pollSeconds,900)*1000,xe=Ea(m.maxWaitMinutes,0)*60000,We=Date.now();for(;;){let Be=await oi(X,re.id,se,fe);if(!Be.capacityAvailable&&!Be.alreadyComplete){if(Ae={...Ae,phase:"waiting-capacity",status:"waiting-capacity",updatedAt:new Date().toISOString()},await pt(Ae),!m.wait){if(!m.json)e(`${se} has no capacity in ${Be.location}. The server remains running and unchanged. Use --wait to poll safely.`);return}if(xe>0&&Date.now()-We>=xe)throw Error(`Timed out waiting for ${se} capacity in ${Be.location}.`);if(!m.json)e(`Waiting ${Math.round(Pe/1000)} seconds for ${se} capacity...`);await Bun.sleep(Pe);continue}let Ue=await ss(z);try{let et=await(async()=>{try{return Ae={...Ae,status:"running",attempts:Ae.attempts+1,updatedAt:new Date().toISOString()},await pt(Ae),await Zo({client:X,serverId:re.id,targetType:se,upgradeDisk:fe,resumeFromOff:Ae.phase==="shutting-down"||Ae.phase==="resizing"||Ae.phase==="powering-on"||Ae.phase==="verifying",manifest:Ae.manifest,hooks:{preflight:async()=>{let Rt=await es(he);return Ae={...Ae,manifest:Rt,updatedAt:new Date().toISOString()},await pt(Ae),Rt},afterBoot:async(Rt,Et,wt,Pt)=>ts(he,Et,wt,Pt),onPhase:async(Rt,Et)=>{if(Ae={...Ae,phase:Rt,status:Rt==="waiting-capacity"?"waiting-capacity":Rt==="complete"?"completed":"running",updatedAt:new Date().toISOString()},await pt(Ae),!m.json)e(`${Rt}${Et?` ${JSON.stringify(Et)}`:""}`)}}})}finally{await Ue()}})();if(Ae={...Ae,status:et.status==="completed"||et.status==="already-complete"?"completed":et.status==="recovered"?"recovered":"waiting-capacity",lastError:et.status==="recovered"?et.error:void 0,updatedAt:new Date().toISOString()},await pt(Ae),m.json)console.log(JSON.stringify({schemaVersion:1,result:et},null,2));else if(et.status==="completed"||et.status==="already-complete")n(`${re.name} is on ${se} and passed full post-boot verification.`);else if(et.status==="recovered"&&et.retryable&&m.wait){e(`Capacity race recovered safely. Waiting ${Math.round(Pe/1000)} seconds before retry.`),await Bun.sleep(Pe);continue}else if(et.status==="recovered")throw Error(`Resize did not complete and the original server was recovered: ${et.error}`);return}catch(et){throw Ae={...Ae,status:"failed",lastError:et instanceof Error?et.message:String(et),updatedAt:new Date().toISOString()},await pt(Ae),et}}}async function Tp(D,t){let m=await Ee();if(m.cloud?.provider!=="hetzner")throw Error("server:optimize currently requires the Hetzner provider.");let A=t.env??process.env.CLOUD_ENV??"production",_=T(m,A),z=await pe(_);if(!z?.serverId)throw Error(`No pinned Hetzner server was found for ${_}.`);if(![z.serverName,String(z.serverId),z.stackName].includes(D))throw Error(`Refusing to optimize ${D}: project state is pinned to ${z.serverName}.`);let U=lr(m),Y=new qe({apiToken:dr(U.apiToken,m)}),X=await Y.getServer(z.serverId),ne=z.publicIp??X.public_net.ipv4?.ip;if(!ne)throw Error(`Server ${X.name} has no public IPv4 address.`);let re=Qi(m);if(t.json)console.log(JSON.stringify({schemaVersion:1,server:X.name,plan:re},null,2));else c(["Server","Firewall ports","Monitoring","Auto updates","Swap","SSH passwords"],[[X.name,re.firewallPorts.join(","),re.monitoring?"on":"off",re.autoUpdates?"on":"off",`${re.swapGb} GB`,"disabled"]]);if(!t.apply){if(!t.json)e(`Preview only. Re-run with --apply --confirm ${X.name} to execute.`);return}if(t.confirm!==X.name)throw Error(`Optimization requires --confirm ${X.name}.`);let se={host:ne,user:z.sshUser??U.sshUser,identityFile:U.sshPrivateKeyPath,connectTimeoutSec:15},fe=await Qr(se),$e=fe.routeProbes.filter((wt)=>!wt.ok),Ie=m.infrastructure?.compute,he=Z(Ie)?new Set(["nginx.service","bun-gateway.service","ts-cloud-nginx.service"]):new Set,Re=fe.failedUnits.filter((wt)=>!he.has(wt));if(Re.length>0)throw Error(`Preflight found failed services: ${Re.join(", ")}`);if($e.length>0)throw Error(`Preflight found unhealthy routes: ${$e.map((wt)=>wt.domain).join(", ")}`);let Te=Z(Ie)?[]:Object.values(m.sites??{}).flatMap((wt)=>typeof wt?.port==="number"&&![80,443].includes(wt.port)?[wt.port]:[]),Ae=Jr({allowSsh:Ie?.allowSsh!==!1,sitePorts:Te,allowedPorts:Ie?.firewall?.allowedPorts}),Pe=(z.firewallId?(await Y.listFirewalls()).find((wt)=>wt.id===z.firewallId):void 0)??(await Y.listFirewalls()).find((wt)=>wt.name===`${m.project.slug}-${A}-app-fw`);if(!Pe)throw Error(`Managed firewall for ${X.name} was not found.`);let xe=await Y.setFirewallRules(Pe.id,Ae);await Promise.all(xe.map((wt)=>Y.waitForAction(wt.id))),await rs(m,se);let[We,Be]=await Promise.all([Qr(se),ns(se)]),Ue=is(re,Be),et=cc(fe,We),Rt=We.routeProbes.filter((wt)=>!wt.ok);if(et.stoppedServices.length>0)Ue.push(`services stopped: ${et.stoppedServices.join(", ")}`);if(et.changedRouteFragments.length>0)Ue.push(`route fragments changed: ${et.changedRouteFragments.join(", ")}`);if(et.missingRouteIds.length>0)Ue.push(`routes disappeared: ${et.missingRouteIds.join(", ")}`);if(et.changedReleaseLinks.length>0)Ue.push(`release links changed: ${et.changedReleaseLinks.join(", ")}`);if(et.missingData.length>0)Ue.push(`databases or volumes disappeared: ${et.missingData.join(", ")}`);if(Rt.length>0)Ue.push(`unhealthy routes: ${Rt.map((wt)=>wt.domain).join(", ")}`);if(Ue.length>0)throw Error(`Host optimization verification failed: ${Ue.join("; ")}`);let Et={serverId:X.id,serverName:X.name,services:We.runningServices.length,routes:We.routeIds.length,healthyDomains:We.routeProbes.length,releaseLinks:We.releaseLinks.length,databasesAndVolumes:We.dataCatalog.length,report:Be};if(t.json)console.log(JSON.stringify({schemaVersion:1,result:Et},null,2));else n(`${X.name} passed full host, rpx route, service, release, and data verification.`)}async function Np(D,t,m){let A=await Ee(),_=m.env??"production",z=T(A,_);await gi(async(U)=>{let Y=Mi(U,D),X=U.store.list(U.controlPlane.project.id,!0),ne=Y.provider==="hetzner"&&Y.providerId?(()=>{try{let Pe=lr(A);return new qe({apiToken:dr(Pe.apiToken,A)})}catch{return null}})():null,re=Y.providerId?Number(Y.providerId):Number.NaN,se=await pe(z),fe=se!=null&&se.serverId===re,$e=new Mr,Ie=Y.trustState==="pinned",he={takenNames:async()=>{let Pe=X.map((xe)=>xe.name);if(ne)Pe.push(...(await ne.listServers()).map((xe)=>xe.name));return Pe},inventoryName:()=>U.store.get(Y.id)?.name??Y.name,renameInventory:(Pe)=>{U.store.update(Y.id,{name:Pe})},...ne&&Number.isFinite(re)?{providerName:async()=>(await ne.getServer(re)).name,renameProvider:async(Pe)=>{await ne.renameServer(re,Pe)}}:{},...fe?{stateName:async()=>(await pe(z))?.serverName,writeStateName:async(Pe)=>{let xe=await pe(z);if(xe)await ut(z,{...xe,serverName:Pe})}}:{},...Ie?{remoteHostname:async()=>{let Pe=await $e.exec(Y,"hostname");return Pe.code===0?Pe.stdout.trim():void 0},setRemoteHostname:async(Pe)=>{let xe=await $e.exec(Y,Ul(Pe));if(xe.code!==0)throw Error(xe.stderr.trim()||`hostname exited ${xe.code}`)}}:{}},Re=await zl(Y.name,t,he),Te=await Cs(Re);if(!m.apply){let Pe=[ne?"":"provider record (no provider id or no API token)",fe?"":"local state pin (none points at this server)",Ie?"":"box hostname (host key is not pinned — run server:validate first)"].filter(Boolean);if(m.json){console.log(JSON.stringify({schemaVersion:1,operation:Re.operation,target:Re.target,rename:{from:Y.name,to:t},notCovered:Pe,steps:Te.map((xe)=>({id:xe.step.id,title:xe.step.title,state:xe.state,change:xe.step.change,reason:xe.reason}))},null,2));return}for(let xe of As(Re,Te))console.log(xe);for(let xe of Pe)console.log(` not covered: ${xe}`);console.log(" Re-run with --apply to perform it.");return}let Ae=await ks(Re,Te,{log:(Pe)=>e(Pe),audit:(Pe)=>U.controlPlane.store.appendEvent({projectId:U.controlPlane.project.id,resourceId:Y.resourceId,type:`${Pe.operation}.${Pe.step}.${Pe.state}`,level:Pe.state==="failed"?"error":"info",payload:{target:Pe.target,renameTo:t,...Pe.error?{error:Pe.error}:{}}})});if(m.json)console.log(JSON.stringify({schemaVersion:1,outcome:Ae},null,2));if(!Ae.success){let Pe=Ae.steps.find((xe)=>xe.state==="failed");throw Error(`${Re.operation} stopped at '${Pe?.title}': ${Pe?.error}. Earlier steps stayed applied; re-run the same command to continue from here.`)}if(!m.json)n(`Renamed ${Y.name} to ${t}.`)})}function Ta(D){D.command("capabilities [server]","Show provider and target operation support").option("--json","Print structured JSON").action(async(t,m)=>{try{await gi(async(A)=>{let _=t?[Mi(A,t)]:A.store.list(A.controlPlane.project.id),z=_.flatMap((U)=>Object.entries(U.capabilities).map(([Y,X])=>({server:U.name,provider:U.provider,action:Y,...X})));if(m.json)console.log(JSON.stringify({schemaVersion:1,targets:z},null,2));else c(["Server","Provider","Action","Support","Explanation"],z.map((U)=>[U.server,U.provider,U.action,U.supported?"supported":"unsupported",U.reason??"—"]))})}catch(A){vn(A)}}),D.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,A)=>{try{await Ep(t,m,A)}catch(_){vn(_)}}),D.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 Tp(t,m)}catch(A){vn(A)}}),D.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 xp(t,m)}catch(A){vn(A)}}),D.command("server:list","List fleet servers").option("--json","Print structured JSON").action(async(t)=>{try{await gi(async(m)=>{let A=m.store.list(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(A,null,2));else c(["Name","Provider ID","Provider / region","Status / trust","Roles","CPU / memory","Heartbeat"],A.map((_)=>[_.name,_.providerId??"—",`${_.provider} / ${_.region??"external"}`,`${_.status} / ${_.trustState}`,_.roles.join(","),`${_.capacity.cpu??0} / ${_.capacity.memoryBytes??0}`,_.heartbeatAt??"never"]))})}catch(m){vn(m)}}),D.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 gi(async(A)=>{let _=m.provider;if(!["aws","hetzner","ssh"].includes(_)||!m.endpoint)throw Error("A supported --provider and --endpoint are required; provisioning and enrollment are separate operations.");let z=A.service.enroll({organizationId:A.controlPlane.organization.id,projectId:A.controlPlane.project.id,name:t,provider:_,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((U)=>U.split("=")).filter((U)=>U[0]&&U[1]))});n(`Enrolled ${z.name} as ${z.id}; no remote mutation was performed.`)})}catch(A){vn(A)}}),D.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 gi(async(A)=>{let _=Mi(A,t);if(_=await A.service.test(_.id),_.trustState==="rotation_pending"){if(!m.acceptHostKey)throw Error(`Host key changed to ${_.pendingHostKey}; review it first.`);_=A.service.reviewHostKey(_.id,m.acceptHostKey)}let z=await A.service.validate(_.id);if(m.json)console.log(JSON.stringify(z.validation,null,2));else c(["Severity","Code","Finding","Remediation"],(z.validation?.findings??[]).map((U)=>[U.severity,U.code,U.message,U.remediation??"—"]));if(!z.validation?.valid)process.exitCode=1})}catch(A){vn(A)}}),D.command("server:bootstrap <name>","Preview or queue bootstrap").option("--apply","Apply reviewed plan").action(async(t,m)=>{try{await gi(async(A)=>{let _=A.service.bootstrap(Mi(A,t).id,!!m.apply);if(_.preview)c(["Step"],_.steps.map((z)=>[z]));else n(`Bootstrap queued: ${_.operation?.id}`)})}catch(A){vn(A)}}),D.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,A)=>{try{await Np(t,m,A)}catch(_){vn(_)}}),D.command("server:drain <name>","Drain without terminating").option("--complete","Mark movement complete").action(async(t,m)=>{try{await gi(async(A)=>n(A.service.drain(Mi(A,t).id,!!m.complete).status))}catch(A){vn(A)}}),D.command("server:uncordon <name>","Return a server to scheduling").action(async(t)=>{try{await gi(async(m)=>{m.service.uncordon(Mi(m,t).id),n(`Uncordoned ${t}.`)})}catch(m){vn(m)}}),D.command("server:archive <name>","Archive inventory without termination").option("--confirm <name>","Exact name").action(async(t,m)=>{try{await gi(async(A)=>{A.service.archive(Mi(A,t).id,m.confirm??""),n(`Archived ${t}; provider infrastructure was not terminated.`)})}catch(A){vn(A)}}),D.command("server:ssh <name>","Open strict SSH using the enrolled endpoint").action(async(t)=>{try{await gi(async(m)=>{let A=Mi(m,t);if(A.trustState!=="pinned")throw Error("Validate and pin the server host key first.");let _=Bun.spawn(["ssh","-p",String(A.sshPort),"-o","StrictHostKeyChecking=yes",`${A.sshUser}@${A.endpoint}`],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}),z=await _.exited;if(z)process.exitCode=z})}catch(m){vn(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"]])D.command(t,m).action(async(...A)=>Fn(t.split(" ")[0],{target:String(A[0]??""),nextAction:"Use the dashboard capability view or the corresponding runtime, release, firewall, backup, or maintenance service."}))}import{existsSync as Wl,mkdirSync as Op,readFileSync as Lp,writeFileSync as jp}from"node:fs";import{join as ql,resolve as Fp}from"node:path";var Na=(D)=>{r(D instanceof Error?D.message:String(D)),process.exitCode=1};async function Bp(){try{return await Ee()}catch{return}}function Mp(D){if(D===void 0)return;let t=Number(D);if(!Number.isInteger(t)||t<1||t>65535)throw Error(`--port must be a port number, not '${D}'.`);return t}function Gl(D,t,m){let A=D?.ssh?.hosts?.find((_)=>_.host===t);return new fr({hosts:t?[A??{host:t}]:D?.ssh?.hosts,user:m.user,port:Mp(m.port),privateKeyPath:m.key,hostKey:D?.ssh?.hostKey,sudo:D?.ssh?.sudo,profile:m.profile??D?.ssh?.profile,publicIp:D?.ssh?.publicIp,lan:D?.ssh?.lan})}var Hl=1073741824;function Oa(D){D.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 A=await Bp(),_=Gl(A,t,m),z=t??_.targetHost(),U=await _.ensureHostKey(z),{facts:Y,findings:X}=await _.preflight(z);if(m.json)console.log(JSON.stringify({schemaVersion:1,host:z,hostKeyFingerprint:U.fingerprint,facts:Y,findings:X},null,2));else{if(i(`Preflight ${z}`),U.pinnedNow)e(`Pinned host key ${U.fingerprint}`);if(e(`${Y.os} on ${Y.arch}, ${Y.cpuCores} cores, ${(Y.memoryBytes/Hl).toFixed(1)} GiB memory, ${(Y.diskFreeBytes/Hl).toFixed(1)} GiB free`),Y.piModel)e(Y.piModel);if(Y.lanIp)e(`LAN address ${Y.lanIp}`);if(console.log(Xr(X)),gr(X))r("The host is not ready; fix the errors above and run the preflight again.");else n("The host is ready to adopt.")}if(gr(X))process.exitCode=1}catch(A){Na(A)}}),D.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 Ee(),A=t.env??"production";if(t.dryRun){let U=mr(m),[Y]=U.hosts;console.log(pr({config:m,environment:A,profile:U.profile,sudoUser:Y.user!=="root"?Y.user:void 0,lan:U.lan}));return}let _=Gl(m,void 0,{});i(`Adopt ${_.targetHost()}`);let z=await _.provisionComputeInfrastructure({config:m,environment:A});n(`${z.appPublicIp} is bootstrapped; deploy with: cloud deploy --env ${A}`)}catch(m){Na(m)}}),D.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 Ji))throw Error(`--os must be raspberry-pi-os or ubuntu, not '${m}'.`);let A=await Ee(),_=t.env??"production",z=mr(A,{hosts:A.ssh?.hosts?.length?void 0:[{host:t.hostname}],profile:m==="raspberry-pi-os"?"raspberry-pi":void 0}),U=t.user??(A.ssh?.hosts?.[0]?.user??"pi"),Y=Kr(t.key??"~/.ssh/id_ed25519.pub");if(!Wl(Y))throw Error(`Public key not found at ${Y}; pass --key <path to a .pub file>.`);let X=Lp(Y,"utf8").trim(),ne;if(t.wifiSsid){let Ie=t.wifiPassphraseEnv??"WIFI_PASSWORD",he=process.env[Ie];if(!he)throw Error(`--wifi-ssid needs the passphrase in $${Ie} (set it in the environment, not on the command line).`);if(!t.wifiCountry)throw Error("--wifi-country <cc> is required with --wifi-ssid.");ne={ssid:t.wifiSsid,passphrase:he,country:t.wifiCountry}}let re=pr({config:A,environment:_,profile:z.profile,sudoUser:U!=="root"?U:void 0,lan:z.lan}),se=Xi({hostname:t.hostname,user:U,publicKey:X,timezone:t.timezone,locale:t.locale,wifi:ne},re,{os:m}),fe=Fp(t.out);Op(fe,{recursive:!0});let $e=Object.keys(se.files).filter((Ie)=>Wl(ql(fe,Ie)));if($e.length>0&&!t.force)throw Error(`${$e.join(", ")} already exist in ${fe}; pass --force to overwrite.`);for(let[Ie,he]of Object.entries(se.files))jp(ql(fe,Ie),he,{mode:384});i(`First boot for ${t.hostname}`),n(`Wrote ${Object.keys(se.files).join(", ")} to ${fe}`),console.log(se.instructions)}catch(m){Na(m)}})}async function _p(){let D=await Ee(),t=y(process.cwd(),D),m=new Dn(t.store),A=new Nn(m,new De(t.store));return{controlPlane:t,store:m,service:A}}async function Go(D){let t=await _p();try{await D(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var Ps=(D)=>Object.fromEntries(String(D??"").split(",").map((t)=>t.split("=")).filter((t)=>t[0]&&t[1])),Kl=(D)=>Object.fromEntries(Object.entries(Ps(D)).map(([t,m])=>[t,Number(m)]));function La(D){D.command("pool:list","List capacity pools and reservations").option("--json","Print structured JSON").action(async(t)=>Go((m)=>{let A=m.store.listPools(m.controlPlane.project.id);if(t.json)console.log(JSON.stringify(A,null,2));else c(["Name","Purpose","Backend","Region / arch","Status","Capacity","Concurrency"],A.map((_)=>[_.name,_.purpose,_.backend,`${_.region??"any"} / ${_.architecture??"any"}`,_.status,JSON.stringify(_.capacity),String(_.concurrency)]))})),D.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)=>Go((A)=>{let{purpose:_,backend:z}=m;if(!["application","build","worker","monitoring","backup"].includes(_)||!["server","ecs","asg"].includes(z))throw Error("Unsupported pool purpose or backend.");let U=A.store.createPool({organizationId:A.controlPlane.organization.id,projectId:A.controlPlane.project.id,name:t,purpose:_,backend:z,region:m.region,architecture:m.arch,labels:Ps(m.labels),requiredServerLabels:Ps(m.selector),toleratedTaints:[],capacity:{cpu:0,memoryBytes:0,diskBytes:0,gpu:0,...Kl(m.capacity)},maxWorkloads:Number(m.max),costWeight:1,concurrency:Number(m.concurrency),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"});n(`Created ${U.name} (${U.id}).`)})),D.command("pool:add-server <pool> <server>","Attach an enrolled server to a pool").action(async(t,m)=>Go((A)=>{let _=A.store.listPools(A.controlPlane.project.id).find((U)=>U.id===t||U.name===t),z=new De(A.controlPlane.store).list(A.controlPlane.project.id).find((U)=>U.id===m||U.name===m);if(!_||!z)throw Error("Pool or server was not found.");A.store.addMember(_.id,z.id),n(`Attached ${z.name} to ${_.name}.`)})),D.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)=>Go((m)=>{let A=m.service.explain(m.controlPlane.project.id,{purpose:t.purpose,resources:Kl(t.resources),region:t.region,architecture:t.arch,labels:Ps(t.labels)});if(t.json)console.log(JSON.stringify(A,null,2));else c(["Pool","Server","Eligible","Available","Fit / spread / cost","Reasons"],A.map((_)=>[_.poolName,_.serverId??"provider-managed",_.eligible?"yes":"no",JSON.stringify(_.available),`${_.score.fit.toFixed(2)} / ${_.score.spread} / ${_.score.cost}`,_.reasons.join("; ")||"eligible"]))})),D.command("pool:drain <pool>","Move stateless placements and block stateful placements").action(async(t)=>Go((m)=>{let A=m.store.listPools(m.controlPlane.project.id).find((z)=>z.id===t||z.name===t);if(!A)throw Error("Pool was not found.");let _=m.service.drainPool(A.id);n(`Draining ${A.name}: moved ${_.moved.length}, blocked ${_.blocked.length} stateful placement(s).`)}))}async function zp(){let D=await Ee(),t=y(process.cwd(),D),m=new kn(t.store),A=new xn(m);return{controlPlane:t,store:m,service:A}}async function oo(D){let t=await zp();try{await D(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}var Ho=(D,t)=>{let m=D.store.list(D.controlPlane.project.id).find((A)=>A.id===t||A.name===t);if(!m)throw Error("Regional topology was not found.");return m},Up=(D)=>D.split(",").map((t,m)=>{let[A,_="aws"]=t.split(":");return{region:String(A),provider:_,role:m===0?"primary":"secondary"}}),Vp=(D)=>{let t=new Set(["s3","dynamodb","secrets"]),m=D.split(",").map((_)=>_.trim()),A=m.find((_)=>!t.has(_));if(A)throw Error(`Unsupported replication kind: ${A}`);return m};function ja(D){D.command("region:list","List regional topology, traffic, and replication health").option("--json","Print structured JSON").action(async(t)=>oo((m)=>{let A=m.store.list(m.controlPlane.project.id).map((_)=>({topology:_,targets:m.store.targets(_.id),channels:m.store.channels(_.id),route:m.store.route(_.id),executions:m.store.executions(_.id)}));if(t.json)console.log(JSON.stringify(A,null,2));else c(["Name","Hostname","Active","Status","Revision","Replication"],A.map((_)=>[_.topology.name,_.topology.hostname,_.topology.activeRegion,_.topology.status,_.topology.revision??"—",`${_.channels.filter((z)=>z.status==="in_sync").length}/${_.channels.length} in sync`]))})),D.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)=>oo((A)=>{if(!m.hostname||!m.regions)throw Error("--hostname and --regions are required.");let _=A.service.create({organizationId:A.controlPlane.organization.id,projectId:A.controlPlane.project.id,name:t,hostname:m.hostname,regions:Up(m.regions),trafficPolicy:"active_passive",dataPolicy:{replicate:Vp(String(m.replicate)),maxLagSeconds:Number(m.maxLag),retainOnDestroy:!0},dnsProvider:"route53",cdnEnabled:!!m.cdn,wafEnabled:!!m.waf});n(`Created ${_.name} (${_.id}); run region:rollout with an immutable manifest.`)})),D.command("region:plan <name> <operation>","Preview exact regional execution steps").option("--target <region>","Failover or failback region").action(async(t,m,A)=>oo((_)=>c(["Step"],_.service.plan(Ho(_,t).id,m,A.target).map((z)=>[z])))),D.command("region:rollout <name> <revision>","Queue secondary-first regional stack rollout").option("--manifest <file>","Regional stack manifest JSON").action(async(t,m,A)=>oo(async(_)=>{let z=A.manifest?await Bun.file(A.manifest).json():{},U=_.service.enqueue({topologyId:Ho(_,t).id,kind:"rollout",revision:m,manifest:z});n(`Regional rollout queued: ${U.operation.id}`)})),D.command("region:failover <name> <region>","Queue health and RPO-gated failover").action(async(t,m)=>oo((A)=>{let _=A.service.enqueue({topologyId:Ho(A,t).id,kind:"failover",targetRegion:m});n(`Failover queued: ${_.operation.id}`)})),D.command("region:failback <name> <region>","Queue health and RPO-gated failback").action(async(t,m)=>oo((A)=>{let _=A.service.enqueue({topologyId:Ho(A,t).id,kind:"failback",targetRegion:m});n(`Failback queued: ${_.operation.id}`)})),D.command("region:destroy <name>","Drain traffic and delete regional stacks while retaining data").option("--confirm <name>","Exact topology name").action(async(t,m)=>oo((A)=>{let _=A.service.enqueue({topologyId:Ho(A,t).id,kind:"destroy",confirmation:m.confirm});n(`Regional teardown queued: ${_.operation.id}; replicated data remains retained.`)}))}var Ko="0.16.39";async function qp(){let D=await Ee(),t=y(process.cwd(),D),m=new _n(t.store),A=new On(m),_=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((z)=>new $n(z,t.store,t.project.id,t.organization.id));return{controlPlane:t,store:m,service:A,cleanup:_}}async function $i(D){let t=await qp();try{await D(t)}catch(m){r(m instanceof Error?m.message:String(m)),process.exitCode=1}finally{t.controlPlane.store.close()}}function Fa(D){D.command("maintenance:list","List updates, campaigns, cleanup plans, and DR drills").option("--json","Print structured JSON").action(async(t)=>$i((m)=>{let A={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)},_=[...A.manifests.map((z)=>["update",z.version,z.compatibility.compatible?"compatible":"blocked",z.compatibility.reasons.join("; ")||z.channel]),...A.campaigns.map((z)=>["upgrade",z.id,z.status,z.currentStage??z.fromVersion]),...A.cleanups.map((z)=>["cleanup",z.kind,z.status,`${z.candidates.length} items / ${z.estimatedBytes} bytes`]),...A.drills.map((z)=>["DR drill",z.scenario,z.status,z.isolatedTarget])];if(t.json)console.log(JSON.stringify(A,null,2));else c(["Area","Name / version","Status","Detail"],_)})),D.command("maintenance:key:add <name> <pem>","Trust an Ed25519 update signing key").action(async(t,m)=>$i(async(A)=>{let _=A.store.addTrustedKey({organizationId:A.controlPlane.organization.id,name:t,publicKeyPem:await Bun.file(m).text()});n(`Trusted ${_.name}: ${_.fingerprint}`)})),D.command("maintenance:manifest <document> <signature> <key>","Verify and import a signed update manifest").action(async(t,m,A)=>$i(async(_)=>{let z=await Bun.file(t).json(),U=(await Bun.file(m).text()).trim(),Y=_.store.importManifest({organizationId:_.controlPlane.organization.id,keyId:A,document:z,signature:U,current:{schemaVersion:_.controlPlane.store.health().schemaVersion,currentVersion:Ko,platform:process.platform,architecture:process.arch}});n(`Verified ${Y.version}; ${Y.compatibility.compatible?"compatible":"blocked: "+Y.compatibility.reasons.join("; ")}`)})),D.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,A)=>$i((_)=>{let z=_.store.createWindow({projectId:_.controlPlane.project.id,name:t,schedule:m,timezone:A.timezone,durationMinutes:Number(A.minutes),allowedOperations:["platform.upgrade"],requireApproval:!0});n(`Created ${z.name} (${z.id}).`)})),D.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,A)=>$i((_)=>{let z=new De(_.controlPlane.store).list(_.controlPlane.project.id).filter((X)=>X.status==="ready").map((X)=>({serverId:X.id,target:X.name,previousVersion:X.bootstrapVersion??Ko}));if(!z.length)z.push({target:"control-plane",previousVersion:Ko});let U=_.store.createCampaign({projectId:_.controlPlane.project.id,manifestId:t,fromVersion:Ko,strategy:A.strategy==="rolling"?"rolling":"canary",batchSize:Number(A.batch),healthGate:{kind:"platform"},backupId:m,targets:z}),Y=_.service.enqueueCampaign(U.id);n(`Staged upgrade queued: ${Y.operation.id}`)})),D.command("cleanup:preview <kind>","Discover a bounded cleanup candidate set without deleting").option("--older-than <days>","Minimum age",{default:"30"}).action(async(t,m)=>$i(async(A)=>{let _=await A.service.previewCleanup({projectId:A.controlPlane.project.id,kind:t,criteria:{olderThanDays:Number(m.olderThan)}},A.cleanup);c(["ID","Candidate","Bytes"],_.candidates.map((z)=>[z.id,z.label,String(z.bytes)])),e(`Apply with: cloud cleanup:apply ${_.id} --confirm "DELETE ${_.candidates.length} ${_.kind}"`)})),D.command("cleanup:apply <plan>","Apply an unchanged cleanup preview").option("--confirm <text>","Exact preview confirmation").action(async(t,m)=>$i((A)=>{let _=A.service.enqueueCleanup(t,String(m.confirm??""));n(`Cleanup queued: ${_.operation.id}`)})),D.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,A)=>$i((_)=>{let z=_.store.createDrill({projectId:_.controlPlane.project.id,scenario:t,isolatedTarget:m,expectedRpoMinutes:Number(A.rpo),expectedRtoMinutes:Number(A.rto),recoveryPointId:A.recoveryPoint,topologyId:A.topology});n(`Planned isolated drill ${z.id}.`)})),D.command("dr:run <drill>","Queue an isolated disaster-recovery drill").action(async(t)=>$i((m)=>{let A=m.service.enqueueDrill(t);n(`DR drill queued: ${A.operation.id}`)}))}async function Ba(){try{return(await Ee()).project.region||process.env.AWS_REGION||"us-east-1"}catch{return process.env.AWS_REGION||"us-east-1"}}function Ma(D){D.command("function:list","List all Lambda functions").option("--region <region>","AWS region").action(async(t)=>{i("Lambda Functions");let m=t?.region||await Ba(),A=new I(m);try{let{Functions:_=[]}=await A.listFunctions({MaxItems:50});if(!_.length){e("No functions found");return}c(["Name","Runtime","Memory","Timeout","Last Modified"],_.map((z)=>[z.FunctionName??"-",z.Runtime??"-",z.MemorySize?`${z.MemorySize} MB`:"-",z.Timeout?`${z.Timeout}s`:"-",z.LastModified??"-"]))}catch(_){r(`Failed to list functions: ${_.message}`),process.exitCode=1}}),D.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 A=m?.region||await Ba(),_=new I(A),z=new s("Invoking function...");z.start();try{let U=await _.invoke({FunctionName:t,InvocationType:m?.async?"Event":"RequestResponse",Payload:m?.payload||"{}",LogType:m?.async?"None":"Tail"});if(U.FunctionError){if(z.fail(`Function returned an error (${U.FunctionError})`),U.Payload)e(U.Payload);process.exitCode=1;return}if(z.succeed(`Invoked (status ${U.StatusCode})`),U.Payload)e(`
319
319
  Response:`),e(U.Payload);if(U.LogResult)e(`
320
320
  Logs:`),e(Buffer.from(U.LogResult,"base64").toString("utf-8"))}catch(U){z.fail(`Invocation failed: ${U.message}`),process.exitCode=1}}),D.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 A=m?.region||await Ba(),_=new oe(A),z=t.startsWith("/aws/lambda/")?t:`/aws/lambda/${t}`,U=Number(m?.since??15),Y=(X)=>{for(let ne of X){let re=ne.timestamp?new Date(ne.timestamp).toISOString():"";e(`${re} ${(ne.message??"").trimEnd()}`)}};try{let X=Date.now()-U*60000,{events:ne=[]}=await _.filterLogEvents({logGroupName:z,startTime:X,filterPattern:m?.filter,limit:200});if(Y(ne),ne.length)X=(ne[ne.length-1].timestamp??X)+1;if(m?.tail){e(`
321
321
  (streaming — Ctrl+C to stop)`);for(;;){await new Promise((se)=>setTimeout(se,3000));let{events:re=[]}=await _.filterLogEvents({logGroupName:z,startTime:X,filterPattern:m?.filter,limit:200});if(re.length)Y(re),X=(re[re.length-1].timestamp??X)+1}}}catch(X){r(`Failed to read logs: ${X.message}`),process.exitCode=1}})}async function Jl(D){let t=Bun.spawn(["docker",...D],{stdin:"inherit",stdout:"inherit",stderr:"pipe"}),[m,A]=await Promise.all([t.exited,new Response(t.stderr).text()]);return{ok:m===0,exitCode:m,command:["docker",...D].join(" "),stderr:A.trim()}}function _a(D){D.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 A=await Jl(m);if(t.json)console.log(JSON.stringify(A));if(!A.ok)r(A.stderr||`docker exited ${A.exitCode}`),process.exitCode=A.exitCode;else n(`Built ${t.tag??"latest"}.`)}),D.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 Jl(["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}.`)}),D.command("container:deploy","Deploy a container image").action(async()=>Fn("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 za(D){D.command("domain:list","List all domains").option("--provider <provider>","DNS provider: porkbun, godaddy, cloudflare, or route53").action(async(t)=>{i("Domains");try{let m=si(t?.provider),A=mn(t?.provider)?.provider||"unknown",_=new s(`Fetching domains from ${A}...`);_.start();let z=await m.listDomains();if(_.succeed(`Found ${z.length} domain(s)`),z.length===0){e("No domains found in this provider");return}let U=z.map((Y)=>[Y,"Active","-",A.charAt(0).toUpperCase()+A.slice(1)]);c(["Domain","Status","SSL","Provider"],U)}catch(m){r(`Failed to list domains: ${m instanceof Error?m.message:String(m)}`)}}),D.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 A=si(m?.provider),_=mn(m?.provider)?.provider||"unknown",z=new s(`Checking if ${_} can manage ${t}...`);if(z.start(),await A.canManageDomain(t))z.succeed(`Domain ${t} is already available in ${_}`),e(`
@@ -1 +1 @@
1
- import"./chunk-q8hp4dfy.js";import"./chunk-55cckkb2.js";import"./chunk-6r5mehaj.js";import"./chunk-e0kapeev.js";import{cr}from"./chunk-8496fsmq.js";import"./chunk-dmwfnbg0.js";import"./chunk-tt3m3fda.js";import"./chunk-x0ywfbk5.js";import"./chunk-hjq05rxh.js";import"./chunk-pyr0dc6j.js";import"./chunk-0ynfqf9t.js";import"./chunk-4h60xsat.js";import"./chunk-dnmb3sr0.js";import"./chunk-5wqjqh6c.js";import"./chunk-w8jfw39t.js";import"./chunk-r0yapyqc.js";import"./chunk-8zn63v9h.js";import"./chunk-sqmays54.js";import"./chunk-wga7gj0h.js";import"./chunk-ygsdntxq.js";import"./chunk-cqhtnsby.js";import"./chunk-e6mfcw0v.js";import"./chunk-48nz63ab.js";import"./chunk-85k5gvnc.js";import"./chunk-7rpj0qhb.js";import"./chunk-c7z8et78.js";import"./chunk-gc8p1tdr.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 cr({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
+ import"./chunk-q8hp4dfy.js";import"./chunk-55cckkb2.js";import"./chunk-6r5mehaj.js";import"./chunk-e0kapeev.js";import{cr}from"./chunk-ehnevjt4.js";import"./chunk-dmwfnbg0.js";import"./chunk-tt3m3fda.js";import"./chunk-x0ywfbk5.js";import"./chunk-hjq05rxh.js";import"./chunk-pyr0dc6j.js";import"./chunk-0ynfqf9t.js";import"./chunk-4h60xsat.js";import"./chunk-dnmb3sr0.js";import"./chunk-5wqjqh6c.js";import"./chunk-w8jfw39t.js";import"./chunk-r0yapyqc.js";import"./chunk-8zn63v9h.js";import"./chunk-sqmays54.js";import"./chunk-wga7gj0h.js";import"./chunk-ygsdntxq.js";import"./chunk-cqhtnsby.js";import"./chunk-e6mfcw0v.js";import"./chunk-48nz63ab.js";import"./chunk-85k5gvnc.js";import"./chunk-7rpj0qhb.js";import"./chunk-c7z8et78.js";import"./chunk-gc8p1tdr.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 cr({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();