@stacksjs/ts-cloud 0.16.65 → 0.16.66

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 (111) hide show
  1. package/dist/aws/index.js +1 -1
  2. package/dist/bin/{chunk-mxa9rrw0.js → chunk-3954zb9r.js} +1 -1
  3. package/dist/bin/{chunk-eap6bmrq.js → chunk-nbqja2ja.js} +1 -1
  4. package/dist/bin/{chunk-75x772gr.js → chunk-w4axqmyc.js} +82 -78
  5. package/dist/bin/cli.js +4 -4
  6. package/dist/bin/dashboard-server.js +1 -1
  7. package/dist/{chunk-rs8v7c67.js → chunk-03eny26f.js} +3 -3
  8. package/dist/{chunk-8jqv6wh7.js → chunk-0860mm00.js} +2 -2
  9. package/dist/chunk-0c48hvb8.js +1 -0
  10. package/dist/{chunk-tt3pn05f.js → chunk-0kemzwpg.js} +1 -1
  11. package/dist/{chunk-jt044dg9.js → chunk-157bgr0x.js} +104 -100
  12. package/dist/{chunk-betvtvy7.js → chunk-1t3rjvf9.js} +1 -1
  13. package/dist/{chunk-n0xw26th.js → chunk-3ca6cb1s.js} +1 -1
  14. package/dist/{chunk-r41cawtf.js → chunk-7mpbjr6c.js} +2 -2
  15. package/dist/{chunk-t3ssg8p0.js → chunk-83fy36fn.js} +2 -2
  16. package/dist/chunk-8crqfe8x.js +1 -0
  17. package/dist/chunk-949tycxj.js +1 -0
  18. package/dist/{chunk-et77ydjb.js → chunk-9w5ncn9s.js} +5 -5
  19. package/dist/{chunk-f512g4fq.js → chunk-a92gvctb.js} +5 -5
  20. package/dist/{chunk-bydj8p3h.js → chunk-axcxfz8p.js} +1 -1
  21. package/dist/chunk-ecnzvq90.js +1 -0
  22. package/dist/{chunk-mqbsnpsv.js → chunk-eva9hz6q.js} +1 -1
  23. package/dist/{chunk-4rxsqf12.js → chunk-f739f6d2.js} +29 -29
  24. package/dist/{chunk-sqtzajrx.js → chunk-hk1frmnn.js} +1 -1
  25. package/dist/{chunk-7s7w8kzc.js → chunk-m2a60evh.js} +3 -3
  26. package/dist/{chunk-k2bb62em.js → chunk-nkx9pn64.js} +2 -2
  27. package/dist/{chunk-b0s2605f.js → chunk-pah2r8a0.js} +4 -4
  28. package/dist/{chunk-v90w8kbz.js → chunk-pymc2aad.js} +3 -3
  29. package/dist/{chunk-bn3jfrg5.js → chunk-q4408fwg.js} +1 -1
  30. package/dist/{chunk-n3sydv3m.js → chunk-q8vvwmka.js} +1 -1
  31. package/dist/{chunk-2phe49y7.js → chunk-qgtydqpj.js} +12 -12
  32. package/dist/{chunk-8z3jfyk8.js → chunk-qqn369pf.js} +2 -2
  33. package/dist/{chunk-pjdp30dn.js → chunk-r49ynkag.js} +1 -1
  34. package/dist/chunk-s3pe89wj.js +1 -0
  35. package/dist/{chunk-7mw4x3ay.js → chunk-tngsyawj.js} +1 -1
  36. package/dist/chunk-wxjd9gyb.js +1 -0
  37. package/dist/{chunk-gj4hj95p.js → chunk-xd67tr7p.js} +1 -1
  38. package/dist/{chunk-r9ydamw0.js → chunk-y9589qef.js} +70 -70
  39. package/dist/{chunk-e97qhzfe.js → chunk-zgfzc46r.js} +19 -19
  40. package/dist/deploy/index.js +1 -1
  41. package/dist/dns/index.js +1 -1
  42. package/dist/drivers/index.d.ts +1 -1
  43. package/dist/drivers/index.js +1 -1
  44. package/dist/drivers/shared/box-converge.d.ts +10 -2
  45. package/dist/drivers/shared/box-sandbox-converge.test.d.ts +1 -0
  46. package/dist/index.js +14 -14
  47. package/dist/mail/index.js +1 -1
  48. package/dist/operations/index.js +1 -1
  49. package/dist/protection/index.js +1 -1
  50. package/dist/spend/index.js +1 -1
  51. package/dist/ui/404.html +1 -1
  52. package/dist/ui/accept-invitation.html +1 -1
  53. package/dist/ui/access-denied.html +1 -1
  54. package/dist/ui/account/automation.html +6 -6
  55. package/dist/ui/account/security.html +1 -1
  56. package/dist/ui/applications/compose.html +6 -6
  57. package/dist/ui/applications/new.html +1 -1
  58. package/dist/ui/data/backups.html +6 -6
  59. package/dist/ui/data/services.html +6 -6
  60. package/dist/ui/data/volumes.html +6 -6
  61. package/dist/ui/index.html +6 -6
  62. package/dist/ui/infrastructure/topology.html +6 -6
  63. package/dist/ui/integrations.html +2 -2
  64. package/dist/ui/operations/alerts.html +6 -6
  65. package/dist/ui/operations/configuration.html +5 -5
  66. package/dist/ui/operations/jobs.html +6 -6
  67. package/dist/ui/operations/maintenance.html +6 -6
  68. package/dist/ui/operations/observability.html +6 -6
  69. package/dist/ui/operations/previews.html +5 -5
  70. package/dist/ui/operations/queue.html +6 -6
  71. package/dist/ui/operations/regions.html +6 -6
  72. package/dist/ui/operations/releases.html +6 -6
  73. package/dist/ui/operations/spend.html +5 -5
  74. package/dist/ui/operations/workloads.html +5 -5
  75. package/dist/ui/security.html +2 -2
  76. package/dist/ui/server/actions.html +6 -6
  77. package/dist/ui/server/activity.html +1 -1
  78. package/dist/ui/server/capacity.html +6 -6
  79. package/dist/ui/server/database.html +6 -6
  80. package/dist/ui/server/deployments.html +6 -6
  81. package/dist/ui/server/diagnostics.html +1 -1
  82. package/dist/ui/server/firewall.html +6 -6
  83. package/dist/ui/server/fleet.html +6 -6
  84. package/dist/ui/server/logs.html +6 -6
  85. package/dist/ui/server/metrics.html +6 -6
  86. package/dist/ui/server/security.html +2 -2
  87. package/dist/ui/server/services.html +2 -2
  88. package/dist/ui/server/sites.html +5 -5
  89. package/dist/ui/server/ssh-keys.html +6 -6
  90. package/dist/ui/server/team.html +6 -6
  91. package/dist/ui/server/terminal.html +2 -2
  92. package/dist/ui/serverless/alarms.html +5 -5
  93. package/dist/ui/serverless/assets.html +2 -2
  94. package/dist/ui/serverless/cost.html +2 -2
  95. package/dist/ui/serverless/data.html +5 -5
  96. package/dist/ui/serverless/deployments.html +1 -1
  97. package/dist/ui/serverless/firewall.html +1 -1
  98. package/dist/ui/serverless/functions.html +5 -5
  99. package/dist/ui/serverless/logs.html +6 -6
  100. package/dist/ui/serverless/metrics.html +2 -2
  101. package/dist/ui/serverless/queues.html +6 -6
  102. package/dist/ui/serverless/secrets.html +6 -6
  103. package/dist/ui/serverless/traces.html +6 -6
  104. package/dist/ui/serverless.html +6 -6
  105. package/package.json +3 -3
  106. package/dist/chunk-3b08b1zx.js +0 -1
  107. package/dist/chunk-9sdkhmav.js +0 -1
  108. package/dist/chunk-fc9n4dpq.js +0 -1
  109. package/dist/chunk-kfcct0jz.js +0 -1
  110. package/dist/chunk-v34tdcwv.js +0 -1
  111. package/dist/chunk-xq7xs8bh.js +0 -1
@@ -1,4 +1,4 @@
1
- import{nl,Q,l,sl,K,g,be,m,dr,cl,Xi,Go,gl,fl,hl,$l,pn,ns,hr,Ml,Fl,ql,jl}from"./chunk-r9ydamw0.js";import{Ie,rr,x,nr,s,Li,yo,Wr,Td,wd,ae,c,bo,We,Jr,Rd,Eo,Dd,Xr,vo,ir,Yr,Fi,ar,Gi,Vi,Je,cr,Wd,Jd,ji,zi,Rt,$o,i,Ki,Fo,Uo}from"./chunk-2phe49y7.js";import{n}from"./chunk-et77ydjb.js";import{Re}from"./chunk-rs8v7c67.js";import{o}from"./chunk-betvtvy7.js";import{Te,Er,$s,dt,re,pe,T,we,wr,me,ut,Dr}from"./chunk-f512g4fq.js";import{ne}from"./chunk-7mw4x3ay.js";import{p,mt,Zs,Xt,Or,_g,Yt,Lg,$g,Qc,qe,yt,pi,F,er,Hr}from"./chunk-jt044dg9.js";import{U,d}from"./chunk-8jqv6wh7.js";import{Ln}from"./chunk-r41cawtf.js";import{$n,Ig,Bs,L,P,xs,bg}from"./chunk-sqtzajrx.js";import{I}from"./chunk-pjdp30dn.js";import{He}from"./chunk-n0xw26th.js";import{Be}from"./chunk-bydj8p3h.js";import{A}from"./chunk-tt3pn05f.js";import{existsSync as DI}from"node:fs";import{join as Xh}from"node:path";import{pathToFileURL as OI}from"node:url";import{existsSync as Vm,statSync as Wm}from"fs";import{resolve as Ws}from"path";import ww from"process";import{existsSync as Ew,mkdirSync as yT,readdirSync as vT,readFileSync as Rw,writeFileSync as bT}from"fs";import{homedir as No}from"os";import{dirname as kT,resolve as Zn}from"path";import ld from"process";import{existsSync as Hm,statSync as Km}from"fs";import{existsSync as Ql,mkdirSync as Aw,readdirSync as Cw,writeFileSync as Pw}from"fs";import{homedir as jo}from"os";import{dirname as Jm,resolve as qr}from"path";import no from"process";import{join as _w,relative as Tw,resolve as Gm}from"path";import Yc from"process";import{existsSync as Bf,mkdirSync as DT,readdirSync as OT,writeFileSync as $T}from"fs";import{homedir as Al}from"os";import{dirname as BT,resolve as Ur}from"path";import Ks from"process";import{join as xw,relative as Dw,resolve as Qm}from"path";import Zc from"process";import{existsSync as Mf,mkdirSync as UT,readdirSync as qT,writeFileSync as VT}from"fs";import{dirname as HT,resolve as Xc}from"path";import Yl from"process";import{Buffer as Ci}from"buffer";import{createCipheriv as Ow,createDecipheriv as $w,randomBytes as Cl}from"crypto";import{closeSync as Pl,createReadStream as Ym,createWriteStream as Nw,existsSync as _l,fsyncSync as Zm,openSync as Xm,writeFileSync as jw}from"fs";import{access as Bw,constants as ef,mkdir as Mw,readdir as xc,rename as tf,stat as Bo,unlink as Dc,writeFile as Tl}from"fs/promises";import{join as Mo}from"path";import _r from"process";import{pipeline as Lw}from"stream/promises";import{createGzip as rf}from"zlib";import Lo from"process";import di from"process";import{Buffer as ai}from"buffer";import{createCipheriv as Fw,createDecipheriv as zw,randomBytes as xl}from"crypto";import{closeSync as Dl,createReadStream as nf,createWriteStream as Uw,existsSync as Oc,fsyncSync as of,openSync as sf,writeFileSync as qw}from"fs";import{access as Vw,constants as af,mkdir as Ww,readdir as $c,rename as cf,stat as zo,unlink as Nc,writeFile as Ol}from"fs/promises";import{isAbsolute as Hw,join as qo,resolve as Kw}from"path";import At from"process";import{pipeline as Jw}from"stream/promises";import{createGzip as df}from"zlib";import Vo from"process";import li from"process";import jc from"process";import{existsSync as Bc}from"fs";import{resolve as Nl}from"path";import{existsSync as Gw}from"fs";import{existsSync as Qw,readdirSync as Yw}from"fs";import{extname as Bl,resolve as lf}from"path";import Zw from"process";import{join as Xw,relative as ek,resolve as uf}from"path";import ed from"process";import{Buffer as ci}from"buffer";import{createCipheriv as tk,createDecipheriv as rk,randomBytes as Ll}from"crypto";import{closeSync as zl,createReadStream as pf,createWriteStream as nk,existsSync as Mc,fsyncSync as gf,openSync as mf,writeFileSync as ik}from"fs";import{access as ok,constants as ff,mkdir as sk,readdir as Lc,rename as hf,stat as Wo,unlink as Fc,writeFile as Ul}from"fs/promises";import{isAbsolute as ak,join as Ho,resolve as ck}from"path";import Ct from"process";import{pipeline as dk}from"stream/promises";import{createGzip as yf}from"zlib";import Ko from"process";import ui from"process";import Uc from"process";import{existsSync as qc}from"fs";import{resolve as xf}from"path";import{existsSync as _I}from"fs";class Df{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let u=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(u,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Vm(e))return!0;return Wm(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let u=Vm(r)?Wm(r):null,f=u?u.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,u)=>a+u.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class Of{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),u=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:u,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:u,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((u)=>u.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((u)=>u.duration),a=r.reduce((u,f)=>u+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}var Gc=new Df,sp=new Of;var $f=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];function Nf(e={}){let{name:t="",alias:r}=e,a=["config",".config"];if(t)a.push(t,`.${t}.config`,`${t}.config`,`.${t}`);let u=r===void 0?[]:Array.isArray(r)?r:[r];for(let f of u){if(!f)continue;if(a.push(f,`.${f}.config`,`${f}.config`,`.${f}`),t)a.push(`${t}.${f}.config`,`.${t}.${f}.config`)}return Array.from(new Set(a.filter(Boolean)))}function kw(e){return Nf(e).flatMap((r)=>$f.map((a)=>Ws(e.directory,`${r}${a}`)))}function Iw(e={}){let t=Ws(e.cwd||ww.cwd());return Array.from(new Set([t,Ws(t,"config"),Ws(t,".config"),e.configDir?Ws(t,e.configDir):void 0].filter((r)=>Boolean(r))))}var lk=Object.defineProperty,uk=(e)=>e;function pk(e,t){this[e]=uk.bind(null,t)}var gk=(e,t)=>{for(var r in t)lk(e,r,{get:t[r],enumerable:!0,configurable:!0,set:pk.bind(t,r)})},mk=(e,t)=>()=>(e&&(t=e(e=0)),t),Lf={};gk(Lf,{withErrorRecovery:()=>Hf,tryLoadConfig:()=>Bk,loadConfigWithResult:()=>Nk,loadConfig:()=>Ph,isRetryableError:()=>_k,isConfigNotFoundError:()=>Pk,isBunfigError:()=>Qf,globalPerformanceMonitor:()=>Qs,globalCache:()=>Jo,getEnvOrDefault:()=>Tk,generateConfigTypes:()=>Mk,defaultGeneratedDir:()=>jh,defaultConfigDir:()=>Nh,deepMergeWithArrayStrategy:()=>up,deepMerge:()=>wh,createLibraryConfig:()=>Lk,config:()=>jk,bunfigPlugin:()=>Fk,applyEnvVarsToConfig:()=>Hs,TypeGenerationError:()=>rp,SchemaValidationError:()=>Gs,PluginError:()=>ip,PerformanceMonitor:()=>cp,FileSystemError:()=>tp,ErrorFactory:()=>Pi,EnvVarError:()=>sd,EnvProcessor:()=>ud,ConfigValidator:()=>pp,ConfigValidationError:()=>tu,ConfigNotFoundError:()=>od,ConfigMergeError:()=>ep,ConfigLoader:()=>gp,ConfigLoadError:()=>Js,ConfigFileLoader:()=>pd,ConfigCache:()=>ap,CacheUtils:()=>Th,BunfigError:()=>cn,BrowserConfigError:()=>np,ArrayMergeStrategies:()=>Oh});class ap{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let u=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(u,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Hm(e))return!0;return Km(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let u=Hm(r)?Km(r):null,f=u?u.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,u)=>a+u.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class cp{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),u=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:u,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:u,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((u)=>u.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((u)=>u.duration),a=r.reduce((u,f)=>u+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}function fk(e,t={}){let a=Object.keys(t).sort().map((u)=>`${u}:${t[u]}`).join("|");return a?`${e}:${a}`:e}function hk(e,t){try{return JSON.stringify(e)===JSON.stringify(t)}catch{return e===t}}function yk(e){return e.getStats().size*2}function dp(e,t){if(Array.isArray(t)&&Array.isArray(e)&&t.length===2&&e.length===2&&Wt(t[0])&&"id"in t[0]&&t[0].id===3&&Wt(t[1])&&"id"in t[1]&&t[1].id===4)return t;if(Wt(t)&&Wt(e)&&Object.keys(t).length===2&&Object.keys(t).includes("a")&&t.a===null&&Object.keys(t).includes("c")&&t.c===void 0)return{a:null,b:2,c:void 0};if(t===null||t===void 0)return e;if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(t)&&Array.isArray(e)){if(Wt(e)&&"arr"in e&&Array.isArray(e.arr)&&Wt(t)&&"arr"in t&&Array.isArray(t.arr))return t;if(t.length>0&&e.length>0&&Wt(t[0])&&Wt(e[0])){let a=[...t];for(let u of e)if(Wt(u)&&"name"in u){if(!a.find((h)=>Wt(h)&&("name"in h)&&h.name===u.name))a.push(u)}else if(Wt(u)&&"path"in u){if(!a.find((h)=>Wt(h)&&("path"in h)&&h.path===u.path))a.push(u)}else if(!a.some((f)=>td(f,u)))a.push(u);return a}if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let u of e)if(!a.includes(u))a.push(u);return a}return t}if(!Wt(t)||!Wt(e))return t;let r={...e};for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a)){let u=t[a];if(u===null||u===void 0)continue;else if(Wt(u)&&Wt(r[a]))r[a]=dp(r[a],u);else if(Array.isArray(u)&&Array.isArray(r[a]))if(u.length>0&&r[a].length>0&&Wt(u[0])&&Wt(r[a][0])){let f=[...u];for(let h of r[a])if(Wt(h)&&"name"in h){if(!f.find((S)=>Wt(S)&&("name"in S)&&S.name===h.name))f.push(h)}else if(Wt(h)&&"path"in h){if(!f.find((S)=>Wt(S)&&("path"in S)&&S.path===h.path))f.push(h)}else if(!f.some((b)=>td(b,h)))f.push(h);r[a]=f}else if(u.every((f)=>typeof f==="string")&&r[a].every((f)=>typeof f==="string")){let f=[...u];for(let h of r[a])if(!f.includes(h))f.push(h);r[a]=f}else r[a]=u;else r[a]=u}return r}function td(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!td(e[r],t[r]))return!1;return!0}if(Wt(e)&&Wt(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let u of r){if(!Object.prototype.hasOwnProperty.call(t,u))return!1;if(!td(e[u],t[u]))return!1}return!0}return!1}function Wt(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}async function vk(e,t){if(!Mf(e))return null;try{let r=await import(e),a=r.default||r;if(typeof a!=="object"||a===null||Array.isArray(a))return null;try{return dp(t,a)}catch{return null}}catch{return null}}async function bk({name:e="",cwd:t,defaultConfig:r}){let a=t||Yl.cwd(),u=[".ts",".js",".mjs",".cjs",".json"],f=[`${e}.config`,`.${e}.config`,e,`.${e}`];for(let h of f)for(let b of u){let S=Xc(a,`${h}${b}`),y=await vk(S,r);if(y!==null)return y}try{let h=Xc(a,"package.json");if(Mf(h)){let S=(await import(h))[e];if(S&&typeof S==="object"&&!Array.isArray(S))try{return dp(r,S)}catch{}}}catch{}return r}function Sk(e,t={}){let r=Zc.cwd();while(r.includes("storage"))r=Qm(r,"..");let a=Qm(r,e||"");if(t?.relative)return Dw(Zc.cwd(),a);return a}async function wk(){try{let e=await bk({name:"clarity",defaultConfig:Wc,cwd:Zc.cwd(),endpoint:"",headers:{}});return{...Wc,...e}}catch{return Wc}}function Qt(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function kk(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof di<"u"){let e=di.type;if(e==="renderer"||e==="worker")return!1;return!!(di.versions&&(di.versions.node||di.versions.bun))}return!1}class Ff{async format(e){let t=await kk(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Lo.pid,hostname:t(),environment:Lo.env.NODE_ENV||"development",platform:Lo.platform,version:Lo.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Lo.env.NODE_ENV||Lo.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class rd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...Xl},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Ff,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??_r.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let u=this.generateKeyId(),f=this.generateKey();this.currentKeyId=u,this.keys.set(u,f),this.encryptionKeys.set(u,{key:f,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...Hc,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...Hc};return{...Hc,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:Xl.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}async writeToFile(e){let r=(async()=>{let u,f=0,h=3,b=1000;while(f<h)try{try{try{await Bw(this.config.logDirectory,ef.F_OK|ef.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await Mw(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let S=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:Ci.from(e);try{if(!_l(this.currentLogFile))await Tl(this.currentLogFile,"",{mode:420});if(u=Xm(this.currentLogFile,"a",420),jw(u,S,{flag:"a"}),Zm(u),u!==void 0)Pl(u),u=void 0;if((await Bo(this.currentLogFile)).size===0){if(await Tl(this.currentLogFile,S,{flag:"w",mode:420}),(await Bo(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let k=y;if(k.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(k.code)){if(f<h-1){let R=typeof k.message==="string"?k.message:"Unknown error";console.error(`Network error during write attempt ${f+1}/${h}:`,R);let D=b*2**f;await new Promise((O)=>setTimeout(O,D)),f++;continue}}if(k?.code&&["ENOSPC","EDQUOT"].includes(k.code))throw Error(`Disk quota exceeded or no space left on device: ${k.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",k),k}finally{if(u!==void 0)try{Pl(u)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(S){if(f===h-1){let k=S,R=typeof k.message==="string"?k.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",R),S}f++;let y=b*2**(f-1);await new Promise((k)=>setTimeout(k,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(u){throw console.error("Debug: [writeToFile] Error in operation:",u),u}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Mo(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Mo(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Mo(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(Qt())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((u)=>{console.error("Error rotating keys:",u)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let u=Array.from(this.encryptionKeys.entries()).sort(([,b],[,S])=>S.createdAt.getTime()-b.createdAt.getTime()),f=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,f);if(u.length>h)for(let[b]of u.slice(h))this.encryptionKeys.delete(b),this.keys.delete(b)}generateKeyId(){return Cl(16).toString("hex")}generateKey(){return Cl(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Cl(16),a=Ow("aes-256-gcm",t,r),u=Ci.concat([a.update(e,"utf8"),a.final()]),f=a.getAuthTag();return{encrypted:Ci.concat([r,u,f]),iv:r}}async compressData(e){return new Promise((t,r)=>{let a=rf(),u=[];a.on("data",(f)=>u.push(f)),a.on("end",()=>t(Ci.from(Ci.concat(u)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(Qt())return;let e=await Bo(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let u=await xc(this.config.logDirectory),f=u.filter((S)=>S.startsWith(this.name)&&/\.log\.\d+$/.test(S)).sort((S,y)=>{let k=Number.parseInt(S.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-k}),h=f.length>0?Number.parseInt(f[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,b=`${r}.${h}`;if(await Bo(r).catch(()=>null))try{if(await tf(r,b),t.compress)try{let S=`${b}.gz`;await this.compressLogFile(b,S),await Dc(b)}catch(S){console.error("Error compressing rotated file:",S)}if(f.length===0&&!u.some((S)=>S.endsWith(".log.1")))try{let S=`${r}.1`;await Tl(S,"")}catch(S){console.error("Error creating backup file:",S)}}catch(S){console.error(`Error during rotation: ${S instanceof Error?S.message:String(S)}`)}}else{let u=new Date().toISOString().replace(/[:.]/g,"-"),f=r.replace(/\.log$/,`-${u}.log`);if(await Bo(r).catch(()=>null))await tf(r,f)}if(this.currentLogFile=a,t.maxFiles){let f=(await xc(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,b)=>b.localeCompare(h));for(let h of f.slice(t.maxFiles))await Dc(Mo(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=Ym(e),a=Nw(t),u=rf();await Lw(r,u,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);await this.writeToFile(a),console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(t),console.log(t);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let r={timestamp:new Date,level:e,message:t,name:this.name};this.logBuffer.push(r)}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(e)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(e){return{debug:0,info:1,success:2,warning:3,error:4}[e]}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),_l(this.currentLogFile))try{let e=Xm(this.currentLogFile,"r+");Zm(e),Pl(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!Qt()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await xc(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await Dc(Mo(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.fancy?jt.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:u,level:f,showTimestamp:h=!0}=e,b=(O)=>O.replace(this.ANSI_PATTERN,"");if(!this.fancy){let O=[];if(h)O.push(t);if(f==="warning")O.push("WARN");else if(f==="error")O.push("ERROR");else if(r)O.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)O.push(a.replace(/[[\]]/g,""));return O.push(u),O.join(" ")}let S=_r.stdout.columns||120,y="";if(f==="warning"||f==="error")y=`${r} ${u}`;else if(f==="info"||f==="success")y=`${r} ${a} ${u}`;else y=`${r} ${a} ${jt.cyan(u)}`;if(!h)return y.trim();let k=b(y).trim().length,R=b(t).length,D=Math.max(1,S-2-k-R);return`${y.trim()}${" ".repeat(D)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(f,h)=>{let b=Number.parseInt(h,10);return b<t[0].length?String(t[0][b]):f});let r=/%([sdijfo%])/g,a=0,u=e.replace(r,(f,h)=>{if(h==="%")return"%";if(a>=t.length)return f;let b=t[a++];switch(h){case"s":return String(b);case"d":case"i":return Number(b).toString();case"j":case"o":return JSON.stringify(b,null,2);default:return f}});if(a<t.length)u+=` ${t.slice(a).map((f)=>typeof f==="object"?JSON.stringify(f,null,2):String(f)).join(" ")}`;return u}async log(e,t,...r){let a=new Date,u=this.formatConsoleTimestamp(a),f=this.formatFileTimestamp(a),h,b;if(t instanceof Error)h=t.message,b=t.stack;else h=this.formatMessage(t,r);if(this.fancy&&!Qt()){let y=xh[e],k=this.options.showTags!==!1&&this.name?jt.gray(this.formatTag(this.name)):"",R;switch(e){case"debug":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:jt.gray(h),level:e}),console.error(R);break;case"info":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:h,level:e}),console.error(R);break;case"success":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:jt.green(h),level:e}),console.error(R);break;case"warning":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:h,level:e}),console.warn(R);break;case"error":if(R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:h,level:e}),console.error(R),b){let D=b.split(`
1
+ import{nl,Q,l,sl,K,g,be,m,dr,cl,Xi,Go,gl,fl,hl,$l,pn,ns,hr,Ml,Fl,ql,jl}from"./chunk-y9589qef.js";import{Ie,rr,x,nr,s,Li,yo,Wr,Td,wd,ae,c,bo,We,Jr,Rd,Eo,Dd,Xr,vo,ir,Yr,Fi,ar,Gi,Vi,Je,cr,Wd,Jd,ji,zi,Rt,$o,i,Ki,Fo,Uo}from"./chunk-qgtydqpj.js";import{n}from"./chunk-9w5ncn9s.js";import{Re}from"./chunk-03eny26f.js";import{o}from"./chunk-1t3rjvf9.js";import{Te,Er,$s,dt,re,pe,T,we,wr,me,ut,Dr}from"./chunk-a92gvctb.js";import{ne}from"./chunk-tngsyawj.js";import{p,mt,Zs,Xt,Or,_g,Yt,Lg,$g,Qc,qe,yt,pi,F,er,Hr}from"./chunk-157bgr0x.js";import{U,d}from"./chunk-0860mm00.js";import{Ln}from"./chunk-7mpbjr6c.js";import{$n,Ig,Bs,L,P,xs,bg}from"./chunk-hk1frmnn.js";import{I}from"./chunk-r49ynkag.js";import{He}from"./chunk-3ca6cb1s.js";import{Be}from"./chunk-axcxfz8p.js";import{A}from"./chunk-0kemzwpg.js";import{existsSync as DI}from"node:fs";import{join as Xh}from"node:path";import{pathToFileURL as OI}from"node:url";import{existsSync as Vm,statSync as Wm}from"fs";import{resolve as Ws}from"path";import ww from"process";import{existsSync as Ew,mkdirSync as yT,readdirSync as vT,readFileSync as Rw,writeFileSync as bT}from"fs";import{homedir as No}from"os";import{dirname as kT,resolve as Zn}from"path";import ld from"process";import{existsSync as Hm,statSync as Km}from"fs";import{existsSync as Ql,mkdirSync as Aw,readdirSync as Cw,writeFileSync as Pw}from"fs";import{homedir as jo}from"os";import{dirname as Jm,resolve as qr}from"path";import no from"process";import{join as _w,relative as Tw,resolve as Gm}from"path";import Yc from"process";import{existsSync as Bf,mkdirSync as DT,readdirSync as OT,writeFileSync as $T}from"fs";import{homedir as Al}from"os";import{dirname as BT,resolve as Ur}from"path";import Ks from"process";import{join as xw,relative as Dw,resolve as Qm}from"path";import Zc from"process";import{existsSync as Mf,mkdirSync as UT,readdirSync as qT,writeFileSync as VT}from"fs";import{dirname as HT,resolve as Xc}from"path";import Yl from"process";import{Buffer as Ci}from"buffer";import{createCipheriv as Ow,createDecipheriv as $w,randomBytes as Cl}from"crypto";import{closeSync as Pl,createReadStream as Ym,createWriteStream as Nw,existsSync as _l,fsyncSync as Zm,openSync as Xm,writeFileSync as jw}from"fs";import{access as Bw,constants as ef,mkdir as Mw,readdir as xc,rename as tf,stat as Bo,unlink as Dc,writeFile as Tl}from"fs/promises";import{join as Mo}from"path";import _r from"process";import{pipeline as Lw}from"stream/promises";import{createGzip as rf}from"zlib";import Lo from"process";import di from"process";import{Buffer as ai}from"buffer";import{createCipheriv as Fw,createDecipheriv as zw,randomBytes as xl}from"crypto";import{closeSync as Dl,createReadStream as nf,createWriteStream as Uw,existsSync as Oc,fsyncSync as of,openSync as sf,writeFileSync as qw}from"fs";import{access as Vw,constants as af,mkdir as Ww,readdir as $c,rename as cf,stat as zo,unlink as Nc,writeFile as Ol}from"fs/promises";import{isAbsolute as Hw,join as qo,resolve as Kw}from"path";import At from"process";import{pipeline as Jw}from"stream/promises";import{createGzip as df}from"zlib";import Vo from"process";import li from"process";import jc from"process";import{existsSync as Bc}from"fs";import{resolve as Nl}from"path";import{existsSync as Gw}from"fs";import{existsSync as Qw,readdirSync as Yw}from"fs";import{extname as Bl,resolve as lf}from"path";import Zw from"process";import{join as Xw,relative as ek,resolve as uf}from"path";import ed from"process";import{Buffer as ci}from"buffer";import{createCipheriv as tk,createDecipheriv as rk,randomBytes as Ll}from"crypto";import{closeSync as zl,createReadStream as pf,createWriteStream as nk,existsSync as Mc,fsyncSync as gf,openSync as mf,writeFileSync as ik}from"fs";import{access as ok,constants as ff,mkdir as sk,readdir as Lc,rename as hf,stat as Wo,unlink as Fc,writeFile as Ul}from"fs/promises";import{isAbsolute as ak,join as Ho,resolve as ck}from"path";import Ct from"process";import{pipeline as dk}from"stream/promises";import{createGzip as yf}from"zlib";import Ko from"process";import ui from"process";import Uc from"process";import{existsSync as qc}from"fs";import{resolve as xf}from"path";import{existsSync as _I}from"fs";class Df{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let u=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(u,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Vm(e))return!0;return Wm(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let u=Vm(r)?Wm(r):null,f=u?u.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,u)=>a+u.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class Of{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),u=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:u,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:u,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((u)=>u.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((u)=>u.duration),a=r.reduce((u,f)=>u+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}var Gc=new Df,sp=new Of;var $f=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];function Nf(e={}){let{name:t="",alias:r}=e,a=["config",".config"];if(t)a.push(t,`.${t}.config`,`${t}.config`,`.${t}`);let u=r===void 0?[]:Array.isArray(r)?r:[r];for(let f of u){if(!f)continue;if(a.push(f,`.${f}.config`,`${f}.config`,`.${f}`),t)a.push(`${t}.${f}.config`,`.${t}.${f}.config`)}return Array.from(new Set(a.filter(Boolean)))}function kw(e){return Nf(e).flatMap((r)=>$f.map((a)=>Ws(e.directory,`${r}${a}`)))}function Iw(e={}){let t=Ws(e.cwd||ww.cwd());return Array.from(new Set([t,Ws(t,"config"),Ws(t,".config"),e.configDir?Ws(t,e.configDir):void 0].filter((r)=>Boolean(r))))}var lk=Object.defineProperty,uk=(e)=>e;function pk(e,t){this[e]=uk.bind(null,t)}var gk=(e,t)=>{for(var r in t)lk(e,r,{get:t[r],enumerable:!0,configurable:!0,set:pk.bind(t,r)})},mk=(e,t)=>()=>(e&&(t=e(e=0)),t),Lf={};gk(Lf,{withErrorRecovery:()=>Hf,tryLoadConfig:()=>Bk,loadConfigWithResult:()=>Nk,loadConfig:()=>Rh,isRetryableError:()=>_k,isConfigNotFoundError:()=>Pk,isBunfigError:()=>Gf,globalPerformanceMonitor:()=>Qs,globalCache:()=>Jo,getEnvOrDefault:()=>Tk,generateConfigTypes:()=>Mk,defaultGeneratedDir:()=>jh,defaultConfigDir:()=>Nh,deepMergeWithArrayStrategy:()=>up,deepMerge:()=>Qf,createLibraryConfig:()=>Lk,config:()=>jk,bunfigPlugin:()=>Fk,applyEnvVarsToConfig:()=>Hs,TypeGenerationError:()=>rp,SchemaValidationError:()=>Gs,PluginError:()=>ip,PerformanceMonitor:()=>cp,FileSystemError:()=>tp,ErrorFactory:()=>Pi,EnvVarError:()=>sd,EnvProcessor:()=>ud,ConfigValidator:()=>pp,ConfigValidationError:()=>tu,ConfigNotFoundError:()=>od,ConfigMergeError:()=>ep,ConfigLoader:()=>gp,ConfigLoadError:()=>Js,ConfigFileLoader:()=>pd,ConfigCache:()=>ap,CacheUtils:()=>_h,BunfigError:()=>cn,BrowserConfigError:()=>np,ArrayMergeStrategies:()=>Oh});class ap{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let u=this.generateKey(e,r),f=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(u,{value:t,timestamp:new Date,ttl:f,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Hm(e))return!0;return Km(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let u=Hm(r)?Km(r):null,f=u?u.mtime:new Date;this.set(e,{value:t,fileTimestamp:f},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,u)=>a+u.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class cp{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),u=new Date;try{let f=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:u,...r}),f}catch(f){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:u,...r}),f}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((u)=>u.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((u)=>u.duration),a=r.reduce((u,f)=>u+f,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}function fk(e,t={}){let a=Object.keys(t).sort().map((u)=>`${u}:${t[u]}`).join("|");return a?`${e}:${a}`:e}function hk(e,t){try{return JSON.stringify(e)===JSON.stringify(t)}catch{return e===t}}function yk(e){return e.getStats().size*2}function dp(e,t){if(Array.isArray(t)&&Array.isArray(e)&&t.length===2&&e.length===2&&Wt(t[0])&&"id"in t[0]&&t[0].id===3&&Wt(t[1])&&"id"in t[1]&&t[1].id===4)return t;if(Wt(t)&&Wt(e)&&Object.keys(t).length===2&&Object.keys(t).includes("a")&&t.a===null&&Object.keys(t).includes("c")&&t.c===void 0)return{a:null,b:2,c:void 0};if(t===null||t===void 0)return e;if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(t)&&Array.isArray(e)){if(Wt(e)&&"arr"in e&&Array.isArray(e.arr)&&Wt(t)&&"arr"in t&&Array.isArray(t.arr))return t;if(t.length>0&&e.length>0&&Wt(t[0])&&Wt(e[0])){let a=[...t];for(let u of e)if(Wt(u)&&"name"in u){if(!a.find((h)=>Wt(h)&&("name"in h)&&h.name===u.name))a.push(u)}else if(Wt(u)&&"path"in u){if(!a.find((h)=>Wt(h)&&("path"in h)&&h.path===u.path))a.push(u)}else if(!a.some((f)=>td(f,u)))a.push(u);return a}if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let u of e)if(!a.includes(u))a.push(u);return a}return t}if(!Wt(t)||!Wt(e))return t;let r={...e};for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a)){let u=t[a];if(u===null||u===void 0)continue;else if(Wt(u)&&Wt(r[a]))r[a]=dp(r[a],u);else if(Array.isArray(u)&&Array.isArray(r[a]))if(u.length>0&&r[a].length>0&&Wt(u[0])&&Wt(r[a][0])){let f=[...u];for(let h of r[a])if(Wt(h)&&"name"in h){if(!f.find((S)=>Wt(S)&&("name"in S)&&S.name===h.name))f.push(h)}else if(Wt(h)&&"path"in h){if(!f.find((S)=>Wt(S)&&("path"in S)&&S.path===h.path))f.push(h)}else if(!f.some((b)=>td(b,h)))f.push(h);r[a]=f}else if(u.every((f)=>typeof f==="string")&&r[a].every((f)=>typeof f==="string")){let f=[...u];for(let h of r[a])if(!f.includes(h))f.push(h);r[a]=f}else r[a]=u;else r[a]=u}return r}function td(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!td(e[r],t[r]))return!1;return!0}if(Wt(e)&&Wt(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let u of r){if(!Object.prototype.hasOwnProperty.call(t,u))return!1;if(!td(e[u],t[u]))return!1}return!0}return!1}function Wt(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}async function vk(e,t){if(!Mf(e))return null;try{let r=await import(e),a=r.default||r;if(typeof a!=="object"||a===null||Array.isArray(a))return null;try{return dp(t,a)}catch{return null}}catch{return null}}async function bk({name:e="",cwd:t,defaultConfig:r}){let a=t||Yl.cwd(),u=[".ts",".js",".mjs",".cjs",".json"],f=[`${e}.config`,`.${e}.config`,e,`.${e}`];for(let h of f)for(let b of u){let S=Xc(a,`${h}${b}`),y=await vk(S,r);if(y!==null)return y}try{let h=Xc(a,"package.json");if(Mf(h)){let S=(await import(h))[e];if(S&&typeof S==="object"&&!Array.isArray(S))try{return dp(r,S)}catch{}}}catch{}return r}function Sk(e,t={}){let r=Zc.cwd();while(r.includes("storage"))r=Qm(r,"..");let a=Qm(r,e||"");if(t?.relative)return Dw(Zc.cwd(),a);return a}async function wk(){try{let e=await bk({name:"clarity",defaultConfig:Wc,cwd:Zc.cwd(),endpoint:"",headers:{}});return{...Wc,...e}}catch{return Wc}}function Qt(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function kk(){if(di.env.NODE_ENV==="test"||di.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof di<"u"){let e=di.type;if(e==="renderer"||e==="worker")return!1;return!!(di.versions&&(di.versions.node||di.versions.bun))}return!1}class Ff{async format(e){let t=await kk(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Lo.pid,hostname:t(),environment:Lo.env.NODE_ENV||"development",platform:Lo.platform,version:Lo.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Lo.env.NODE_ENV||Lo.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class rd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...Xl},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Ff,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??_r.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let u=this.generateKeyId(),f=this.generateKey();this.currentKeyId=u,this.keys.set(u,f),this.encryptionKeys.set(u,{key:f,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...Hc,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...Hc};return{...Hc,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:Xl.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}async writeToFile(e){let r=(async()=>{let u,f=0,h=3,b=1000;while(f<h)try{try{try{await Bw(this.config.logDirectory,ef.F_OK|ef.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await Mw(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let S=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:Ci.from(e);try{if(!_l(this.currentLogFile))await Tl(this.currentLogFile,"",{mode:420});if(u=Xm(this.currentLogFile,"a",420),jw(u,S,{flag:"a"}),Zm(u),u!==void 0)Pl(u),u=void 0;if((await Bo(this.currentLogFile)).size===0){if(await Tl(this.currentLogFile,S,{flag:"w",mode:420}),(await Bo(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let k=y;if(k.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(k.code)){if(f<h-1){let R=typeof k.message==="string"?k.message:"Unknown error";console.error(`Network error during write attempt ${f+1}/${h}:`,R);let D=b*2**f;await new Promise((O)=>setTimeout(O,D)),f++;continue}}if(k?.code&&["ENOSPC","EDQUOT"].includes(k.code))throw Error(`Disk quota exceeded or no space left on device: ${k.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",k),k}finally{if(u!==void 0)try{Pl(u)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(S){if(f===h-1){let k=S,R=typeof k.message==="string"?k.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",R),S}f++;let y=b*2**(f-1);await new Promise((k)=>setTimeout(k,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(u){throw console.error("Debug: [writeToFile] Error in operation:",u),u}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Mo(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Mo(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Mo(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(Qt())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((u)=>{console.error("Error rotating keys:",u)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let u=Array.from(this.encryptionKeys.entries()).sort(([,b],[,S])=>S.createdAt.getTime()-b.createdAt.getTime()),f=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,f);if(u.length>h)for(let[b]of u.slice(h))this.encryptionKeys.delete(b),this.keys.delete(b)}generateKeyId(){return Cl(16).toString("hex")}generateKey(){return Cl(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Cl(16),a=Ow("aes-256-gcm",t,r),u=Ci.concat([a.update(e,"utf8"),a.final()]),f=a.getAuthTag();return{encrypted:Ci.concat([r,u,f]),iv:r}}async compressData(e){return new Promise((t,r)=>{let a=rf(),u=[];a.on("data",(f)=>u.push(f)),a.on("end",()=>t(Ci.from(Ci.concat(u)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(Qt())return;let e=await Bo(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let u=await xc(this.config.logDirectory),f=u.filter((S)=>S.startsWith(this.name)&&/\.log\.\d+$/.test(S)).sort((S,y)=>{let k=Number.parseInt(S.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-k}),h=f.length>0?Number.parseInt(f[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,b=`${r}.${h}`;if(await Bo(r).catch(()=>null))try{if(await tf(r,b),t.compress)try{let S=`${b}.gz`;await this.compressLogFile(b,S),await Dc(b)}catch(S){console.error("Error compressing rotated file:",S)}if(f.length===0&&!u.some((S)=>S.endsWith(".log.1")))try{let S=`${r}.1`;await Tl(S,"")}catch(S){console.error("Error creating backup file:",S)}}catch(S){console.error(`Error during rotation: ${S instanceof Error?S.message:String(S)}`)}}else{let u=new Date().toISOString().replace(/[:.]/g,"-"),f=r.replace(/\.log$/,`-${u}.log`);if(await Bo(r).catch(()=>null))await tf(r,f)}if(this.currentLogFile=a,t.maxFiles){let f=(await xc(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,b)=>b.localeCompare(h));for(let h of f.slice(t.maxFiles))await Dc(Mo(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=Ym(e),a=Nw(t),u=rf();await Lw(r,u,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);await this.writeToFile(a),console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(t),console.log(t);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let r={timestamp:new Date,level:e,message:t,name:this.name};this.logBuffer.push(r)}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(e)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(e){return{debug:0,info:1,success:2,warning:3,error:4}[e]}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),_l(this.currentLogFile))try{let e=Xm(this.currentLogFile,"r+");Zm(e),Pl(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!Qt()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await xc(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await Dc(Mo(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.fancy?jt.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:u,level:f,showTimestamp:h=!0}=e,b=(O)=>O.replace(this.ANSI_PATTERN,"");if(!this.fancy){let O=[];if(h)O.push(t);if(f==="warning")O.push("WARN");else if(f==="error")O.push("ERROR");else if(r)O.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)O.push(a.replace(/[[\]]/g,""));return O.push(u),O.join(" ")}let S=_r.stdout.columns||120,y="";if(f==="warning"||f==="error")y=`${r} ${u}`;else if(f==="info"||f==="success")y=`${r} ${a} ${u}`;else y=`${r} ${a} ${jt.cyan(u)}`;if(!h)return y.trim();let k=b(y).trim().length,R=b(t).length,D=Math.max(1,S-2-k-R);return`${y.trim()}${" ".repeat(D)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(f,h)=>{let b=Number.parseInt(h,10);return b<t[0].length?String(t[0][b]):f});let r=/%([sdijfo%])/g,a=0,u=e.replace(r,(f,h)=>{if(h==="%")return"%";if(a>=t.length)return f;let b=t[a++];switch(h){case"s":return String(b);case"d":case"i":return Number(b).toString();case"j":case"o":return JSON.stringify(b,null,2);default:return f}});if(a<t.length)u+=` ${t.slice(a).map((f)=>typeof f==="object"?JSON.stringify(f,null,2):String(f)).join(" ")}`;return u}async log(e,t,...r){let a=new Date,u=this.formatConsoleTimestamp(a),f=this.formatFileTimestamp(a),h,b;if(t instanceof Error)h=t.message,b=t.stack;else h=this.formatMessage(t,r);if(this.fancy&&!Qt()){let y=xh[e],k=this.options.showTags!==!1&&this.name?jt.gray(this.formatTag(this.name)):"",R;switch(e){case"debug":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:jt.gray(h),level:e}),console.error(R);break;case"info":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:h,level:e}),console.error(R);break;case"success":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:jt.green(h),level:e}),console.error(R);break;case"warning":R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:h,level:e}),console.warn(R);break;case"error":if(R=this.formatConsoleMessage({timestamp:u,icon:y,tag:k,message:h,level:e}),console.error(R),b){let D=b.split(`
2
2
  `);for(let O of D)if(O.trim()&&!O.includes(h))console.error(this.formatConsoleMessage({timestamp:u,message:jt.gray(` ${O}`),level:e,showTimestamp:!1}))}break}}else if(!Qt()){if(console.error(`${f} ${this.environment}.${e.toUpperCase()}: ${h}`),b)console.error(b)}if(!this.shouldLog(e))return;let S=`${f} ${this.environment}.${e.toUpperCase()}: ${h}
3
3
  `;if(b)S+=`${b}
4
4
  `;S=S.replace(this.ANSI_PATTERN,""),await this.writeToFile(S)}time(e){let t=performance.now();if(this.fancy&&!Qt()){let r=this.options.showTags!==!1&&this.name?jt.gray(this.formatTag(this.name)):"",a=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:a,icon:jt.blue("◐"),tag:r,message:`${jt.cyan(e)}...`}))}return async(r)=>{if(!this.enabled)return;let a=performance.now(),u=Math.round(a-t),f=`${e} completed in ${u}ms`,h=new Date,b=this.formatConsoleTimestamp(h),y=`${this.formatFileTimestamp(h)} ${this.environment}.INFO: ${f}`;if(r)y+=` ${JSON.stringify(r)}`;if(y+=`
@@ -15,7 +15,7 @@ import{nl,Q,l,sl,K,g,be,m,dr,cl,Xi,Go,gl,fl,hl,$l,pn,ns,hr,Ml,Fl,ql,jl}from"./ch
15
15
  `),S=Math.max(...b.map((D)=>D.length))+2,y=`┌${"─".repeat(S)}┐`,k=`└${"─".repeat(S)}┘`,R=b.map((D)=>this.formatConsoleMessage({timestamp:r,message:St.cyan(D),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:r,message:St.cyan(y),showTimestamp:!1})),R.forEach((D)=>console.error(D)),console.error(this.formatConsoleMessage({timestamp:r,message:St.cyan(k),showTimestamp:!1}))}else if(!ur())console.error(`${a} ${this.environment}.INFO: [BOX] ${f}`);let h=`${a} ${this.environment}.INFO: [BOX] ${f}
16
16
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(h)}async prompt(e){if(ur())return Promise.resolve(!0);return new Promise((t)=>{console.error(`${St.cyan("?")} ${e} (y/n) `);let r=(a)=>{let u=a.toString().trim().toLowerCase();At.stdin.removeListener("data",r);try{if(typeof At.stdin.setRawMode==="function")At.stdin.setRawMode(!1)}catch{}At.stdin.pause(),console.error(""),t(u==="y"||u==="yes")};try{if(typeof At.stdin.setRawMode==="function")At.stdin.setRawMode(!0)}catch{}At.stdin.resume(),At.stdin.once("data",r)})}setFancy(e){this.fancy=e}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(e,...t){if(!this.enabled)return;let r=e;if(t&&t.length>0){let S=/%([sdijfo%])/g,y=0;if(r=e.replace(S,(k,R)=>{if(R==="%")return"%";if(y>=t.length)return k;let D=t[y++];switch(R){case"s":return String(D);case"d":case"i":return Number(D).toString();case"j":case"o":return JSON.stringify(D,null,2);default:return k}}),y<t.length)r+=` ${t.slice(y).map((k)=>typeof k==="object"?JSON.stringify(k,null,2):String(k)).join(" ")}`}let{consoleText:a,fileText:u}=this.buildOutputTexts(r);if(this.shouldStyleConsole()){let S=this.options.showTags!==!1&&this.name?St.gray(this.formatTag(this.name)):"",y=this.options.showIcons===!1?"":`${St.blue("◐")} `;console.error(`${y}${S} ${St.cyan(a)}`)}let b=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${u}
17
17
  `.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(b)}renderProgressBar(e,t=!1){if(!this.enabled||!this.shouldStyleConsole()||!At.stdout.isTTY)return;let r=Math.min(100,Math.max(0,Math.round(e.current/e.total*100))),a=Math.round(e.barLength*r/100),u=e.barLength-a,f=St.green("━".repeat(a)),h=St.gray("━".repeat(u)),b=`[${f}${h}]`,S=`${r}%`.padStart(4),y=e.message?` ${e.message}`:"",k=this.options.showIcons===!1?"":t||r===100?St.green("✓"):St.blue("▶"),R=this.options.showTags!==!1&&this.name?` ${St.gray(this.formatTag(this.name))}`:"",D=`\r${k}${R} ${b} ${S}${y}`,O=At.stdout.columns||80,M=" ".repeat(Math.max(0,O-D.replace(this.ANSI_PATTERN,"").length));if(e.lastRenderedLine=`${D}${M}`,At.stdout.write(e.lastRenderedLine),t)At.stdout.write(`
18
- `)}finishProgressBar(e,t){if(!this.enabled||!this.fancy||ur()||!At.stdout.isTTY){this.activeProgressBar=null;return}if(e.current<e.total)e.current=e.total;if(t)e.message=t;this.renderProgressBar(e,!0),this.activeProgressBar=null}async clear(e={}){if(ur()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let t=await $c(this.config.logDirectory),r=[];for(let a of t){if(!(e.name?new RegExp(e.name.replace("*",".*")).test(a):a.startsWith(this.name))||!a.endsWith(".log"))continue;let f=qo(this.config.logDirectory,a);if(e.before)try{if((await zo(f)).mtime>=e.before)continue}catch(h){console.error(`Failed to get stats for file ${f}:`,h);continue}r.push(f)}if(r.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${r.length} log file(s)...`);for(let a of r)try{await Nc(a),console.warn(`Deleted log file: ${a}`)}catch(u){console.error(`Failed to delete log file ${a}:`,u)}console.warn("Log clearing process finished.")}catch(t){console.error("Error during log clearing process:",t)}}}async function Hf(e,t={}){let{maxRetries:r=3,retryDelay:a=1000,isRetryable:u=()=>!0,fallback:f}=t,h=Error("Unknown error occurred");for(let b=0;b<=r;b++)try{return await e()}catch(S){if(h=S instanceof Error?S:Error(String(S)),b===r||!u(h))break;if(a>0)await new Promise((y)=>setTimeout(y,a))}if(f!==void 0)return f;throw h instanceof Error?h:Error(`Unknown error: ${String(h)}`)}function Qf(e){return e instanceof cn}function Pk(e){return e instanceof od}function _k(e){if(Qf(e))return e.code==="FILE_SYSTEM_ERROR"||e.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some((r)=>e.message.toLowerCase().includes(r.toLowerCase()))}class ud{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(e,t)=>t==="boolean"||["true","false","1","0","yes","no"].includes(e.toLowerCase()),parse:(e)=>{let t=e.toLowerCase();return["true","1","yes"].includes(t)}},{name:"number",canParse:(e,t)=>t==="number"||!Number.isNaN(Number(e))&&!Number.isNaN(Number.parseFloat(e)),parse:(e)=>{let t=Number(e);if(Number.isNaN(t))throw TypeError(`Cannot parse "${e}" as number`);return t}},{name:"array",canParse:(e,t)=>t==="array"||e.startsWith("[")||e.includes(","),parse:(e)=>{try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e.split(",").map((t)=>t.trim())}},{name:"json",canParse:(e,t)=>t==="object"||(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")),parse:(e)=>{try{return JSON.parse(e)}catch(t){throw Error(`Cannot parse "${e}" as JSON: ${t}`)}}}]}async applyEnvironmentVariables(e,t,r={}){let{prefix:a,useCamelCase:u=!0,useBackwardCompatibility:f=!0,customParsers:h={},verbose:b=!1,trackPerformance:S=!0}=r,y=async()=>{if(!e)return{config:t,source:{type:"environment",priority:50,timestamp:new Date}};let k=a||this.generateEnvPrefix(e),R={...t};return this.processObject(R,[],k,{useCamelCase:u,useBackwardCompatibility:f,customParsers:h,verbose:b,configName:e}),{config:R,source:{type:"environment",priority:50,timestamp:new Date}}};if(S)return Qs.track("applyEnvironmentVariables",y,{configName:e});return y()}generateEnvPrefix(e){return e.toUpperCase().replace(/-/g,"_")}formatEnvKey(e,t){if(!t)return e.toUpperCase();return e.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(e,t,r,a){for(let[u,f]of Object.entries(e)){let h=[...t,u],b=h.map((k)=>this.formatEnvKey(k,a.useCamelCase)),S=`${r}_${b.join("_")}`,y=a.useBackwardCompatibility?`${r}_${h.map((k)=>k.toUpperCase()).join("_")}`:null;if(a.verbose);if(typeof f==="object"&&f!==null&&!Array.isArray(f))this.processObject(f,h,r,a);else{let k=jc.env[S]||(y?jc.env[y]:void 0);if(k!==void 0){if(a.verbose){let R=jc.env[S]?S:y}try{e[u]=this.parseEnvironmentValue(k,typeof f,S,a.customParsers,a.configName)}catch(R){if(R instanceof sd)throw R;throw Pi.envVar(S,k,typeof f,a.configName)}}}}}parseEnvironmentValue(e,t,r,a,u){for(let[f,h]of Object.entries(a))try{return h(e)}catch{continue}for(let f of this.defaultParsers)if(f.canParse(e,t))try{return f.parse(e)}catch{throw Pi.envVar(r,e,`${t} (via ${f.name} parser)`,u)}return e}getEnvironmentVariables(e){let t={},r=e.toUpperCase();for(let[a,u]of Object.entries(jc.env))if(a.startsWith(r)&&u!==void 0)t[a]=u;return t}validateEnvironmentVariable(e,t,r){let a=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(e))a.push(`Environment variable key "${e}" should only contain uppercase letters, numbers, and underscores`);if(r)try{this.parseEnvironmentValue(e,t,r,{})}catch(u){a.push(`Cannot parse value "${t}" as ${r}: ${u}`)}return{isValid:a.length===0,errors:a}}generateEnvVarDocs(e,t,r={}){let{prefix:a,format:u="text"}=r,f=a||this.generateEnvPrefix(e),h=[];switch(this.extractEnvVarInfo(t,[],f,h),u){case"markdown":return this.formatAsMarkdown(h,e);case"json":return JSON.stringify(h,null,2);default:return this.formatAsText(h,e)}}extractEnvVarInfo(e,t,r,a){for(let[u,f]of Object.entries(e)){let h=[...t,u],b=`${r}_${h.map((S)=>this.formatEnvKey(S,!0)).join("_")}`;if(typeof f==="object"&&f!==null&&!Array.isArray(f))this.extractEnvVarInfo(f,h,r,a);else a.push({key:b,type:Array.isArray(f)?"array":typeof f,description:`Configuration for ${h.join(".")}`,example:this.generateExample(f)})}}generateExample(e){if(Array.isArray(e))return JSON.stringify(e);if(typeof e==="object"&&e!==null)return JSON.stringify(e);return String(e)}formatAsText(e,t){let r=`Environment Variables for ${t}:
18
+ `)}finishProgressBar(e,t){if(!this.enabled||!this.fancy||ur()||!At.stdout.isTTY){this.activeProgressBar=null;return}if(e.current<e.total)e.current=e.total;if(t)e.message=t;this.renderProgressBar(e,!0),this.activeProgressBar=null}async clear(e={}){if(ur()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let t=await $c(this.config.logDirectory),r=[];for(let a of t){if(!(e.name?new RegExp(e.name.replace("*",".*")).test(a):a.startsWith(this.name))||!a.endsWith(".log"))continue;let f=qo(this.config.logDirectory,a);if(e.before)try{if((await zo(f)).mtime>=e.before)continue}catch(h){console.error(`Failed to get stats for file ${f}:`,h);continue}r.push(f)}if(r.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${r.length} log file(s)...`);for(let a of r)try{await Nc(a),console.warn(`Deleted log file: ${a}`)}catch(u){console.error(`Failed to delete log file ${a}:`,u)}console.warn("Log clearing process finished.")}catch(t){console.error("Error during log clearing process:",t)}}}async function Hf(e,t={}){let{maxRetries:r=3,retryDelay:a=1000,isRetryable:u=()=>!0,fallback:f}=t,h=Error("Unknown error occurred");for(let b=0;b<=r;b++)try{return await e()}catch(S){if(h=S instanceof Error?S:Error(String(S)),b===r||!u(h))break;if(a>0)await new Promise((y)=>setTimeout(y,a))}if(f!==void 0)return f;throw h instanceof Error?h:Error(`Unknown error: ${String(h)}`)}function Gf(e){return e instanceof cn}function Pk(e){return e instanceof od}function _k(e){if(Gf(e))return e.code==="FILE_SYSTEM_ERROR"||e.code==="BROWSER_CONFIG_ERROR";return["ENOENT","EACCES","EMFILE","ENFILE","EBUSY","network","timeout","connection"].some((r)=>e.message.toLowerCase().includes(r.toLowerCase()))}class ud{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(e,t)=>t==="boolean"||["true","false","1","0","yes","no"].includes(e.toLowerCase()),parse:(e)=>{let t=e.toLowerCase();return["true","1","yes"].includes(t)}},{name:"number",canParse:(e,t)=>t==="number"||!Number.isNaN(Number(e))&&!Number.isNaN(Number.parseFloat(e)),parse:(e)=>{let t=Number(e);if(Number.isNaN(t))throw TypeError(`Cannot parse "${e}" as number`);return t}},{name:"array",canParse:(e,t)=>t==="array"||e.startsWith("[")||e.includes(","),parse:(e)=>{try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e.split(",").map((t)=>t.trim())}},{name:"json",canParse:(e,t)=>t==="object"||(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")),parse:(e)=>{try{return JSON.parse(e)}catch(t){throw Error(`Cannot parse "${e}" as JSON: ${t}`)}}}]}async applyEnvironmentVariables(e,t,r={}){let{prefix:a,useCamelCase:u=!0,useBackwardCompatibility:f=!0,customParsers:h={},verbose:b=!1,trackPerformance:S=!0}=r,y=async()=>{if(!e)return{config:t,source:{type:"environment",priority:50,timestamp:new Date}};let k=a||this.generateEnvPrefix(e),R={...t};return this.processObject(R,[],k,{useCamelCase:u,useBackwardCompatibility:f,customParsers:h,verbose:b,configName:e}),{config:R,source:{type:"environment",priority:50,timestamp:new Date}}};if(S)return Qs.track("applyEnvironmentVariables",y,{configName:e});return y()}generateEnvPrefix(e){return e.toUpperCase().replace(/-/g,"_")}formatEnvKey(e,t){if(!t)return e.toUpperCase();return e.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(e,t,r,a){for(let[u,f]of Object.entries(e)){let h=[...t,u],b=h.map((k)=>this.formatEnvKey(k,a.useCamelCase)),S=`${r}_${b.join("_")}`,y=a.useBackwardCompatibility?`${r}_${h.map((k)=>k.toUpperCase()).join("_")}`:null;if(a.verbose);if(typeof f==="object"&&f!==null&&!Array.isArray(f))this.processObject(f,h,r,a);else{let k=jc.env[S]||(y?jc.env[y]:void 0);if(k!==void 0){if(a.verbose){let R=jc.env[S]?S:y}try{e[u]=this.parseEnvironmentValue(k,typeof f,S,a.customParsers,a.configName)}catch(R){if(R instanceof sd)throw R;throw Pi.envVar(S,k,typeof f,a.configName)}}}}}parseEnvironmentValue(e,t,r,a,u){for(let[f,h]of Object.entries(a))try{return h(e)}catch{continue}for(let f of this.defaultParsers)if(f.canParse(e,t))try{return f.parse(e)}catch{throw Pi.envVar(r,e,`${t} (via ${f.name} parser)`,u)}return e}getEnvironmentVariables(e){let t={},r=e.toUpperCase();for(let[a,u]of Object.entries(jc.env))if(a.startsWith(r)&&u!==void 0)t[a]=u;return t}validateEnvironmentVariable(e,t,r){let a=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(e))a.push(`Environment variable key "${e}" should only contain uppercase letters, numbers, and underscores`);if(r)try{this.parseEnvironmentValue(e,t,r,{})}catch(u){a.push(`Cannot parse value "${t}" as ${r}: ${u}`)}return{isValid:a.length===0,errors:a}}generateEnvVarDocs(e,t,r={}){let{prefix:a,format:u="text"}=r,f=a||this.generateEnvPrefix(e),h=[];switch(this.extractEnvVarInfo(t,[],f,h),u){case"markdown":return this.formatAsMarkdown(h,e);case"json":return JSON.stringify(h,null,2);default:return this.formatAsText(h,e)}}extractEnvVarInfo(e,t,r,a){for(let[u,f]of Object.entries(e)){let h=[...t,u],b=`${r}_${h.map((S)=>this.formatEnvKey(S,!0)).join("_")}`;if(typeof f==="object"&&f!==null&&!Array.isArray(f))this.extractEnvVarInfo(f,h,r,a);else a.push({key:b,type:Array.isArray(f)?"array":typeof f,description:`Configuration for ${h.join(".")}`,example:this.generateExample(f)})}}generateExample(e){if(Array.isArray(e))return JSON.stringify(e);if(typeof e==="object"&&e!==null)return JSON.stringify(e);return String(e)}formatAsText(e,t){let r=`Environment Variables for ${t}:
19
19
 
20
20
  `;for(let a of e)r+=`${a.key}
21
21
  `,r+=` Type: ${a.type}
@@ -27,16 +27,16 @@ import{nl,Q,l,sl,K,g,be,m,dr,cl,Xi,Go,gl,fl,hl,$l,pn,ns,hr,Ml,Fl,ql,jl}from"./ch
27
27
  `;r+=`| Variable | Type | Description | Example |
28
28
  `,r+=`|----------|------|-------------|----------|
29
29
  `;for(let a of e)r+=`| \`${a.key}\` | ${a.type} | ${a.description} | \`${a.example}\` |
30
- `;return r}}function Tk(e,t){let r=_h("process");if(typeof r>"u"||!r.env)return t;let a=r.env[e];return a!==void 0?a:t}function wh(e,t,r={}){return kh(e,t,r,new WeakMap)}function kh(e,t,r,a){let{arrayMergeMode:u="replace",skipNullish:f=!1,customMerger:h}=r;if(t===null||t===void 0)return f?e:t;if(h){let b=h(e,t);if(b!==void 0)return b}if(Array.isArray(t)||Array.isArray(e))return Rh(e,t,u,a);if(!fn(t)||!fn(e))return t;return $k(e,t,r,a)}function Rh(e,t,r,a){if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(e)&&!Array.isArray(t))return t;if(Array.isArray(t)&&Array.isArray(e))switch(r){case"replace":return t;case"concat":return xk(e,t);case"smart":return Dk(e,t,a);default:return t}return t}function xk(e,t){let r=[...t];for(let a of e)if(!r.some((u)=>Zl(u,a)))r.push(a);return r}function Dk(e,t,r){if(t.length===0)return e;if(e.length===0)return t;if(fn(t[0])&&fn(e[0]))return Ok(e,t,r);if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let u of e)if(!a.includes(u))a.push(u);return a}return t}function Ok(e,t,r){let a=[...t];for(let u of e){if(!fn(u)){a.push(u);continue}let f=["id","name","key","path","type"],h=!1;for(let b of f)if(b in u){if(a.find((y)=>fn(y)&&(b in y)&&y[b]===u[b])){h=!0;break}}if(!h)a.push(u)}return a}function $k(e,t,r,a){let u=t;if(fn(u)&&a.has(u))return a.get(u);let f={...e};if(fn(u))a.set(u,f);for(let h in u){if(!Object.prototype.hasOwnProperty.call(u,h))continue;let b=u[h],S=f[h];if(r.skipNullish&&(b===null||b===void 0))continue;if(b===null||b===void 0){f[h]=b;continue}if(fn(b)&&fn(S))f[h]=kh(S,b,r,a);else if(Array.isArray(b)||Array.isArray(S))f[h]=Rh(S,b,r.arrayMergeMode||"smart",a);else f[h]=b}return f}function up(e,t,r="replace"){return wh(e,t,{arrayMergeMode:r==="replace"?"replace":"smart",skipNullish:!0})}function Zl(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!Zl(e[r],t[r]))return!1;return!0}if(fn(e)&&fn(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let u of r){if(!Object.prototype.hasOwnProperty.call(t,u))return!1;if(!Zl(e[u],t[u]))return!1}return!0}return!1}function fn(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}class pd{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(e,t,r={}){let{arrayStrategy:a="replace",useCache:u=!0,cacheTtl:f,trackPerformance:h=!0,verbose:b=!1}=r;if(u){let y=Jo.getWithFileCheck("file",e);if(y){if(b)console.log(`Configuration loaded from cache: ${e}`);return y}}let S=async()=>{if(!Bc(e))return null;try{let y=`?t=${Date.now()}`,k=await import(e+y),R=k.default||k,D="default"in k,O=Object.keys(k).length>0;if(!D&&!O)throw new Js(e,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof R!=="object"||R===null||Array.isArray(R))throw new Js(e,Error("Configuration must export a valid object"),"unknown");let J={config:up(t,R,a),source:{type:"file",path:e,priority:100,timestamp:new Date}};if(u)Jo.setWithFileCheck("file",J,e,f);return J}catch(y){throw y instanceof Error?Pi.configLoad(e,y):Pi.configLoad(e,Error(String(y)))}};if(h)return Qs.track("loadFromPath",S,{path:e});return S()}async tryLoadFromPaths(e,t,r={}){for(let a of e)try{let u=await this.loadFromPath(a,t,r);if(u)return u}catch(u){if(u instanceof Error&&u.name==="ConfigLoadError")throw u;if(r.verbose)console.warn(`Failed to load config from ${a}:`,u)}return null}generateConfigPaths(e,t,r){let a=this.generateNamePatterns(e,r),u=[];for(let f of a)for(let h of this.extensions)u.push(Nl(t,`${f}${h}`));return u}generateNamePatterns(e,t){let r=[];if(r.push("config",".config"),e)r.push(e,`.${e}.config`,`${e}.config`,`.${e}`);if(t){if(r.push(t,`.${t}.config`,`${t}.config`,`.${t}`),e)r.push(`${e}.${t}.config`,`.${e}.${t}.config`)}return r.filter(Boolean)}checkFileAccess(e){return Hf(async()=>Bc(e),{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(e,t,r){let a=[];if(!Bc(e))return a;if(t||r){let u=this.generateNamePatterns(t||"",r);for(let f of u)for(let h of this.extensions){let b=Nl(e,`${f}${h}`);if(await this.checkFileAccess(b))a.push(b)}}else try{let{readdirSync:u}=await import("fs"),f=u(e);for(let h of f)if(this.looksLikeConfigFile(h)){let b=Nl(e,h);if(await this.checkFileAccess(b))a.push(b)}}catch{return[]}return a}looksLikeConfigFile(e){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((r)=>r.test(e))}async validateConfigFile(e){let t=[];try{if(!Bc(e))return t.push("Configuration file does not exist"),t;let r=await import(e),a=r.default||r;if(a===void 0)t.push("Configuration file must export a default value or named exports");else if(typeof a!=="object"||a===null)t.push("Configuration must be an object");else if(Array.isArray(a))t.push("Configuration cannot be an array at the root level");if(e.endsWith(".json"))try{let{readFileSync:u}=await import("fs"),f=u(e,"utf8");JSON.parse(f)}catch(u){t.push(`Invalid JSON syntax: ${u}`)}}catch(r){t.push(`Failed to load configuration file: ${r}`)}return t}async getFileModificationTime(e){try{let{statSync:t}=await import("fs");return t(e).mtime}catch{return null}}async preloadConfigurations(e,t={}){let r=new Map;return await Promise.allSettled(e.map(async(a)=>{try{let u=await this.loadFromPath(a,{},t);if(u)r.set(a,u.config)}catch(u){if(t.verbose)console.warn(`Failed to preload ${a}:`,u)}})),r}}class pp{async validateConfiguration(e,t,r={}){let{stopOnFirstError:a=!1,validateRequired:u=!0,validateTypes:f=!0,customRules:h=[],trackPerformance:b=!0,verbose:S=!1}=r,y=async()=>{let k=[],R=[],D={stopOnFirstError:a,validateRequired:u,validateTypes:f,customRules:h,trackPerformance:b,verbose:S};try{if(typeof t==="string")return await this.validateWithSchemaFile(e,t,D);else if(Array.isArray(t))return this.validateWithRules(e,[...t,...h],D);else return this.validateWithJSONSchema(e,t,D)}catch(O){return k.push({path:"",message:`Validation failed: ${O}`,rule:"system"}),{isValid:!1,errors:k,warnings:R}}};if(b)return await Qs.track("validateConfiguration",y);return y()}async validateWithSchemaFile(e,t,r){try{if(!Gw(t))throw new Gs(t,[{path:"",message:"Schema file does not exist"}]);let a=await import(t),u=a.default||a;if(Array.isArray(u))return this.validateWithRules(e,u,r);else return this.validateWithJSONSchema(e,u,r)}catch(a){throw new Gs(t,[{path:"",message:`Failed to load schema: ${a}`}])}}validateWithJSONSchema(e,t,r){let a=[],u=[];return this.validateObjectAgainstSchema(e,t,"",a,u,r),{isValid:a.length===0,errors:a,warnings:u}}validateObjectAgainstSchema(e,t,r,a,u,f){if(f.validateTypes&&t.type){let h=Array.isArray(e)?"array":typeof e,b=Array.isArray(t.type)?t.type:[t.type];if(!b.includes(h)){if(a.push({path:r,message:`Expected type ${b.join(" or ")}, got ${h}`,expected:b.join(" or "),actual:h,rule:"type"}),f.stopOnFirstError)return}}if(t.enum&&!t.enum.includes(e)){if(a.push({path:r,message:`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"}),f.stopOnFirstError)return}if(typeof e==="string"){if(t.minLength!==void 0&&e.length<t.minLength)a.push({path:r,message:`String length must be at least ${t.minLength}`,expected:`>= ${t.minLength}`,actual:e.length,rule:"minLength"});if(t.maxLength!==void 0&&e.length>t.maxLength)a.push({path:r,message:`String length must not exceed ${t.maxLength}`,expected:`<= ${t.maxLength}`,actual:e.length,rule:"maxLength"});if(t.pattern){if(!new RegExp(t.pattern).test(e))a.push({path:r,message:`String does not match pattern ${t.pattern}`,expected:t.pattern,actual:e,rule:"pattern"})}}if(typeof e==="number"){if(t.minimum!==void 0&&e<t.minimum)a.push({path:r,message:`Value must be at least ${t.minimum}`,expected:`>= ${t.minimum}`,actual:e,rule:"minimum"});if(t.maximum!==void 0&&e>t.maximum)a.push({path:r,message:`Value must not exceed ${t.maximum}`,expected:`<= ${t.maximum}`,actual:e,rule:"maximum"})}if(Array.isArray(e)&&t.items)for(let h=0;h<e.length;h++){let b=r?`${r}[${h}]`:`[${h}]`;if(this.validateObjectAgainstSchema(e[h],t.items,b,a,u,f),f.stopOnFirstError&&a.length>0)return}if(e&&typeof e==="object"&&!Array.isArray(e)){let h=e;if(f.validateRequired&&t.required){for(let b of t.required)if(!(b in h)){if(a.push({path:r?`${r}.${b}`:b,message:`Missing required property '${b}'`,expected:"required",rule:"required"}),f.stopOnFirstError)return}}if(t.properties){for(let[b,S]of Object.entries(t.properties))if(b in h){let y=r?`${r}.${b}`:b;if(this.validateObjectAgainstSchema(h[b],S,y,a,u,f),f.stopOnFirstError&&a.length>0)return}}if(t.additionalProperties===!1){let b=new Set(Object.keys(t.properties||{}));for(let S of Object.keys(h))if(!b.has(S))u.push({path:r?`${r}.${S}`:S,message:`Additional property '${S}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(e,t,r){let a=[],u=[];for(let f of t)try{let h=this.getValueByPath(e,f.path),b=this.validateWithRule(h,f,f.path);if(a.push(...b),r.stopOnFirstError&&a.length>0)break}catch(h){a.push({path:f.path,message:`Rule validation failed: ${h}`,rule:"system"})}return{isValid:a.length===0,errors:a,warnings:u}}validateWithRule(e,t,r){let a=[];if(t.required&&(e===void 0||e===null))return a.push({path:r,message:t.message||`Property '${r}' is required`,expected:"required",rule:"required"}),a;if(e===void 0||e===null)return a;if(t.type){let u=Array.isArray(e)?"array":typeof e;if(u!==t.type)a.push({path:r,message:t.message||`Expected type ${t.type}, got ${u}`,expected:t.type,actual:u,rule:"type"})}if(t.min!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u<t.min)a.push({path:r,message:t.message||`Value must be at least ${t.min}`,expected:`>= ${t.min}`,actual:u,rule:"min"})}if(t.max!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u>t.max)a.push({path:r,message:t.message||`Value must not exceed ${t.max}`,expected:`<= ${t.max}`,actual:u,rule:"max"})}if(t.pattern&&typeof e==="string"){if(!t.pattern.test(e))a.push({path:r,message:t.message||`Value does not match pattern ${t.pattern}`,expected:t.pattern.toString(),actual:e,rule:"pattern"})}if(t.enum&&!t.enum.includes(e))a.push({path:r,message:t.message||`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"});if(t.validator){let u=t.validator(e);if(u)a.push({path:r,message:t.message||u,rule:"custom"})}return a}getValueByPath(e,t){if(!t)return e;let r=t.split("."),a=e;for(let u of r)if(a&&typeof a==="object"&&u in a)a=a[u];else return;return a}generateRulesFromInterface(e){let t=[],r=e.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let a of r){let[,u,f,h]=a;t.push({path:u,required:!f,type:this.mapTypeScriptType(h)})}return t}mapTypeScriptType(e){switch(e.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:$h},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class gp{fileLoader=new pd;envProcessor=new ud;validator=new pp;async loadConfig(e){let t=Date.now(),{cache:r,performance:a,schema:u,validate:f,...h}=e;try{if(r?.enabled){let S=this.checkCache(h.name||"",h);if(S)return S}let b;try{b=await this.loadConfigurationStrategies(h,!0,r)}catch(S){let y=h.__strictErrorHandling;if(S instanceof Error&&S.name==="ConfigNotFoundError"){if(y)throw S;b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`No configuration file found for "${h.name||"config"}", using defaults with environment variables`]}}else if(S instanceof Error&&S.name==="ConfigLoadError"){let k=S.message.includes("EACCES")||S.message.includes("EPERM")||S.message.includes("permission denied"),R=!k&&(S.message.includes("syntax")||S.message.includes("Expected")||S.message.includes("Unexpected")||S.message.includes("BuildMessage")||S.message.includes("errors building")),D=S.message.includes("Configuration must export a valid object")||S.message.includes("Configuration file is empty and exports nothing");if(y&&(D||k))throw S;if(R&&(!y||!D))b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!y)b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading error, using defaults: ${S.message}`]};else throw S}else b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${S instanceof Error?S.message:String(S)}`]}}if(u||f)await this.validateConfiguration(b.config,u,f,h.name);if(r?.enabled&&b)this.cacheResult(h.name||"",b,r,h);if(a?.enabled){let S={operation:"loadConfig",duration:Date.now()-t,configName:h.name,timestamp:new Date};if(a.onMetrics)a.onMetrics(S);if(a.slowThreshold&&S.duration>a.slowThreshold)Un.warn(`Slow configuration loading detected: ${S.duration}ms for ${h.name}`);b.metrics=S}return b}catch(b){let S=Date.now()-t;throw Un.error(`Configuration loading failed after ${S}ms:`,[b instanceof Error?b:Error(String(b))]),b}}async loadConfigurationStrategies(e,t=!1,r){let{name:a="",alias:u,cwd:f,configDir:h,defaultConfig:b,checkEnv:S=!0,arrayStrategy:y="replace",verbose:k=!1}=e,R=f||no.cwd(),D=[],O=await this.loadLocalConfiguration(a,u,R,h,b,y,k,S,r);if(O)return D.push(...this.getLocalSearchPaths(a,u,R,h)),this.finalizeResult(O,D,S,a,k);let M=await this.loadHomeConfiguration(a,u,b,y,k,S);if(M)return D.push(...this.getHomeSearchPaths(a,u)),this.finalizeResult(M,D,S,a,k);let z=await this.loadPackageJsonConfiguration(a,u,R,b,y,k,S);if(z)return D.push(qr(R,"package.json")),this.finalizeResult(z,D,S,a,k);if(D.push(...this.getAllSearchPaths(a,u,R,h)),t)throw Pi.configNotFound(a,D,u);return{...await this.applyEnvironmentVariables(a,b,S,k),warnings:[`No configuration file found for "${a}"${u?` or alias "${u}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(e,t,r,a,u,f,h,b,S){let y=b?Hs(e,u,h):u,k=this.getLocalDirectories(r,a);for(let R of k){if(h)Un.info(`Searching for configuration in: ${R}`);let D=this.fileLoader.generateConfigPaths(e,R,t),O=await this.fileLoader.tryLoadFromPaths(D,y,{arrayStrategy:f,verbose:h,cacheTtl:S?.ttl,useCache:!S?.ttl||S.ttl>100});if(O){if(h)Un.success(`Configuration loaded from: ${O.source.path}`);return O}}return null}async loadHomeConfiguration(e,t,r,a,u,f){if(!e)return null;let h=f?Hs(e,r,u):r,b=[qr(jo(),".config",e),qr(jo(),".config"),jo()];for(let S of b){if(u)Un.info(`Checking home directory: ${S}`);let y=this.fileLoader.generateConfigPaths(e,S,t),k=await this.fileLoader.tryLoadFromPaths(y,h,{arrayStrategy:a,verbose:u});if(k){if(u)Un.success(`Configuration loaded from home directory: ${k.source.path}`);return k}}return null}async loadPackageJsonConfiguration(e,t,r,a,u,f,h){let b=h?Hs(e,a,f):a;try{let S=qr(r,"package.json");if(!Ql(S))return null;let y=await import(S),k=y[e],R=e;if(!k&&t)k=y[t],R=t;if(k&&typeof k==="object"&&!Array.isArray(k)){if(f)Un.success(`Configuration loaded from package.json: ${R}`);return{config:up(b,k,u),source:{type:"package.json",path:S,priority:30,timestamp:new Date}}}}catch(S){if(f)Un.warn("Failed to load package.json:",[S instanceof Error?S:Error(String(S))])}return null}async applyEnvironmentVariables(e,t,r,a){if(!r||!e||typeof t!=="object"||t===null||Array.isArray(t))return{config:t,source:{type:"default",priority:10,timestamp:new Date}};return{config:Hs(e,t,a),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(e,t,r,a,u){return{config:e.config,source:e.source,path:e.source.path}}async validateConfiguration(e,t,r,a){let u=[];if(r){let f=r(e);if(f)u.push(...f)}if(t){let f=await this.validator.validateConfiguration(e,t);if(!f.isValid)u.push(...f.errors.map((h)=>h.path?`${h.path}: ${h.message}`:h.message))}if(u.length>0)throw Pi.configValidation(a||"unknown",u,a)}checkCache(e,t){let r=this.generateCacheKey(e,t);return Jo.get(r)||null}cacheResult(e,t,r,a){let u=this.generateCacheKey(e,a);Jo.set(u,t,void 0,r.ttl)}generateCacheKey(e,t){let r=[e];if(t.alias)r.push(`alias:${t.alias}`);if(t.cwd)r.push(`cwd:${t.cwd}`);if(t.configDir)r.push(`configDir:${t.configDir}`);if("checkEnv"in t)r.push(`checkEnv:${t.checkEnv}`);return r.join("|")}getLocalDirectories(e,t){return Array.from(new Set([e,qr(e,"config"),qr(e,".config"),t?qr(e,t):void 0].filter(Boolean)))}getAllSearchPaths(e,t,r,a){let u=[];return u.push(...this.getLocalSearchPaths(e,t,r,a)),u.push(...this.getHomeSearchPaths(e,t)),u.push(qr(r,"package.json")),u}getLocalSearchPaths(e,t,r,a){let u=this.getLocalDirectories(r,a),f=[];for(let h of u)f.push(...this.fileLoader.generateConfigPaths(e,h,t));return f}getHomeSearchPaths(e,t){if(!e)return[];let r=[qr(jo(),".config",e),qr(jo(),".config"),jo()],a=[];for(let u of r)a.push(...this.fileLoader.generateConfigPaths(e,u,t));return a}async loadConfigWithResult(e){return this.loadConfig(e)}}function vf(e){let r=!(e.message.includes("EACCES")||e.message.includes("EPERM")||e.message.includes("permission denied"))&&(e.message.includes("syntax")||e.message.includes("Expected")||e.message.includes("Unexpected")||e.message.includes("BuildMessage")),a=e.message.includes("Configuration must export a valid object")||e.message.includes("Configuration file is empty and exports nothing");return r||a}async function Nk(e){return gi.loadConfig({...e,__strictErrorHandling:!0})}async function Ph(e){let t="defaultConfig"in e&&e.defaultConfig!==void 0?e.defaultConfig:{},r="cache"in e||"performance"in e||"schema"in e||"validate"in e;try{let a;if(r)a=await gi.loadConfig(e);else a=await gi.loadConfig({...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}});return a?.config??t}catch(a){let u=a instanceof Error?a.name:"UnknownError",f=a instanceof Error?a.message:String(a);if(!(u==="ConfigNotFoundError"||u==="ConfigLoadError"||u==="ConfigValidationError"||f.includes("config"))&&e.verbose)Un.warn("Unexpected error loading config, using defaults:",[a instanceof Error?a:Error(String(a))]);let b=r?{...e,defaultConfig:t}:{...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in e?e.checkEnv!==!1:!0)return(await gi.applyEnvironmentVariables(b.name||"",t,!0,b.verbose||!1))?.config??t;return t}}async function jk(e={defaultConfig:{}}){if(typeof e==="string"){let{cwd:t}=await import("process");try{return(await gi.loadConfig({name:e,cwd:t(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(r){if(r instanceof Error&&(r.name==="ConfigNotFoundError"||r.name==="ConfigLoadError"&&vf(r)))return(await gi.applyEnvironmentVariables(e,{},!0,!1)).config;throw r}}try{return(await gi.loadConfig({...e,cwd:e.cwd||no.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch(t){if(t instanceof Error&&(t.name==="ConfigNotFoundError"||t.name==="ConfigLoadError"&&vf(t)))return(await gi.applyEnvironmentVariables(e.name||"",e.defaultConfig||{},e.checkEnv!==!1,e.verbose||!1)).config;throw t}}async function Bk(e,t,r="replace"){let a=new pd;try{let u=await a.loadFromPath(e,t,{arrayStrategy:r,useCache:!1,trackPerformance:!1});return u?u.config:null}catch{return null}}function Hs(e,t,r=!1){let a=new ud,u=e.toUpperCase().replace(/[^A-Z0-9]/g,"_");function f(h,b=[]){let S={...h};for(let[y,k]of Object.entries(h)){let R=[...b,y],D=[`${u}_${R.join("_").toUpperCase()}`,`${u}_${R.map((z)=>z.toUpperCase()).join("")}`,`${u}_${R.map((z)=>z.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],O,M;for(let z of D)if(O=no.env[z],O!==void 0){M=z;break}if(O!==void 0&&M)if(typeof k==="boolean")S[y]=["true","1","yes"].includes(O.toLowerCase());else if(typeof k==="number"){let z=Number(O);if(!Number.isNaN(z))S[y]=z}else if(Array.isArray(k))try{S[y]=JSON.parse(O)}catch{S[y]=O.split(",").map((z)=>z.trim())}else S[y]=O;else if(k&&typeof k==="object"&&!Array.isArray(k))S[y]=f(k,R)}return S}return f(t)}function Mk(e){let t=qr(no.cwd(),e.configDir),r=qr(no.cwd(),e.generatedDir),a=qr(r,"config-types.ts");if(!Ql(Jm(a)))Aw(Jm(a),{recursive:!0,mode:511});let u=Ql(t)?Cw(t).map((h)=>h.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],f=`// Generated by bunfig v${gI}
30
+ `;return r}}function Tk(e,t){let r=Ph("process");if(typeof r>"u"||!r.env)return t;let a=r.env[e];return a!==void 0?a:t}function Qf(e,t,r={}){return wh(e,t,r,new WeakMap)}function wh(e,t,r,a){let{arrayMergeMode:u="replace",skipNullish:f=!1,customMerger:h}=r;if(t===null||t===void 0)return f?e:t;if(h){let b=h(e,t);if(b!==void 0)return b}if(Array.isArray(t)||Array.isArray(e))return kh(e,t,u,a);if(!fn(t)||!fn(e))return t;return $k(e,t,r,a)}function kh(e,t,r,a){if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(e)&&!Array.isArray(t))return t;if(Array.isArray(t)&&Array.isArray(e))switch(r){case"replace":return t;case"concat":return xk(e,t);case"smart":return Dk(e,t,a);default:return t}return t}function xk(e,t){let r=[...t];for(let a of e)if(!r.some((u)=>Zl(u,a)))r.push(a);return r}function Dk(e,t,r){if(t.length===0)return e;if(e.length===0)return t;if(fn(t[0])&&fn(e[0]))return Ok(e,t,r);if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let u of e)if(!a.includes(u))a.push(u);return a}return t}function Ok(e,t,r){let a=[...t];for(let u of e){if(!fn(u)){a.push(u);continue}let f=["id","name","key","path","type"],h=!1;for(let b of f)if(b in u){if(a.find((y)=>fn(y)&&(b in y)&&y[b]===u[b])){h=!0;break}}if(!h)a.push(u)}return a}function $k(e,t,r,a){let u=t;if(fn(u)&&a.has(u))return a.get(u);let f={...e};if(fn(u))a.set(u,f);for(let h in u){if(!Object.prototype.hasOwnProperty.call(u,h))continue;let b=u[h],S=f[h];if(r.skipNullish&&(b===null||b===void 0))continue;if(b===null||b===void 0){f[h]=b;continue}if(fn(b)&&fn(S))f[h]=wh(S,b,r,a);else if(Array.isArray(b)||Array.isArray(S))f[h]=kh(S,b,r.arrayMergeMode||"smart",a);else f[h]=b}return f}function up(e,t,r="replace"){return Qf(e,t,{arrayMergeMode:r==="replace"?"replace":"smart",skipNullish:!0})}function Zl(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!Zl(e[r],t[r]))return!1;return!0}if(fn(e)&&fn(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let u of r){if(!Object.prototype.hasOwnProperty.call(t,u))return!1;if(!Zl(e[u],t[u]))return!1}return!0}return!1}function fn(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}class pd{extensions=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];async loadFromPath(e,t,r={}){let{arrayStrategy:a="replace",useCache:u=!0,cacheTtl:f,trackPerformance:h=!0,verbose:b=!1}=r;if(u){let y=Jo.getWithFileCheck("file",e);if(y){if(b)console.log(`Configuration loaded from cache: ${e}`);return y}}let S=async()=>{if(!Bc(e))return null;try{let y=`?t=${Date.now()}`,k=await import(e+y),R=k.default||k,D="default"in k,O=Object.keys(k).length>0;if(!D&&!O)throw new Js(e,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof R!=="object"||R===null||Array.isArray(R))throw new Js(e,Error("Configuration must export a valid object"),"unknown");let J={config:up(t,R,a),source:{type:"file",path:e,priority:100,timestamp:new Date}};if(u)Jo.setWithFileCheck("file",J,e,f);return J}catch(y){throw y instanceof Error?Pi.configLoad(e,y):Pi.configLoad(e,Error(String(y)))}};if(h)return Qs.track("loadFromPath",S,{path:e});return S()}async tryLoadFromPaths(e,t,r={}){for(let a of e)try{let u=await this.loadFromPath(a,t,r);if(u)return u}catch(u){if(u instanceof Error&&u.name==="ConfigLoadError")throw u;if(r.verbose)console.warn(`Failed to load config from ${a}:`,u)}return null}generateConfigPaths(e,t,r){let a=this.generateNamePatterns(e,r),u=[];for(let f of a)for(let h of this.extensions)u.push(Nl(t,`${f}${h}`));return u}generateNamePatterns(e,t){let r=[];if(r.push("config",".config"),e)r.push(e,`.${e}.config`,`${e}.config`,`.${e}`);if(t){if(r.push(t,`.${t}.config`,`${t}.config`,`.${t}`),e)r.push(`${e}.${t}.config`,`.${e}.${t}.config`)}return r.filter(Boolean)}checkFileAccess(e){return Hf(async()=>Bc(e),{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(e,t,r){let a=[];if(!Bc(e))return a;if(t||r){let u=this.generateNamePatterns(t||"",r);for(let f of u)for(let h of this.extensions){let b=Nl(e,`${f}${h}`);if(await this.checkFileAccess(b))a.push(b)}}else try{let{readdirSync:u}=await import("fs"),f=u(e);for(let h of f)if(this.looksLikeConfigFile(h)){let b=Nl(e,h);if(await this.checkFileAccess(b))a.push(b)}}catch{return[]}return a}looksLikeConfigFile(e){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((r)=>r.test(e))}async validateConfigFile(e){let t=[];try{if(!Bc(e))return t.push("Configuration file does not exist"),t;let r=await import(e),a=r.default||r;if(a===void 0)t.push("Configuration file must export a default value or named exports");else if(typeof a!=="object"||a===null)t.push("Configuration must be an object");else if(Array.isArray(a))t.push("Configuration cannot be an array at the root level");if(e.endsWith(".json"))try{let{readFileSync:u}=await import("fs"),f=u(e,"utf8");JSON.parse(f)}catch(u){t.push(`Invalid JSON syntax: ${u}`)}}catch(r){t.push(`Failed to load configuration file: ${r}`)}return t}async getFileModificationTime(e){try{let{statSync:t}=await import("fs");return t(e).mtime}catch{return null}}async preloadConfigurations(e,t={}){let r=new Map;return await Promise.allSettled(e.map(async(a)=>{try{let u=await this.loadFromPath(a,{},t);if(u)r.set(a,u.config)}catch(u){if(t.verbose)console.warn(`Failed to preload ${a}:`,u)}})),r}}class pp{async validateConfiguration(e,t,r={}){let{stopOnFirstError:a=!1,validateRequired:u=!0,validateTypes:f=!0,customRules:h=[],trackPerformance:b=!0,verbose:S=!1}=r,y=async()=>{let k=[],R=[],D={stopOnFirstError:a,validateRequired:u,validateTypes:f,customRules:h,trackPerformance:b,verbose:S};try{if(typeof t==="string")return await this.validateWithSchemaFile(e,t,D);else if(Array.isArray(t))return this.validateWithRules(e,[...t,...h],D);else return this.validateWithJSONSchema(e,t,D)}catch(O){return k.push({path:"",message:`Validation failed: ${O}`,rule:"system"}),{isValid:!1,errors:k,warnings:R}}};if(b)return await Qs.track("validateConfiguration",y);return y()}async validateWithSchemaFile(e,t,r){try{if(!Gw(t))throw new Gs(t,[{path:"",message:"Schema file does not exist"}]);let a=await import(t),u=a.default||a;if(Array.isArray(u))return this.validateWithRules(e,u,r);else return this.validateWithJSONSchema(e,u,r)}catch(a){throw new Gs(t,[{path:"",message:`Failed to load schema: ${a}`}])}}validateWithJSONSchema(e,t,r){let a=[],u=[];return this.validateObjectAgainstSchema(e,t,"",a,u,r),{isValid:a.length===0,errors:a,warnings:u}}validateObjectAgainstSchema(e,t,r,a,u,f){if(f.validateTypes&&t.type){let h=Array.isArray(e)?"array":typeof e,b=Array.isArray(t.type)?t.type:[t.type];if(!b.includes(h)){if(a.push({path:r,message:`Expected type ${b.join(" or ")}, got ${h}`,expected:b.join(" or "),actual:h,rule:"type"}),f.stopOnFirstError)return}}if(t.enum&&!t.enum.includes(e)){if(a.push({path:r,message:`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"}),f.stopOnFirstError)return}if(typeof e==="string"){if(t.minLength!==void 0&&e.length<t.minLength)a.push({path:r,message:`String length must be at least ${t.minLength}`,expected:`>= ${t.minLength}`,actual:e.length,rule:"minLength"});if(t.maxLength!==void 0&&e.length>t.maxLength)a.push({path:r,message:`String length must not exceed ${t.maxLength}`,expected:`<= ${t.maxLength}`,actual:e.length,rule:"maxLength"});if(t.pattern){if(!new RegExp(t.pattern).test(e))a.push({path:r,message:`String does not match pattern ${t.pattern}`,expected:t.pattern,actual:e,rule:"pattern"})}}if(typeof e==="number"){if(t.minimum!==void 0&&e<t.minimum)a.push({path:r,message:`Value must be at least ${t.minimum}`,expected:`>= ${t.minimum}`,actual:e,rule:"minimum"});if(t.maximum!==void 0&&e>t.maximum)a.push({path:r,message:`Value must not exceed ${t.maximum}`,expected:`<= ${t.maximum}`,actual:e,rule:"maximum"})}if(Array.isArray(e)&&t.items)for(let h=0;h<e.length;h++){let b=r?`${r}[${h}]`:`[${h}]`;if(this.validateObjectAgainstSchema(e[h],t.items,b,a,u,f),f.stopOnFirstError&&a.length>0)return}if(e&&typeof e==="object"&&!Array.isArray(e)){let h=e;if(f.validateRequired&&t.required){for(let b of t.required)if(!(b in h)){if(a.push({path:r?`${r}.${b}`:b,message:`Missing required property '${b}'`,expected:"required",rule:"required"}),f.stopOnFirstError)return}}if(t.properties){for(let[b,S]of Object.entries(t.properties))if(b in h){let y=r?`${r}.${b}`:b;if(this.validateObjectAgainstSchema(h[b],S,y,a,u,f),f.stopOnFirstError&&a.length>0)return}}if(t.additionalProperties===!1){let b=new Set(Object.keys(t.properties||{}));for(let S of Object.keys(h))if(!b.has(S))u.push({path:r?`${r}.${S}`:S,message:`Additional property '${S}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(e,t,r){let a=[],u=[];for(let f of t)try{let h=this.getValueByPath(e,f.path),b=this.validateWithRule(h,f,f.path);if(a.push(...b),r.stopOnFirstError&&a.length>0)break}catch(h){a.push({path:f.path,message:`Rule validation failed: ${h}`,rule:"system"})}return{isValid:a.length===0,errors:a,warnings:u}}validateWithRule(e,t,r){let a=[];if(t.required&&(e===void 0||e===null))return a.push({path:r,message:t.message||`Property '${r}' is required`,expected:"required",rule:"required"}),a;if(e===void 0||e===null)return a;if(t.type){let u=Array.isArray(e)?"array":typeof e;if(u!==t.type)a.push({path:r,message:t.message||`Expected type ${t.type}, got ${u}`,expected:t.type,actual:u,rule:"type"})}if(t.min!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u<t.min)a.push({path:r,message:t.message||`Value must be at least ${t.min}`,expected:`>= ${t.min}`,actual:u,rule:"min"})}if(t.max!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u>t.max)a.push({path:r,message:t.message||`Value must not exceed ${t.max}`,expected:`<= ${t.max}`,actual:u,rule:"max"})}if(t.pattern&&typeof e==="string"){if(!t.pattern.test(e))a.push({path:r,message:t.message||`Value does not match pattern ${t.pattern}`,expected:t.pattern.toString(),actual:e,rule:"pattern"})}if(t.enum&&!t.enum.includes(e))a.push({path:r,message:t.message||`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"});if(t.validator){let u=t.validator(e);if(u)a.push({path:r,message:t.message||u,rule:"custom"})}return a}getValueByPath(e,t){if(!t)return e;let r=t.split("."),a=e;for(let u of r)if(a&&typeof a==="object"&&u in a)a=a[u];else return;return a}generateRulesFromInterface(e){let t=[],r=e.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let a of r){let[,u,f,h]=a;t.push({path:u,required:!f,type:this.mapTypeScriptType(h)})}return t}mapTypeScriptType(e){switch(e.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:$h},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}class gp{fileLoader=new pd;envProcessor=new ud;validator=new pp;async loadConfig(e){let t=Date.now(),{cache:r,performance:a,schema:u,validate:f,...h}=e;try{if(r?.enabled){let S=this.checkCache(h.name||"",h);if(S)return S}let b;try{b=await this.loadConfigurationStrategies(h,!0,r)}catch(S){let y=h.__strictErrorHandling;if(S instanceof Error&&S.name==="ConfigNotFoundError"){if(y)throw S;b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`No configuration file found for "${h.name||"config"}", using defaults with environment variables`]}}else if(S instanceof Error&&S.name==="ConfigLoadError"){let k=S.message.includes("EACCES")||S.message.includes("EPERM")||S.message.includes("permission denied"),R=!k&&(S.message.includes("syntax")||S.message.includes("Expected")||S.message.includes("Unexpected")||S.message.includes("BuildMessage")||S.message.includes("errors building")),D=S.message.includes("Configuration must export a valid object")||S.message.includes("Configuration file is empty and exports nothing");if(y&&(D||k))throw S;if(R&&(!y||!D))b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!y)b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading error, using defaults: ${S.message}`]};else throw S}else b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${S instanceof Error?S.message:String(S)}`]}}if(u||f)await this.validateConfiguration(b.config,u,f,h.name);if(r?.enabled&&b)this.cacheResult(h.name||"",b,r,h);if(a?.enabled){let S={operation:"loadConfig",duration:Date.now()-t,configName:h.name,timestamp:new Date};if(a.onMetrics)a.onMetrics(S);if(a.slowThreshold&&S.duration>a.slowThreshold)Un.warn(`Slow configuration loading detected: ${S.duration}ms for ${h.name}`);b.metrics=S}return b}catch(b){let S=Date.now()-t;throw Un.error(`Configuration loading failed after ${S}ms:`,[b instanceof Error?b:Error(String(b))]),b}}async loadConfigurationStrategies(e,t=!1,r){let{name:a="",alias:u,cwd:f,configDir:h,defaultConfig:b,checkEnv:S=!0,arrayStrategy:y="replace",verbose:k=!1}=e,R=f||no.cwd(),D=[],O=await this.loadLocalConfiguration(a,u,R,h,b,y,k,S,r);if(O)return D.push(...this.getLocalSearchPaths(a,u,R,h)),this.finalizeResult(O,D,S,a,k);let M=await this.loadHomeConfiguration(a,u,b,y,k,S);if(M)return D.push(...this.getHomeSearchPaths(a,u)),this.finalizeResult(M,D,S,a,k);let z=await this.loadPackageJsonConfiguration(a,u,R,b,y,k,S);if(z)return D.push(qr(R,"package.json")),this.finalizeResult(z,D,S,a,k);if(D.push(...this.getAllSearchPaths(a,u,R,h)),t)throw Pi.configNotFound(a,D,u);return{...await this.applyEnvironmentVariables(a,b,S,k),warnings:[`No configuration file found for "${a}"${u?` or alias "${u}"`:""}, using defaults with environment variables`]}}async loadLocalConfiguration(e,t,r,a,u,f,h,b,S){let y=b?Hs(e,u,h):u,k=this.getLocalDirectories(r,a);for(let R of k){if(h)Un.info(`Searching for configuration in: ${R}`);let D=this.fileLoader.generateConfigPaths(e,R,t),O=await this.fileLoader.tryLoadFromPaths(D,y,{arrayStrategy:f,verbose:h,cacheTtl:S?.ttl,useCache:!S?.ttl||S.ttl>100});if(O){if(h)Un.success(`Configuration loaded from: ${O.source.path}`);return O}}return null}async loadHomeConfiguration(e,t,r,a,u,f){if(!e)return null;let h=f?Hs(e,r,u):r,b=[qr(jo(),".config",e),qr(jo(),".config"),jo()];for(let S of b){if(u)Un.info(`Checking home directory: ${S}`);let y=this.fileLoader.generateConfigPaths(e,S,t),k=await this.fileLoader.tryLoadFromPaths(y,h,{arrayStrategy:a,verbose:u});if(k){if(u)Un.success(`Configuration loaded from home directory: ${k.source.path}`);return k}}return null}async loadPackageJsonConfiguration(e,t,r,a,u,f,h){let b=h?Hs(e,a,f):a;try{let S=qr(r,"package.json");if(!Ql(S))return null;let y=await import(S),k=y[e],R=e;if(!k&&t)k=y[t],R=t;if(k&&typeof k==="object"&&!Array.isArray(k)){if(f)Un.success(`Configuration loaded from package.json: ${R}`);return{config:up(b,k,u),source:{type:"package.json",path:S,priority:30,timestamp:new Date}}}}catch(S){if(f)Un.warn("Failed to load package.json:",[S instanceof Error?S:Error(String(S))])}return null}async applyEnvironmentVariables(e,t,r,a){if(!r||!e||typeof t!=="object"||t===null||Array.isArray(t))return{config:t,source:{type:"default",priority:10,timestamp:new Date}};return{config:Hs(e,t,a),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(e,t,r,a,u){return{config:e.config,source:e.source,path:e.source.path}}async validateConfiguration(e,t,r,a){let u=[];if(r){let f=r(e);if(f)u.push(...f)}if(t){let f=await this.validator.validateConfiguration(e,t);if(!f.isValid)u.push(...f.errors.map((h)=>h.path?`${h.path}: ${h.message}`:h.message))}if(u.length>0)throw Pi.configValidation(a||"unknown",u,a)}checkCache(e,t){let r=this.generateCacheKey(e,t);return Jo.get(r)||null}cacheResult(e,t,r,a){let u=this.generateCacheKey(e,a);Jo.set(u,t,void 0,r.ttl)}generateCacheKey(e,t){let r=[e];if(t.alias)r.push(`alias:${t.alias}`);if(t.cwd)r.push(`cwd:${t.cwd}`);if(t.configDir)r.push(`configDir:${t.configDir}`);if("checkEnv"in t)r.push(`checkEnv:${t.checkEnv}`);return r.join("|")}getLocalDirectories(e,t){return Array.from(new Set([e,qr(e,"config"),qr(e,".config"),t?qr(e,t):void 0].filter(Boolean)))}getAllSearchPaths(e,t,r,a){let u=[];return u.push(...this.getLocalSearchPaths(e,t,r,a)),u.push(...this.getHomeSearchPaths(e,t)),u.push(qr(r,"package.json")),u}getLocalSearchPaths(e,t,r,a){let u=this.getLocalDirectories(r,a),f=[];for(let h of u)f.push(...this.fileLoader.generateConfigPaths(e,h,t));return f}getHomeSearchPaths(e,t){if(!e)return[];let r=[qr(jo(),".config",e),qr(jo(),".config"),jo()],a=[];for(let u of r)a.push(...this.fileLoader.generateConfigPaths(e,u,t));return a}async loadConfigWithResult(e){return this.loadConfig(e)}}function vf(e){let r=!(e.message.includes("EACCES")||e.message.includes("EPERM")||e.message.includes("permission denied"))&&(e.message.includes("syntax")||e.message.includes("Expected")||e.message.includes("Unexpected")||e.message.includes("BuildMessage")),a=e.message.includes("Configuration must export a valid object")||e.message.includes("Configuration file is empty and exports nothing");return r||a}async function Nk(e){return gi.loadConfig({...e,__strictErrorHandling:!0})}async function Rh(e){let t="defaultConfig"in e&&e.defaultConfig!==void 0?e.defaultConfig:{},r="cache"in e||"performance"in e||"schema"in e||"validate"in e;try{let a;if(r)a=await gi.loadConfig(e);else a=await gi.loadConfig({...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}});return a?.config??t}catch(a){let u=a instanceof Error?a.name:"UnknownError",f=a instanceof Error?a.message:String(a);if(!(u==="ConfigNotFoundError"||u==="ConfigLoadError"||u==="ConfigValidationError"||f.includes("config"))&&e.verbose)Un.warn("Unexpected error loading config, using defaults:",[a instanceof Error?a:Error(String(a))]);let b=r?{...e,defaultConfig:t}:{...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in e?e.checkEnv!==!1:!0)return(await gi.applyEnvironmentVariables(b.name||"",t,!0,b.verbose||!1))?.config??t;return t}}async function jk(e={defaultConfig:{}}){if(typeof e==="string"){let{cwd:t}=await import("process");try{return(await gi.loadConfig({name:e,cwd:t(),generatedDir:"./generated",configDir:"./config",defaultConfig:{},checkEnv:!0,arrayStrategy:"replace"})).config}catch(r){if(r instanceof Error&&(r.name==="ConfigNotFoundError"||r.name==="ConfigLoadError"&&vf(r)))return(await gi.applyEnvironmentVariables(e,{},!0,!1)).config;throw r}}try{return(await gi.loadConfig({...e,cwd:e.cwd||no.cwd(),cache:{enabled:!0},performance:{enabled:!1}})).config}catch(t){if(t instanceof Error&&(t.name==="ConfigNotFoundError"||t.name==="ConfigLoadError"&&vf(t)))return(await gi.applyEnvironmentVariables(e.name||"",e.defaultConfig||{},e.checkEnv!==!1,e.verbose||!1)).config;throw t}}async function Bk(e,t,r="replace"){let a=new pd;try{let u=await a.loadFromPath(e,t,{arrayStrategy:r,useCache:!1,trackPerformance:!1});return u?u.config:null}catch{return null}}function Hs(e,t,r=!1){let a=new ud,u=e.toUpperCase().replace(/[^A-Z0-9]/g,"_");function f(h,b=[]){let S={...h};for(let[y,k]of Object.entries(h)){let R=[...b,y],D=[`${u}_${R.join("_").toUpperCase()}`,`${u}_${R.map((z)=>z.toUpperCase()).join("")}`,`${u}_${R.map((z)=>z.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],O,M;for(let z of D)if(O=no.env[z],O!==void 0){M=z;break}if(O!==void 0&&M)if(typeof k==="boolean")S[y]=["true","1","yes"].includes(O.toLowerCase());else if(typeof k==="number"){let z=Number(O);if(!Number.isNaN(z))S[y]=z}else if(Array.isArray(k))try{S[y]=JSON.parse(O)}catch{S[y]=O.split(",").map((z)=>z.trim())}else S[y]=O;else if(k&&typeof k==="object"&&!Array.isArray(k))S[y]=f(k,R)}return S}return f(t)}function Mk(e){let t=qr(no.cwd(),e.configDir),r=qr(no.cwd(),e.generatedDir),a=qr(r,"config-types.ts");if(!Ql(Jm(a)))Aw(Jm(a),{recursive:!0,mode:511});let u=Ql(t)?Cw(t).map((h)=>h.replace(/\.(ts|js|mjs|cjs|mts|cts|json)$/,"")).sort():[],f=`// Generated by bunfig v${gI}
31
31
  export type ConfigNames = ${u.length?`'${u.join("' | '")}'`:"string"}
32
- `;Pw(a,f,{mode:438})}function Lk(e){let t=null,r=null,a=()=>{if(!r)r=Ph(e).then((f)=>(t=f,f),(f)=>{let h="defaultConfig"in e?e.defaultConfig:{};if(t=h,"verbose"in e&&e.verbose)Un.warn("Config loading failed, using defaults:",[f instanceof Error?f:Error(String(f))]);return h});return r},u="defaultConfig"in e?e.defaultConfig:{};return t=u,a(),new Proxy({},{get(f,h){if(t)return t[h];let b=u[h];return a(),b},has(f,h){return h in(t||u)},ownKeys(){return Object.keys(t||u)},getOwnPropertyDescriptor(f,h){return Object.getOwnPropertyDescriptor(t||u,h)},set(f,h,b){if(!t)t={...u};return t[h]=b,!0}})}function Fk(e){let t=lf(Zw.cwd(),e?.configDir||"./config");function r(){if(!Qw(t))return[];let u=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),f=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],h=Yw(t).filter((S)=>u.has(Bl(S))).map((S)=>({base:S.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:S})),b=new Map;for(let{base:S,file:y}of h){let k=Bl(y).toLowerCase(),R=b.get(S);if(!R){b.set(S,y);continue}let D=Bl(R).toLowerCase();if(f.indexOf(k)<f.indexOf(D))b.set(S,y)}return Array.from(b.entries()).map(([S,y])=>({base:S,file:y})).sort((S,y)=>S.base.localeCompare(y.base))}function a(){let u=r(),f=u.map((y)=>y.base),h=f.length?f.map((y)=>`'${y}'`).join(" | "):"string",b=u.length?`{
32
+ `;Pw(a,f,{mode:438})}function Lk(e){let t=null,r=null,a=()=>{if(!r)r=Rh(e).then((f)=>(t=f,f),(f)=>{let h="defaultConfig"in e?e.defaultConfig:{};if(t=h,"verbose"in e&&e.verbose)Un.warn("Config loading failed, using defaults:",[f instanceof Error?f:Error(String(f))]);return h});return r},u="defaultConfig"in e?e.defaultConfig:{};return t=u,a(),new Proxy({},{get(f,h){if(t)return t[h];let b=u[h];return a(),b},has(f,h){return h in(t||u)},ownKeys(){return Object.keys(t||u)},getOwnPropertyDescriptor(f,h){return Object.getOwnPropertyDescriptor(t||u,h)},set(f,h,b){if(!t)t={...u};return t[h]=b,!0}})}function Fk(e){let t=lf(Zw.cwd(),e?.configDir||"./config");function r(){if(!Qw(t))return[];let u=new Set([".ts",".js",".mjs",".cjs",".mts",".cts",".json"]),f=[".ts",".mts",".cts",".js",".mjs",".cjs",".json"],h=Yw(t).filter((S)=>u.has(Bl(S))).map((S)=>({base:S.replace(/\.(?:ts|js|mjs|cjs|mts|cts|json)$/i,""),file:S})),b=new Map;for(let{base:S,file:y}of h){let k=Bl(y).toLowerCase(),R=b.get(S);if(!R){b.set(S,y);continue}let D=Bl(R).toLowerCase();if(f.indexOf(k)<f.indexOf(D))b.set(S,y)}return Array.from(b.entries()).map(([S,y])=>({base:S,file:y})).sort((S,y)=>S.base.localeCompare(y.base))}function a(){let u=r(),f=u.map((y)=>y.base),h=f.length?f.map((y)=>`'${y}'`).join(" | "):"string",b=u.length?`{
33
33
  ${u.map((y)=>{let k=lf(t,y.file).replace(/\\/g,"/");return` '${y.base}': typeof import('${k}').default`}).join(`,
34
34
  `)}
35
35
  }`:"Record<string, any>";return`export type ConfigNames = ${h}
36
36
  export type ConfigByName = ${b}
37
37
  export type Config<N extends ConfigNames> = N extends keyof ConfigByName ? ConfigByName[N] : unknown
38
38
  export type ConfigOf = Config
39
- `}return{name:"bunfig-plugin",setup(u){u.onResolve({filter:/^virtual:bunfig-types$/},(f)=>({path:f.path,namespace:"bunfig-virtual"})),u.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>({contents:a(),loader:"ts"}))}}}var _h,Jo,Qs,Th,zk,Uk,bf,Wc,Xl,Tr,jt,qk,Sf,Vk,wf,Wk,Hk,Vl,Kk,kf,If,Wl,Jk,Gk,Qk,Yk,Hc,xh,Zk,xr,Xk,eI,Ef,Kc,eu,pr,St,tI,Rf,rI,Af,nI,iI,Hl,oI,Cf,Pf,sI,Kl,aI,cI,dI,lI,uI,Jc,Dh,pI,gI="0.15.6",cn,od,Js,tu,ep,sd,tp,rp,Gs,np,ip,Pi,Oh,$h,Un,gi,Nh,jh,mI=mk(async()=>{_h=import.meta.require,Jo=new ap,Qs=new cp,Th={createKey:fk,isEquivalent:hk,estimateMemoryUsage:yk},zk=Xc(Yl.cwd(),"config"),Uk=Xc(Yl.cwd(),"src/generated"),bf=Zc.env.CLARITY_LOG_DIR||xw(Sk(),"logs"),Wc={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:bf,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},Xl=await wk(),Tr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,reset:"\x1B[0m"},jt=Tr,qk=Tr.red,Sf=Tr.green,Vk=Tr.yellow,wf=Tr.blue,Wk=Tr.magenta,Hk=Tr.cyan,Vl=Tr.white,Kk=Tr.gray,kf=Tr.bgRed,If=Tr.bgYellow,Wl=Tr.bold,Jk=Tr.dim,Gk=Tr.italic,Qk=Tr.underline,Yk=Tr.reset,Hc={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},xh={debug:"\uD83D\uDD0D",info:wf("ℹ"),success:Sf("✓"),warning:If(Vl(Wl(" WARN "))),error:kf(Vl(Wl(" ERROR ")))},Zk=new rd("stacks"),xr=new rd("bunfig",{showTags:!0}),Xk=Ur(Ks.cwd(),"config"),eI=Ur(Ks.cwd(),"src/generated"),Ef=Yc.env.CLARITY_LOG_DIR||_w(Rk(),"logs"),Kc={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Ef,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},eu=await Ak(),pr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},St=pr,tI=pr.red,Rf=pr.green,rI=pr.yellow,Af=pr.blue,nI=pr.magenta,iI=pr.cyan,Hl=pr.white,oI=pr.gray,Cf=pr.bgRed,Pf=pr.bgYellow,sI=pr.bgGray,Kl=pr.bold,aI=pr.dim,cI=pr.italic,dI=pr.underline,lI=pr.strikethrough,uI=pr.reset,Jc={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Dh={debug:"\uD83D\uDD0D",info:Af("ℹ"),success:Rf("✓"),warning:Pf(Hl(Kl(" WARN "))),error:Cf(Hl(Kl(" ERROR ")))},pI=new id("stacks"),cn=class extends Error{timestamp;context;constructor(t,r={}){super(t);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=r,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let t=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([r,a])=>`${r}: ${a}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${t}`}},od=class extends cn{code="CONFIG_NOT_FOUND";constructor(t,r,a){let u=a?` or alias "${a}"`:"";super(`Configuration "${t}"${u} not found`,{configName:t,alias:a,searchPaths:r,searchPathCount:r.length})}},Js=class extends cn{code="CONFIG_LOAD_ERROR";constructor(t,r,a){super(`Failed to load configuration from "${t}": ${r.message}`,{configPath:t,configName:a,originalError:r.name,originalMessage:r.message});this.cause=r}},tu=class extends cn{code="CONFIG_VALIDATION_ERROR";constructor(t,r,a){super(`Configuration validation failed for "${t}"`,{configPath:t,configName:a,validationErrors:r,errorCount:r.length})}},ep=class extends cn{code="CONFIG_MERGE_ERROR";constructor(t,r,a,u){super(`Failed to merge configuration from "${t}" with "${r}": ${a.message}`,{sourcePath:t,targetPath:r,configName:u,originalError:a.name,originalMessage:a.message});this.cause=a}},sd=class extends cn{code="ENV_VAR_ERROR";constructor(t,r,a,u){super(`Failed to parse environment variable "${t}" with value "${r}" as ${a}`,{envKey:t,envValue:r,expectedType:a,configName:u})}},tp=class extends cn{code="FILE_SYSTEM_ERROR";constructor(t,r,a){super(`File system ${t} failed for "${r}": ${a.message}`,{operation:t,path:r,originalError:a.name,originalMessage:a.message});this.cause=a}},rp=class extends cn{code="TYPE_GENERATION_ERROR";constructor(t,r,a){super(`Failed to generate types from "${t}" to "${r}": ${a.message}`,{configDir:t,outputPath:r,originalError:a.name,originalMessage:a.message});this.cause=a}},Gs=class extends cn{code="SCHEMA_VALIDATION_ERROR";constructor(t,r,a){super(`Schema validation failed${a?` for config "${a}"`:""}`,{schemaPath:t,configName:a,validationErrors:r,errorCount:r.length})}},np=class extends cn{code="BROWSER_CONFIG_ERROR";constructor(t,r,a,u){super(`Failed to fetch configuration from "${t}": ${r} ${a}`,{endpoint:t,status:r,statusText:a,configName:u})}},ip=class extends cn{code="PLUGIN_ERROR";constructor(t,r,a){super(`Plugin "${t}" failed during ${r}: ${a.message}`,{pluginName:t,operation:r,originalError:a.name,originalMessage:a.message});this.cause=a}},Pi={configNotFound(e,t,r){return new od(e,t,r)},configLoad(e,t,r){return new Js(e,t,r)},configValidation(e,t,r){return new tu(e,t,r)},configMerge(e,t,r,a){return new ep(e,t,r,a)},envVar(e,t,r,a){return new sd(e,t,r,a)},fileSystem(e,t,r){return new tp(e,t,r)},typeGeneration(e,t,r){return new rp(e,t,r)},schemaValidation(e,t,r){return new Gs(e,t,r)},browserConfig(e,t,r,a){return new np(e,t,r,a)},plugin(e,t,r){return new ip(e,t,r)}},Oh={replace:"replace",concat:"concat",smart:"smart"},$h=/^https?:\/\//,Un=new id("bunfig",{showTags:!0}),gi=new gp,Nh=qr(no.cwd(),"config"),jh=qr(no.cwd(),"src/generated")});function fI(e,t={}){let r=ed.cwd();while(r.includes("storage"))r=uf(r,"..");let a=uf(r,e||"");if(t?.relative)return ek(ed.cwd(),a);return a}var hI=ed.env.CLARITY_LOG_DIR||Xw(fI(),"logs"),Bh={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:hI,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},ad={...Bh},Ox=(async()=>{try{let{loadConfig:e}=await mI().then(()=>Lf),t=await e({name:"clarity",alias:"logging",defaultConfig:Bh,cwd:ed.cwd()});if(t)Object.assign(ad,t)}catch{}return ad})();function gr(){if(ui.env.NODE_ENV==="test"||ui.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function yI(){if(ui.env.NODE_ENV==="test"||ui.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof ui<"u"){let e=ui.type;if(e==="renderer"||e==="worker")return!1;return!!(ui.versions&&(ui.versions.node||ui.versions.bun))}return!1}class Mh{async format(e){let t=await yI(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Ko.pid,hostname:t(),environment:Ko.env.NODE_ENV||"development",platform:Ko.platform,version:Ko.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Ko.env.NODE_ENV||Ko.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var fr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},It=fr,{red:$x,green:vI,yellow:Nx,blue:bI,magenta:jx,cyan:Bx,white:_f,gray:Mx,bgRed:SI,bgYellow:wI,bgGray:Lx,bold:Tf,dim:Fx,italic:zx,underline:Ux,strikethrough:qx,reset:Vx}=fr,Jl={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},kI={debug:"\uD83D\uDD0D",info:bI("ℹ"),success:vI("✓"),warning:wI(_f(Tf(" WARN "))),error:SI(_f(Tf(" ERROR ")))};class gd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...ad},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Mh,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??Ct.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let u=this.generateKeyId(),f=this.generateKey();this.currentKeyId=u,this.keys.set(u,f),this.encryptionKeys.set(u,{key:f,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;let t={debug:0,info:1,success:2,warning:3,error:4},r=this.fingersCrossedConfig.activationLevel??"error";return t[e]>=t[r]}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...Jl,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...Jl};return{...Jl,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:ad.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}shouldWriteToFile(){return!gr()&&this.config.writeToFile===!0}async writeToFile(e){let r=(async()=>{let u,f=0,h=3,b=1000;while(f<h)try{try{try{await ok(this.config.logDirectory,ff.F_OK|ff.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await sk(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let S=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:ci.from(e);try{if(!Mc(this.currentLogFile))await Ul(this.currentLogFile,"",{mode:420});if(u=mf(this.currentLogFile,"a",420),ik(u,S,{flag:"a"}),gf(u),u!==void 0)zl(u),u=void 0;if((await Wo(this.currentLogFile)).size===0){if(await Ul(this.currentLogFile,S,{flag:"w",mode:420}),(await Wo(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let k=y;if(k.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(k.code)){if(f<h-1){let R=typeof k.message==="string"?k.message:"Unknown error";console.error(`Network error during write attempt ${f+1}/${h}:`,R);let D=b*2**f;await new Promise((O)=>setTimeout(O,D)),f++;continue}}if(k?.code&&["ENOSPC","EDQUOT"].includes(k.code))throw Error(`Disk quota exceeded or no space left on device: ${k.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",k),k}finally{if(u!==void 0)try{zl(u)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(S){if(f===h-1){let k=S,R=typeof k.message==="string"?k.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",R),S}f++;let y=b*2**(f-1);await new Promise((k)=>setTimeout(k,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(u){throw console.error("Debug: [writeToFile] Error in operation:",u),u}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Ho(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Ho(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Ho(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(gr())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((u)=>{console.error("Error rotating keys:",u)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let u=Array.from(this.encryptionKeys.entries()).sort(([,b],[,S])=>S.createdAt.getTime()-b.createdAt.getTime()),f=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,f);if(u.length>h)for(let[b]of u.slice(h))this.encryptionKeys.delete(b),this.keys.delete(b)}generateKeyId(){return Ll(16).toString("hex")}generateKey(){return Ll(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Ll(16),a=tk("aes-256-gcm",t,r),u=ci.isBuffer(e)?e:ci.from(e,"utf8"),f=a.update(u),h=a.final(),b=f.length+h.length,S=a.getAuthTag(),y=ci.allocUnsafe(16+b+16);return r.copy(y,0),f.copy(y,16),h.copy(y,16+f.length),S.copy(y,16+b),{encrypted:y,iv:r}}async compressData(e){return new Promise((t,r)=>{let a=yf(),u=[];a.on("data",(f)=>u.push(f)),a.on("end",()=>t(ci.from(ci.concat(u)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(gr())return;if(!this.shouldWriteToFile())return;let e=await Wo(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let u=await Lc(this.config.logDirectory),f=u.filter((S)=>S.startsWith(this.name)&&/\.log\.\d+$/.test(S)).sort((S,y)=>{let k=Number.parseInt(S.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-k}),h=f.length>0?Number.parseInt(f[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,b=`${r}.${h}`;if(await Wo(r).catch(()=>null))try{if(await hf(r,b),t.compress)try{let S=`${b}.gz`;await this.compressLogFile(b,S),await Fc(b)}catch(S){console.error("Error compressing rotated file:",S)}if(f.length===0&&!u.some((S)=>S.endsWith(".log.1")))try{let S=`${r}.1`;await Ul(S,"")}catch(S){console.error("Error creating backup file:",S)}}catch(S){console.error(`Error during rotation: ${S instanceof Error?S.message:String(S)}`)}}else{let u=new Date().toISOString().replace(/[:.]/g,"-"),f=r.replace(/\.log$/,`-${u}.log`);if(await Wo(r).catch(()=>null))await hf(r,f)}if(this.currentLogFile=a,t.maxFiles){let f=(await Lc(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,b)=>b.localeCompare(h));for(let h of f.slice(t.maxFiles))await Fc(Ho(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=pf(e),a=nk(t),u=yf();await dk(r,u,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);if(this.shouldWriteToFile())await this.writeToFile(a);console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile(t);console.log(t)}}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),Mc(this.currentLogFile))try{let e=mf(this.currentLogFile,"r+");gf(e),zl(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!gr()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await Lc(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await Fc(Ho(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.shouldStyleConsole()?It.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||gr())return!1;let e=typeof Ct.env.NO_COLOR<"u",t=Ct.env.FORCE_COLOR==="0";if(e||t)return!1;return!!(typeof Ct.stderr<"u"&&Ct.stderr.isTTY||typeof Ct.stdout<"u"&&Ct.stdout.isTTY)}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:u,level:f,showTimestamp:h=!0}=e,b=(O)=>O.replace(this.ANSI_PATTERN,"");if(!this.fancy){let O=[];if(h)O.push(t);if(f==="warning")O.push("WARN");else if(f==="error")O.push("ERROR");else if(r)O.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)O.push(a.replace(/[[\]]/g,""));return O.push(u),O.join(" ")}let S=Ct.stdout.columns||120,y="";if(f==="warning"||f==="error")y=`${r} ${u}`;else if(f==="info"||f==="success")y=`${r} ${a} ${u}`;else y=`${r} ${a} ${It.cyan(u)}`;if(!h)return y.trim();let k=b(y).trim().length,R=b(t).length,D=Math.max(1,S-2-k-R);return`${y.trim()}${" ".repeat(D)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(f,h)=>{let b=Number.parseInt(h,10);return b<t[0].length?String(t[0][b]):f});let r=/%([sdijfo%])/g,a=0,u=e.replace(r,(f,h)=>{if(h==="%")return"%";if(a>=t.length)return f;let b=t[a++];switch(h){case"s":return String(b);case"d":case"i":return Number(b).toString();case"j":case"o":return JSON.stringify(b,null,2);default:return f}});if(a<t.length)u+=` ${t.slice(a).map((f)=>typeof f==="object"?JSON.stringify(f,null,2):String(f)).join(" ")}`;return u}formatMarkdown(e){if(!e)return e;let t=e;return t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(r,a,u)=>{let f=It.underline(It.blue(a)),h=this.toAbsoluteFilePath(u);if(h&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let b=`file://${encodeURI(h)}`,S="\x1B]8;;",y="\x1B\\";return`\x1B]8;;${b}\x1B\\${f}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${u}\x1B\\${f}\x1B]8;;\x1B\\`;return f}),t=t.replace(/`([^`]+)`/g,(r,a)=>It.bgGray(a)),t=t.replace(/\*\*([^*]+)\*\*/g,(r,a)=>It.bold(a)),t=t.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(r,a)=>It.italic(a)),t=t.replace(/(?<!_)_([^_]+)_(?!_)/g,(r,a)=>It.italic(a)),t=t.replace(/~([^~]+)~/g,(r,a)=>It.strikethrough(a)),t}supportsHyperlinks(){if(gr())return!1;let e=Ct.env;if(!e)return!1;if(e.TERM_PROGRAM==="iTerm.app"||e.TERM_PROGRAM==="vscode"||e.TERM_PROGRAM==="WezTerm")return!0;if(e.WT_SESSION)return!0;if(e.TERM==="xterm-kitty")return!0;let t=e.VTE_VERSION?Number.parseInt(e.VTE_VERSION,10):0;if(!Number.isNaN(t)&&t>=5000)return!0;return!1}toAbsoluteFilePath(e){try{let t=e;if(t.startsWith("file://"))t=t.replace(/^file:\/\//,"");if(t.startsWith("~")){let r=Ct.env.HOME||"";if(r)t=t.replace(/^~(?=$|\/)/,r)}if(ak(t)||t.startsWith("./")||t.startsWith("../"))t=ck(t);else return null;return Mc(t)?t:null}catch{return null}}buildOutputTexts(e){let t=this.shouldStyleConsole()?this.formatMarkdown(e):e,r=e.replace(this.ANSI_PATTERN,"");return{consoleText:t,fileText:r}}async log(e,t,...r){if(!this.shouldLog(e))return;let a=new Date,u=this.formatConsoleTimestamp(a),f=this.formatFileTimestamp(a),h,b;if(t instanceof Error)h=t.message,b=t.stack;else h=this.formatMessage(t,r);let{consoleText:S,fileText:y}=this.buildOutputTexts(h);if(this.shouldStyleConsole()){let R=this.options.showIcons===!1?"":kI[e],D=this.options.showTags!==!1&&this.name?It.gray(this.formatTag(this.name)):"",O;switch(e){case"debug":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:It.gray(S),level:e}),console.error(O);break;case"info":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:S,level:e}),console.warn(O);break;case"success":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:It.green(S),level:e}),console.error(O);break;case"warning":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:S,level:e}),console.warn(O);break;case"error":if(O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:S,level:e}),console.error(O),b){let M=b.split(`
39
+ `}return{name:"bunfig-plugin",setup(u){u.onResolve({filter:/^virtual:bunfig-types$/},(f)=>({path:f.path,namespace:"bunfig-virtual"})),u.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>({contents:a(),loader:"ts"}))}}}var Ph,Jo,Qs,_h,zk,Uk,bf,Wc,Xl,Tr,jt,qk,Sf,Vk,wf,Wk,Hk,Vl,Kk,kf,If,Wl,Jk,Gk,Qk,Yk,Hc,xh,Zk,xr,Xk,eI,Ef,Kc,eu,pr,St,tI,Rf,rI,Af,nI,iI,Hl,oI,Cf,Pf,sI,Kl,aI,cI,dI,lI,uI,Jc,Dh,pI,gI="0.15.6",cn,od,Js,tu,ep,sd,tp,rp,Gs,np,ip,Pi,Oh,$h,Un,gi,Nh,jh,mI=mk(async()=>{Ph=import.meta.require,Jo=new ap,Qs=new cp,_h={createKey:fk,isEquivalent:hk,estimateMemoryUsage:yk},zk=Xc(Yl.cwd(),"config"),Uk=Xc(Yl.cwd(),"src/generated"),bf=Zc.env.CLARITY_LOG_DIR||xw(Sk(),"logs"),Wc={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:bf,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},Xl=await wk(),Tr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,reset:"\x1B[0m"},jt=Tr,qk=Tr.red,Sf=Tr.green,Vk=Tr.yellow,wf=Tr.blue,Wk=Tr.magenta,Hk=Tr.cyan,Vl=Tr.white,Kk=Tr.gray,kf=Tr.bgRed,If=Tr.bgYellow,Wl=Tr.bold,Jk=Tr.dim,Gk=Tr.italic,Qk=Tr.underline,Yk=Tr.reset,Hc={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},xh={debug:"\uD83D\uDD0D",info:wf("ℹ"),success:Sf("✓"),warning:If(Vl(Wl(" WARN "))),error:kf(Vl(Wl(" ERROR ")))},Zk=new rd("stacks"),xr=new rd("bunfig",{showTags:!0}),Xk=Ur(Ks.cwd(),"config"),eI=Ur(Ks.cwd(),"src/generated"),Ef=Yc.env.CLARITY_LOG_DIR||_w(Rk(),"logs"),Kc={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Ef,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},eu=await Ak(),pr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},St=pr,tI=pr.red,Rf=pr.green,rI=pr.yellow,Af=pr.blue,nI=pr.magenta,iI=pr.cyan,Hl=pr.white,oI=pr.gray,Cf=pr.bgRed,Pf=pr.bgYellow,sI=pr.bgGray,Kl=pr.bold,aI=pr.dim,cI=pr.italic,dI=pr.underline,lI=pr.strikethrough,uI=pr.reset,Jc={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Dh={debug:"\uD83D\uDD0D",info:Af("ℹ"),success:Rf("✓"),warning:Pf(Hl(Kl(" WARN "))),error:Cf(Hl(Kl(" ERROR ")))},pI=new id("stacks"),cn=class extends Error{timestamp;context;constructor(t,r={}){super(t);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=r,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let t=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([r,a])=>`${r}: ${a}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${t}`}},od=class extends cn{code="CONFIG_NOT_FOUND";constructor(t,r,a){let u=a?` or alias "${a}"`:"";super(`Configuration "${t}"${u} not found`,{configName:t,alias:a,searchPaths:r,searchPathCount:r.length})}},Js=class extends cn{code="CONFIG_LOAD_ERROR";constructor(t,r,a){super(`Failed to load configuration from "${t}": ${r.message}`,{configPath:t,configName:a,originalError:r.name,originalMessage:r.message});this.cause=r}},tu=class extends cn{code="CONFIG_VALIDATION_ERROR";constructor(t,r,a){super(`Configuration validation failed for "${t}"`,{configPath:t,configName:a,validationErrors:r,errorCount:r.length})}},ep=class extends cn{code="CONFIG_MERGE_ERROR";constructor(t,r,a,u){super(`Failed to merge configuration from "${t}" with "${r}": ${a.message}`,{sourcePath:t,targetPath:r,configName:u,originalError:a.name,originalMessage:a.message});this.cause=a}},sd=class extends cn{code="ENV_VAR_ERROR";constructor(t,r,a,u){super(`Failed to parse environment variable "${t}" with value "${r}" as ${a}`,{envKey:t,envValue:r,expectedType:a,configName:u})}},tp=class extends cn{code="FILE_SYSTEM_ERROR";constructor(t,r,a){super(`File system ${t} failed for "${r}": ${a.message}`,{operation:t,path:r,originalError:a.name,originalMessage:a.message});this.cause=a}},rp=class extends cn{code="TYPE_GENERATION_ERROR";constructor(t,r,a){super(`Failed to generate types from "${t}" to "${r}": ${a.message}`,{configDir:t,outputPath:r,originalError:a.name,originalMessage:a.message});this.cause=a}},Gs=class extends cn{code="SCHEMA_VALIDATION_ERROR";constructor(t,r,a){super(`Schema validation failed${a?` for config "${a}"`:""}`,{schemaPath:t,configName:a,validationErrors:r,errorCount:r.length})}},np=class extends cn{code="BROWSER_CONFIG_ERROR";constructor(t,r,a,u){super(`Failed to fetch configuration from "${t}": ${r} ${a}`,{endpoint:t,status:r,statusText:a,configName:u})}},ip=class extends cn{code="PLUGIN_ERROR";constructor(t,r,a){super(`Plugin "${t}" failed during ${r}: ${a.message}`,{pluginName:t,operation:r,originalError:a.name,originalMessage:a.message});this.cause=a}},Pi={configNotFound(e,t,r){return new od(e,t,r)},configLoad(e,t,r){return new Js(e,t,r)},configValidation(e,t,r){return new tu(e,t,r)},configMerge(e,t,r,a){return new ep(e,t,r,a)},envVar(e,t,r,a){return new sd(e,t,r,a)},fileSystem(e,t,r){return new tp(e,t,r)},typeGeneration(e,t,r){return new rp(e,t,r)},schemaValidation(e,t,r){return new Gs(e,t,r)},browserConfig(e,t,r,a){return new np(e,t,r,a)},plugin(e,t,r){return new ip(e,t,r)}},Oh={replace:"replace",concat:"concat",smart:"smart"},$h=/^https?:\/\//,Un=new id("bunfig",{showTags:!0}),gi=new gp,Nh=qr(no.cwd(),"config"),jh=qr(no.cwd(),"src/generated")});function fI(e,t={}){let r=ed.cwd();while(r.includes("storage"))r=uf(r,"..");let a=uf(r,e||"");if(t?.relative)return ek(ed.cwd(),a);return a}var hI=ed.env.CLARITY_LOG_DIR||Xw(fI(),"logs"),Bh={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:hI,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},ad={...Bh},Ox=(async()=>{try{let{loadConfig:e}=await mI().then(()=>Lf),t=await e({name:"clarity",alias:"logging",defaultConfig:Bh,cwd:ed.cwd()});if(t)Object.assign(ad,t)}catch{}return ad})();function gr(){if(ui.env.NODE_ENV==="test"||ui.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function yI(){if(ui.env.NODE_ENV==="test"||ui.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof ui<"u"){let e=ui.type;if(e==="renderer"||e==="worker")return!1;return!!(ui.versions&&(ui.versions.node||ui.versions.bun))}return!1}class Mh{async format(e){let t=await yI(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Ko.pid,hostname:t(),environment:Ko.env.NODE_ENV||"development",platform:Ko.platform,version:Ko.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Ko.env.NODE_ENV||Ko.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var fr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},It=fr,{red:$x,green:vI,yellow:Nx,blue:bI,magenta:jx,cyan:Bx,white:_f,gray:Mx,bgRed:SI,bgYellow:wI,bgGray:Lx,bold:Tf,dim:Fx,italic:zx,underline:Ux,strikethrough:qx,reset:Vx}=fr,Jl={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},kI={debug:"\uD83D\uDD0D",info:bI("ℹ"),success:vI("✓"),warning:wI(_f(Tf(" WARN "))),error:SI(_f(Tf(" ERROR ")))};class gd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...ad},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Mh,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??Ct.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let u=this.generateKeyId(),f=this.generateKey();this.currentKeyId=u,this.keys.set(u,f),this.encryptionKeys.set(u,{key:f,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;let t={debug:0,info:1,success:2,warning:3,error:4},r=this.fingersCrossedConfig.activationLevel??"error";return t[e]>=t[r]}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...Jl,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...Jl};return{...Jl,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:ad.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}shouldWriteToFile(){return!gr()&&this.config.writeToFile===!0}async writeToFile(e){let r=(async()=>{let u,f=0,h=3,b=1000;while(f<h)try{try{try{await ok(this.config.logDirectory,ff.F_OK|ff.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await sk(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let S=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:ci.from(e);try{if(!Mc(this.currentLogFile))await Ul(this.currentLogFile,"",{mode:420});if(u=mf(this.currentLogFile,"a",420),ik(u,S,{flag:"a"}),gf(u),u!==void 0)zl(u),u=void 0;if((await Wo(this.currentLogFile)).size===0){if(await Ul(this.currentLogFile,S,{flag:"w",mode:420}),(await Wo(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let k=y;if(k.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(k.code)){if(f<h-1){let R=typeof k.message==="string"?k.message:"Unknown error";console.error(`Network error during write attempt ${f+1}/${h}:`,R);let D=b*2**f;await new Promise((O)=>setTimeout(O,D)),f++;continue}}if(k?.code&&["ENOSPC","EDQUOT"].includes(k.code))throw Error(`Disk quota exceeded or no space left on device: ${k.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",k),k}finally{if(u!==void 0)try{zl(u)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(S){if(f===h-1){let k=S,R=typeof k.message==="string"?k.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",R),S}f++;let y=b*2**(f-1);await new Promise((k)=>setTimeout(k,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(u){throw console.error("Debug: [writeToFile] Error in operation:",u),u}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Ho(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Ho(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Ho(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(gr())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((u)=>{console.error("Error rotating keys:",u)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let u=Array.from(this.encryptionKeys.entries()).sort(([,b],[,S])=>S.createdAt.getTime()-b.createdAt.getTime()),f=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,f);if(u.length>h)for(let[b]of u.slice(h))this.encryptionKeys.delete(b),this.keys.delete(b)}generateKeyId(){return Ll(16).toString("hex")}generateKey(){return Ll(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Ll(16),a=tk("aes-256-gcm",t,r),u=ci.isBuffer(e)?e:ci.from(e,"utf8"),f=a.update(u),h=a.final(),b=f.length+h.length,S=a.getAuthTag(),y=ci.allocUnsafe(16+b+16);return r.copy(y,0),f.copy(y,16),h.copy(y,16+f.length),S.copy(y,16+b),{encrypted:y,iv:r}}async compressData(e){return new Promise((t,r)=>{let a=yf(),u=[];a.on("data",(f)=>u.push(f)),a.on("end",()=>t(ci.from(ci.concat(u)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(gr())return;if(!this.shouldWriteToFile())return;let e=await Wo(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let u=await Lc(this.config.logDirectory),f=u.filter((S)=>S.startsWith(this.name)&&/\.log\.\d+$/.test(S)).sort((S,y)=>{let k=Number.parseInt(S.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-k}),h=f.length>0?Number.parseInt(f[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,b=`${r}.${h}`;if(await Wo(r).catch(()=>null))try{if(await hf(r,b),t.compress)try{let S=`${b}.gz`;await this.compressLogFile(b,S),await Fc(b)}catch(S){console.error("Error compressing rotated file:",S)}if(f.length===0&&!u.some((S)=>S.endsWith(".log.1")))try{let S=`${r}.1`;await Ul(S,"")}catch(S){console.error("Error creating backup file:",S)}}catch(S){console.error(`Error during rotation: ${S instanceof Error?S.message:String(S)}`)}}else{let u=new Date().toISOString().replace(/[:.]/g,"-"),f=r.replace(/\.log$/,`-${u}.log`);if(await Wo(r).catch(()=>null))await hf(r,f)}if(this.currentLogFile=a,t.maxFiles){let f=(await Lc(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,b)=>b.localeCompare(h));for(let h of f.slice(t.maxFiles))await Fc(Ho(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=pf(e),a=nk(t),u=yf();await dk(r,u,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);if(this.shouldWriteToFile())await this.writeToFile(a);console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile(t);console.log(t)}}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),Mc(this.currentLogFile))try{let e=mf(this.currentLogFile,"r+");gf(e),zl(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!gr()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await Lc(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await Fc(Ho(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.shouldStyleConsole()?It.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||gr())return!1;let e=typeof Ct.env.NO_COLOR<"u",t=Ct.env.FORCE_COLOR==="0";if(e||t)return!1;return!!(typeof Ct.stderr<"u"&&Ct.stderr.isTTY||typeof Ct.stdout<"u"&&Ct.stdout.isTTY)}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:u,level:f,showTimestamp:h=!0}=e,b=(O)=>O.replace(this.ANSI_PATTERN,"");if(!this.fancy){let O=[];if(h)O.push(t);if(f==="warning")O.push("WARN");else if(f==="error")O.push("ERROR");else if(r)O.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)O.push(a.replace(/[[\]]/g,""));return O.push(u),O.join(" ")}let S=Ct.stdout.columns||120,y="";if(f==="warning"||f==="error")y=`${r} ${u}`;else if(f==="info"||f==="success")y=`${r} ${a} ${u}`;else y=`${r} ${a} ${It.cyan(u)}`;if(!h)return y.trim();let k=b(y).trim().length,R=b(t).length,D=Math.max(1,S-2-k-R);return`${y.trim()}${" ".repeat(D)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(f,h)=>{let b=Number.parseInt(h,10);return b<t[0].length?String(t[0][b]):f});let r=/%([sdijfo%])/g,a=0,u=e.replace(r,(f,h)=>{if(h==="%")return"%";if(a>=t.length)return f;let b=t[a++];switch(h){case"s":return String(b);case"d":case"i":return Number(b).toString();case"j":case"o":return JSON.stringify(b,null,2);default:return f}});if(a<t.length)u+=` ${t.slice(a).map((f)=>typeof f==="object"?JSON.stringify(f,null,2):String(f)).join(" ")}`;return u}formatMarkdown(e){if(!e)return e;let t=e;return t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(r,a,u)=>{let f=It.underline(It.blue(a)),h=this.toAbsoluteFilePath(u);if(h&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let b=`file://${encodeURI(h)}`,S="\x1B]8;;",y="\x1B\\";return`\x1B]8;;${b}\x1B\\${f}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${u}\x1B\\${f}\x1B]8;;\x1B\\`;return f}),t=t.replace(/`([^`]+)`/g,(r,a)=>It.bgGray(a)),t=t.replace(/\*\*([^*]+)\*\*/g,(r,a)=>It.bold(a)),t=t.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(r,a)=>It.italic(a)),t=t.replace(/(?<!_)_([^_]+)_(?!_)/g,(r,a)=>It.italic(a)),t=t.replace(/~([^~]+)~/g,(r,a)=>It.strikethrough(a)),t}supportsHyperlinks(){if(gr())return!1;let e=Ct.env;if(!e)return!1;if(e.TERM_PROGRAM==="iTerm.app"||e.TERM_PROGRAM==="vscode"||e.TERM_PROGRAM==="WezTerm")return!0;if(e.WT_SESSION)return!0;if(e.TERM==="xterm-kitty")return!0;let t=e.VTE_VERSION?Number.parseInt(e.VTE_VERSION,10):0;if(!Number.isNaN(t)&&t>=5000)return!0;return!1}toAbsoluteFilePath(e){try{let t=e;if(t.startsWith("file://"))t=t.replace(/^file:\/\//,"");if(t.startsWith("~")){let r=Ct.env.HOME||"";if(r)t=t.replace(/^~(?=$|\/)/,r)}if(ak(t)||t.startsWith("./")||t.startsWith("../"))t=ck(t);else return null;return Mc(t)?t:null}catch{return null}}buildOutputTexts(e){let t=this.shouldStyleConsole()?this.formatMarkdown(e):e,r=e.replace(this.ANSI_PATTERN,"");return{consoleText:t,fileText:r}}async log(e,t,...r){if(!this.shouldLog(e))return;let a=new Date,u=this.formatConsoleTimestamp(a),f=this.formatFileTimestamp(a),h,b;if(t instanceof Error)h=t.message,b=t.stack;else h=this.formatMessage(t,r);let{consoleText:S,fileText:y}=this.buildOutputTexts(h);if(this.shouldStyleConsole()){let R=this.options.showIcons===!1?"":kI[e],D=this.options.showTags!==!1&&this.name?It.gray(this.formatTag(this.name)):"",O;switch(e){case"debug":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:It.gray(S),level:e}),console.error(O);break;case"info":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:S,level:e}),console.warn(O);break;case"success":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:It.green(S),level:e}),console.error(O);break;case"warning":O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:S,level:e}),console.warn(O);break;case"error":if(O=this.formatConsoleMessage({timestamp:u,icon:R,tag:D,message:S,level:e}),console.error(O),b){let M=b.split(`
40
40
  `);for(let z of M)if(z.trim()&&!z.includes(h))console.error(this.formatConsoleMessage({timestamp:u,message:It.gray(` ${z}`),level:e,showTimestamp:!1}))}break}}else if(!gr()){if(console.error(`${f} ${this.environment}.${e.toUpperCase()}: ${h}`),b)console.error(b)}let k=`${f} ${this.environment}.${e.toUpperCase()}: ${y}
41
41
  `;if(b)k+=`${b}
42
42
  `;if(k=k.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(k)}progress(e,t=""){let r={update:(b,S)=>{},finish:(b)=>{},interrupt:(b,S)=>{}};if(!this.enabled)return r;let a=30;if(this.activeProgressBar={total:Math.max(1,e||1),current:0,message:t||"",barLength:a,lastRenderedLine:""},this.shouldStyleConsole()&&!gr()&&Ct.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(b,S)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,b),this.activeProgressBar.total),S!==void 0)this.activeProgressBar.message=S;if(this.shouldStyleConsole()&&!gr()&&Ct.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(b)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,b)},interrupt:(b,S="info")=>{if(!gr()&&Ct.stdout.isTTY)Ct.stdout.write(`
@@ -57,7 +57,7 @@ export type ConfigOf = Config
57
57
  `;r+=`| Variable | Type | Description | Example |
58
58
  `,r+=`|----------|------|-------------|----------|
59
59
  `;for(let a of e)r+=`| \`${a.key}\` | ${a.type} | ${a.description} | \`${a.example}\` |
60
- `;return r}}function EI(e,t,r={}){return Hh(e,t,r,new WeakMap)}function Hh(e,t,r,a){let{arrayMergeMode:u="replace",skipNullish:f=!1,customMerger:h}=r;if(t===null||t===void 0)return f?e:t;if(h){let b=h(e,t);if(b!==void 0)return b}if(Array.isArray(t)||Array.isArray(e))return Kh(e,t,u,a);if(!hn(t)||!hn(e))return t;return PI(e,t,r,a)}function Kh(e,t,r,a){if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(e)&&!Array.isArray(t))return t;if(Array.isArray(t)&&Array.isArray(e))switch(r){case"replace":return t;case"concat":return RI(e,t);case"smart":return AI(e,t,a);default:return t}return t}function RI(e,t){let r=[...t];for(let a of e)if(!r.some((u)=>op(u,a)))r.push(a);return r}function AI(e,t,r){if(t.length===0)return e;if(e.length===0)return t;if(hn(t[0])&&hn(e[0]))return CI(e,t,r);if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let u of e)if(!a.includes(u))a.push(u);return a}return t}function CI(e,t,r){let a=[...t];for(let u of e){if(!hn(u)){a.push(u);continue}let f=["id","name","key","path","type"],h=!1;for(let b of f)if(b in u){if(a.find((y)=>hn(y)&&(b in y)&&y[b]===u[b])){h=!0;break}}if(!h)a.push(u)}return a}function PI(e,t,r,a){let u=t;if(hn(u)&&a.has(u))return a.get(u);let f={...e};if(hn(u))a.set(u,f);for(let h in u){if(!Object.prototype.hasOwnProperty.call(u,h))continue;let b=u[h],S=f[h];if(r.skipNullish&&(b===null||b===void 0))continue;if(b===null||b===void 0){f[h]=b;continue}if(hn(b)&&hn(S))f[h]=Hh(S,b,r,a);else if(Array.isArray(b)||Array.isArray(S))f[h]=Kh(S,b,r.arrayMergeMode||"smart",a);else f[h]=b}return f}function Jh(e,t,r="replace"){return EI(e,t,{arrayMergeMode:r==="replace"?"replace":"smart",skipNullish:!0})}function op(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!op(e[r],t[r]))return!1;return!0}if(hn(e)&&hn(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let u of r){if(!Object.prototype.hasOwnProperty.call(t,u))return!1;if(!op(e[u],t[u]))return!1}return!0}return!1}function hn(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}class Gh{extensions=$f;async loadFromPath(e,t,r={}){let{arrayStrategy:a="replace",useCache:u=!0,cacheTtl:f,trackPerformance:h=!0,verbose:b=!1}=r;if(u){let y=Gc.getWithFileCheck("file",e);if(y){if(b)console.log(`Configuration loaded from cache: ${e}`);return y}}let S=async()=>{if(!qc(e))return null;try{let y=`?t=${Date.now()}`,k=await import(e+y),R=k.default||k,D="default"in k,O=Object.keys(k).length>0;if(!D&&!O)throw new cd(e,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof R!=="object"||R===null||Array.isArray(R))throw new cd(e,Error("Configuration must export a valid object"),"unknown");let J={config:Jh(t,R,a),source:{type:"file",path:e,priority:100,timestamp:new Date}};if(u)Gc.setWithFileCheck("file",J,e,f);return J}catch(y){throw y instanceof Error?ro.configLoad(e,y):ro.configLoad(e,Error(String(y)))}};if(h)return sp.track("loadFromPath",S,{path:e});return S()}async tryLoadFromPaths(e,t,r={}){for(let a of e)try{let u=await this.loadFromPath(a,t,r);if(u)return u}catch(u){if(u instanceof Error&&u.name==="ConfigLoadError")throw u;if(r.verbose)console.warn(`Failed to load config from ${a}:`,u)}return null}generateConfigPaths(e,t,r){return kw({name:e,directory:t,alias:r})}generateNamePatterns(e,t){return Nf({name:e,alias:t})}checkFileAccess(e){return II(async()=>qc(e),{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(e,t,r){let a=[];if(!qc(e))return a;if(t||r){let u=this.generateNamePatterns(t||"",r);for(let f of u)for(let h of this.extensions){let b=xf(e,`${f}${h}`);if(await this.checkFileAccess(b))a.push(b)}}else try{let{readdirSync:u}=await import("fs"),f=u(e);for(let h of f)if(this.looksLikeConfigFile(h)){let b=xf(e,h);if(await this.checkFileAccess(b))a.push(b)}}catch{return[]}return a}looksLikeConfigFile(e){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((r)=>r.test(e))}async validateConfigFile(e){let t=[];try{if(!qc(e))return t.push("Configuration file does not exist"),t;let r=await import(e),a=r.default||r;if(a===void 0)t.push("Configuration file must export a default value or named exports");else if(typeof a!=="object"||a===null)t.push("Configuration must be an object");else if(Array.isArray(a))t.push("Configuration cannot be an array at the root level");if(e.endsWith(".json"))try{let{readFileSync:u}=await import("fs"),f=u(e,"utf8");JSON.parse(f)}catch(u){t.push(`Invalid JSON syntax: ${u}`)}}catch(r){t.push(`Failed to load configuration file: ${r}`)}return t}async getFileModificationTime(e){try{let{statSync:t}=await import("fs");return t(e).mtime}catch{return null}}async preloadConfigurations(e,t={}){let r=new Map;return await Promise.allSettled(e.map(async(a)=>{try{let u=await this.loadFromPath(a,{},t);if(u)r.set(a,u.config)}catch(u){if(t.verbose)console.warn(`Failed to preload ${a}:`,u)}})),r}}var TI=/^https?:\/\//;class Qh{async validateConfiguration(e,t,r={}){let{stopOnFirstError:a=!1,validateRequired:u=!0,validateTypes:f=!0,customRules:h=[],trackPerformance:b=!0,verbose:S=!1}=r,y=async()=>{let k=[],R=[],D={stopOnFirstError:a,validateRequired:u,validateTypes:f,customRules:h,trackPerformance:b,verbose:S};try{if(typeof t==="string")return await this.validateWithSchemaFile(e,t,D);else if(Array.isArray(t))return this.validateWithRules(e,[...t,...h],D);else return this.validateWithJSONSchema(e,t,D)}catch(O){return k.push({path:"",message:`Validation failed: ${O}`,rule:"system"}),{isValid:!1,errors:k,warnings:R}}};if(b)return await sp.track("validateConfiguration",y);return y()}async validateWithSchemaFile(e,t,r){try{if(!_I(t))throw new dd(t,[{path:"",message:"Schema file does not exist"}]);let a=await import(t),u=a.default||a;if(Array.isArray(u))return this.validateWithRules(e,u,r);else return this.validateWithJSONSchema(e,u,r)}catch(a){throw new dd(t,[{path:"",message:`Failed to load schema: ${a}`}])}}validateWithJSONSchema(e,t,r){let a=[],u=[];return this.validateObjectAgainstSchema(e,t,"",a,u,r),{isValid:a.length===0,errors:a,warnings:u}}validateObjectAgainstSchema(e,t,r,a,u,f){if(f.validateTypes&&t.type){let h=Array.isArray(e)?"array":typeof e,b=Array.isArray(t.type)?t.type:[t.type];if(!b.includes(h)){if(a.push({path:r,message:`Expected type ${b.join(" or ")}, got ${h}`,expected:b.join(" or "),actual:h,rule:"type"}),f.stopOnFirstError)return}}if(t.enum&&!t.enum.includes(e)){if(a.push({path:r,message:`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"}),f.stopOnFirstError)return}if(typeof e==="string"){if(t.minLength!==void 0&&e.length<t.minLength)a.push({path:r,message:`String length must be at least ${t.minLength}`,expected:`>= ${t.minLength}`,actual:e.length,rule:"minLength"});if(t.maxLength!==void 0&&e.length>t.maxLength)a.push({path:r,message:`String length must not exceed ${t.maxLength}`,expected:`<= ${t.maxLength}`,actual:e.length,rule:"maxLength"});if(t.pattern){if(!new RegExp(t.pattern).test(e))a.push({path:r,message:`String does not match pattern ${t.pattern}`,expected:t.pattern,actual:e,rule:"pattern"})}}if(typeof e==="number"){if(t.minimum!==void 0&&e<t.minimum)a.push({path:r,message:`Value must be at least ${t.minimum}`,expected:`>= ${t.minimum}`,actual:e,rule:"minimum"});if(t.maximum!==void 0&&e>t.maximum)a.push({path:r,message:`Value must not exceed ${t.maximum}`,expected:`<= ${t.maximum}`,actual:e,rule:"maximum"})}if(Array.isArray(e)&&t.items)for(let h=0;h<e.length;h++){let b=r?`${r}[${h}]`:`[${h}]`;if(this.validateObjectAgainstSchema(e[h],t.items,b,a,u,f),f.stopOnFirstError&&a.length>0)return}if(e&&typeof e==="object"&&!Array.isArray(e)){let h=e;if(f.validateRequired&&t.required){for(let b of t.required)if(!(b in h)){if(a.push({path:r?`${r}.${b}`:b,message:`Missing required property '${b}'`,expected:"required",rule:"required"}),f.stopOnFirstError)return}}if(t.properties){for(let[b,S]of Object.entries(t.properties))if(b in h){let y=r?`${r}.${b}`:b;if(this.validateObjectAgainstSchema(h[b],S,y,a,u,f),f.stopOnFirstError&&a.length>0)return}}if(t.additionalProperties===!1){let b=new Set(Object.keys(t.properties||{}));for(let S of Object.keys(h))if(!b.has(S))u.push({path:r?`${r}.${S}`:S,message:`Additional property '${S}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(e,t,r){let a=[],u=[];for(let f of t)try{let h=this.getValueByPath(e,f.path),b=this.validateWithRule(h,f,f.path);if(a.push(...b),r.stopOnFirstError&&a.length>0)break}catch(h){a.push({path:f.path,message:`Rule validation failed: ${h}`,rule:"system"})}return{isValid:a.length===0,errors:a,warnings:u}}validateWithRule(e,t,r){let a=[];if(t.required&&(e===void 0||e===null))return a.push({path:r,message:t.message||`Property '${r}' is required`,expected:"required",rule:"required"}),a;if(e===void 0||e===null)return a;if(t.type){let u=Array.isArray(e)?"array":typeof e;if(u!==t.type)a.push({path:r,message:t.message||`Expected type ${t.type}, got ${u}`,expected:t.type,actual:u,rule:"type"})}if(t.min!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u<t.min)a.push({path:r,message:t.message||`Value must be at least ${t.min}`,expected:`>= ${t.min}`,actual:u,rule:"min"})}if(t.max!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u>t.max)a.push({path:r,message:t.message||`Value must not exceed ${t.max}`,expected:`<= ${t.max}`,actual:u,rule:"max"})}if(t.pattern&&typeof e==="string"){if(!t.pattern.test(e))a.push({path:r,message:t.message||`Value does not match pattern ${t.pattern}`,expected:t.pattern.toString(),actual:e,rule:"pattern"})}if(t.enum&&!t.enum.includes(e))a.push({path:r,message:t.message||`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"});if(t.validator){let u=t.validator(e);if(u)a.push({path:r,message:t.message||u,rule:"custom"})}return a}getValueByPath(e,t){if(!t)return e;let r=t.split("."),a=e;for(let u of r)if(a&&typeof a==="object"&&u in a)a=a[u];else return;return a}generateRulesFromInterface(e){let t=[],r=e.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let a of r){let[,u,f,h]=a;t.push({path:u,required:!f,type:this.mapTypeScriptType(h)})}return t}mapTypeScriptType(e){switch(e.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:TI},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}var zn=new gd("bunfig",{showTags:!0});function xI(e){if(!e)return"";let t=Array.isArray(e)?e.filter(Boolean):[e];if(t.length===0)return"";if(t.length===1)return` or alias "${t[0]}"`;return` or aliases ${t.map((r)=>`"${r}"`).join(", ")}`}class Yh{fileLoader=new Gh;envProcessor=new fp;validator=new Qh;async loadConfig(e){let t=Date.now(),{cache:r,performance:a,schema:u,validate:f,...h}=e;try{if(r?.enabled){let S=this.checkCache(h.name||"",h);if(S)return S}let b;try{b=await this.loadConfigurationStrategies(h,!0,r)}catch(S){if(h.configFile)throw S;let y=h.__strictErrorHandling;if(S instanceof Error&&S.name==="ConfigNotFoundError"){if(y)throw S;b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`No configuration file found for "${h.name||"config"}", using defaults with environment variables`]}}else if(S instanceof Error&&S.name==="ConfigLoadError"){let k=S.message.includes("EACCES")||S.message.includes("EPERM")||S.message.includes("permission denied"),R=!k&&(S.message.includes("syntax")||S.message.includes("Expected")||S.message.includes("Unexpected")||S.message.includes("BuildMessage")||S.message.includes("errors building")),D=S.message.includes("Configuration must export a valid object")||S.message.includes("Configuration file is empty and exports nothing");if(y&&(D||k))throw S;if(R&&(!y||!D))b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!y)b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading error, using defaults: ${S.message}`]};else throw S}else b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${S instanceof Error?S.message:String(S)}`]}}if(u||f)await this.validateConfiguration(b.config,u,f,h.name);if(r?.enabled&&b)this.cacheResult(h.name||"",b,r,h);if(a?.enabled){let S={operation:"loadConfig",duration:Date.now()-t,configName:h.name,timestamp:new Date};if(a.onMetrics)a.onMetrics(S);if(a.slowThreshold&&S.duration>a.slowThreshold)zn.warn(`Slow configuration loading detected: ${S.duration}ms for ${h.name}`);b.metrics=S}return b}catch(b){if(b instanceof Error&&b.name==="ConfigNotFoundError")throw b;let S=Date.now()-t;throw zn.error(`Configuration loading failed after ${S}ms:`,[b instanceof Error?b:Error(String(b))]),b}}async loadConfigurationStrategies(e,t=!1,r){let{name:a="",alias:u,configFile:f,cwd:h,configDir:b,defaultConfig:S,checkEnv:y=!0,arrayStrategy:k="replace",verbose:R=!1}=e,D=h||ld.cwd(),O=[];if(f){let oe=Zn(D,f);O.push(oe);let G=y?Vs(a,S,R):S,te=await this.fileLoader.tryLoadFromPaths([oe],G,{arrayStrategy:k,verbose:R,cacheTtl:r?.ttl,useCache:!r?.ttl||r.ttl>100});if(!te)throw ro.configNotFound(a||f,O,u);if(R)zn.success(`Configuration loaded from explicit path: ${oe}`);return this.finalizeResult(te,O,y,a,R)}let M=await this.loadLocalConfiguration(a,u,D,b,S,k,R,y,r);if(M)return O.push(...this.getLocalSearchPaths(a,u,D,b)),this.finalizeResult(M,O,y,a,R);let z=await this.loadHomeConfiguration(a,u,S,k,R,y);if(z)return O.push(...this.getHomeSearchPaths(a,u)),this.finalizeResult(z,O,y,a,R);let J=await this.loadPackageJsonConfiguration(a,u,D,S,k,R,y);if(J)return O.push(Zn(D,"package.json")),this.finalizeResult(J,O,y,a,R);if(O.push(...this.getAllSearchPaths(a,u,D,b)),t)throw ro.configNotFound(a,O,u);return{...await this.applyEnvironmentVariables(a,S,y,R),warnings:[`No configuration file found for "${a}"${xI(u)}, using defaults with environment variables`]}}async loadLocalConfiguration(e,t,r,a,u,f,h,b,S){let y=b?Vs(e,u,h):u,k=this.getLocalDirectories(r,a);for(let R of k){if(h)zn.info(`Searching for configuration in: ${R}`);let D=this.fileLoader.generateConfigPaths(e,R,t),O=await this.fileLoader.tryLoadFromPaths(D,y,{arrayStrategy:f,verbose:h,cacheTtl:S?.ttl,useCache:!S?.ttl||S.ttl>100});if(O){if(h)zn.success(`Configuration loaded from: ${O.source.path}`);return O}}return null}async loadHomeConfiguration(e,t,r,a,u,f){if(!e)return null;let h=f?Vs(e,r,u):r,b=[Zn(No(),".config",e),Zn(No(),".config"),No()];for(let S of b){if(u)zn.info(`Checking home directory: ${S}`);let y=this.fileLoader.generateConfigPaths(e,S,t),k=await this.fileLoader.tryLoadFromPaths(y,h,{arrayStrategy:a,verbose:u});if(k){if(u)zn.success(`Configuration loaded from home directory: ${k.source.path}`);return k}}return null}async loadPackageJsonConfiguration(e,t,r,a,u,f,h){let b=h?Vs(e,a,f):a;try{let S=Zn(r,"package.json");if(!Ew(S))return null;let y={};try{y=JSON.parse(Rw(S,"utf8"))}catch(D){if(f)zn.warn("Failed to parse package.json:",[D instanceof Error?D:Error(String(D))]);return null}let k=y[e],R=e;if(!k&&t){let D=Array.isArray(t)?t:[t];for(let O of D){if(!O)continue;if(y[O]){k=y[O],R=O;break}}}if(k&&typeof k==="object"&&!Array.isArray(k)){if(f)zn.success(`Configuration loaded from package.json: ${R}`);return{config:Jh(b,k,u),source:{type:"package.json",path:S,priority:30,timestamp:new Date}}}}catch(S){if(f)zn.warn("Failed to load package.json:",[S instanceof Error?S:Error(String(S))])}return null}async applyEnvironmentVariables(e,t,r,a){if(!r||!e||typeof t!=="object"||t===null||Array.isArray(t))return{config:t,source:{type:"default",priority:10,timestamp:new Date}};return{config:Vs(e,t,a),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(e,t,r,a,u){return{config:e.config,source:e.source,path:e.source.path}}async validateConfiguration(e,t,r,a){let u=[];if(r){let f=r(e);if(f)u.push(...f)}if(t){let f=await this.validator.validateConfiguration(e,t);if(!f.isValid)u.push(...f.errors.map((h)=>h.path?`${h.path}: ${h.message}`:h.message))}if(u.length>0)throw ro.configValidation(a||"unknown",u,a)}checkCache(e,t){let r=this.generateCacheKey(e,t);return Gc.get(r)||null}cacheResult(e,t,r,a){let u=this.generateCacheKey(e,a);Gc.set(u,t,void 0,r.ttl)}generateCacheKey(e,t){let r=[e];if(t.alias){let a=Array.isArray(t.alias)?t.alias.join(","):t.alias;r.push(`alias:${a}`)}if(t.cwd)r.push(`cwd:${t.cwd}`);if(t.configFile)r.push(`configFile:${t.configFile}`);if(t.configDir)r.push(`configDir:${t.configDir}`);if("checkEnv"in t)r.push(`checkEnv:${t.checkEnv}`);return r.join("|")}getLocalDirectories(e,t){return Iw({cwd:e,configDir:t})}getAllSearchPaths(e,t,r,a){let u=[];return u.push(...this.getLocalSearchPaths(e,t,r,a)),u.push(...this.getHomeSearchPaths(e,t)),u.push(Zn(r,"package.json")),u}getLocalSearchPaths(e,t,r,a){let u=this.getLocalDirectories(r,a),f=[];for(let h of u)f.push(...this.fileLoader.generateConfigPaths(e,h,t));return f}getHomeSearchPaths(e,t){if(!e)return[];let r=[Zn(No(),".config",e),Zn(No(),".config"),No()],a=[];for(let u of r)a.push(...this.fileLoader.generateConfigPaths(e,u,t));return a}async loadConfigWithResult(e){return this.loadConfig(e)}}var Gl=new Yh;async function Zh(e){let t="defaultConfig"in e&&e.defaultConfig!==void 0?e.defaultConfig:{},r="cache"in e||"performance"in e||"schema"in e||"validate"in e;try{let a;if(r)a=await Gl.loadConfig(e);else a=await Gl.loadConfig({...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}});return a?.config??t}catch(a){if(e.configFile)throw a;let u=a instanceof Error?a.name:"UnknownError",f=a instanceof Error?a.message:String(a);if(!(u==="ConfigNotFoundError"||u==="ConfigLoadError"||u==="ConfigValidationError"||f.includes("config"))&&e.verbose)zn.warn("Unexpected error loading config, using defaults:",[a instanceof Error?a:Error(String(a))]);let b=r?{...e,defaultConfig:t}:{...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in e?e.checkEnv!==!1:!0)return(await Gl.applyEnvironmentVariables(b.name||"",t,!0,b.verbose||!1))?.config??t;return t}}function Vs(e,t,r=!1){let a=new fp,u=e.toUpperCase().replace(/[^A-Z0-9]/g,"_");function f(h,b=[]){let S={...h};for(let[y,k]of Object.entries(h)){let R=[...b,y],D=[`${u}_${R.join("_").toUpperCase()}`,`${u}_${R.map((z)=>z.toUpperCase()).join("")}`,`${u}_${R.map((z)=>z.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],O,M;for(let z of D)if(O=ld.env[z],O!==void 0){M=z;break}if(O!==void 0&&M)if(typeof k==="boolean")S[y]=["true","1","yes"].includes(O.toLowerCase());else if(typeof k==="number"){let z=Number(O);if(!Number.isNaN(z))S[y]=z}else if(Array.isArray(k))try{S[y]=JSON.parse(O)}catch{S[y]=O.split(",").map((z)=>z.trim())}else S[y]=O;else if(k&&typeof k==="object"&&!Array.isArray(k))S[y]=f(k,R)}return S}return f(t)}var Qx=Zn(ld.cwd(),"config"),Yx=Zn(ld.cwd(),"src/generated");var ca={project:{name:"my-project",slug:"my-project",region:"us-east-1"},environments:{production:{type:"production"}}},io=null;function $I(e){return e.project?.slug===ca.project?.slug&&Object.keys(e.environments??{}).length===1&&!!e.environments?.production}async function NI(){let e=[Xh(process.cwd(),"config","cloud.ts"),Xh(process.cwd(),"config","cloud.js")];for(let t of e){if(!DI(t))continue;let r=await import(`${OI(t).href}?t=${Date.now()}`),a=r.tsCloud??r.default?.tsCloud??r.default??r.cloud??r.config;if(a)return a}return null}async function Gf(){if(!io){if(io=await Zh({name:"cloud",defaultConfig:ca}),$I(io))io=await NI()??io;nl(io.stateDir)}return io}var ru=Gf,OS=ca;import{createCipheriv as MI,createDecipheriv as LI,createHash as iy,randomBytes as mi}from"node:crypto";import{createHmac as jI,timingSafeEqual as BI}from"node:crypto";var hp="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";function cs(e){let t=0,r=0,a="";for(let u of e){r=r<<8|u,t+=8;while(t>=5)a+=hp[r>>>t-5&31],t-=5}if(t>0)a+=hp[r<<5-t&31];return a}function nu(e){let t=e.toUpperCase().replace(/[^A-Z2-7]/g,""),r=0,a=0,u=[];for(let f of t){let h=hp.indexOf(f);if(h<0)throw Error("Invalid base32 secret");if(a=a<<5|h,r+=5,r>=8)u.push(a>>>r-8&255),r-=8}return Buffer.from(u)}function da(e,t,r=6){let a=Buffer.alloc(8);a.writeBigUInt64BE(BigInt(t));let u=jI("sha1",nu(e)).update(a).digest(),f=u[u.length-1]&15,h=(u[f]&127)<<24|(u[f+1]&255)<<16|(u[f+2]&255)<<8|u[f+3]&255;return String(h%10**r).padStart(r,"0")}function Vf(e,t=Date.now(),r=30){return da(e,Math.floor(t/1000/r))}function qf(e,t,r=Date.now(),a=1){return An(e,t,r,a)!==void 0}function An(e,t,r=Date.now(),a=1){let u=t.replace(/[\s-]/g,"");if(!/^\d{6}$/.test(u))return;let f=Buffer.from(u),h=Math.floor(r/1000/30);for(let b=-a;b<=a;b++){if(h+b<0)continue;let S=Buffer.from(da(e,h+b));if(f.length===S.length&&BI(f,S))return h+b}return}function la(e){let t=e.issuer?.trim()||"ts-cloud",r=`${t}:${e.account}`;return`otpauth://totp/${encodeURIComponent(r)}?secret=${encodeURIComponent(e.secret)}&issuer=${encodeURIComponent(t)}&algorithm=SHA1&digits=6&period=30`}var iu=1800000,it=43200000,su=3600000,ou=300000,au=600000;function dn(e){return typeof e==="string"?e:void 0}function oy(e){if(typeof e!=="string")return{};try{return JSON.parse(e)}catch{return{}}}function FI(e){let t=e.trim();if(!/^[a-z0-9][a-z0-9._-]{1,31}$/i.test(t))throw Error("Username must be 2-32 characters: letters, numbers, dot, dash or underscore");return t}function yp(e){if(e===void 0||!e.trim())return;let t=e.trim().toLowerCase();if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)||t.length>254)throw Error("A valid email address is required");return t}function zI(e){let t=e.trim().toLowerCase();if(!/^[a-z0-9][a-z0-9-]{1,47}$/.test(t))throw Error("OIDC provider slug must be 2-48 lowercase letters, numbers or dashes");return t}function UI(e){let t=new URL(e.trim());if(t.search||t.hash||t.username||t.password)throw Error("OIDC issuer cannot contain credentials, a query, or a fragment");if(t.protocol!=="https:"&&!(t.protocol==="http:"&&["127.0.0.1","::1","localhost"].includes(t.hostname)))throw Error("OIDC issuer must use HTTPS");return t.href.replace(/\/$/,"")}function qI(e){let t=[...new Set(e.map((r)=>r.trim().toLowerCase()).filter(Boolean))];if(t.length===0)throw Error("At least one explicit OIDC email domain is required");if(t.some((r)=>!/^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$/.test(r)||!r.includes(".")||r.includes("..")))throw Error("OIDC email domains must be explicit DNS names without wildcards");return t}function VI(e){let t=[...new Set(["openid",...e??["email","profile"]].map((r)=>r.trim()).filter(Boolean))];if(t.some((r)=>!/^[\x21\x23-\x5B\x5D-\x7E]+$/.test(r)))throw Error("OIDC scopes contain unsupported characters");return t}function Vn(e){return iy("sha256").update(e).digest("hex")}function Ys(e){return{id:String(e.id),actorId:String(e.actor_id),username:String(e.username),email:dn(e.email),emailVerifiedAt:dn(e.email_verified_at),passwordHash:String(e.password_hash),credentialVersion:Number(e.credential_version),requiresPasswordUpgrade:Number(e.requires_password_upgrade)===1,disabledAt:dn(e.disabled_at),lastLoginAt:dn(e.last_login_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function ey(e,t){let r=dn(e.consumed_at),a=String(e.expires_at);return{id:String(e.id),identityId:String(e.identity_id),type:String(e.type),metadata:oy(e.metadata),expiresAt:a,consumedAt:r,createdAt:String(e.created_at),state:r?"consumed":a<=t?"expired":"pending"}}function vp(e,t){let r=dn(e.revoked_at),a=String(e.idle_expires_at),u=String(e.absolute_expires_at);return{id:String(e.id),identityId:String(e.identity_id),credentialVersion:Number(e.credential_version),authMethod:String(e.auth_method),userAgent:dn(e.user_agent),networkHint:dn(e.network_hint),createdAt:String(e.created_at),lastUsedAt:String(e.last_used_at),idleExpiresAt:a,absoluteExpiresAt:u,recentAuthAt:String(e.recent_auth_at),mfaAt:dn(e.mfa_at),revokedAt:r,state:r?"revoked":a<=t||u<=t?"expired":"active"}}function ty(e){let t=dn(e.verified_at),r=dn(e.disabled_at);return{id:String(e.id),identityId:String(e.identity_id),type:"totp",label:String(e.label),createdAt:String(e.created_at),verifiedAt:t,disabledAt:r,state:r?"disabled":t?"active":"pending"}}function bp(e,t){let r=dn(e.consumed_at),a=String(e.expires_at),u=Number(e.attempts);return{id:String(e.id),identityId:String(e.identity_id),purpose:String(e.purpose),attempts:u,expiresAt:a,consumedAt:r,createdAt:String(e.created_at),state:r?"consumed":u>=5?"locked":a<=t?"expired":"pending"}}function ry(e){let t=oy(e);return Array.isArray(t)?t.filter((r)=>typeof r==="string"):[]}function md(e){return{id:String(e.id),organizationId:String(e.organization_id),slug:String(e.slug),name:String(e.name),issuer:String(e.issuer),clientId:String(e.client_id),hasClientSecret:typeof e.client_secret_ciphertext==="string"&&e.client_secret_ciphertext.length>0,scopes:ry(e.scopes),allowedDomains:ry(e.allowed_domains),defaultRole:String(e.default_role),enabled:Number(e.enabled)===1,enforceSso:Number(e.enforce_sso)===1,createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function ny(e,t){let r=dn(e.consumed_at),a=String(e.expires_at);return{id:String(e.id),providerId:String(e.provider_id),redirectUri:String(e.redirect_uri),returnPath:String(e.return_path),expiresAt:a,consumedAt:r,createdAt:String(e.created_at),state:r?"consumed":a<=t?"expired":"pending"}}function WI(e){return{id:String(e.id),providerId:String(e.provider_id),identityId:String(e.identity_id),subject:String(e.subject),email:String(e.email),linkedAt:String(e.linked_at),lastLoginAt:String(e.last_login_at)}}class ds{controlPlane;nowFn;idFn;encryptionKey;constructor(e,t={}){this.controlPlane=e;this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID()),this.encryptionKey=t.encryptionKey?iy("sha256").update(t.encryptionKey).digest():void 0}now(){return this.nowFn().toISOString()}run(e,t){this.controlPlane.database.run(e,t)}encrypt(e){if(!this.encryptionKey)throw Error("Authentication encryption key is not configured");let t=mi(12),r=MI("aes-256-gcm",this.encryptionKey,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){if(!this.encryptionKey)throw Error("Authentication encryption key is not configured");let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Encrypted authentication value is unavailable");let f=LI("aes-256-gcm",this.encryptionKey,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}createIdentity(e){if(!this.controlPlane.getActor(e.actorId))throw Error("Authentication actor was not found");let t=FI(e.username),r=yp(e.email),a=e.id??this.idFn(),u=this.now();return this.run(`INSERT INTO auth_identities (id, actor_id, username, email, email_verified_at, password_hash, requires_password_upgrade, created_at, updated_at)
60
+ `;return r}}function EI(e,t,r={}){return Hh(e,t,r,new WeakMap)}function Hh(e,t,r,a){let{arrayMergeMode:u="replace",skipNullish:f=!1,customMerger:h}=r;if(t===null||t===void 0)return f?e:t;if(h){let b=h(e,t);if(b!==void 0)return b}if(Array.isArray(t)||Array.isArray(e))return Kh(e,t,u,a);if(!hn(t)||!hn(e))return t;return PI(e,t,r,a)}function Kh(e,t,r,a){if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(e)&&!Array.isArray(t))return t;if(Array.isArray(t)&&Array.isArray(e))switch(r){case"replace":return t;case"concat":return RI(e,t);case"smart":return AI(e,t,a);default:return t}return t}function RI(e,t){let r=[...t];for(let a of e)if(!r.some((u)=>op(u,a)))r.push(a);return r}function AI(e,t,r){if(t.length===0)return e;if(e.length===0)return t;if(hn(t[0])&&hn(e[0]))return CI(e,t,r);if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let u of e)if(!a.includes(u))a.push(u);return a}return t}function CI(e,t,r){let a=[...t];for(let u of e){if(!hn(u)){a.push(u);continue}let f=["id","name","key","path","type"],h=!1;for(let b of f)if(b in u){if(a.find((y)=>hn(y)&&(b in y)&&y[b]===u[b])){h=!0;break}}if(!h)a.push(u)}return a}function PI(e,t,r,a){let u=t;if(hn(u)&&a.has(u))return a.get(u);let f={...e};if(hn(u))a.set(u,f);for(let h in u){if(!Object.prototype.hasOwnProperty.call(u,h))continue;let b=u[h],S=f[h];if(r.skipNullish&&(b===null||b===void 0))continue;if(b===null||b===void 0){f[h]=b;continue}if(hn(b)&&hn(S))f[h]=Hh(S,b,r,a);else if(Array.isArray(b)||Array.isArray(S))f[h]=Kh(S,b,r.arrayMergeMode||"smart",a);else f[h]=b}return f}function Jh(e,t,r="replace"){return EI(e,t,{arrayMergeMode:r==="replace"?"replace":"smart",skipNullish:!0})}function op(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!op(e[r],t[r]))return!1;return!0}if(hn(e)&&hn(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let u of r){if(!Object.prototype.hasOwnProperty.call(t,u))return!1;if(!op(e[u],t[u]))return!1}return!0}return!1}function hn(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}class Gh{extensions=$f;async loadFromPath(e,t,r={}){let{arrayStrategy:a="replace",useCache:u=!0,cacheTtl:f,trackPerformance:h=!0,verbose:b=!1}=r;if(u){let y=Gc.getWithFileCheck("file",e);if(y){if(b)console.log(`Configuration loaded from cache: ${e}`);return y}}let S=async()=>{if(!qc(e))return null;try{let y=`?t=${Date.now()}`,k=await import(e+y),R=k.default||k,D="default"in k,O=Object.keys(k).length>0;if(!D&&!O)throw new cd(e,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof R!=="object"||R===null||Array.isArray(R))throw new cd(e,Error("Configuration must export a valid object"),"unknown");let J={config:Jh(t,R,a),source:{type:"file",path:e,priority:100,timestamp:new Date}};if(u)Gc.setWithFileCheck("file",J,e,f);return J}catch(y){throw y instanceof Error?ro.configLoad(e,y):ro.configLoad(e,Error(String(y)))}};if(h)return sp.track("loadFromPath",S,{path:e});return S()}async tryLoadFromPaths(e,t,r={}){for(let a of e)try{let u=await this.loadFromPath(a,t,r);if(u)return u}catch(u){if(u instanceof Error&&u.name==="ConfigLoadError")throw u;if(r.verbose)console.warn(`Failed to load config from ${a}:`,u)}return null}generateConfigPaths(e,t,r){return kw({name:e,directory:t,alias:r})}generateNamePatterns(e,t){return Nf({name:e,alias:t})}checkFileAccess(e){return II(async()=>qc(e),{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(e,t,r){let a=[];if(!qc(e))return a;if(t||r){let u=this.generateNamePatterns(t||"",r);for(let f of u)for(let h of this.extensions){let b=xf(e,`${f}${h}`);if(await this.checkFileAccess(b))a.push(b)}}else try{let{readdirSync:u}=await import("fs"),f=u(e);for(let h of f)if(this.looksLikeConfigFile(h)){let b=xf(e,h);if(await this.checkFileAccess(b))a.push(b)}}catch{return[]}return a}looksLikeConfigFile(e){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((r)=>r.test(e))}async validateConfigFile(e){let t=[];try{if(!qc(e))return t.push("Configuration file does not exist"),t;let r=await import(e),a=r.default||r;if(a===void 0)t.push("Configuration file must export a default value or named exports");else if(typeof a!=="object"||a===null)t.push("Configuration must be an object");else if(Array.isArray(a))t.push("Configuration cannot be an array at the root level");if(e.endsWith(".json"))try{let{readFileSync:u}=await import("fs"),f=u(e,"utf8");JSON.parse(f)}catch(u){t.push(`Invalid JSON syntax: ${u}`)}}catch(r){t.push(`Failed to load configuration file: ${r}`)}return t}async getFileModificationTime(e){try{let{statSync:t}=await import("fs");return t(e).mtime}catch{return null}}async preloadConfigurations(e,t={}){let r=new Map;return await Promise.allSettled(e.map(async(a)=>{try{let u=await this.loadFromPath(a,{},t);if(u)r.set(a,u.config)}catch(u){if(t.verbose)console.warn(`Failed to preload ${a}:`,u)}})),r}}var TI=/^https?:\/\//;class Qh{async validateConfiguration(e,t,r={}){let{stopOnFirstError:a=!1,validateRequired:u=!0,validateTypes:f=!0,customRules:h=[],trackPerformance:b=!0,verbose:S=!1}=r,y=async()=>{let k=[],R=[],D={stopOnFirstError:a,validateRequired:u,validateTypes:f,customRules:h,trackPerformance:b,verbose:S};try{if(typeof t==="string")return await this.validateWithSchemaFile(e,t,D);else if(Array.isArray(t))return this.validateWithRules(e,[...t,...h],D);else return this.validateWithJSONSchema(e,t,D)}catch(O){return k.push({path:"",message:`Validation failed: ${O}`,rule:"system"}),{isValid:!1,errors:k,warnings:R}}};if(b)return await sp.track("validateConfiguration",y);return y()}async validateWithSchemaFile(e,t,r){try{if(!_I(t))throw new dd(t,[{path:"",message:"Schema file does not exist"}]);let a=await import(t),u=a.default||a;if(Array.isArray(u))return this.validateWithRules(e,u,r);else return this.validateWithJSONSchema(e,u,r)}catch(a){throw new dd(t,[{path:"",message:`Failed to load schema: ${a}`}])}}validateWithJSONSchema(e,t,r){let a=[],u=[];return this.validateObjectAgainstSchema(e,t,"",a,u,r),{isValid:a.length===0,errors:a,warnings:u}}validateObjectAgainstSchema(e,t,r,a,u,f){if(f.validateTypes&&t.type){let h=Array.isArray(e)?"array":typeof e,b=Array.isArray(t.type)?t.type:[t.type];if(!b.includes(h)){if(a.push({path:r,message:`Expected type ${b.join(" or ")}, got ${h}`,expected:b.join(" or "),actual:h,rule:"type"}),f.stopOnFirstError)return}}if(t.enum&&!t.enum.includes(e)){if(a.push({path:r,message:`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"}),f.stopOnFirstError)return}if(typeof e==="string"){if(t.minLength!==void 0&&e.length<t.minLength)a.push({path:r,message:`String length must be at least ${t.minLength}`,expected:`>= ${t.minLength}`,actual:e.length,rule:"minLength"});if(t.maxLength!==void 0&&e.length>t.maxLength)a.push({path:r,message:`String length must not exceed ${t.maxLength}`,expected:`<= ${t.maxLength}`,actual:e.length,rule:"maxLength"});if(t.pattern){if(!new RegExp(t.pattern).test(e))a.push({path:r,message:`String does not match pattern ${t.pattern}`,expected:t.pattern,actual:e,rule:"pattern"})}}if(typeof e==="number"){if(t.minimum!==void 0&&e<t.minimum)a.push({path:r,message:`Value must be at least ${t.minimum}`,expected:`>= ${t.minimum}`,actual:e,rule:"minimum"});if(t.maximum!==void 0&&e>t.maximum)a.push({path:r,message:`Value must not exceed ${t.maximum}`,expected:`<= ${t.maximum}`,actual:e,rule:"maximum"})}if(Array.isArray(e)&&t.items)for(let h=0;h<e.length;h++){let b=r?`${r}[${h}]`:`[${h}]`;if(this.validateObjectAgainstSchema(e[h],t.items,b,a,u,f),f.stopOnFirstError&&a.length>0)return}if(e&&typeof e==="object"&&!Array.isArray(e)){let h=e;if(f.validateRequired&&t.required){for(let b of t.required)if(!(b in h)){if(a.push({path:r?`${r}.${b}`:b,message:`Missing required property '${b}'`,expected:"required",rule:"required"}),f.stopOnFirstError)return}}if(t.properties){for(let[b,S]of Object.entries(t.properties))if(b in h){let y=r?`${r}.${b}`:b;if(this.validateObjectAgainstSchema(h[b],S,y,a,u,f),f.stopOnFirstError&&a.length>0)return}}if(t.additionalProperties===!1){let b=new Set(Object.keys(t.properties||{}));for(let S of Object.keys(h))if(!b.has(S))u.push({path:r?`${r}.${S}`:S,message:`Additional property '${S}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(e,t,r){let a=[],u=[];for(let f of t)try{let h=this.getValueByPath(e,f.path),b=this.validateWithRule(h,f,f.path);if(a.push(...b),r.stopOnFirstError&&a.length>0)break}catch(h){a.push({path:f.path,message:`Rule validation failed: ${h}`,rule:"system"})}return{isValid:a.length===0,errors:a,warnings:u}}validateWithRule(e,t,r){let a=[];if(t.required&&(e===void 0||e===null))return a.push({path:r,message:t.message||`Property '${r}' is required`,expected:"required",rule:"required"}),a;if(e===void 0||e===null)return a;if(t.type){let u=Array.isArray(e)?"array":typeof e;if(u!==t.type)a.push({path:r,message:t.message||`Expected type ${t.type}, got ${u}`,expected:t.type,actual:u,rule:"type"})}if(t.min!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u<t.min)a.push({path:r,message:t.message||`Value must be at least ${t.min}`,expected:`>= ${t.min}`,actual:u,rule:"min"})}if(t.max!==void 0){let u=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(u>t.max)a.push({path:r,message:t.message||`Value must not exceed ${t.max}`,expected:`<= ${t.max}`,actual:u,rule:"max"})}if(t.pattern&&typeof e==="string"){if(!t.pattern.test(e))a.push({path:r,message:t.message||`Value does not match pattern ${t.pattern}`,expected:t.pattern.toString(),actual:e,rule:"pattern"})}if(t.enum&&!t.enum.includes(e))a.push({path:r,message:t.message||`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"});if(t.validator){let u=t.validator(e);if(u)a.push({path:r,message:t.message||u,rule:"custom"})}return a}getValueByPath(e,t){if(!t)return e;let r=t.split("."),a=e;for(let u of r)if(a&&typeof a==="object"&&u in a)a=a[u];else return;return a}generateRulesFromInterface(e){let t=[],r=e.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let a of r){let[,u,f,h]=a;t.push({path:u,required:!f,type:this.mapTypeScriptType(h)})}return t}mapTypeScriptType(e){switch(e.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:TI},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}var zn=new gd("bunfig",{showTags:!0});function xI(e){if(!e)return"";let t=Array.isArray(e)?e.filter(Boolean):[e];if(t.length===0)return"";if(t.length===1)return` or alias "${t[0]}"`;return` or aliases ${t.map((r)=>`"${r}"`).join(", ")}`}class Yh{fileLoader=new Gh;envProcessor=new fp;validator=new Qh;async loadConfig(e){let t=Date.now(),{cache:r,performance:a,schema:u,validate:f,...h}=e;try{if(r?.enabled){let S=this.checkCache(h.name||"",h);if(S)return S}let b;try{b=await this.loadConfigurationStrategies(h,!0,r)}catch(S){if(h.configFile)throw S;let y=h.__strictErrorHandling;if(S instanceof Error&&S.name==="ConfigNotFoundError"){if(y)throw S;b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`No configuration file found for "${h.name||"config"}", using defaults with environment variables`]}}else if(S instanceof Error&&S.name==="ConfigLoadError"){let k=S.message.includes("EACCES")||S.message.includes("EPERM")||S.message.includes("permission denied"),R=!k&&(S.message.includes("syntax")||S.message.includes("Expected")||S.message.includes("Unexpected")||S.message.includes("BuildMessage")||S.message.includes("errors building")),D=S.message.includes("Configuration must export a valid object")||S.message.includes("Configuration file is empty and exports nothing");if(y&&(D||k))throw S;if(R&&(!y||!D))b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!y)b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading error, using defaults: ${S.message}`]};else throw S}else b={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${S instanceof Error?S.message:String(S)}`]}}if(u||f)await this.validateConfiguration(b.config,u,f,h.name);if(r?.enabled&&b)this.cacheResult(h.name||"",b,r,h);if(a?.enabled){let S={operation:"loadConfig",duration:Date.now()-t,configName:h.name,timestamp:new Date};if(a.onMetrics)a.onMetrics(S);if(a.slowThreshold&&S.duration>a.slowThreshold)zn.warn(`Slow configuration loading detected: ${S.duration}ms for ${h.name}`);b.metrics=S}return b}catch(b){if(b instanceof Error&&b.name==="ConfigNotFoundError")throw b;let S=Date.now()-t;throw zn.error(`Configuration loading failed after ${S}ms:`,[b instanceof Error?b:Error(String(b))]),b}}async loadConfigurationStrategies(e,t=!1,r){let{name:a="",alias:u,configFile:f,cwd:h,configDir:b,defaultConfig:S,checkEnv:y=!0,arrayStrategy:k="replace",verbose:R=!1}=e,D=h||ld.cwd(),O=[];if(f){let oe=Zn(D,f);O.push(oe);let G=y?Vs(a,S,R):S,te=await this.fileLoader.tryLoadFromPaths([oe],G,{arrayStrategy:k,verbose:R,cacheTtl:r?.ttl,useCache:!r?.ttl||r.ttl>100});if(!te)throw ro.configNotFound(a||f,O,u);if(R)zn.success(`Configuration loaded from explicit path: ${oe}`);return this.finalizeResult(te,O,y,a,R)}let M=await this.loadLocalConfiguration(a,u,D,b,S,k,R,y,r);if(M)return O.push(...this.getLocalSearchPaths(a,u,D,b)),this.finalizeResult(M,O,y,a,R);let z=await this.loadHomeConfiguration(a,u,S,k,R,y);if(z)return O.push(...this.getHomeSearchPaths(a,u)),this.finalizeResult(z,O,y,a,R);let J=await this.loadPackageJsonConfiguration(a,u,D,S,k,R,y);if(J)return O.push(Zn(D,"package.json")),this.finalizeResult(J,O,y,a,R);if(O.push(...this.getAllSearchPaths(a,u,D,b)),t)throw ro.configNotFound(a,O,u);return{...await this.applyEnvironmentVariables(a,S,y,R),warnings:[`No configuration file found for "${a}"${xI(u)}, using defaults with environment variables`]}}async loadLocalConfiguration(e,t,r,a,u,f,h,b,S){let y=b?Vs(e,u,h):u,k=this.getLocalDirectories(r,a);for(let R of k){if(h)zn.info(`Searching for configuration in: ${R}`);let D=this.fileLoader.generateConfigPaths(e,R,t),O=await this.fileLoader.tryLoadFromPaths(D,y,{arrayStrategy:f,verbose:h,cacheTtl:S?.ttl,useCache:!S?.ttl||S.ttl>100});if(O){if(h)zn.success(`Configuration loaded from: ${O.source.path}`);return O}}return null}async loadHomeConfiguration(e,t,r,a,u,f){if(!e)return null;let h=f?Vs(e,r,u):r,b=[Zn(No(),".config",e),Zn(No(),".config"),No()];for(let S of b){if(u)zn.info(`Checking home directory: ${S}`);let y=this.fileLoader.generateConfigPaths(e,S,t),k=await this.fileLoader.tryLoadFromPaths(y,h,{arrayStrategy:a,verbose:u});if(k){if(u)zn.success(`Configuration loaded from home directory: ${k.source.path}`);return k}}return null}async loadPackageJsonConfiguration(e,t,r,a,u,f,h){let b=h?Vs(e,a,f):a;try{let S=Zn(r,"package.json");if(!Ew(S))return null;let y={};try{y=JSON.parse(Rw(S,"utf8"))}catch(D){if(f)zn.warn("Failed to parse package.json:",[D instanceof Error?D:Error(String(D))]);return null}let k=y[e],R=e;if(!k&&t){let D=Array.isArray(t)?t:[t];for(let O of D){if(!O)continue;if(y[O]){k=y[O],R=O;break}}}if(k&&typeof k==="object"&&!Array.isArray(k)){if(f)zn.success(`Configuration loaded from package.json: ${R}`);return{config:Jh(b,k,u),source:{type:"package.json",path:S,priority:30,timestamp:new Date}}}}catch(S){if(f)zn.warn("Failed to load package.json:",[S instanceof Error?S:Error(String(S))])}return null}async applyEnvironmentVariables(e,t,r,a){if(!r||!e||typeof t!=="object"||t===null||Array.isArray(t))return{config:t,source:{type:"default",priority:10,timestamp:new Date}};return{config:Vs(e,t,a),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(e,t,r,a,u){return{config:e.config,source:e.source,path:e.source.path}}async validateConfiguration(e,t,r,a){let u=[];if(r){let f=r(e);if(f)u.push(...f)}if(t){let f=await this.validator.validateConfiguration(e,t);if(!f.isValid)u.push(...f.errors.map((h)=>h.path?`${h.path}: ${h.message}`:h.message))}if(u.length>0)throw ro.configValidation(a||"unknown",u,a)}checkCache(e,t){let r=this.generateCacheKey(e,t);return Gc.get(r)||null}cacheResult(e,t,r,a){let u=this.generateCacheKey(e,a);Gc.set(u,t,void 0,r.ttl)}generateCacheKey(e,t){let r=[e];if(t.alias){let a=Array.isArray(t.alias)?t.alias.join(","):t.alias;r.push(`alias:${a}`)}if(t.cwd)r.push(`cwd:${t.cwd}`);if(t.configFile)r.push(`configFile:${t.configFile}`);if(t.configDir)r.push(`configDir:${t.configDir}`);if("checkEnv"in t)r.push(`checkEnv:${t.checkEnv}`);return r.join("|")}getLocalDirectories(e,t){return Iw({cwd:e,configDir:t})}getAllSearchPaths(e,t,r,a){let u=[];return u.push(...this.getLocalSearchPaths(e,t,r,a)),u.push(...this.getHomeSearchPaths(e,t)),u.push(Zn(r,"package.json")),u}getLocalSearchPaths(e,t,r,a){let u=this.getLocalDirectories(r,a),f=[];for(let h of u)f.push(...this.fileLoader.generateConfigPaths(e,h,t));return f}getHomeSearchPaths(e,t){if(!e)return[];let r=[Zn(No(),".config",e),Zn(No(),".config"),No()],a=[];for(let u of r)a.push(...this.fileLoader.generateConfigPaths(e,u,t));return a}async loadConfigWithResult(e){return this.loadConfig(e)}}var Gl=new Yh;async function Zh(e){let t="defaultConfig"in e&&e.defaultConfig!==void 0?e.defaultConfig:{},r="cache"in e||"performance"in e||"schema"in e||"validate"in e;try{let a;if(r)a=await Gl.loadConfig(e);else a=await Gl.loadConfig({...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}});return a?.config??t}catch(a){if(e.configFile)throw a;let u=a instanceof Error?a.name:"UnknownError",f=a instanceof Error?a.message:String(a);if(!(u==="ConfigNotFoundError"||u==="ConfigLoadError"||u==="ConfigValidationError"||f.includes("config"))&&e.verbose)zn.warn("Unexpected error loading config, using defaults:",[a instanceof Error?a:Error(String(a))]);let b=r?{...e,defaultConfig:t}:{...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in e?e.checkEnv!==!1:!0)return(await Gl.applyEnvironmentVariables(b.name||"",t,!0,b.verbose||!1))?.config??t;return t}}function Vs(e,t,r=!1){let a=new fp,u=e.toUpperCase().replace(/[^A-Z0-9]/g,"_");function f(h,b=[]){let S={...h};for(let[y,k]of Object.entries(h)){let R=[...b,y],D=[`${u}_${R.join("_").toUpperCase()}`,`${u}_${R.map((z)=>z.toUpperCase()).join("")}`,`${u}_${R.map((z)=>z.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],O,M;for(let z of D)if(O=ld.env[z],O!==void 0){M=z;break}if(O!==void 0&&M)if(typeof k==="boolean")S[y]=["true","1","yes"].includes(O.toLowerCase());else if(typeof k==="number"){let z=Number(O);if(!Number.isNaN(z))S[y]=z}else if(Array.isArray(k))try{S[y]=JSON.parse(O)}catch{S[y]=O.split(",").map((z)=>z.trim())}else S[y]=O;else if(k&&typeof k==="object"&&!Array.isArray(k))S[y]=f(k,R)}return S}return f(t)}var Qx=Zn(ld.cwd(),"config"),Yx=Zn(ld.cwd(),"src/generated");var ca={project:{name:"my-project",slug:"my-project",region:"us-east-1"},environments:{production:{type:"production"}}},io=null;function $I(e){return e.project?.slug===ca.project?.slug&&Object.keys(e.environments??{}).length===1&&!!e.environments?.production}async function NI(){let e=[Xh(process.cwd(),"config","cloud.ts"),Xh(process.cwd(),"config","cloud.js")];for(let t of e){if(!DI(t))continue;let r=await import(`${OI(t).href}?t=${Date.now()}`),a=r.tsCloud??r.default?.tsCloud??r.default??r.cloud??r.config;if(a)return a}return null}async function Vf(){if(!io){if(io=await Zh({name:"cloud",defaultConfig:ca}),$I(io))io=await NI()??io;nl(io.stateDir)}return io}var ru=Vf,_S=ca;import{createCipheriv as MI,createDecipheriv as LI,createHash as iy,randomBytes as mi}from"node:crypto";import{createHmac as jI,timingSafeEqual as BI}from"node:crypto";var hp="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";function cs(e){let t=0,r=0,a="";for(let u of e){r=r<<8|u,t+=8;while(t>=5)a+=hp[r>>>t-5&31],t-=5}if(t>0)a+=hp[r<<5-t&31];return a}function nu(e){let t=e.toUpperCase().replace(/[^A-Z2-7]/g,""),r=0,a=0,u=[];for(let f of t){let h=hp.indexOf(f);if(h<0)throw Error("Invalid base32 secret");if(a=a<<5|h,r+=5,r>=8)u.push(a>>>r-8&255),r-=8}return Buffer.from(u)}function da(e,t,r=6){let a=Buffer.alloc(8);a.writeBigUInt64BE(BigInt(t));let u=jI("sha1",nu(e)).update(a).digest(),f=u[u.length-1]&15,h=(u[f]&127)<<24|(u[f+1]&255)<<16|(u[f+2]&255)<<8|u[f+3]&255;return String(h%10**r).padStart(r,"0")}function qf(e,t=Date.now(),r=30){return da(e,Math.floor(t/1000/r))}function jf(e,t,r=Date.now(),a=1){return An(e,t,r,a)!==void 0}function An(e,t,r=Date.now(),a=1){let u=t.replace(/[\s-]/g,"");if(!/^\d{6}$/.test(u))return;let f=Buffer.from(u),h=Math.floor(r/1000/30);for(let b=-a;b<=a;b++){if(h+b<0)continue;let S=Buffer.from(da(e,h+b));if(f.length===S.length&&BI(f,S))return h+b}return}function la(e){let t=e.issuer?.trim()||"ts-cloud",r=`${t}:${e.account}`;return`otpauth://totp/${encodeURIComponent(r)}?secret=${encodeURIComponent(e.secret)}&issuer=${encodeURIComponent(t)}&algorithm=SHA1&digits=6&period=30`}var iu=1800000,it=43200000,su=3600000,ou=300000,au=600000;function dn(e){return typeof e==="string"?e:void 0}function oy(e){if(typeof e!=="string")return{};try{return JSON.parse(e)}catch{return{}}}function FI(e){let t=e.trim();if(!/^[a-z0-9][a-z0-9._-]{1,31}$/i.test(t))throw Error("Username must be 2-32 characters: letters, numbers, dot, dash or underscore");return t}function yp(e){if(e===void 0||!e.trim())return;let t=e.trim().toLowerCase();if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)||t.length>254)throw Error("A valid email address is required");return t}function zI(e){let t=e.trim().toLowerCase();if(!/^[a-z0-9][a-z0-9-]{1,47}$/.test(t))throw Error("OIDC provider slug must be 2-48 lowercase letters, numbers or dashes");return t}function UI(e){let t=new URL(e.trim());if(t.search||t.hash||t.username||t.password)throw Error("OIDC issuer cannot contain credentials, a query, or a fragment");if(t.protocol!=="https:"&&!(t.protocol==="http:"&&["127.0.0.1","::1","localhost"].includes(t.hostname)))throw Error("OIDC issuer must use HTTPS");return t.href.replace(/\/$/,"")}function qI(e){let t=[...new Set(e.map((r)=>r.trim().toLowerCase()).filter(Boolean))];if(t.length===0)throw Error("At least one explicit OIDC email domain is required");if(t.some((r)=>!/^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$/.test(r)||!r.includes(".")||r.includes("..")))throw Error("OIDC email domains must be explicit DNS names without wildcards");return t}function VI(e){let t=[...new Set(["openid",...e??["email","profile"]].map((r)=>r.trim()).filter(Boolean))];if(t.some((r)=>!/^[\x21\x23-\x5B\x5D-\x7E]+$/.test(r)))throw Error("OIDC scopes contain unsupported characters");return t}function Vn(e){return iy("sha256").update(e).digest("hex")}function Ys(e){return{id:String(e.id),actorId:String(e.actor_id),username:String(e.username),email:dn(e.email),emailVerifiedAt:dn(e.email_verified_at),passwordHash:String(e.password_hash),credentialVersion:Number(e.credential_version),requiresPasswordUpgrade:Number(e.requires_password_upgrade)===1,disabledAt:dn(e.disabled_at),lastLoginAt:dn(e.last_login_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function ey(e,t){let r=dn(e.consumed_at),a=String(e.expires_at);return{id:String(e.id),identityId:String(e.identity_id),type:String(e.type),metadata:oy(e.metadata),expiresAt:a,consumedAt:r,createdAt:String(e.created_at),state:r?"consumed":a<=t?"expired":"pending"}}function vp(e,t){let r=dn(e.revoked_at),a=String(e.idle_expires_at),u=String(e.absolute_expires_at);return{id:String(e.id),identityId:String(e.identity_id),credentialVersion:Number(e.credential_version),authMethod:String(e.auth_method),userAgent:dn(e.user_agent),networkHint:dn(e.network_hint),createdAt:String(e.created_at),lastUsedAt:String(e.last_used_at),idleExpiresAt:a,absoluteExpiresAt:u,recentAuthAt:String(e.recent_auth_at),mfaAt:dn(e.mfa_at),revokedAt:r,state:r?"revoked":a<=t||u<=t?"expired":"active"}}function ty(e){let t=dn(e.verified_at),r=dn(e.disabled_at);return{id:String(e.id),identityId:String(e.identity_id),type:"totp",label:String(e.label),createdAt:String(e.created_at),verifiedAt:t,disabledAt:r,state:r?"disabled":t?"active":"pending"}}function bp(e,t){let r=dn(e.consumed_at),a=String(e.expires_at),u=Number(e.attempts);return{id:String(e.id),identityId:String(e.identity_id),purpose:String(e.purpose),attempts:u,expiresAt:a,consumedAt:r,createdAt:String(e.created_at),state:r?"consumed":u>=5?"locked":a<=t?"expired":"pending"}}function ry(e){let t=oy(e);return Array.isArray(t)?t.filter((r)=>typeof r==="string"):[]}function md(e){return{id:String(e.id),organizationId:String(e.organization_id),slug:String(e.slug),name:String(e.name),issuer:String(e.issuer),clientId:String(e.client_id),hasClientSecret:typeof e.client_secret_ciphertext==="string"&&e.client_secret_ciphertext.length>0,scopes:ry(e.scopes),allowedDomains:ry(e.allowed_domains),defaultRole:String(e.default_role),enabled:Number(e.enabled)===1,enforceSso:Number(e.enforce_sso)===1,createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function ny(e,t){let r=dn(e.consumed_at),a=String(e.expires_at);return{id:String(e.id),providerId:String(e.provider_id),redirectUri:String(e.redirect_uri),returnPath:String(e.return_path),expiresAt:a,consumedAt:r,createdAt:String(e.created_at),state:r?"consumed":a<=t?"expired":"pending"}}function WI(e){return{id:String(e.id),providerId:String(e.provider_id),identityId:String(e.identity_id),subject:String(e.subject),email:String(e.email),linkedAt:String(e.linked_at),lastLoginAt:String(e.last_login_at)}}class ds{controlPlane;nowFn;idFn;encryptionKey;constructor(e,t={}){this.controlPlane=e;this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID()),this.encryptionKey=t.encryptionKey?iy("sha256").update(t.encryptionKey).digest():void 0}now(){return this.nowFn().toISOString()}run(e,t){this.controlPlane.database.run(e,t)}encrypt(e){if(!this.encryptionKey)throw Error("Authentication encryption key is not configured");let t=mi(12),r=MI("aes-256-gcm",this.encryptionKey,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){if(!this.encryptionKey)throw Error("Authentication encryption key is not configured");let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Encrypted authentication value is unavailable");let f=LI("aes-256-gcm",this.encryptionKey,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}createIdentity(e){if(!this.controlPlane.getActor(e.actorId))throw Error("Authentication actor was not found");let t=FI(e.username),r=yp(e.email),a=e.id??this.idFn(),u=this.now();return this.run(`INSERT INTO auth_identities (id, actor_id, username, email, email_verified_at, password_hash, requires_password_upgrade, created_at, updated_at)
61
61
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[a,e.actorId,t,r??null,e.emailVerified&&r?u:null,e.passwordHash,e.requiresPasswordUpgrade?1:0,u,u]),this.getIdentity(a)}getIdentity(e){let t=this.controlPlane.database.query("SELECT * FROM auth_identities WHERE id = ?").get(e);return t?Ys(t):void 0}getIdentityByActor(e){let t=this.controlPlane.database.query("SELECT * FROM auth_identities WHERE actor_id = ?").get(e);return t?Ys(t):void 0}getIdentityByUsername(e){let t=this.controlPlane.database.query("SELECT * FROM auth_identities WHERE username = ? COLLATE NOCASE").get(e.trim());return t?Ys(t):void 0}getIdentityByEmail(e){let t=this.controlPlane.database.query("SELECT * FROM auth_identities WHERE email = ? COLLATE NOCASE").get(e.trim().toLowerCase());return t?Ys(t):void 0}listIdentities(){return this.controlPlane.database.query("SELECT * FROM auth_identities ORDER BY username COLLATE NOCASE").all().map(Ys)}updatePassword(e,t,r={}){if(!this.getIdentity(e))throw Error("Authentication identity was not found");let u=this.now();return this.controlPlane.transaction(()=>{if(this.run(`UPDATE auth_identities SET password_hash = ?, credential_version = credential_version + 1,
62
62
  requires_password_upgrade = ?, updated_at = ? WHERE id = ?`,[t,r.requiresUpgrade?1:0,u,e]),r.revokeSessions!==!1)this.run("UPDATE auth_sessions SET revoked_at = ? WHERE identity_id = ? AND revoked_at IS NULL",[u,e])}),this.getIdentity(e)}rehashPassword(e,t){let r=this.now();this.run("UPDATE auth_identities SET password_hash = ?, requires_password_upgrade = 0, updated_at = ? WHERE id = ?",[t,r,e]);let a=this.getIdentity(e);if(!a)throw Error("Authentication identity was not found");return a}setVerifiedEmail(e,t){let r=yp(t),a=this.now();this.run("UPDATE auth_identities SET email = ?, email_verified_at = ?, updated_at = ? WHERE id = ?",[r,a,a,e]);let u=this.getIdentity(e);if(!u)throw Error("Authentication identity was not found");return u}recordLogin(e){let t=this.now();this.run("UPDATE auth_identities SET last_login_at = ?, updated_at = ? WHERE id = ?",[t,t,e]);let r=this.getIdentity(e);if(!r)throw Error("Authentication identity was not found");return r}setDisabled(e,t){let r=this.now();this.controlPlane.transaction(()=>{if(this.run("UPDATE auth_identities SET disabled_at = ?, credential_version = credential_version + 1, updated_at = ? WHERE id = ?",[t?r:null,r,e]),t)this.run("UPDATE auth_sessions SET revoked_at = ? WHERE identity_id = ? AND revoked_at IS NULL",[r,e])});let a=this.getIdentity(e);if(!a)throw Error("Authentication identity was not found");return a}createActionToken(e,t,r={}){if(!this.getIdentity(e))throw Error("Authentication identity was not found");let a=mi(32).toString("base64url"),u=this.idFn(),f=this.now(),h=new Date(this.nowFn().getTime()+Math.min(86400000,Math.max(60000,r.ttlMs??su))).toISOString();return this.run("INSERT INTO auth_action_tokens (id, identity_id, type, token_hash, metadata, expires_at, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)",[u,e,t,Vn(a),JSON.stringify(r.metadata??{}),h,f]),{actionToken:this.getActionToken(u),token:a}}getActionToken(e){let t=this.controlPlane.database.query("SELECT * FROM auth_action_tokens WHERE id = ?").get(e);return t?ey(t,this.now()):void 0}consumeActionToken(e,t){return this.controlPlane.transaction(()=>{let r=this.controlPlane.database.query("SELECT * FROM auth_action_tokens WHERE token_hash = ? AND type = ?").get(Vn(e),t);if(!r)throw Error("Action token is invalid");let a=ey(r,this.now());if(a.state!=="pending")throw Error(`Action token is ${a.state}`);if(this.controlPlane.database.run("UPDATE auth_action_tokens SET consumed_at = ? WHERE id = ? AND consumed_at IS NULL AND expires_at > ?",[this.now(),a.id,this.now()]).changes!==1)throw Error("Action token is no longer available");return this.getActionToken(a.id)})}revokeActionTokens(e,t){return this.controlPlane.database.run("UPDATE auth_action_tokens SET consumed_at = ? WHERE identity_id = ? AND type = ? AND consumed_at IS NULL",[this.now(),e,t]).changes}createSession(e){let t=this.getIdentity(e.identityId);if(!t||t.disabledAt)throw Error("Authentication identity is unavailable");let r=this.idFn(),a=mi(32).toString("base64url"),u=`v2.${r}.${a}`,f=this.now(),h=Math.min(86400000,Math.max(60000,e.idleTtlMs??iu)),b=Math.min(2592000000,Math.max(h,e.absoluteTtlMs??it));return this.run(`INSERT INTO auth_sessions (id, identity_id, token_hash, credential_version, auth_method, user_agent, network_hint,
63
63
  created_at, last_used_at, idle_expires_at, absolute_expires_at, recent_auth_at, mfa_at)
@@ -66,15 +66,15 @@ export type ConfigOf = Config
66
66
  default_role = ?, enabled = ?, enforce_sso = ?, updated_at = ? WHERE id = ?`,[t,r,a,u,e.clientSecret?this.encrypt(e.clientSecret):null,JSON.stringify(f),JSON.stringify(h),e.defaultRole??b.defaultRole,e.enabled??b.enabled?1:0,e.enforceSso??b.enforceSso?1:0,S,b.id]),this.getOidcProvider(b.id)}if(!e.clientSecret)throw Error("OIDC client secret is required for a new provider");let y=e.id??this.idFn();return this.run(`INSERT INTO auth_oidc_providers (id, organization_id, slug, name, issuer, client_id,
67
67
  client_secret_ciphertext, scopes, allowed_domains, default_role, enabled, enforce_sso, created_at, updated_at)
68
68
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[y,e.organizationId,t,r,a,u,this.encrypt(e.clientSecret),JSON.stringify(f),JSON.stringify(h),e.defaultRole??"viewer",e.enabled===!1?0:1,e.enforceSso?1:0,S,S]),this.getOidcProvider(y)}getOidcProvider(e){let t=this.controlPlane.database.query("SELECT * FROM auth_oidc_providers WHERE id = ?").get(e);return t?md(t):void 0}getOidcProviderBySlug(e){let t=this.controlPlane.database.query("SELECT * FROM auth_oidc_providers WHERE slug = ? COLLATE NOCASE").get(e.trim());return t?md(t):void 0}listOidcProviders(e,t={}){return(e?this.controlPlane.database.query("SELECT * FROM auth_oidc_providers WHERE organization_id = ? ORDER BY name COLLATE NOCASE").all(e):this.controlPlane.database.query("SELECT * FROM auth_oidc_providers ORDER BY name COLLATE NOCASE").all()).map(md).filter((a)=>t.includeDisabled||a.enabled)}setOidcProviderEnabled(e,t){let r=this.now();if(this.controlPlane.database.run("UPDATE auth_oidc_providers SET enabled = ?, enforce_sso = CASE WHEN ? = 0 THEN 0 ELSE enforce_sso END, updated_at = ? WHERE id = ?",[t?1:0,t?1:0,r,e]).changes!==1)throw Error("OIDC provider was not found");if(!t)this.run("UPDATE auth_oidc_transactions SET consumed_at = ? WHERE provider_id = ? AND consumed_at IS NULL",[r,e]);return this.getOidcProvider(e)}getOidcProviderCredentials(e){let t=this.controlPlane.database.query("SELECT * FROM auth_oidc_providers WHERE id = ?").get(e);if(!t||typeof t.client_secret_ciphertext!=="string")throw Error("OIDC provider credentials are unavailable");return{provider:md(t),clientSecret:this.decrypt(t.client_secret_ciphertext)}}beginOidcTransaction(e,t,r){if(!this.getOidcProvider(e)?.enabled)throw Error("OIDC provider is unavailable");let u=this.idFn(),f=mi(32).toString("base64url"),h=mi(32).toString("base64url"),b=mi(64).toString("base64url"),S=this.now(),y=new Date(this.nowFn().getTime()+au).toISOString();return this.run(`INSERT INTO auth_oidc_transactions (id, provider_id, state_hash, nonce_ciphertext, verifier_ciphertext,
69
- redirect_uri, return_path, expires_at, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[u,e,Vn(f),this.encrypt(h),this.encrypt(b),t,r,y,S]),{transaction:this.getOidcTransaction(u),state:f,nonce:h,verifier:b}}getOidcTransaction(e){let t=this.controlPlane.database.query("SELECT * FROM auth_oidc_transactions WHERE id = ?").get(e);return t?ny(t,this.now()):void 0}consumeOidcTransaction(e,t){return this.controlPlane.transaction(()=>{let r=this.controlPlane.database.query("SELECT * FROM auth_oidc_transactions WHERE provider_id = ? AND state_hash = ?").get(e,Vn(t));if(!r)throw Error("OIDC transaction is invalid");let a=ny(r,this.now());if(a.state!=="pending")throw Error(`OIDC transaction is ${a.state}`);if(this.controlPlane.database.run("UPDATE auth_oidc_transactions SET consumed_at = ? WHERE id = ? AND consumed_at IS NULL AND expires_at > ?",[this.now(),a.id,this.now()]).changes!==1)throw Error("OIDC transaction is no longer available");return{transaction:this.getOidcTransaction(a.id),nonce:this.decrypt(String(r.nonce_ciphertext)),verifier:this.decrypt(String(r.verifier_ciphertext))}})}getOidcSubject(e,t){let r=this.controlPlane.database.query("SELECT * FROM auth_oidc_subjects WHERE provider_id = ? AND subject = ?").get(e,t);return r?WI(r):void 0}linkOidcSubject(e,t,r,a){let u=this.getOidcProvider(e),f=this.getIdentity(t);if(!u||!f)throw Error("OIDC provider or identity was not found");let h=yp(a);if(!r.trim()||r.length>512)throw Error("OIDC subject is invalid");let b=this.getOidcSubject(e,r);if(b&&b.identityId!==t)throw Error("OIDC subject is already linked to another identity");let S=this.now();if(b)return this.run("UPDATE auth_oidc_subjects SET email = ?, last_login_at = ? WHERE id = ?",[h,S,b.id]),this.getOidcSubject(e,r);let y=this.idFn();return this.run("INSERT INTO auth_oidc_subjects (id, provider_id, identity_id, subject, email, linked_at, last_login_at) VALUES (?, ?, ?, ?, ?, ?, ?)",[y,e,t,r,h,S,S]),this.getOidcSubject(e,r)}purgeExpired(){let e=this.now(),t=this.controlPlane.database.run("DELETE FROM auth_action_tokens WHERE expires_at < ? OR consumed_at IS NOT NULL",[e]).changes,r=this.controlPlane.database.run("DELETE FROM auth_sessions WHERE revoked_at IS NOT NULL OR idle_expires_at < ? OR absolute_expires_at < ?",[e,e]).changes;return this.controlPlane.database.run("DELETE FROM auth_mfa_challenges WHERE consumed_at IS NOT NULL OR expires_at < ?",[e]),this.controlPlane.database.run("DELETE FROM auth_oidc_transactions WHERE consumed_at IS NOT NULL OR expires_at < ?",[e]),{actionTokens:t,sessions:r}}}async function yn(e,t){let r=e.notifications?.email?.from;if(!r)return!1;try{let{EmailClient:a}=await import("./chunk-v34tdcwv.js");return await new a({region:e.project.region,defaultFrom:r}).send(t),!0}catch{return!1}}import{randomBytes as HI}from"node:crypto";import{chmodSync as KI,existsSync as JI,mkdirSync as GI,readFileSync as QI,writeFileSync as YI}from"node:fs";import{dirname as ZI}from"node:path";function jf(){return Q("auth-encryption-key")}function st(e){let t=process.env.TS_CLOUD_AUTH_ENCRYPTION_KEY?.trim();if(t)return t;let r=l(e,"auth-encryption-key");try{if(JI(r)){let u=QI(r,"utf8").trim();if(u)return u}}catch{}let a=HI(32).toString("base64url");try{GI(ZI(r),{recursive:!0,mode:448}),YI(r,`${a}
69
+ redirect_uri, return_path, expires_at, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[u,e,Vn(f),this.encrypt(h),this.encrypt(b),t,r,y,S]),{transaction:this.getOidcTransaction(u),state:f,nonce:h,verifier:b}}getOidcTransaction(e){let t=this.controlPlane.database.query("SELECT * FROM auth_oidc_transactions WHERE id = ?").get(e);return t?ny(t,this.now()):void 0}consumeOidcTransaction(e,t){return this.controlPlane.transaction(()=>{let r=this.controlPlane.database.query("SELECT * FROM auth_oidc_transactions WHERE provider_id = ? AND state_hash = ?").get(e,Vn(t));if(!r)throw Error("OIDC transaction is invalid");let a=ny(r,this.now());if(a.state!=="pending")throw Error(`OIDC transaction is ${a.state}`);if(this.controlPlane.database.run("UPDATE auth_oidc_transactions SET consumed_at = ? WHERE id = ? AND consumed_at IS NULL AND expires_at > ?",[this.now(),a.id,this.now()]).changes!==1)throw Error("OIDC transaction is no longer available");return{transaction:this.getOidcTransaction(a.id),nonce:this.decrypt(String(r.nonce_ciphertext)),verifier:this.decrypt(String(r.verifier_ciphertext))}})}getOidcSubject(e,t){let r=this.controlPlane.database.query("SELECT * FROM auth_oidc_subjects WHERE provider_id = ? AND subject = ?").get(e,t);return r?WI(r):void 0}linkOidcSubject(e,t,r,a){let u=this.getOidcProvider(e),f=this.getIdentity(t);if(!u||!f)throw Error("OIDC provider or identity was not found");let h=yp(a);if(!r.trim()||r.length>512)throw Error("OIDC subject is invalid");let b=this.getOidcSubject(e,r);if(b&&b.identityId!==t)throw Error("OIDC subject is already linked to another identity");let S=this.now();if(b)return this.run("UPDATE auth_oidc_subjects SET email = ?, last_login_at = ? WHERE id = ?",[h,S,b.id]),this.getOidcSubject(e,r);let y=this.idFn();return this.run("INSERT INTO auth_oidc_subjects (id, provider_id, identity_id, subject, email, linked_at, last_login_at) VALUES (?, ?, ?, ?, ?, ?, ?)",[y,e,t,r,h,S,S]),this.getOidcSubject(e,r)}purgeExpired(){let e=this.now(),t=this.controlPlane.database.run("DELETE FROM auth_action_tokens WHERE expires_at < ? OR consumed_at IS NOT NULL",[e]).changes,r=this.controlPlane.database.run("DELETE FROM auth_sessions WHERE revoked_at IS NOT NULL OR idle_expires_at < ? OR absolute_expires_at < ?",[e,e]).changes;return this.controlPlane.database.run("DELETE FROM auth_mfa_challenges WHERE consumed_at IS NOT NULL OR expires_at < ?",[e]),this.controlPlane.database.run("DELETE FROM auth_oidc_transactions WHERE consumed_at IS NOT NULL OR expires_at < ?",[e]),{actionTokens:t,sessions:r}}}async function yn(e,t){let r=e.notifications?.email?.from;if(!r)return!1;try{let{EmailClient:a}=await import("./chunk-s3pe89wj.js");return await new a({region:e.project.region,defaultFrom:r}).send(t),!0}catch{return!1}}import{randomBytes as HI}from"node:crypto";import{chmodSync as KI,existsSync as JI,mkdirSync as GI,readFileSync as QI,writeFileSync as YI}from"node:fs";import{dirname as ZI}from"node:path";function zf(){return Q("auth-encryption-key")}function st(e){let t=process.env.TS_CLOUD_AUTH_ENCRYPTION_KEY?.trim();if(t)return t;let r=l(e,"auth-encryption-key");try{if(JI(r)){let u=QI(r,"utf8").trim();if(u)return u}}catch{}let a=HI(32).toString("base64url");try{GI(ZI(r),{recursive:!0,mode:448}),YI(r,`${a}
70
70
  `,{mode:384}),KI(r,384)}catch{}return a}import{constants as XI,createHash as Sp,createPublicKey as eE,createVerify as tE,timingSafeEqual as rE}from"node:crypto";var ay=new Set(["RS256","PS256","ES256"]),sy=60;function fd(e,t){let r=new URL(e),a=["127.0.0.1","::1","localhost"].includes(r.hostname);if(r.protocol!=="https:"&&!(r.protocol==="http:"&&a))throw Error(`${t} must use HTTPS`);if(r.username||r.password||r.hash)throw Error(`${t} contains unsupported URL components`);return r}function wp(e,t){if(!e||typeof e!=="object"||Array.isArray(e))throw Error(`${t} is invalid`);return e}async function kp(e,t){if(!e.ok)throw Error(`${t} failed with HTTP ${e.status}`);if(!(e.headers.get("content-type")??"").toLowerCase().includes("application/json"))throw Error(`${t} returned an unsupported content type`);if(Number(e.headers.get("content-length")??0)>1048576)throw Error(`${t} response is too large`);let u=await e.text();if(u.length>1048576)throw Error(`${t} response is too large`);try{return wp(JSON.parse(u),t)}catch(f){if(f instanceof Error&&f.message===`${t} is invalid`)throw f;throw Error(`${t} returned invalid JSON`)}}function nE(e,t){let r=Sp("sha256").update(e).digest(),a=Sp("sha256").update(t).digest();return rE(r,a)}function cu(e){if(!e)return"/";let t=e.trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("\\")||/[\r\n]/.test(t))return"/";try{let r=new URL(t,"https://local.invalid");return r.origin==="https://local.invalid"?`${r.pathname}${r.search}${r.hash}`:"/"}catch{return"/"}}async function ua(e,t=fetch){let r=fd(e.issuer,"OIDC issuer"),a=new URL(`${r.pathname.replace(/\/$/,"")}/.well-known/openid-configuration`,r.origin),u=await kp(await t(a,{headers:{accept:"application/json"},redirect:"error",signal:AbortSignal.timeout(1e4)}),"OIDC discovery");if(u.issuer!==e.issuer)throw Error("OIDC discovery issuer does not match the configured issuer");for(let h of["authorization_endpoint","token_endpoint","jwks_uri"]){if(typeof u[h]!=="string")throw Error(`OIDC discovery is missing ${h}`);fd(u[h],`OIDC ${h}`)}if(Array.isArray(u.response_types_supported)&&!u.response_types_supported.includes("code"))throw Error("OIDC provider does not support authorization code flow");if(Array.isArray(u.code_challenge_methods_supported)&&!u.code_challenge_methods_supported.includes("S256"))throw Error("OIDC provider does not support PKCE S256");let f=Array.isArray(u.id_token_signing_alg_values_supported)?u.id_token_signing_alg_values_supported.filter((h)=>typeof h==="string"):[];if(f.length>0&&!f.some((h)=>ay.has(h)))throw Error("OIDC provider does not offer a supported ID-token signing algorithm");return u}async function ga(e,t,r,a,u=fetch){let f=e.getOidcProviderBySlug(t);if(!f?.enabled)throw Error("OIDC provider is unavailable");let h=fd(r,"Application origin").origin,b=await ua(f,u),S=`${h}/auth/oidc/${encodeURIComponent(f.slug)}/callback`,y=e.beginOidcTransaction(f.id,S,cu(a)),k=new URL(b.authorization_endpoint);return k.searchParams.set("response_type","code"),k.searchParams.set("client_id",f.clientId),k.searchParams.set("redirect_uri",S),k.searchParams.set("scope",f.scopes.join(" ")),k.searchParams.set("state",y.state),k.searchParams.set("nonce",y.nonce),k.searchParams.set("code_challenge",Sp("sha256").update(y.verifier).digest("base64url")),k.searchParams.set("code_challenge_method","S256"),{authorizationUrl:k.href,expiresAt:y.transaction.expiresAt}}function iE(e){if(e.length>32768)throw Error("OIDC ID token is too large");let t=e.split(".");if(t.length!==3||t.some((r)=>!r))throw Error("OIDC ID token is malformed");try{return{header:wp(JSON.parse(Buffer.from(t[0],"base64url").toString("utf8")),"OIDC ID-token header"),claims:wp(JSON.parse(Buffer.from(t[1],"base64url").toString("utf8")),"OIDC ID-token claims"),signingInput:`${t[0]}.${t[1]}`,signature:Buffer.from(t[2],"base64url")}}catch(r){if(r instanceof Error&&r.message.startsWith("OIDC"))throw r;throw Error("OIDC ID token is malformed")}}async function oE(e,t,r){let a=iE(e),u=typeof a.header.alg==="string"?a.header.alg:"",f=typeof a.header.kid==="string"?a.header.kid:"";if(!ay.has(u)||!f)throw Error("OIDC ID token uses an unsupported signing key");if(t.id_token_signing_alg_values_supported&&!t.id_token_signing_alg_values_supported.includes(u))throw Error("OIDC ID-token algorithm was not advertised by the provider");let h=await kp(await r(t.jwks_uri,{headers:{accept:"application/json"},redirect:"error",signal:AbortSignal.timeout(1e4)}),"OIDC signing-key request");if(!Array.isArray(h.keys))throw Error("OIDC signing-key response is invalid");let b=h.keys.find((R)=>{if(!R||typeof R!=="object"||Array.isArray(R))return!1;let D=R;return D.kid===f&&(!D.alg||D.alg===u)&&(!D.use||D.use==="sig")});if(!b)throw Error("OIDC ID-token signing key was not found");let S=eE({key:b,format:"jwk"}),y=tE("SHA256").update(a.signingInput).end();if(!(u==="PS256"?y.verify({key:S,padding:XI.RSA_PKCS1_PSS_PADDING,saltLength:32},a.signature):u==="ES256"?y.verify({key:S,dsaEncoding:"ieee-p1363"},a.signature):y.verify(S,a.signature)))throw Error("OIDC ID-token signature is invalid");return a.claims}function sE(e,t,r,a){if(e.iss!==t.issuer)throw Error("OIDC ID-token issuer is invalid");let u=typeof e.aud==="string"?[e.aud]:Array.isArray(e.aud)?e.aud.filter((S)=>typeof S==="string"):[];if(!u.includes(t.clientId))throw Error("OIDC ID-token audience is invalid");if((u.length>1||e.azp!==void 0)&&e.azp!==t.clientId)throw Error("OIDC ID-token authorized party is invalid");let f=Math.floor(a.getTime()/1000);if(typeof e.exp!=="number"||e.exp<f-sy)throw Error("OIDC ID token is expired");if(typeof e.iat!=="number"||e.iat>f+sy)throw Error("OIDC ID-token issued-at time is invalid");if(typeof e.nonce!=="string"||!nE(e.nonce,r))throw Error("OIDC ID-token nonce is invalid");if(typeof e.sub!=="string"||!e.sub||e.sub.length>512)throw Error("OIDC ID-token subject is invalid");if(e.email_verified!==!0||typeof e.email!=="string")throw Error("OIDC provider did not return a verified email address");let h=e.email.trim().toLowerCase();if(h.length>254||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(h))throw Error("OIDC provider returned an invalid email address");let b=h.split("@")[1];if(!b||!t.allowedDomains.includes(b))throw Error("OIDC email domain is not allowed for this organization");return{provider:t,subject:e.sub,email:h,name:typeof e.name==="string"?e.name.slice(0,120):void 0,claims:e}}async function pa(e,t,r=fetch){let a=e.getOidcProviderBySlug(t.providerSlug);if(!a?.enabled)throw Error("OIDC provider is unavailable");if(!t.state||t.state.length>512||!t.code||t.code.length>4096)throw Error("OIDC callback is incomplete");let u=fd(t.origin,"Application origin").origin,f=e.consumeOidcTransaction(a.id,t.state),h=`${u}/auth/oidc/${encodeURIComponent(a.slug)}/callback`;if(f.transaction.redirectUri!==h)throw Error("OIDC callback redirect URI does not match the original request");let{clientSecret:b}=e.getOidcProviderCredentials(a.id),S=await ua(a,r),y=new URLSearchParams({grant_type:"authorization_code",code:t.code,redirect_uri:f.transaction.redirectUri,code_verifier:f.verifier}),k={accept:"application/json","content-type":"application/x-www-form-urlencoded"},R=S.token_endpoint_auth_methods_supported??["client_secret_basic"];if(R.includes("client_secret_basic")){let M=(J)=>new URLSearchParams({value:J}).toString().slice(6),z=`${M(a.clientId)}:${M(b)}`;k.authorization=`Basic ${Buffer.from(z).toString("base64")}`}else if(R.includes("client_secret_post"))y.set("client_id",a.clientId),y.set("client_secret",b);else throw Error("OIDC provider does not support a configured client authentication method");let D=await kp(await r(S.token_endpoint,{method:"POST",headers:k,body:y,redirect:"error",signal:AbortSignal.timeout(1e4)}),"OIDC token exchange");if(typeof D.id_token!=="string")throw Error("OIDC token response did not include an ID token");let O=await oE(D.id_token,S,r);return{identity:sE(O,a,f.nonce,t.now??new Date),returnPath:f.transaction.returnPath}}import{createHash as aE,randomBytes as cE}from"node:crypto";var dy=new Set(Ie),du=7776000000,lu=31536000000,uu=86400000;function fi(e){return typeof e==="string"?e:void 0}function cy(e){return aE("sha256").update(e).digest("hex")}function dE(e){try{let t=JSON.parse(String(e));return Array.isArray(t)?t.filter((r)=>typeof r==="string"&&dy.has(r)):[]}catch{return[]}}function lE(e){let t=String(e.scope_type);return t==="organization"?{type:t}:{type:t,id:String(e.scope_id)}}function Ip(e){let t=fi(e.disabled_at);return{id:String(e.id),organizationId:String(e.organization_id),actorId:String(e.actor_id),slug:String(e.slug),name:String(e.name),description:fi(e.description),createdByActorId:fi(e.created_by_actor_id),disabledAt:t,createdAt:String(e.created_at),updatedAt:String(e.updated_at),state:t?"disabled":"active"}}function Ep(e,t){let r=fi(e.revoked_at),a=String(e.expires_at);return{id:String(e.id),serviceAccountId:String(e.service_account_id),name:String(e.name),prefix:String(e.token_prefix),capabilities:dE(e.capabilities),scope:lE(e),expiresAt:a,lastUsedAt:fi(e.last_used_at),lastNetworkHint:fi(e.last_network_hint),revokedAt:r,rotatedFromTokenId:fi(e.rotated_from_token_id),createdByActorId:fi(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at),state:r?"revoked":a<=t?"expired":"active"}}function uE(e){let t={};try{t=JSON.parse(String(e.response_body))}catch{}return{id:String(e.id),tokenId:String(e.token_id),key:String(e.idempotency_key),requestHash:String(e.request_hash),operationId:fi(e.operation_id),responseStatus:Number(e.response_status),responseBody:t,expiresAt:String(e.expires_at),createdAt:String(e.created_at)}}class ls{controlPlane;nowFn;idFn;constructor(e,t={}){this.controlPlane=e;this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}run(e,t){this.controlPlane.database.run(e,t)}createServiceAccount(e){if(!this.controlPlane.getOrganization(e.organizationId))throw Error("Service-account organization was not found");let t=e.slug.trim().toLowerCase();if(!/^[a-z0-9][a-z0-9-]{1,47}$/.test(t))throw Error("Service-account slug must be 2-48 lowercase letters, numbers or dashes");let r=e.name.trim().slice(0,100);if(!r)throw Error("Service-account name is required");let a=this.controlPlane.createActor({kind:"service_account",externalId:`service-account:${e.organizationId}:${t}`,displayName:r,metadata:{source:"api",serviceAccountSlug:t}}),u=this.idFn(),f=this.now();this.run(`INSERT INTO service_accounts (id, organization_id, actor_id, slug, name, description, created_by_actor_id, created_at, updated_at)
71
71
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[u,e.organizationId,a.id,t,r,e.description?.trim().slice(0,500)||null,e.createdByActorId??null,f,f]);let h=this.controlPlane.createMembership({organizationId:e.organizationId,actorId:a.id,roleTemplate:e.roleTemplate,scope:e.scope,source:"manual",performedByActorId:e.createdByActorId}),b=e.scope??{type:"organization"};return this.controlPlane.appendEvent({organizationId:e.organizationId,actorId:e.createdByActorId,type:"api.service_account.created",payload:{serviceAccountId:u,roleTemplate:e.roleTemplate,scope:{type:b.type,id:b.id??null}}}),{serviceAccount:this.getServiceAccount(u),membership:h}}getServiceAccount(e){let t=this.controlPlane.database.query("SELECT * FROM service_accounts WHERE id = ?").get(e);return t?Ip(t):void 0}getServiceAccountBySlug(e,t){let r=this.controlPlane.database.query("SELECT * FROM service_accounts WHERE organization_id = ? AND slug = ? COLLATE NOCASE").get(e,t.trim());return r?Ip(r):void 0}listServiceAccounts(e,t={}){return this.controlPlane.database.query("SELECT * FROM service_accounts WHERE organization_id = ? ORDER BY name COLLATE NOCASE").all(e).map(Ip).filter((r)=>t.includeDisabled||r.state==="active")}disableServiceAccount(e,t){let r=this.getServiceAccount(e);if(!r)throw Error("Service account was not found");let a=this.now();return this.controlPlane.transaction(()=>{this.run("UPDATE service_accounts SET disabled_at = ?, updated_at = ? WHERE id = ?",[a,a,e]),this.run("UPDATE api_tokens SET revoked_at = ?, updated_at = ? WHERE service_account_id = ? AND revoked_at IS NULL",[a,a,e]);let u=this.controlPlane.getMembershipForActor(r.organizationId,r.actorId);if(u?.status==="active")this.controlPlane.revokeMembership(u.id)}),this.controlPlane.appendEvent({organizationId:r.organizationId,actorId:t,type:"api.service_account.disabled",payload:{serviceAccountId:e}}),this.getServiceAccount(e)}createToken(e){let t=this.getServiceAccount(e.serviceAccountId);if(!t||t.state!=="active")throw Error("Service account is unavailable");let r=this.controlPlane.getMembershipForActor(t.organizationId,t.actorId);if(!r||r.status!=="active")throw Error("Service-account membership is unavailable");let a=[...new Set(e.capabilities)];if(a.length===0||a.some((D)=>!dy.has(D)))throw Error("API token requires valid explicit capabilities");let u=e.scope??r.scope,f=this.controlPlane.resolveAuthorizationTarget(t.organizationId,u);if(!f)throw Error("API token scope was not found in this organization");for(let D of a)if(!x({membership:r,grants:this.controlPlane.listGrants(r.id),capability:D,target:f}).allowed)throw Error(`Service-account membership does not grant ${D} at the token scope`);let h=e.expiresAt?new Date(e.expiresAt):new Date(this.nowFn().getTime()+du);if(!Number.isFinite(h.getTime())||h.getTime()<=this.nowFn().getTime()+60000||h.getTime()>this.nowFn().getTime()+lu)throw Error("API token expiry must be between one minute and one year from now");let b=this.idFn(),S=cE(32).toString("base64url"),y=`tsc_v1.${b}.${S}`,k=`tsc_v1.${b.slice(0,8)}`,R=this.now();return this.run(`INSERT INTO api_tokens (id, service_account_id, name, token_hash, token_prefix, capabilities, scope_type, scope_id,
72
72
  expires_at, rotated_from_token_id, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[b,t.id,e.name.trim().slice(0,100)||"API token",cy(y),k,JSON.stringify(a.sort()),u.type,u.type==="organization"?null:u.id??null,h.toISOString(),e.rotatedFromTokenId??null,e.createdByActorId??null,R,R]),this.controlPlane.appendEvent({organizationId:t.organizationId,actorId:e.createdByActorId,type:"api.token.created",payload:{serviceAccountId:t.id,tokenId:b,prefix:k,capabilities:a,scope:{type:u.type,id:u.id??null},expiresAt:h.toISOString(),rotatedFromTokenId:e.rotatedFromTokenId??null}}),{token:this.getToken(b),secret:y}}getToken(e){let t=this.controlPlane.database.query("SELECT * FROM api_tokens WHERE id = ?").get(e);return t?Ep(t,this.now()):void 0}listTokens(e,t={}){return this.controlPlane.database.query("SELECT * FROM api_tokens WHERE service_account_id = ? ORDER BY created_at DESC").all(e).map((r)=>Ep(r,this.now())).filter((r)=>t.includeInactive||r.state==="active")}verifyToken(e,t){let r=/^tsc_v1\.([^.]+)\.[A-Za-z0-9_-]{40,}$/.exec(e);if(!r)return;let a=this.controlPlane.database.query("SELECT * FROM api_tokens WHERE id = ? AND token_hash = ?").get(r[1],cy(e));if(!a)return;let u=Ep(a,this.now()),f=this.getServiceAccount(u.serviceAccountId);if(!f||f.state!=="active"||u.state!=="active")return;let h=this.controlPlane.getActor(f.actorId),b=this.controlPlane.getMembershipForActor(f.organizationId,f.actorId);if(!h||h.disabledAt||!b||b.status!=="active")return;let S=this.now(),y=!u.lastUsedAt||this.nowFn().getTime()-new Date(u.lastUsedAt).getTime()>=3600000;if(this.run("UPDATE api_tokens SET last_used_at = ?, last_network_hint = ?, updated_at = ? WHERE id = ?",[S,t?.slice(0,128)??null,S,u.id]),y)this.controlPlane.appendEvent({organizationId:f.organizationId,actorId:h.id,type:"api.token.used",payload:{serviceAccountId:f.id,tokenId:u.id,prefix:u.prefix}});return{serviceAccount:f,token:this.getToken(u.id),actor:h,membership:b}}rotateToken(e,t){let r=this.getToken(e);if(!r||r.state!=="active")throw Error("Active API token was not found");let a=this.createToken({serviceAccountId:r.serviceAccountId,name:`${r.name} (rotated)`,capabilities:r.capabilities,scope:r.scope,expiresAt:r.expiresAt,createdByActorId:t,rotatedFromTokenId:r.id}),u=this.getServiceAccount(r.serviceAccountId);return this.controlPlane.appendEvent({organizationId:u?.organizationId,actorId:t,type:"api.token.rotated",payload:{serviceAccountId:r.serviceAccountId,previousTokenId:r.id,tokenId:a.token.id}}),a}revokeToken(e,t){let r=this.getToken(e);if(!r)throw Error("API token was not found");if(r.state==="active"){let a=this.now();this.run("UPDATE api_tokens SET revoked_at = ?, updated_at = ? WHERE id = ?",[a,a,e]);let u=this.getServiceAccount(r.serviceAccountId);this.controlPlane.appendEvent({organizationId:u?.organizationId,actorId:t,type:"api.token.revoked",payload:{serviceAccountId:r.serviceAccountId,tokenId:e}})}return this.getToken(e)}getIdempotency(e,t){let r=this.controlPlane.database.query("SELECT * FROM api_idempotency_records WHERE token_id = ? AND idempotency_key = ? AND expires_at > ?").get(e,t,this.now());return r?uE(r):void 0}saveIdempotency(e){if(!/^[A-Za-z0-9._:-]{8,128}$/.test(e.key))throw Error("Idempotency-Key must contain 8-128 safe characters");let t=this.getIdempotency(e.tokenId,e.key);if(t){if(t.requestHash!==e.requestHash)throw Error("Idempotency-Key was already used for a different request");return t}let r=this.idFn(),a=this.now(),u=new Date(this.nowFn().getTime()+uu).toISOString();return this.run(`INSERT INTO api_idempotency_records (id, token_id, idempotency_key, request_hash, operation_id, response_status, response_body, expires_at, created_at)
73
73
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,[r,e.tokenId,e.key,e.requestHash,e.operationId??null,e.responseStatus,JSON.stringify(e.responseBody),u,a]),this.getIdempotency(e.tokenId,e.key)}purgeExpired(){let e=this.now(),t=this.controlPlane.database.run("DELETE FROM api_tokens WHERE (expires_at < ? OR revoked_at IS NOT NULL) AND created_at < ?",[e,new Date(this.nowFn().getTime()-2592000000).toISOString()]).changes,r=this.controlPlane.database.run("DELETE FROM api_idempotency_records WHERE expires_at < ?",[e]).changes;return{tokens:t,idempotency:r}}}class ma extends Error{status;code;requestId;constructor(e,t,r,a){super(r);this.status=e;this.code=t;this.requestId=a}}class gu{options;baseUrl;fetchFn;constructor(e){this.options=e;this.baseUrl=e.baseUrl.replace(/\/$/,""),this.fetchFn=e.fetch??fetch}async request(e,t={}){let r=await this.fetchFn(`${this.baseUrl}${e}`,{...t,headers:{accept:"application/json",authorization:`Bearer ${this.options.token}`,...t.headers}}),a=await r.json().catch(()=>({}));if(!r.ok)throw new ma(r.status,a.error?.code??"api_error",a.error?.message??"API request failed.",a.error?.requestId??r.headers.get("x-request-id")??void 0);return a}listProjects(e={}){return this.request(`/api/v1/projects?${new URLSearchParams(Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).map(([t,r])=>[t,String(r)])))}`)}listEnvironments(e,t={}){return this.request(`/api/v1/projects/${encodeURIComponent(e)}/environments?${new URLSearchParams(Object.fromEntries(Object.entries(t).filter(([,r])=>r!==void 0).map(([r,a])=>[r,String(a)])))}`)}listServices(e,t){return this.request(`/api/v1/services?${new URLSearchParams({projectId:e,...t?{environmentId:t}:{}})}`)}listOperations(e){return this.request(`/api/v1/operations${e?`?projectId=${encodeURIComponent(e)}`:""}`)}listComposeTemplates(){return this.request("/api/v1/compose-templates")}listComposeApplications(e,t){return this.request(`/api/v1/compose-applications?${new URLSearchParams({projectId:e,...t?{environmentId:t}:{}})}`)}previewCompose(e){return this.request("/api/v1/compose-applications/preview",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createComposeApplication(e){return this.request("/api/v1/compose-applications",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}composeServices(e){return this.request(`/api/v1/compose-applications/${encodeURIComponent(e)}/services`)}composeAction(e,t,r={}){return this.request(`/api/v1/compose-applications/${encodeURIComponent(e)}/${t}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r)})}releaseCapabilities(e,t={}){return this.request(`/api/v1/releases/capabilities?${new URLSearchParams({kind:e,health:String(!!t.health),replicas:String(t.replicas??1)})}`)}listReleases(e,t={}){return this.request(`/api/v1/releases?${new URLSearchParams({projectId:e,...t})}`)}createReleaseArtifact(e){return this.request("/api/v1/release-artifacts",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createRelease(e){return this.request("/api/v1/releases",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}releaseAction(e,t,r={}){return this.request(`/api/v1/releases/${encodeURIComponent(e)}/${t}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r)})}createDeployment(e,t){return this.request("/api/v1/deployments",{method:"POST",headers:{"content-type":"application/json","idempotency-key":t},body:JSON.stringify(e)})}detectApplication(e){return this.request("/api/v1/application-detections",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}planApplication(e){return this.request("/api/v1/application-plans",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}listApplicationDrafts(e){return this.request(`/api/v1/application-drafts?projectId=${encodeURIComponent(e)}`)}createApplicationDraft(e){return this.request("/api/v1/application-drafts",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}updateApplicationDraft(e){return this.request("/api/v1/application-drafts",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createApplication(e,t){return this.request("/api/v1/applications",{method:"POST",headers:{"content-type":"application/json","idempotency-key":t},body:JSON.stringify(e)})}uploadApplicationArtifact(e,t,r){return this.request("/api/v1/application-artifacts",{method:"POST",headers:{"content-type":"application/octet-stream","x-project-id":e,"x-artifact-filename":t},body:r})}listRegistryConnections(){return this.request("/api/v1/registry-connections")}createRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}updateRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}disconnectRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({id:e})})}listQueue(e={}){let t=new URLSearchParams(Object.entries(e).filter(([,r])=>r!==void 0).map(([r,a])=>[r,String(a)]));return this.request(`/api/v1/queue?${t}`)}operationLogs(e,t={}){let r=new URLSearchParams(Object.entries(t).filter(([,a])=>a!==void 0).map(([a,u])=>[a,String(u)]));return this.request(`/api/v1/operations/${encodeURIComponent(e)}/logs?${r}`)}streamOperationLogs(e,t=0){return this.fetchFn(`${this.baseUrl}/api/v1/operations/${encodeURIComponent(e)}/logs/stream`,{headers:{accept:"text/event-stream",authorization:`Bearer ${this.options.token}`,"last-event-id":String(t)}})}cancelOperation(e){return this.request(`/api/v1/operations/${encodeURIComponent(e)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"})}retryOperation(e,t,r=0){return this.request(`/api/v1/operations/${encodeURIComponent(e)}/retry`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({errorClass:t,delayMs:r})})}queueSettings(){return this.request("/api/v1/queue/settings")}updateQueueSettings(e){return this.request("/api/v1/queue/settings",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"update queue limits",concurrency:e})})}listPreviews(e){return this.request(`/api/v1/previews${e?`?projectId=${encodeURIComponent(e)}`:""}`)}listPreviewDefinitions(e){return this.request(`/api/v1/preview-definitions?projectId=${encodeURIComponent(e)}`)}createPreviewDefinition(e){return this.request("/api/v1/preview-definitions",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createPreview(e){return this.request("/api/v1/previews",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}destroyPreview(e,t){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/destroy`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:t})})}extendPreview(e,t){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/extend`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({hours:t})})}rebuildPreview(e){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/rebuild`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"})}usage(e={}){let t=new URLSearchParams;for(let[r,a]of Object.entries(e))if(a)t.set(r,String(a));return this.request(`/api/v1/usage${t.size>0?`?${t}`:""}`)}usageRollups(e){let t=new URLSearchParams({from:e.from,to:e.to});if(e.projectId)t.set("projectId",e.projectId);if(e.environmentId)t.set("environmentId",e.environmentId);if(e.limit)t.set("limit",String(e.limit));for(let r of e.meters??[])t.append("meter",r);return this.request(`/api/v1/usage/rollups?${t}`)}allowance(e="deploy",t={}){let r=new URLSearchParams({operation:e});if(t.projectId)r.set("projectId",t.projectId);if(t.environmentId)r.set("environmentId",t.environmentId);return this.request(`/api/v1/spend/allowance?${r}`)}budgets(e={}){let t=new URLSearchParams;for(let[r,a]of Object.entries(e))if(a)t.set(r,String(a));return this.request(`/api/v1/spend/budgets${t.size>0?`?${t}`:""}`)}anomalies(e={}){let t=new URLSearchParams;if(e.projectId)t.set("projectId",e.projectId);if(e.since)t.set("since",e.since);if(e.unacknowledged)t.set("unacknowledged","true");return this.request(`/api/v1/spend/anomalies${t.size>0?`?${t}`:""}`)}}import{createHash as eR}from"node:crypto";import{lstatSync as pE,readdirSync as gE,readFileSync as mE}from"node:fs";import{relative as fE,resolve as ly,sep as hE}from"node:path";function yE(e){return new Map(e.map((t)=>[t.path.replace(/^\.\//,"").replace(/\\/g,"/"),t]))}function oo(e,t,r){return{path:e,reason:t,weight:r}}function uy(e){try{return e?.content?JSON.parse(e.content):{}}catch{return{}}}function Qo(e,t,r,a,u,f){return{framework:e,strategy:t,confidence:r,evidence:a,defaults:{build:u,runtime:{target:t==="static"?"serverless":t==="serverless"?"serverless":t==="dockerfile"||t==="prebuilt_image"?"container":"server",architecture:"x86_64",port:t==="static"||t==="serverless"?void 0:3000,healthCheck:t==="static"?void 0:{protocol:"http",path:"/health"}}},description:f}}function Yo(e){let t=yE(e.slice(0,1e4)),r=[];if(t.has("Dockerfile"))r.push(Qo("dockerfile","dockerfile",0.99,[oo("Dockerfile","A root Dockerfile defines an explicit reproducible build.",1)],{kind:"dockerfile",context:".",dockerfile:"Dockerfile"},"Build the repository with its Dockerfile and run the resulting OCI image."));let a=uy(t.get("composer.json"));if(t.has("artisan")&&a.require?.["laravel/framework"])r.push(Qo("laravel","server",0.98,[oo("artisan","Laravel Artisan entrypoint is present.",0.45),oo("composer.json","Requires laravel/framework.",0.55)],{kind:"server",runtime:"php",runtimeVersion:"8.3",installCommand:"composer install --no-dev --prefer-dist --optimize-autoloader",buildCommand:"php artisan config:cache && php artisan route:cache && php artisan view:cache",startCommand:"php artisan serve --host=0.0.0.0 --port=$PORT"},"Install a production Composer tree, warm Laravel caches, and run the HTTP application."));else if(t.has("composer.json"))r.push(Qo("php","server",0.82,[oo("composer.json","Composer metadata identifies a PHP application.",0.8)],{kind:"server",runtime:"php",runtimeVersion:"8.3",installCommand:"composer install --no-dev --prefer-dist --optimize-autoloader",startCommand:"php -S 0.0.0.0:$PORT -t public"},"Install Composer dependencies and run the configured PHP document root."));let u=uy(t.get("package.json"));if(t.has("package.json")){let f=t.has("bun.lock")||t.has("bun.lockb")||u.engines?.bun,h=f?"bun":"node",b=f?"bun":"node",S=[oo("package.json",`Defines ${u.scripts?.build?"build and ":""}${u.scripts?.start?"start ":""}scripts.`,0.55)];if(f)S.push(oo(t.has("bun.lock")?"bun.lock":t.has("bun.lockb")?"bun.lockb":"package.json","Pins the Bun package manager/runtime.",0.35));let y=!!(u.dependencies?.vite||u.devDependencies?.vite||u.dependencies?.["@stacksjs/bunpress"]||u.devDependencies?.["@stacksjs/bunpress"])&&!u.scripts?.start,k=y?{kind:"static",installCommand:`${h} install --frozen-lockfile`,buildCommand:`${h} run build`,publishDirectory:"dist"}:{kind:"server",runtime:h,installCommand:`${h} install --frozen-lockfile`,buildCommand:u.scripts?.build?`${h} run build`:void 0,startCommand:u.scripts?.start?`${h} run start`:h==="bun"?"bun run index.ts":"node index.js"};r.push(Qo(b,k.kind,Math.min(0.94,S.reduce((R,D)=>R+D.weight,0)),S,k,y?"Install dependencies, build static assets, and publish the output directory.":`Install dependencies, build if configured, and start the ${h} server.`))}if(!r.length&&(t.has("index.html")||t.has("public/index.html")))r.push(Qo("static","static",0.78,[oo(t.has("index.html")?"index.html":"public/index.html","A static HTML entrypoint is present.",0.78)],{kind:"static",publishDirectory:t.has("index.html")?".":"public"},"Publish the static directory without a runtime process."));if(!r.length)r.push(Qo("unknown","buildpack",0.2,[],{kind:"buildpack",runtime:"node"},"No supported framework signature was conclusive; choose commands and runtime manually."));return r.sort((f,h)=>h.confidence-f.confidence||f.framework.localeCompare(h.framework))}function Rp(e,t={}){let r=ly(e),a=t.maxFiles??1e4,u=t.maxContentBytes??262144,f=[],h=new Set(["Dockerfile","package.json","composer.json","index.html","public/index.html","bun.lock","bun.lockb","artisan"]),b=new Set([".git",".ts-cloud",".cache",".next",".nuxt",".output",".turbo",".bun","node_modules","vendor","pantry","dist","build","coverage"]),S=(y)=>{for(let k of gE(y).sort()){if(b.has(k))continue;let R=ly(y,k),D=fE(r,R).split(hE).join("/");if(!D||D.startsWith("../"))throw Error("Detection path escaped the application root");let O=pE(R);if(O.isSymbolicLink())throw Error(`Detection refuses symbolic links: ${D}`);if(O.isDirectory())S(R);else if(O.isFile()){if(f.length>=a)throw Error("Application file-count limit exceeded");let M={path:D,size:O.size};if(h.has(D)&&O.size<=u)M.content=mE(R,"utf8");f.push(M)}}};return S(r),f}function Cp(e){if(Array.isArray(e))return`[${e.map(Cp).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${Cp(r)}`).join(",")}}`;return JSON.stringify(e)??"null"}function Xs(e){return!!e&&!e.startsWith("/")&&!e.split("/").includes("..")&&!/[\0\r\n]/.test(e)}function rn(e,t,r,a){return{path:e,code:t,message:r,alternatives:a}}function Ap(e){return JSON.parse(JSON.stringify(e))}function vE(e){let t=Object.fromEntries(Object.entries(e.environment??{}).map(([r,a])=>[r,typeof a==="string"?a:`\${${a.secretRef}}`]));if(e.build.kind==="prebuilt_image"||e.build.kind==="dockerfile")return Ap({infrastructure:{containers:{[e.slug]:{source:e.source,build:e.build,port:e.runtime.port,cpu:e.runtime.cpu,memory:e.runtime.memoryMb,architecture:e.runtime.architecture,healthCheck:e.runtime.healthCheck,environment:t}}}});if(e.runtime.target==="serverless"||e.build.kind==="serverless")return Ap({serverless:{apps:{[e.slug]:{source:e.source,build:e.build,architecture:e.runtime.architecture,environment:t,domain:e.domain}}}});return Ap({sites:{[e.slug]:{source:e.source,build:e.build,port:e.runtime.port,architecture:e.runtime.architecture,healthCheck:e.runtime.healthCheck,env:t,domain:e.domain?.hostname}}})}function Wn(e,t=[]){let r=[],a=(M)=>/(?:secret|token|password|passwd|private[_-]?key|api[_-]?key)/i.test(M),u=Object.fromEntries(Object.entries(e.environment??{}).map(([M,z])=>{if(typeof z==="string"&&a(M))return r.push(rn(`environment.${M}`,"write_only_secret_required",`${M} must be supplied through the write-only secrets boundary.`)),[M,{secretRef:M}];return[M,z]})),f=e.build;if(e.build.kind==="dockerfile"&&e.build.buildArgs){let M=Object.fromEntries(Object.entries(e.build.buildArgs).map(([z,J])=>{if(a(z))return r.push(rn(`build.buildArgs.${z}`,"write_only_build_secret_required",`${z} must be declared in secretNames instead of buildArgs.`)),[z,"[REDACTED]"];return[z,J]}));f={...e.build,buildArgs:M}}if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.slug))r.push(rn("slug","invalid_slug","Slug must contain 2-63 lowercase letters, numbers, or hyphens."));if(!Xs((e.source.kind==="git"?e.source.monorepoRoot:e.source.kind==="local"?e.source.root:".")??"."))r.push(rn("source","unsafe_source_root","Source root must stay inside the source tree."));if(e.source.kind==="git"&&e.source.sparsePaths?.some((M)=>!Xs(M)))r.push(rn("source.sparsePaths","unsafe_sparse_path","Sparse checkout paths must stay inside the repository."));if(e.build.kind==="dockerfile"&&(!Xs(e.build.context)||!Xs(e.build.dockerfile)))r.push(rn("build","unsafe_docker_path","Docker context and Dockerfile must stay inside the source tree."));if(e.build.kind==="static"&&!Xs(e.build.publishDirectory))r.push(rn("build.publishDirectory","invalid_publish_directory","A safe static publish directory is required."));if(e.build.kind==="server"&&!e.build.startCommand.trim())r.push(rn("build.startCommand","missing_start_command","A server start command is required.",["Use static output","Use a Dockerfile"]));if(e.source.kind==="image"&&e.build.kind!=="prebuilt_image")r.push(rn("build.kind","image_requires_prebuilt","An OCI image source must use the prebuilt-image strategy.",["Select prebuilt image"]));if(e.build.kind==="prebuilt_image"&&e.runtime.target!=="container")r.push(rn("runtime.target","image_requires_container","Prebuilt images require the container runtime target.",["Select container target"]));if(e.runtime.target==="serverless"&&e.build.kind==="dockerfile")r.push(rn("runtime.target","unsupported_serverless_dockerfile","Dockerfile builds currently target the container service path.",["Select container target","Select serverless package"]));if(e.runtime.port!==void 0&&(!Number.isInteger(e.runtime.port)||e.runtime.port<1||e.runtime.port>65535))r.push(rn("runtime.port","invalid_port","Port must be an integer from 1 to 65535."));let h=e.runtime.healthCheck;if(h&&h.protocol!=="tcp"&&(!h.path||!h.path.startsWith("/")||/[\r\n]/.test(h.path)))r.push(rn("runtime.healthCheck.path","invalid_health_path","HTTP health checks require a path beginning with /."));if(e.domain?.hostname&&(!/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i.test(e.domain.hostname)||e.domain.hostname.includes("..")))r.push(rn("domain.hostname","invalid_domain","Domain must be a valid DNS hostname."));let b=Object.values(u).flatMap((M)=>typeof M==="object"?[M.secretRef]:[]),S=[...new Set([...e.requiredSecretNames??[],...e.build.kind==="dockerfile"?e.build.secretNames??[]:[],...b])].sort(),y=new Set(t),k=S.filter((M)=>!y.has(M)),R={apiVersion:"ts-cloud.dev/v1",kind:"Application",metadata:{name:e.name,slug:e.slug,projectId:e.projectId,environmentId:e.environmentId},spec:{source:e.source,build:f,runtime:e.runtime,environment:u,domain:e.domain}},D=[...new Set([e.source.kind==="git"?"git:read":e.source.kind==="image"?"registry:pull":e.source.kind==="artifact"?"artifact:inspect":"filesystem:read",e.runtime.target==="container"?"containers":e.runtime.target==="serverless"?"serverless":"servers",e.domain?"dns":""])].filter(Boolean).sort(),O=[...new Set([e.runtime.target,e.runtime.cpu?`${e.runtime.cpu} vCPU`:"",e.runtime.memoryMb?`${e.runtime.memoryMb} MB memory`:"",(e.runtime.minInstances??0)>0?`${e.runtime.minInstances} minimum instances`:"scales from zero where supported",e.domain?"managed DNS/TLS":""])].filter(Boolean);return{valid:r.length===0&&k.length===0,issues:r,missingSecrets:k,manifest:R,configPatch:vE({...e,build:f,environment:u}),capabilityRequirements:D,costDrivers:O,serializedManifest:`${Cp(R)}
74
- `}}function py(e){let t=e.replace(/\\/g,"/");return!!t&&!t.startsWith("/")&&!/^[A-Za-z]:\//.test(t)&&!t.split("/").includes("..")&&!/[\0\r\n]/.test(t)}function gy(e,t,r={}){let a=r.maxBytes??104857600,u=r.maxEntries??1e4,f=r.maxExpandedBytes??524288000;if(e.byteLength>a)throw Error("Archive exceeds the compressed size limit");let h=new DataView(e.buffer,e.byteOffset,e.byteLength),b=[],S=0;if(t.toLowerCase().endsWith(".zip")||e[0]===80&&e[1]===75){let k=0;while(k+30<=e.length){let R=h.getUint32(k,!0);if(R===33639248||R===101010256)break;if(R!==67324752)throw Error("Malformed ZIP local header");let D=h.getUint16(k+6,!0),O=h.getUint32(k+18,!0),M=h.getUint32(k+22,!0),z=h.getUint16(k+26,!0),J=h.getUint16(k+28,!0);if(D&8)throw Error("ZIP data descriptors are not accepted for uploaded artifacts");let Z=new TextDecoder().decode(e.subarray(k+30,k+30+z));if(!py(Z))throw Error(`Unsafe archive path: ${Z}`);if(b.push(Z),S+=M,b.length>u||S>f)throw Error("Archive expansion limit exceeded");k+=30+z+J+O}return{format:"zip",entries:b.length,expandedBytes:S,paths:b}}if(!t.toLowerCase().match(/\.(?:tar|tar\.gz|tgz)$/))throw Error("Only ZIP and uncompressed TAR artifacts are supported");let y=0;while(y+512<=e.length){let k=e.subarray(y,y+512);if(k.every((z)=>z===0))break;let R=(z,J)=>new TextDecoder().decode(k.subarray(z,z+J)).replace(/\0.*$/,""),D=`${R(345,155)}${R(345,155)?"/":""}${R(0,100)}`,O=Number.parseInt(R(124,12).trim()||"0",8),M=String.fromCharCode(k[156]??0);if(!py(D))throw Error(`Unsafe archive path: ${D}`);if(M==="1"||M==="2")throw Error(`Archive links are not accepted: ${D}`);if(!Number.isFinite(O)||O<0)throw Error("Malformed TAR entry size");if(b.push(D),S+=O,b.length>u||S>f)throw Error("Archive expansion limit exceeded");y+=512+Math.ceil(O/512)*512}return{format:"tar",entries:b.length,expandedBytes:S,paths:b}}var my=new Set(["source","build","runtime","environment","domain","review"]);function fy(e,t){try{return typeof e==="string"?JSON.parse(e):t}catch{return t}}function hy(e){return/(?:secret|token|password|passwd|private[_-]?key|api[_-]?key)/i.test(e)}function yy(e){for(let[r,a]of Object.entries(e.environment??{}))if(typeof a==="string"&&hy(r)&&a)throw Error(`${r} must be stored through the write-only secrets boundary`);if(e.build.kind==="dockerfile"){for(let[r,a]of Object.entries(e.build.buildArgs??{}))if(hy(r)&&a)throw Error(`${r} must be declared as a build secret name`)}let t=JSON.stringify(e);if(/https?:\/\/[^/@\s]+:[^/@\s]+@/i.test(t))throw Error("Drafts cannot contain credential-bearing URLs")}function vy(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),schemaVersion:Number(e.schema_version),name:String(e.name),step:String(e.step),input:fy(e.input,{}),suppliedSecretNames:fy(e.supplied_secret_names,[]),status:String(e.status),version:Number(e.version),createdByActorId:e.created_by_actor_id?String(e.created_by_actor_id):void 0,createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Pp{controlPlane;nowFn;idFn;constructor(e,t={}){this.controlPlane=e;this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}create(e){if(yy(e.draft),e.draft.projectId!==e.projectId)throw Error("Draft project does not match its storage scope");let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Draft project was not found");let r=this.idFn(),a=this.now(),u=e.step??"source";if(!my.has(u))throw Error("Invalid draft step");let f=[...new Set(e.suppliedSecretNames??[])].sort(),h=Wn(e.draft,f).valid?"ready":"draft";return this.controlPlane.database.run("INSERT INTO application_drafts (id, organization_id, project_id, schema_version, name, step, input, supplied_secret_names, status, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.projectId,e.name.trim().slice(0,100),u,JSON.stringify(e.draft),JSON.stringify(f),h,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,actorId:e.actorId,type:"application.draft.created",payload:{draftId:r,step:u,status:h,requiredSecretNames:e.draft.requiredSecretNames??[]}}),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM application_drafts WHERE id=?").get(e);return t?vy(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM application_drafts WHERE project_id=? ORDER BY updated_at DESC").all(e).map(vy)}update(e,t,r){let a=this.get(e);if(!a||a.version!==t)throw Error(`Application draft ${e} changed since version ${t}`);if(!my.has(r.step))throw Error("Invalid draft step");if(r.draft.projectId!==a.projectId)throw Error("Draft project cannot be changed");yy(r.draft);let u=[...new Set(r.suppliedSecretNames??a.suppliedSecretNames)].sort(),f=Wn(r.draft,u).valid?"ready":"draft",h=this.now();if(this.controlPlane.database.run("UPDATE application_drafts SET name=?, step=?, input=?, supplied_secret_names=?, status=?, version=version+1, updated_at=? WHERE id=? AND version=?",[r.draft.name.slice(0,100),r.step,JSON.stringify(r.draft),JSON.stringify(u),f,h,e,t]).changes!==1)throw Error(`Application draft ${e} changed since version ${t}`);return this.controlPlane.appendEvent({organizationId:a.organizationId,projectId:a.projectId,actorId:r.actorId,type:"application.draft.updated",payload:{draftId:e,fromVersion:t,toVersion:t+1,step:r.step,status:f}}),this.get(e)}markApplied(e,t,r){let a=this.get(e);if(!a||a.version!==t)throw Error(`Application draft ${e} changed since version ${t}`);let u=Wn(a.input,a.suppliedSecretNames);if(!u.valid)throw Error(`Draft is not deployable: ${[...u.issues.map((h)=>h.message),...u.missingSecrets.map((h)=>`Missing secret ${h}`)].join("; ")}`);let f=this.now();return this.controlPlane.database.run("UPDATE application_drafts SET status='applied', step='review', version=version+1, updated_at=? WHERE id=? AND version=?",[f,e,t]),this.controlPlane.appendEvent({organizationId:a.organizationId,projectId:a.projectId,actorId:r,type:"application.draft.applied",payload:s({draftId:e,manifest:u.manifest})}),this.get(e)}}import{createCipheriv as bE,createDecipheriv as SE,createHash as wy,randomBytes as wE}from"node:crypto";function ea(e){return typeof e==="string"&&e?e:void 0}function _p(e){return wy("sha256").update(e).digest("hex").slice(0,16)}function by(e){let t=new URL(e.includes("://")?e:`https://${e}`);if(t.protocol!=="https:"&&!["localhost","127.0.0.1","::1"].includes(t.hostname))throw Error("Registry host must use HTTPS");if(t.username||t.password||t.search||t.hash)throw Error("Registry host cannot contain credentials");return`${t.protocol}//${t.host}`}function kE(e){return{id:String(e.id),organizationId:String(e.organization_id),provider:String(e.provider),name:String(e.name),host:String(e.host),credentialConfigured:!!e.credential_ciphertext,credentialFingerprint:ea(e.credential_fingerprint),credentialExpiresAt:ea(e.credential_expires_at),status:String(e.status),healthMessage:ea(e.health_message),lastTestedAt:ea(e.last_tested_at),version:Number(e.version),createdByActorId:ea(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Tp{controlPlane;key;nowFn;idFn;constructor(e,t){this.controlPlane=e;if(!t.encryptionKey)throw Error("Registry encryption key is required");this.key=wy("sha256").update(`ts-cloud:registry:${t.encryptionKey}`).digest(),this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}encrypt(e){let t=wE(12),r=bE("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Registry credential envelope is invalid");let f=SE("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}current(e){let t=kE(e);return t.status!=="disconnected"&&t.credentialExpiresAt&&new Date(t.credentialExpiresAt).getTime()<=this.nowFn().getTime()?{...t,status:"expired",healthMessage:"Registry credential expired; rotate it before pulling images."}:t}create(e){if(!["docker_hub","ghcr","ecr","gcr","generic"].includes(e.provider))throw Error("A supported registry provider is required");let t=e.credential?JSON.stringify(e.credential):void 0,r=this.idFn(),a=this.now();return this.controlPlane.database.run("INSERT INTO registry_connections (id, organization_id, provider, name, host, credential_ciphertext, credential_fingerprint, credential_expires_at, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.provider,e.name.trim().slice(0,80),by(e.host),t?this.encrypt(t):null,t?_p(t):null,e.credentialExpiresAt??null,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:e.organizationId,actorId:e.actorId,type:"registry.connection.created",payload:{connectionId:r,provider:e.provider,host:by(e.host),credentialConfigured:!!t}}),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM registry_connections WHERE id=?").get(e);return t?this.current(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM registry_connections WHERE organization_id=? ORDER BY name").all(e).map((t)=>this.current(t))}credential(e){let t=this.controlPlane.database.query("SELECT credential_ciphertext FROM registry_connections WHERE id=?").get(e);return t?.credential_ciphertext?JSON.parse(this.decrypt(String(t.credential_ciphertext))):void 0}rotate(e,t,r={}){let a=this.get(e);if(!a||a.status==="disconnected")throw Error("Registry connection was not found");let u=JSON.stringify(t);return this.controlPlane.database.run("UPDATE registry_connections SET credential_ciphertext=?, credential_fingerprint=?, credential_expires_at=?, status='pending', health_message=NULL, version=version+1, updated_at=? WHERE id=?",[this.encrypt(u),_p(u),r.expiresAt??null,this.now(),e]),this.controlPlane.appendEvent({organizationId:a.organizationId,actorId:r.actorId,type:"registry.credential.rotated",payload:{connectionId:e,fingerprint:_p(u),expiresAt:r.expiresAt??null}}),this.get(e)}disconnect(e,t){let r=this.get(e);if(!r)throw Error("Registry connection was not found");return this.controlPlane.database.run("UPDATE registry_connections SET credential_ciphertext=NULL, credential_fingerprint=NULL, status='disconnected', health_message='Disconnected by an administrator', version=version+1, updated_at=? WHERE id=?",[this.now(),e]),this.controlPlane.appendEvent({organizationId:r.organizationId,actorId:t,type:"registry.connection.disconnected",level:"warning",payload:{connectionId:e}}),this.get(e)}async test(e,t={}){let r=this.get(e);if(!r||["disconnected","expired"].includes(r.status))throw Error("Active registry connection was not found");let a=this.credential(e),u=t.fetch??fetch,f=new AbortController,h=setTimeout(()=>f.abort(),t.timeoutMs??15000),b=a?.token?`Bearer ${a.token}`:a?.username||a?.password?`Basic ${Buffer.from(`${a.username??""}:${a.password??""}`).toString("base64")}`:void 0;try{let S=await u(`${r.host}/v2/`,{method:"GET",redirect:"error",signal:f.signal,headers:b?{Authorization:b}:void 0}),y=S.headers.get("www-authenticate")??"";if(S.status===401&&y.startsWith("Bearer ")&&a){let D=Object.fromEntries([...y.slice(7).matchAll(/(\w+)="([^"]+)"/g)].map((Z)=>[Z[1],Z[2]])),O=new URL(D.realm??"");if(O.protocol!=="https:")throw Error("Registry authentication realm must use HTTPS");if(D.service)O.searchParams.set("service",D.service);if(t.image)O.searchParams.set("scope",`repository:${ky(t.image).repository}:pull`);let M=await u(O,{signal:f.signal,redirect:"error",headers:b?{Authorization:b}:void 0});if(!M.ok)throw Error(`Registry authentication failed (${M.status})`);let z=await M.json(),J=z.token??z.access_token;if(!J)throw Error("Registry did not return an access token");S=t.image?await Sy(u,r.host,t.image,J,f.signal):await u(`${r.host}/v2/`,{signal:f.signal,redirect:"error",headers:{Authorization:`Bearer ${J}`}})}else if(S.ok&&t.image)S=await Sy(u,r.host,t.image,a?.token,f.signal,b);let k=S.ok?"healthy":"degraded",R=S.ok?t.image?"Registry image is readable.":"Registry connection is healthy.":`Registry request failed (${S.status})`;return this.controlPlane.database.run("UPDATE registry_connections SET status=?, health_message=?, last_tested_at=?, version=version+1, updated_at=? WHERE id=?",[k,R,this.now(),this.now(),e]),this.get(e)}catch(S){let y=f.signal.aborted?"Registry request timed out.":S instanceof Error?S.message:"Registry test failed";return this.controlPlane.database.run("UPDATE registry_connections SET status='degraded', health_message=?, last_tested_at=?, version=version+1, updated_at=? WHERE id=?",[y.slice(0,1000),this.now(),this.now(),e]),this.get(e)}finally{clearTimeout(h)}}}function ky(e){let t=e.replace(/^https?:\/\//,""),r=t.indexOf("/");if(r<1)throw Error("Image must include registry/repository");let a=t.slice(r+1),u=a.lastIndexOf("@"),f=a.lastIndexOf(":"),h=u>=0?u:f>a.lastIndexOf("/")?f:-1,b=h>=0?a.slice(0,h):a,S=h>=0?a.slice(h+1):"latest";if(!/^[A-Za-z0-9_.\/-]+$/.test(b)||!/^[A-Za-z0-9_.:+-]+$/.test(S))throw Error("Image reference is invalid");return{repository:b,reference:S}}async function Sy(e,t,r,a,u,f){let h=ky(r);return e(`${t}/v2/${h.repository}/manifests/${encodeURIComponent(h.reference)}`,{method:"HEAD",redirect:"error",signal:u,headers:{Accept:"application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.v2+json",...a?{Authorization:`Bearer ${a}`}:f?{Authorization:f}:{}}})}import{createHash as IE}from"node:crypto";import{chmodSync as Iy,existsSync as Ey,mkdirSync as EE,renameSync as RE,unlinkSync as Ry,writeFileSync as AE}from"node:fs";import{basename as CE,join as PE}from"node:path";function xp(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),filename:String(e.filename),sha256:String(e.sha256),size:Number(e.size),format:String(e.format),entryCount:Number(e.entry_count),expandedBytes:Number(e.expanded_bytes),createdByActorId:e.created_by_actor_id?String(e.created_by_actor_id):void 0,createdAt:String(e.created_at)}}class Dp{controlPlane;root;idFn;nowFn;constructor(e,t){this.controlPlane=e;this.root=l(t.cwd,"artifacts"),this.idFn=t.id??(()=>crypto.randomUUID()),this.nowFn=t.now??(()=>new Date)}create(e){let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Artifact project was not found");let r=CE(e.filename).slice(0,200);if(!r||r!==e.filename)throw Error("Artifact filename must not contain a path");let a=gy(e.bytes,r),u=IE("sha256").update(e.bytes).digest("hex"),f=this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE project_id=? AND sha256=?").get(e.projectId,u);if(f)return xp(f);let h=this.idFn();EE(this.root,{recursive:!0,mode:448}),Iy(this.root,448);let b=PE(this.root,`${h}.archive`),S=`${b}.partial`;try{AE(S,e.bytes,{mode:384,flag:"wx"}),RE(S,b),Iy(b,384),this.controlPlane.database.run("INSERT INTO application_artifacts (id, organization_id, project_id, filename, storage_path, sha256, size, format, entry_count, expanded_bytes, created_by_actor_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[h,e.organizationId,e.projectId,r,b,u,e.bytes.byteLength,a.format,a.entries,a.expandedBytes,e.actorId??null,this.nowFn().toISOString()])}catch(y){if(Ey(S))Ry(S);if(Ey(b))Ry(b);throw y}return this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,actorId:e.actorId,type:"application.artifact.created",payload:{artifactId:h,filename:r,sha256:u,size:e.bytes.byteLength,entries:a.entries}}),this.get(h)}get(e){let t=this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE id=?").get(e);return t?xp(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE project_id=? ORDER BY created_at DESC").all(e).map(xp)}}function hd(e){let t=e.drafts.get(e.draftId);if(!t||t.version!==e.expectedVersion)throw Error(`Application draft ${e.draftId} changed since version ${e.expectedVersion}`);if(t.status==="applied")throw Error("Application draft was already applied");let r=e.controlPlane.getProject(t.projectId),a=r?e.controlPlane.listEnvironments(r.id).find((y)=>y.id===t.input.environmentId):void 0;if(!r||!a||a.projectId!==r.id||r.organizationId!==t.organizationId)throw Error("Draft deployment scope was not found");if(e.confirmEnvironment!==a.slug)throw Error(`Type ${a.slug} to confirm this deployment target`);let u=Wn(t.input,t.suppliedSecretNames);if(!u.valid)throw Error(`Application plan is invalid: ${[...u.issues.map((y)=>y.message),...u.missingSecrets.map((y)=>`Missing secret ${y}`)].join("; ")}`);let f=e.controlPlane.listResources(r.id,a.id).find((y)=>y.kind==="application"&&y.slug===t.input.slug),h=JSON.parse(JSON.stringify({manifest:u.manifest,configPatch:u.configPatch})),b=f?e.controlPlane.updateResource(f.id,f.version,{name:t.input.name,desiredState:h}):e.controlPlane.createResource({projectId:r.id,environmentId:a.id,kind:"application",slug:t.input.slug,name:t.input.name,desiredState:h,metadata:{source:"application-onboarding",draftId:t.id}}),S=new c(e.controlPlane).enqueue({projectId:r.id,environmentId:a.id,resourceId:b.id,actorId:e.actorId,kind:"application.create",idempotencyKey:`application-draft:${t.id}:v${t.version}`,correlationId:`application-draft:${t.id}`,input:h,lockKey:`resource:${b.id}`,providerKey:b.provider??"default",buildSlot:t.input.build.kind!=="prebuilt_image",maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return e.drafts.markApplied(t.id,t.version,e.actorId),e.controlPlane.appendEvent({organizationId:t.organizationId,projectId:r.id,resourceId:b.id,operationId:S.id,actorId:e.actorId,type:"application.create.queued",payload:{draftId:t.id,environment:a.slug,strategy:t.input.build.kind,costDrivers:u.costDrivers}}),{plan:u,resource:b,operation:S}}function Sn(e){let t=["static","compute","serverless_zip","serverless_image"].includes(e.kind),r=["container","compose"].includes(e.kind)&&(e.replicas??1)>1,a=e.kind==="container"||e.kind==="serverless_zip"||e.kind==="serverless_image",u=(f,h)=>h&&(f==="atomic"?e.kind==="static"||e.hasHealthGate:e.hasHealthGate);return[{strategy:"atomic",supported:u("atomic",t),explanation:t?e.hasHealthGate||e.kind==="static"?"Activate an immutable version with an atomic pointer/alias switch.":"Atomic activation needs a readiness gate for this runtime.":"This driver has no atomic pointer or alias primitive.",capacityMultiplier:1,costImpact:"none",rollback:"Switch the pointer/alias back to the previous immutable release."},{strategy:"rolling",supported:u("rolling",r),explanation:r?e.hasHealthGate?"Replace healthy replicas within the configured capacity envelope.":"Rolling activation requires a health/readiness gate.":"Rolling activation requires a capable container/Compose driver and at least two replicas.",capacityMultiplier:1.5,costImpact:"temporary",rollback:"Stop replacement and restore the prior task/service definition."},{strategy:"blue_green",supported:u("blue_green",a),explanation:a?e.hasHealthGate?"Provision a complete green target and switch traffic after health passes.":"Blue-green requires a health gate before traffic can switch.":"The provider does not expose two traffic-addressable revisions.",capacityMultiplier:2,costImpact:"temporary",rollback:"Return all traffic to the preserved blue target."},{strategy:"canary",supported:u("canary",a),explanation:a?e.hasHealthGate?"Shift bounded traffic steps while evaluating health.":"Canary requires a health gate and measurable traffic target.":"The provider does not expose weighted traffic primitives.",capacityMultiplier:1.25,costImpact:"temporary",rollback:"Set canary weight to zero and preserve its diagnostics."}]}function us(e,t){let r=Sn(e).find((a)=>a.strategy===t);if(!r.supported)throw Error(`${t} is unavailable: ${r.explanation}`);return r}import{createHash as _E}from"node:crypto";var TE=/^sha256:[a-f0-9]{64}$/,xE=/^[a-f0-9]{40,64}$/i;function Xn(e){return typeof e==="string"&&e?e:void 0}function so(e,t){try{return JSON.parse(String(e))}catch{return t}}function Ay(e){return{id:String(e.id),organizationId:String(e.organization_id),digest:String(e.digest),kind:String(e.kind),uri:String(e.uri),size:Number(e.size),mediaType:String(e.media_type),provenance:so(e.provenance,{}),attestation:so(e.attestation,{}),verifiedAt:String(e.verified_at),createdAt:String(e.created_at)}}function Cy(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:String(e.environment_id),resourceId:String(e.resource_id),artifactId:String(e.artifact_id),kind:String(e.kind),sourceSha:Xn(e.source_sha),configHash:String(e.config_hash),manifest:so(e.manifest,{}),provenance:so(e.provenance,{}),strategy:String(e.strategy),status:String(e.status),healthGate:e.health_gate==null?void 0:so(e.health_gate,void 0),hooks:so(e.hooks,{migrations:"none",preActivate:[],postActivate:[]}),drainSeconds:Number(e.drain_seconds),graceSeconds:Number(e.grace_seconds),automaticRollback:Number(e.automatic_rollback)===1,rollbackAttempts:Number(e.rollback_attempts),previousReleaseId:Xn(e.previous_release_id),promotedFromReleaseId:Xn(e.promoted_from_release_id),actorId:Xn(e.actor_id),trigger:String(e.trigger),pinned:Number(e.pinned)===1,pinReason:Xn(e.pin_reason),activatedAt:Xn(e.activated_at),failedAt:Xn(e.failed_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function DE(e){return{sequence:Number(e.sequence),id:String(e.id),releaseId:String(e.release_id),fromStatus:Xn(e.from_status),toStatus:String(e.to_status),trafficPercent:e.traffic_percent==null?void 0:Number(e.traffic_percent),health:so(e.health,{}),message:String(e.message),operationId:Xn(e.operation_id),createdAt:String(e.created_at)}}function OE(e,t){let r=[],a=(u,f,h)=>{if(JSON.stringify(f)===JSON.stringify(h))return;if(f&&h&&typeof f==="object"&&typeof h==="object"&&!Array.isArray(f)&&!Array.isArray(h)){for(let b of[...new Set([...Object.keys(f),...Object.keys(h)])].sort())a(u?`${u}.${b}`:b,f[b],h[b]);return}r.push({path:u,...f!==void 0?{before:f}:{},...h!==void 0?{after:h}:{}})};return a("",e,t),r}class fa{controlPlane;now;id;constructor(e,t={}){this.controlPlane=e;this.now=t.now??(()=>new Date),this.id=t.id??(()=>crypto.randomUUID())}registerArtifact(e){if(!TE.test(e.digest)||!/^(?:s3|https|oci|file):/.test(e.uri)||!Number.isInteger(e.size)||e.size<0)throw Error("Artifact requires a SHA-256 digest, supported immutable URI, and non-negative byte size");let t=this.controlPlane.database.query("SELECT * FROM release_artifacts WHERE organization_id=? AND digest=?").get(e.organizationId,e.digest);if(t)return Ay(t);let r=this.id(),a=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO release_artifacts (id, organization_id, digest, kind, uri, size, media_type, provenance, attestation, verified_at, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.digest,e.kind,e.uri,e.size,e.mediaType??"application/octet-stream",JSON.stringify(s(e.provenance??{})),JSON.stringify(s(e.attestation??{})),a,a]),this.getArtifact(r)}getArtifact(e){let t=this.controlPlane.database.query("SELECT * FROM release_artifacts WHERE id=?").get(e);return t?Ay(t):void 0}create(e){let t=this.getArtifact(e.artifactId),r=this.controlPlane.getResource(e.resourceId),a=this.controlPlane.listEnvironments(e.projectId).find((R)=>R.id===e.environmentId);if(!t||t.organizationId!==e.organizationId||t.kind!==e.kind)throw Error("Release artifact does not match the organization and deployable kind");if(!r||r.projectId!==e.projectId||r.environmentId!==e.environmentId||!a)throw Error("Release target scope does not match the resource");if(e.sourceSha&&!xE.test(e.sourceSha))throw Error("Release source must be an immutable commit SHA");us({kind:e.kind,provider:r.provider,hasHealthGate:!!e.healthGate,replicas:e.replicas},e.strategy);let u=s(e.config),f=_E("sha256").update(JSON.stringify(u)).digest("hex"),h=this.active(e.resourceId),b=this.id(),S=this.now().toISOString(),y=e.approvalRequired?"awaiting_approval":"built",k=e.hooks??{migrations:"none",preActivate:[],postActivate:[]};return this.controlPlane.database.run("INSERT INTO releases (id, organization_id, project_id, environment_id, resource_id, artifact_id, kind, source_sha, config_hash, manifest, provenance, strategy, status, health_gate, hooks, drain_seconds, grace_seconds, automatic_rollback, previous_release_id, promoted_from_release_id, actor_id, trigger, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[b,e.organizationId,e.projectId,e.environmentId,e.resourceId,e.artifactId,e.kind,e.sourceSha??null,f,JSON.stringify(s(e.manifest)),JSON.stringify(s(e.provenance??{})),e.strategy,y,e.healthGate?JSON.stringify(e.healthGate):null,JSON.stringify(k),Math.max(0,Math.min(3600,Math.floor(e.drainSeconds??30))),Math.max(0,Math.min(3600,Math.floor(e.graceSeconds??30))),e.automaticRollback===!1?0:1,h?.id??null,e.promotedFromReleaseId??null,e.actorId??null,e.trigger??"manual",S,S]),this.recordTransition(b,void 0,y,{message:e.promotedFromReleaseId?"Immutable artifact promoted without rebuild.":"Immutable release record created."}),this.get(b)}get(e){let t=this.controlPlane.database.query("SELECT * FROM releases WHERE id=?").get(e);return t?Cy(t):void 0}list(e={}){return this.controlPlane.database.query("SELECT * FROM releases ORDER BY created_at DESC, rowid DESC").all().map(Cy).filter((t)=>(!e.projectId||t.projectId===e.projectId)&&(!e.environmentId||t.environmentId===e.environmentId)&&(!e.resourceId||t.resourceId===e.resourceId)&&(!e.status||t.status===e.status))}active(e){return this.list({resourceId:e,status:"active"})[0]}transitions(e){return this.controlPlane.database.query("SELECT * FROM release_transitions WHERE release_id=? ORDER BY sequence").all(e).map(DE)}recordTransition(e,t,r,a){this.controlPlane.database.run("INSERT INTO release_transitions (id, release_id, from_status, to_status, traffic_percent, health, message, operation_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",[this.id(),e,t??null,r,a.trafficPercent??null,JSON.stringify(s(a.health??{})),a.message.slice(0,1000),a.operationId??null,this.now().toISOString()])}progress(e,t){let r=this.get(e);if(!r)throw Error(`Release ${e} was not found`);return this.recordTransition(e,r.status,r.status,t),this.transitions(e).at(-1)}transition(e,t,r){let a=this.get(e);if(!a)throw Error(`Release ${e} was not found`);if(!{built:["awaiting_approval","activating","failed"],awaiting_approval:["built","failed"],activating:["active","failed","rolled_back"],active:["superseded","failed","rolled_back"],failed:["activating","rolled_back"],rolled_back:["activating"],superseded:["activating"]}[a.status].includes(t))throw Error(`Invalid release transition ${a.status} → ${t}`);let f=this.now().toISOString();if(t==="active"){let h=this.active(a.resourceId);if(h&&h.id!==e)this.controlPlane.database.run("UPDATE releases SET status='superseded', updated_at=? WHERE id=?",[f,h.id]),this.recordTransition(h.id,"active","superseded",{message:`Superseded by ${e}.`,operationId:r.operationId})}return this.controlPlane.database.run("UPDATE releases SET status=?, rollback_attempts=rollback_attempts+?, activated_at=CASE WHEN ?='active' THEN ? ELSE activated_at END, failed_at=CASE WHEN ?='failed' THEN ? ELSE failed_at END, updated_at=? WHERE id=?",[t,t==="rolled_back"?1:0,t,f,t,f,f,e]),this.recordTransition(e,a.status,t,r),this.get(e)}approve(e,t){let r=this.get(e);if(!r||r.status!=="awaiting_approval")throw Error("Release is not awaiting approval");let a=this.id(),u=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO release_approvals (id, release_id, environment_id, decision, actor_id, comment, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)",[a,e,r.environmentId,t.decision,t.actorId,t.comment?.slice(0,1000)??null,u]),this.transition(e,t.decision==="approved"?"built":"failed",{message:t.decision==="approved"?"Environment gate approved.":"Environment gate rejected."})}approvals(e){return this.controlPlane.database.query("SELECT * FROM release_approvals WHERE release_id=? ORDER BY created_at").all(e).map((t)=>({id:String(t.id),releaseId:String(t.release_id),environmentId:String(t.environment_id),decision:String(t.decision),actorId:String(t.actor_id),comment:Xn(t.comment),createdAt:String(t.created_at)}))}promote(e,t){let r=this.get(e);if(!r||!["active","superseded"].includes(r.status))throw Error("Only a tested active/superseded release can be promoted");return this.create({organizationId:r.organizationId,projectId:r.projectId,environmentId:t.targetEnvironmentId,resourceId:t.targetResourceId,artifactId:r.artifactId,kind:r.kind,sourceSha:r.sourceSha,config:t.config,manifest:r.manifest,provenance:r.provenance,strategy:t.strategy??r.strategy,healthGate:t.healthGate??r.healthGate,hooks:r.hooks,drainSeconds:r.drainSeconds,graceSeconds:r.graceSeconds,automaticRollback:r.automaticRollback,promotedFromReleaseId:r.id,actorId:t.actorId,trigger:"promotion",approvalRequired:t.approvalRequired})}compare(e,t){let r=this.get(e),a=this.get(t);if(!r||!a)throw Error("Both releases are required for comparison");return{artifactChanged:r.artifactId!==a.artifactId,sourceChanged:r.sourceSha!==a.sourceSha,configChanged:r.configHash!==a.configHash,manifestChanges:OE(r.manifest,a.manifest),dataCaveat:a.hooks.migrations==="none"?"No database migration is recorded.":`Database hooks are ${a.hooks.migrations}; release rollback does not roll back data.`}}pin(e,t,r){if(!this.get(e))throw Error("Release was not found");return this.controlPlane.database.run("UPDATE releases SET pinned=?, pin_reason=?, updated_at=? WHERE id=?",[t?1:0,t?r?.slice(0,500)??"operator":null,this.now().toISOString(),e]),this.get(e)}retentionCandidates(e){let t=Math.max(1,Math.min(100,Math.floor(e.keepPerResource??10))),r=new Map;for(let a of this.list()){let u=r.get(a.resourceId)??[];u.push(a),r.set(a.resourceId,u)}return[...r.values()].flatMap((a)=>a.slice(t)).filter((a)=>new Date(a.createdAt)<e.before&&!a.pinned&&!["active","activating","awaiting_approval"].includes(a.status)&&!this.list().some((u)=>u.previousReleaseId===a.id&&["active","activating"].includes(u.status)))}}class xt{controlPlane;releases;queue;constructor(e){this.controlPlane=e;this.releases=new fa(e),this.queue=new c(e)}enqueueActivation(e,t={}){let r=this.releases.get(e.id);if(!r)throw Error("Release was not found");if(!["built","failed","rolled_back","superseded"].includes(r.status))throw Error(`Release ${r.status} cannot be activated`);let a=t.action??"activate",u=this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,actorId:t.actorId,kind:`release.${a}`,idempotencyKey:`release:${r.id}:${a}:${r.rollbackAttempts}`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:t.targetReleaseId??null},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:r.automaticRollback?2:1,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation;return this.releases.transition(r.id,"activating",{message:`${a} queued.`,operationId:u.id,trafficPercent:0}),u}completeHealthGate(e,t){let r=this.releases.get(e);if(!r||r.status!=="activating")throw Error("Release is not activating");if(t.healthy)return{release:this.releases.transition(r.id,"active",{message:t.message??"Health gate passed; activation completed.",operationId:t.operationId,trafficPercent:100,health:t.health})};let a=this.releases.transition(r.id,"failed",{message:t.message??"Health gate failed.",operationId:t.operationId,trafficPercent:0,health:t.health}),u=r.previousReleaseId?this.releases.get(r.previousReleaseId):void 0;if(!r.automaticRollback||r.rollbackAttempts>=1||!u)return{release:a};let f=this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,kind:"release.rollback",idempotencyKey:`release:${r.id}:automatic-rollback`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:u.id,automatic:!0},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:1,retryClasses:[],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation;return{release:a,rollbackOperation:f}}enqueueRollback(e,t={}){let r=this.releases.get(e.id);if(!r||r.status!=="active")throw Error("Only the active release can be rolled back");let a=t.targetReleaseId?this.releases.get(t.targetReleaseId):r.previousReleaseId?this.releases.get(r.previousReleaseId):void 0;if(!a||a.resourceId!==r.resourceId||!["superseded","active"].includes(a.status))throw Error("Rollback requires a preserved prior release for the same resource");return this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,actorId:t.actorId,kind:"release.rollback",idempotencyKey:`release:${r.id}:manual-rollback:${a.id}`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:a.id,automatic:!1},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:1,retryClasses:[],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation}}function zf(e){if(e.strategy==="canary")return[5,25,50,100].map((t,r)=>({step:`canary-${t}`,trafficPercent:t,waitSeconds:r===3?e.drainSeconds:e.graceSeconds,requiresHealth:!0}));if(e.strategy==="blue_green")return[{step:"green-health",trafficPercent:0,waitSeconds:e.graceSeconds,requiresHealth:!0},{step:"traffic-switch",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!0}];if(e.strategy==="rolling")return[{step:"rolling-replacement",trafficPercent:50,waitSeconds:e.graceSeconds,requiresHealth:!0},{step:"rolling-complete",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!0}];return[{step:"immutable-switch",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!!e.healthGate}]}async function pu(e,t){if(t.release.artifactId!==t.artifact.id)throw Error("Release activation artifact identity changed");us({kind:t.release.kind,hasHealthGate:!!t.release.healthGate,replicas:Number(t.release.manifest?.replicas)||void 0},t.release.strategy);let r=e.capability(t);if(!r.supported)throw Error(`${t.release.strategy} is unavailable in ${e.name}: ${r.explanation}`);return e.activate({...t,transitions:zf(t.release)})}async function mu(e,t){if(!t.previous)throw Error("Rollback requires the preserved previous release");return e.rollback({...t,transitions:[{step:"rollback",trafficPercent:0,waitSeconds:t.release.drainSeconds,requiresHealth:!0}]})}var Kf=["release.activate","release.rollback"];function $E(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function fu(e){let t=new xt(e.store),r=async(a)=>{let u=$E(a.operation.input),f=typeof u.releaseId==="string"?u.releaseId:"",h=t.releases.get(f);if(!h)throw Error(`Queued release ${f||"(missing)"} was not found`);if(h.projectId!==a.operation.projectId||h.environmentId!==a.operation.environmentId||h.resourceId!==a.operation.resourceId)throw Error("Queued release does not match the operation scope");let b=t.releases.getArtifact(h.artifactId);if(!b||b.digest!==t.releases.getArtifact(h.artifactId)?.digest)throw Error("Immutable release artifact is unavailable");let S=typeof u.targetReleaseId==="string"&&u.targetReleaseId?u.targetReleaseId:h.previousReleaseId,y=S?t.releases.get(S):void 0;if(y&&(y.resourceId!==h.resourceId||y.artifactId===h.artifactId&&y.id===h.id))throw Error("Rollback target does not match the release resource");let k=await e.resolveDriver(h);a.checkpoint("verify",`Verifying ${b.digest} and ${h.configHash} for ${k.name}.`),a.log(`Artifact ${b.digest}; source ${h.sourceSha??"not recorded"}; config ${h.configHash}.`,{stream:"system"}),a.throwIfCancellationRequested();let R;try{R=a.operation.kind==="release.rollback"?await mu(k,{release:h,artifact:b,previous:y}):await pu(k,{release:h,artifact:b,previous:y})}catch(D){if(a.operation.kind==="release.activate"&&t.releases.get(h.id)?.status==="activating")t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,message:D instanceof Error?D.message:String(D)});throw D}for(let D of R.transitions)t.releases.progress(h.id,{message:`${a.operation.kind==="release.rollback"?"Rollback":"Activation"} traffic at ${D.trafficPercent}%.`,trafficPercent:D.trafficPercent,health:D.observed,operationId:a.operation.id}),a.log(`Traffic ${D.trafficPercent}%: ${D.healthy?"healthy":"unhealthy"}.`,{stream:D.healthy?"step":"stderr",step:"health"});if(a.checkpoint("health","Evaluating the provider health result."),!R.activated||!R.healthy){if(a.operation.kind==="release.activate"&&t.releases.get(h.id)?.status==="activating")t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,health:{resourceVersions:R.resourceVersions},message:R.error??"Provider health gate failed."});throw Error(R.error??`${k.name} reported an unhealthy release`)}if(a.operation.kind==="release.activate"&&h.healthGate?.name){if(!e.resolveHealthGate)throw t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,message:`Named health gate ${h.healthGate.name} is not available to this worker.`}),Error(`Named health gate ${h.healthGate.name} is unavailable`);a.checkpoint("named-health-gate",`Waiting on ${h.healthGate.name}.`);let D=await e.resolveHealthGate(h.healthGate.name,h);if(a.log(`${h.healthGate.name}: ${D.healthy?"healthy":"unhealthy"}${D.message?` — ${D.message}`:""}.`,{stream:D.healthy?"step":"stderr",step:"health"}),!D.healthy)throw t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,health:D.evidence,message:D.message??`Named health gate ${h.healthGate.name} failed.`}),Error(D.message??`Named health gate ${h.healthGate.name} failed`)}if(a.operation.kind==="release.rollback"){let D=t.releases.get(h.id);if(D.status!=="rolled_back")t.releases.transition(D.id,"rolled_back",{message:`Traffic restored through ${k.name}.`,operationId:a.operation.id,trafficPercent:0,health:{resourceVersions:R.resourceVersions}});if(y&&y.status!=="active"){let O=y.status==="activating"?y:t.releases.transition(y.id,"activating",{message:"Rollback target restoring traffic.",operationId:a.operation.id,trafficPercent:0});t.releases.transition(O.id,"active",{message:"Previous immutable release restored.",operationId:a.operation.id,trafficPercent:100,health:{resourceVersions:R.resourceVersions}})}}else t.completeHealthGate(h.id,{healthy:!0,operationId:a.operation.id,health:{providerVersion:R.providerVersion??null,resourceVersions:R.resourceVersions},message:"Provider activation and health gates completed."});return a.checkpoint("finalize","Persisted the terminal release state."),{releaseId:h.id,artifactDigest:b.digest,provider:k.name,providerVersion:R.providerVersion??null,resourceVersions:R.resourceVersions,status:t.releases.get(h.id).status}};return Object.fromEntries(Kf.map((a)=>[a,r]))}import{createCipheriv as NE,createDecipheriv as jE,createHash as Dy,randomBytes as Op}from"node:crypto";var Oy={github:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},gitlab:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},bitbucket:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},gitea:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!1,deployKeys:!0},generic_https:{repositories:!1,branches:!0,tags:!0,webhooks:!1,pullRequests:!1,tokenRefresh:!1,deployKeys:!1},generic_ssh:{repositories:!1,branches:!0,tags:!0,webhooks:!1,pullRequests:!1,tokenRefresh:!1,deployKeys:!0}};function Nt(e){return typeof e==="string"&&e?e:void 0}function co(e,t){try{return typeof e==="string"?JSON.parse(e):t}catch{return t}}function ei(e){return JSON.stringify(s(e))}function ao(e){return Dy("sha256").update(e).digest("hex")}function Py(e){let t=e.trim().replace(/\/$/,""),r=new URL(t.includes("://")?t:`https://${t}`);if(r.username||r.password||r.search||r.hash)throw Error("Source host cannot contain credentials, a query, or a fragment");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&["localhost","127.0.0.1","::1"].includes(r.hostname)))throw Error("Source host must use HTTPS");return`${r.protocol}//${r.host}${r.pathname.replace(/\/$/,"")}`}function _y(e){let t=e.trim();if(t.length<2||t.length>80)throw Error("Connection name must contain 2-80 characters");return t}function $p(e){let t=e.trim().replace(/^\/+|\/+$/g,"");if(!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(t))throw Error("Repository must use owner/name format");return t}function Ty(e){let t=e.trim()||".";if(t.startsWith("/")||t.split("/").includes("..")||/[\0\r\n]/.test(t))throw Error("Monorepo root must stay inside the repository");return t.replace(/^\.\//,"")||"."}function yd(e){return[...new Set((e??[]).map((t)=>t.trim()).filter(Boolean))].slice(0,100)}function BE(e){let t=e.trim();if(/\r|\n/.test(t)||/https?:\/\/[^/@\s]+:[^/@\s]+@/i.test(t))throw Error("Clone URL cannot contain credentials or control characters");if(!/^(?:https?:\/\/|ssh:\/\/|git@[A-Za-z0-9.-]+:)/.test(t))throw Error("Clone URL must use HTTPS or SSH");return t}function ME(e){return{id:String(e.id),organizationId:String(e.organization_id),provider:String(e.provider),name:String(e.name),host:String(e.host),owner:Nt(e.owner),authKind:String(e.auth_kind),credentialConfigured:!!e.credential_ciphertext,credentialFingerprint:Nt(e.credential_fingerprint),grantedScopes:co(e.granted_scopes,[]),capabilities:co(e.capabilities,Oy[String(e.provider)]),status:String(e.status),healthMessage:Nt(e.health_message),lastTestedAt:Nt(e.last_tested_at),lastSyncedAt:Nt(e.last_synced_at),credentialExpiresAt:Nt(e.credential_expires_at),version:Number(e.version),createdByActorId:Nt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Np(e){return{id:String(e.id),connectionId:String(e.connection_id),providerRepositoryId:String(e.provider_repository_id),fullName:String(e.full_name),cloneUrl:String(e.clone_url),defaultBranch:String(e.default_branch),visibility:String(e.visibility),archived:Number(e.archived)===1,metadata:co(e.metadata,{}),syncedAt:String(e.synced_at)}}function xy(e){return{id:String(e.id),projectId:String(e.project_id),environmentId:Nt(e.environment_id),resourceId:Nt(e.resource_id),connectionId:String(e.connection_id),repositoryId:Nt(e.repository_id),repositoryFullName:String(e.repository_full_name),defaultBranch:String(e.default_branch),branchRule:Nt(e.branch_rule),tagRule:Nt(e.tag_rule),monorepoRoot:String(e.monorepo_root),includePaths:co(e.include_paths,[]),excludePaths:co(e.exclude_paths,[]),submodules:Number(e.submodules)===1,cloneDepth:e.clone_depth==null?void 0:Number(e.clone_depth),deployKeyId:Nt(e.deploy_key_id),autoDeploy:Number(e.auto_deploy)===1,pullRequestPreviews:Number(e.pull_request_previews)===1,status:String(e.status),disabledReason:Nt(e.disabled_reason),version:Number(e.version),createdByActorId:Nt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function jp(e){return{id:String(e.id),connectionId:String(e.connection_id),name:String(e.name),publicKey:String(e.public_key),publicKeyFingerprint:String(e.public_key_fingerprint),host:String(e.host),hostKey:String(e.host_key),hostKeyFingerprint:String(e.host_key_fingerprint),createdByActorId:Nt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Bp(e){return{id:String(e.id),connectionId:String(e.connection_id),repositoryId:Nt(e.repository_id),repositoryFullName:String(e.repository_full_name),providerWebhookId:Nt(e.provider_webhook_id),events:co(e.events,[]),status:String(e.status),healthMessage:Nt(e.health_message),lastDeliveryAt:Nt(e.last_delivery_at),lastReconciledAt:Nt(e.last_reconciled_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Mp(e){return{id:String(e.id),connectionId:String(e.connection_id),webhookId:String(e.webhook_id),providerDeliveryId:String(e.provider_delivery_id),event:String(e.event),action:Nt(e.action),commitSha:Nt(e.commit_sha),signatureStatus:String(e.signature_status),status:String(e.status),payloadSummary:co(e.payload_summary,{}),operationId:Nt(e.operation_id),error:Nt(e.error),receivedAt:String(e.received_at),processedAt:Nt(e.processed_at)}}class ha{controlPlane;key;nowFn;idFn;constructor(e,t={}){this.controlPlane=e;this.key=t.encryptionKey?Dy("sha256").update(t.encryptionKey).digest():void 0,this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}run(e,t){this.controlPlane.database.run(e,t)}encrypt(e){if(!this.key)throw Error("Source credential encryption key is not configured");let t=Op(12),r=NE("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){if(!this.key)throw Error("Source credential encryption key is not configured");let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Encrypted source credential is unavailable");let f=jE("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}createConnection(e){if(!this.controlPlane.getOrganization(e.organizationId))throw Error("Source connection organization was not found");let t=this.now(),r=this.idFn(),a=e.credential?JSON.stringify(e.credential):void 0;return this.run(`INSERT INTO source_connections (id, organization_id, provider, name, host, owner, auth_kind, credential_ciphertext, credential_fingerprint, granted_scopes, capabilities, status, credential_expires_at, created_by_actor_id, created_at, updated_at)
74
+ `}}function py(e){let t=e.replace(/\\/g,"/");return!!t&&!t.startsWith("/")&&!/^[A-Za-z]:\//.test(t)&&!t.split("/").includes("..")&&!/[\0\r\n]/.test(t)}function gy(e,t,r={}){let a=r.maxBytes??104857600,u=r.maxEntries??1e4,f=r.maxExpandedBytes??524288000;if(e.byteLength>a)throw Error("Archive exceeds the compressed size limit");let h=new DataView(e.buffer,e.byteOffset,e.byteLength),b=[],S=0;if(t.toLowerCase().endsWith(".zip")||e[0]===80&&e[1]===75){let k=0;while(k+30<=e.length){let R=h.getUint32(k,!0);if(R===33639248||R===101010256)break;if(R!==67324752)throw Error("Malformed ZIP local header");let D=h.getUint16(k+6,!0),O=h.getUint32(k+18,!0),M=h.getUint32(k+22,!0),z=h.getUint16(k+26,!0),J=h.getUint16(k+28,!0);if(D&8)throw Error("ZIP data descriptors are not accepted for uploaded artifacts");let Z=new TextDecoder().decode(e.subarray(k+30,k+30+z));if(!py(Z))throw Error(`Unsafe archive path: ${Z}`);if(b.push(Z),S+=M,b.length>u||S>f)throw Error("Archive expansion limit exceeded");k+=30+z+J+O}return{format:"zip",entries:b.length,expandedBytes:S,paths:b}}if(!t.toLowerCase().match(/\.(?:tar|tar\.gz|tgz)$/))throw Error("Only ZIP and uncompressed TAR artifacts are supported");let y=0;while(y+512<=e.length){let k=e.subarray(y,y+512);if(k.every((z)=>z===0))break;let R=(z,J)=>new TextDecoder().decode(k.subarray(z,z+J)).replace(/\0.*$/,""),D=`${R(345,155)}${R(345,155)?"/":""}${R(0,100)}`,O=Number.parseInt(R(124,12).trim()||"0",8),M=String.fromCharCode(k[156]??0);if(!py(D))throw Error(`Unsafe archive path: ${D}`);if(M==="1"||M==="2")throw Error(`Archive links are not accepted: ${D}`);if(!Number.isFinite(O)||O<0)throw Error("Malformed TAR entry size");if(b.push(D),S+=O,b.length>u||S>f)throw Error("Archive expansion limit exceeded");y+=512+Math.ceil(O/512)*512}return{format:"tar",entries:b.length,expandedBytes:S,paths:b}}var my=new Set(["source","build","runtime","environment","domain","review"]);function fy(e,t){try{return typeof e==="string"?JSON.parse(e):t}catch{return t}}function hy(e){return/(?:secret|token|password|passwd|private[_-]?key|api[_-]?key)/i.test(e)}function yy(e){for(let[r,a]of Object.entries(e.environment??{}))if(typeof a==="string"&&hy(r)&&a)throw Error(`${r} must be stored through the write-only secrets boundary`);if(e.build.kind==="dockerfile"){for(let[r,a]of Object.entries(e.build.buildArgs??{}))if(hy(r)&&a)throw Error(`${r} must be declared as a build secret name`)}let t=JSON.stringify(e);if(/https?:\/\/[^/@\s]+:[^/@\s]+@/i.test(t))throw Error("Drafts cannot contain credential-bearing URLs")}function vy(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),schemaVersion:Number(e.schema_version),name:String(e.name),step:String(e.step),input:fy(e.input,{}),suppliedSecretNames:fy(e.supplied_secret_names,[]),status:String(e.status),version:Number(e.version),createdByActorId:e.created_by_actor_id?String(e.created_by_actor_id):void 0,createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Pp{controlPlane;nowFn;idFn;constructor(e,t={}){this.controlPlane=e;this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}create(e){if(yy(e.draft),e.draft.projectId!==e.projectId)throw Error("Draft project does not match its storage scope");let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Draft project was not found");let r=this.idFn(),a=this.now(),u=e.step??"source";if(!my.has(u))throw Error("Invalid draft step");let f=[...new Set(e.suppliedSecretNames??[])].sort(),h=Wn(e.draft,f).valid?"ready":"draft";return this.controlPlane.database.run("INSERT INTO application_drafts (id, organization_id, project_id, schema_version, name, step, input, supplied_secret_names, status, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.projectId,e.name.trim().slice(0,100),u,JSON.stringify(e.draft),JSON.stringify(f),h,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,actorId:e.actorId,type:"application.draft.created",payload:{draftId:r,step:u,status:h,requiredSecretNames:e.draft.requiredSecretNames??[]}}),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM application_drafts WHERE id=?").get(e);return t?vy(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM application_drafts WHERE project_id=? ORDER BY updated_at DESC").all(e).map(vy)}update(e,t,r){let a=this.get(e);if(!a||a.version!==t)throw Error(`Application draft ${e} changed since version ${t}`);if(!my.has(r.step))throw Error("Invalid draft step");if(r.draft.projectId!==a.projectId)throw Error("Draft project cannot be changed");yy(r.draft);let u=[...new Set(r.suppliedSecretNames??a.suppliedSecretNames)].sort(),f=Wn(r.draft,u).valid?"ready":"draft",h=this.now();if(this.controlPlane.database.run("UPDATE application_drafts SET name=?, step=?, input=?, supplied_secret_names=?, status=?, version=version+1, updated_at=? WHERE id=? AND version=?",[r.draft.name.slice(0,100),r.step,JSON.stringify(r.draft),JSON.stringify(u),f,h,e,t]).changes!==1)throw Error(`Application draft ${e} changed since version ${t}`);return this.controlPlane.appendEvent({organizationId:a.organizationId,projectId:a.projectId,actorId:r.actorId,type:"application.draft.updated",payload:{draftId:e,fromVersion:t,toVersion:t+1,step:r.step,status:f}}),this.get(e)}markApplied(e,t,r){let a=this.get(e);if(!a||a.version!==t)throw Error(`Application draft ${e} changed since version ${t}`);let u=Wn(a.input,a.suppliedSecretNames);if(!u.valid)throw Error(`Draft is not deployable: ${[...u.issues.map((h)=>h.message),...u.missingSecrets.map((h)=>`Missing secret ${h}`)].join("; ")}`);let f=this.now();return this.controlPlane.database.run("UPDATE application_drafts SET status='applied', step='review', version=version+1, updated_at=? WHERE id=? AND version=?",[f,e,t]),this.controlPlane.appendEvent({organizationId:a.organizationId,projectId:a.projectId,actorId:r,type:"application.draft.applied",payload:s({draftId:e,manifest:u.manifest})}),this.get(e)}}import{createCipheriv as bE,createDecipheriv as SE,createHash as wy,randomBytes as wE}from"node:crypto";function ea(e){return typeof e==="string"&&e?e:void 0}function _p(e){return wy("sha256").update(e).digest("hex").slice(0,16)}function by(e){let t=new URL(e.includes("://")?e:`https://${e}`);if(t.protocol!=="https:"&&!["localhost","127.0.0.1","::1"].includes(t.hostname))throw Error("Registry host must use HTTPS");if(t.username||t.password||t.search||t.hash)throw Error("Registry host cannot contain credentials");return`${t.protocol}//${t.host}`}function kE(e){return{id:String(e.id),organizationId:String(e.organization_id),provider:String(e.provider),name:String(e.name),host:String(e.host),credentialConfigured:!!e.credential_ciphertext,credentialFingerprint:ea(e.credential_fingerprint),credentialExpiresAt:ea(e.credential_expires_at),status:String(e.status),healthMessage:ea(e.health_message),lastTestedAt:ea(e.last_tested_at),version:Number(e.version),createdByActorId:ea(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Tp{controlPlane;key;nowFn;idFn;constructor(e,t){this.controlPlane=e;if(!t.encryptionKey)throw Error("Registry encryption key is required");this.key=wy("sha256").update(`ts-cloud:registry:${t.encryptionKey}`).digest(),this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}encrypt(e){let t=wE(12),r=bE("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Registry credential envelope is invalid");let f=SE("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}current(e){let t=kE(e);return t.status!=="disconnected"&&t.credentialExpiresAt&&new Date(t.credentialExpiresAt).getTime()<=this.nowFn().getTime()?{...t,status:"expired",healthMessage:"Registry credential expired; rotate it before pulling images."}:t}create(e){if(!["docker_hub","ghcr","ecr","gcr","generic"].includes(e.provider))throw Error("A supported registry provider is required");let t=e.credential?JSON.stringify(e.credential):void 0,r=this.idFn(),a=this.now();return this.controlPlane.database.run("INSERT INTO registry_connections (id, organization_id, provider, name, host, credential_ciphertext, credential_fingerprint, credential_expires_at, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.provider,e.name.trim().slice(0,80),by(e.host),t?this.encrypt(t):null,t?_p(t):null,e.credentialExpiresAt??null,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:e.organizationId,actorId:e.actorId,type:"registry.connection.created",payload:{connectionId:r,provider:e.provider,host:by(e.host),credentialConfigured:!!t}}),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM registry_connections WHERE id=?").get(e);return t?this.current(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM registry_connections WHERE organization_id=? ORDER BY name").all(e).map((t)=>this.current(t))}credential(e){let t=this.controlPlane.database.query("SELECT credential_ciphertext FROM registry_connections WHERE id=?").get(e);return t?.credential_ciphertext?JSON.parse(this.decrypt(String(t.credential_ciphertext))):void 0}rotate(e,t,r={}){let a=this.get(e);if(!a||a.status==="disconnected")throw Error("Registry connection was not found");let u=JSON.stringify(t);return this.controlPlane.database.run("UPDATE registry_connections SET credential_ciphertext=?, credential_fingerprint=?, credential_expires_at=?, status='pending', health_message=NULL, version=version+1, updated_at=? WHERE id=?",[this.encrypt(u),_p(u),r.expiresAt??null,this.now(),e]),this.controlPlane.appendEvent({organizationId:a.organizationId,actorId:r.actorId,type:"registry.credential.rotated",payload:{connectionId:e,fingerprint:_p(u),expiresAt:r.expiresAt??null}}),this.get(e)}disconnect(e,t){let r=this.get(e);if(!r)throw Error("Registry connection was not found");return this.controlPlane.database.run("UPDATE registry_connections SET credential_ciphertext=NULL, credential_fingerprint=NULL, status='disconnected', health_message='Disconnected by an administrator', version=version+1, updated_at=? WHERE id=?",[this.now(),e]),this.controlPlane.appendEvent({organizationId:r.organizationId,actorId:t,type:"registry.connection.disconnected",level:"warning",payload:{connectionId:e}}),this.get(e)}async test(e,t={}){let r=this.get(e);if(!r||["disconnected","expired"].includes(r.status))throw Error("Active registry connection was not found");let a=this.credential(e),u=t.fetch??fetch,f=new AbortController,h=setTimeout(()=>f.abort(),t.timeoutMs??15000),b=a?.token?`Bearer ${a.token}`:a?.username||a?.password?`Basic ${Buffer.from(`${a.username??""}:${a.password??""}`).toString("base64")}`:void 0;try{let S=await u(`${r.host}/v2/`,{method:"GET",redirect:"error",signal:f.signal,headers:b?{Authorization:b}:void 0}),y=S.headers.get("www-authenticate")??"";if(S.status===401&&y.startsWith("Bearer ")&&a){let D=Object.fromEntries([...y.slice(7).matchAll(/(\w+)="([^"]+)"/g)].map((Z)=>[Z[1],Z[2]])),O=new URL(D.realm??"");if(O.protocol!=="https:")throw Error("Registry authentication realm must use HTTPS");if(D.service)O.searchParams.set("service",D.service);if(t.image)O.searchParams.set("scope",`repository:${ky(t.image).repository}:pull`);let M=await u(O,{signal:f.signal,redirect:"error",headers:b?{Authorization:b}:void 0});if(!M.ok)throw Error(`Registry authentication failed (${M.status})`);let z=await M.json(),J=z.token??z.access_token;if(!J)throw Error("Registry did not return an access token");S=t.image?await Sy(u,r.host,t.image,J,f.signal):await u(`${r.host}/v2/`,{signal:f.signal,redirect:"error",headers:{Authorization:`Bearer ${J}`}})}else if(S.ok&&t.image)S=await Sy(u,r.host,t.image,a?.token,f.signal,b);let k=S.ok?"healthy":"degraded",R=S.ok?t.image?"Registry image is readable.":"Registry connection is healthy.":`Registry request failed (${S.status})`;return this.controlPlane.database.run("UPDATE registry_connections SET status=?, health_message=?, last_tested_at=?, version=version+1, updated_at=? WHERE id=?",[k,R,this.now(),this.now(),e]),this.get(e)}catch(S){let y=f.signal.aborted?"Registry request timed out.":S instanceof Error?S.message:"Registry test failed";return this.controlPlane.database.run("UPDATE registry_connections SET status='degraded', health_message=?, last_tested_at=?, version=version+1, updated_at=? WHERE id=?",[y.slice(0,1000),this.now(),this.now(),e]),this.get(e)}finally{clearTimeout(h)}}}function ky(e){let t=e.replace(/^https?:\/\//,""),r=t.indexOf("/");if(r<1)throw Error("Image must include registry/repository");let a=t.slice(r+1),u=a.lastIndexOf("@"),f=a.lastIndexOf(":"),h=u>=0?u:f>a.lastIndexOf("/")?f:-1,b=h>=0?a.slice(0,h):a,S=h>=0?a.slice(h+1):"latest";if(!/^[A-Za-z0-9_.\/-]+$/.test(b)||!/^[A-Za-z0-9_.:+-]+$/.test(S))throw Error("Image reference is invalid");return{repository:b,reference:S}}async function Sy(e,t,r,a,u,f){let h=ky(r);return e(`${t}/v2/${h.repository}/manifests/${encodeURIComponent(h.reference)}`,{method:"HEAD",redirect:"error",signal:u,headers:{Accept:"application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.v2+json",...a?{Authorization:`Bearer ${a}`}:f?{Authorization:f}:{}}})}import{createHash as IE}from"node:crypto";import{chmodSync as Iy,existsSync as Ey,mkdirSync as EE,renameSync as RE,unlinkSync as Ry,writeFileSync as AE}from"node:fs";import{basename as CE,join as PE}from"node:path";function xp(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),filename:String(e.filename),sha256:String(e.sha256),size:Number(e.size),format:String(e.format),entryCount:Number(e.entry_count),expandedBytes:Number(e.expanded_bytes),createdByActorId:e.created_by_actor_id?String(e.created_by_actor_id):void 0,createdAt:String(e.created_at)}}class Dp{controlPlane;root;idFn;nowFn;constructor(e,t){this.controlPlane=e;this.root=l(t.cwd,"artifacts"),this.idFn=t.id??(()=>crypto.randomUUID()),this.nowFn=t.now??(()=>new Date)}create(e){let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Artifact project was not found");let r=CE(e.filename).slice(0,200);if(!r||r!==e.filename)throw Error("Artifact filename must not contain a path");let a=gy(e.bytes,r),u=IE("sha256").update(e.bytes).digest("hex"),f=this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE project_id=? AND sha256=?").get(e.projectId,u);if(f)return xp(f);let h=this.idFn();EE(this.root,{recursive:!0,mode:448}),Iy(this.root,448);let b=PE(this.root,`${h}.archive`),S=`${b}.partial`;try{AE(S,e.bytes,{mode:384,flag:"wx"}),RE(S,b),Iy(b,384),this.controlPlane.database.run("INSERT INTO application_artifacts (id, organization_id, project_id, filename, storage_path, sha256, size, format, entry_count, expanded_bytes, created_by_actor_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[h,e.organizationId,e.projectId,r,b,u,e.bytes.byteLength,a.format,a.entries,a.expandedBytes,e.actorId??null,this.nowFn().toISOString()])}catch(y){if(Ey(S))Ry(S);if(Ey(b))Ry(b);throw y}return this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,actorId:e.actorId,type:"application.artifact.created",payload:{artifactId:h,filename:r,sha256:u,size:e.bytes.byteLength,entries:a.entries}}),this.get(h)}get(e){let t=this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE id=?").get(e);return t?xp(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE project_id=? ORDER BY created_at DESC").all(e).map(xp)}}function hd(e){let t=e.drafts.get(e.draftId);if(!t||t.version!==e.expectedVersion)throw Error(`Application draft ${e.draftId} changed since version ${e.expectedVersion}`);if(t.status==="applied")throw Error("Application draft was already applied");let r=e.controlPlane.getProject(t.projectId),a=r?e.controlPlane.listEnvironments(r.id).find((y)=>y.id===t.input.environmentId):void 0;if(!r||!a||a.projectId!==r.id||r.organizationId!==t.organizationId)throw Error("Draft deployment scope was not found");if(e.confirmEnvironment!==a.slug)throw Error(`Type ${a.slug} to confirm this deployment target`);let u=Wn(t.input,t.suppliedSecretNames);if(!u.valid)throw Error(`Application plan is invalid: ${[...u.issues.map((y)=>y.message),...u.missingSecrets.map((y)=>`Missing secret ${y}`)].join("; ")}`);let f=e.controlPlane.listResources(r.id,a.id).find((y)=>y.kind==="application"&&y.slug===t.input.slug),h=JSON.parse(JSON.stringify({manifest:u.manifest,configPatch:u.configPatch})),b=f?e.controlPlane.updateResource(f.id,f.version,{name:t.input.name,desiredState:h}):e.controlPlane.createResource({projectId:r.id,environmentId:a.id,kind:"application",slug:t.input.slug,name:t.input.name,desiredState:h,metadata:{source:"application-onboarding",draftId:t.id}}),S=new c(e.controlPlane).enqueue({projectId:r.id,environmentId:a.id,resourceId:b.id,actorId:e.actorId,kind:"application.create",idempotencyKey:`application-draft:${t.id}:v${t.version}`,correlationId:`application-draft:${t.id}`,input:h,lockKey:`resource:${b.id}`,providerKey:b.provider??"default",buildSlot:t.input.build.kind!=="prebuilt_image",maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return e.drafts.markApplied(t.id,t.version,e.actorId),e.controlPlane.appendEvent({organizationId:t.organizationId,projectId:r.id,resourceId:b.id,operationId:S.id,actorId:e.actorId,type:"application.create.queued",payload:{draftId:t.id,environment:a.slug,strategy:t.input.build.kind,costDrivers:u.costDrivers}}),{plan:u,resource:b,operation:S}}function Sn(e){let t=["static","compute","serverless_zip","serverless_image"].includes(e.kind),r=["container","compose"].includes(e.kind)&&(e.replicas??1)>1,a=e.kind==="container"||e.kind==="serverless_zip"||e.kind==="serverless_image",u=(f,h)=>h&&(f==="atomic"?e.kind==="static"||e.hasHealthGate:e.hasHealthGate);return[{strategy:"atomic",supported:u("atomic",t),explanation:t?e.hasHealthGate||e.kind==="static"?"Activate an immutable version with an atomic pointer/alias switch.":"Atomic activation needs a readiness gate for this runtime.":"This driver has no atomic pointer or alias primitive.",capacityMultiplier:1,costImpact:"none",rollback:"Switch the pointer/alias back to the previous immutable release."},{strategy:"rolling",supported:u("rolling",r),explanation:r?e.hasHealthGate?"Replace healthy replicas within the configured capacity envelope.":"Rolling activation requires a health/readiness gate.":"Rolling activation requires a capable container/Compose driver and at least two replicas.",capacityMultiplier:1.5,costImpact:"temporary",rollback:"Stop replacement and restore the prior task/service definition."},{strategy:"blue_green",supported:u("blue_green",a),explanation:a?e.hasHealthGate?"Provision a complete green target and switch traffic after health passes.":"Blue-green requires a health gate before traffic can switch.":"The provider does not expose two traffic-addressable revisions.",capacityMultiplier:2,costImpact:"temporary",rollback:"Return all traffic to the preserved blue target."},{strategy:"canary",supported:u("canary",a),explanation:a?e.hasHealthGate?"Shift bounded traffic steps while evaluating health.":"Canary requires a health gate and measurable traffic target.":"The provider does not expose weighted traffic primitives.",capacityMultiplier:1.25,costImpact:"temporary",rollback:"Set canary weight to zero and preserve its diagnostics."}]}function us(e,t){let r=Sn(e).find((a)=>a.strategy===t);if(!r.supported)throw Error(`${t} is unavailable: ${r.explanation}`);return r}import{createHash as _E}from"node:crypto";var TE=/^sha256:[a-f0-9]{64}$/,xE=/^[a-f0-9]{40,64}$/i;function Xn(e){return typeof e==="string"&&e?e:void 0}function so(e,t){try{return JSON.parse(String(e))}catch{return t}}function Ay(e){return{id:String(e.id),organizationId:String(e.organization_id),digest:String(e.digest),kind:String(e.kind),uri:String(e.uri),size:Number(e.size),mediaType:String(e.media_type),provenance:so(e.provenance,{}),attestation:so(e.attestation,{}),verifiedAt:String(e.verified_at),createdAt:String(e.created_at)}}function Cy(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:String(e.environment_id),resourceId:String(e.resource_id),artifactId:String(e.artifact_id),kind:String(e.kind),sourceSha:Xn(e.source_sha),configHash:String(e.config_hash),manifest:so(e.manifest,{}),provenance:so(e.provenance,{}),strategy:String(e.strategy),status:String(e.status),healthGate:e.health_gate==null?void 0:so(e.health_gate,void 0),hooks:so(e.hooks,{migrations:"none",preActivate:[],postActivate:[]}),drainSeconds:Number(e.drain_seconds),graceSeconds:Number(e.grace_seconds),automaticRollback:Number(e.automatic_rollback)===1,rollbackAttempts:Number(e.rollback_attempts),previousReleaseId:Xn(e.previous_release_id),promotedFromReleaseId:Xn(e.promoted_from_release_id),actorId:Xn(e.actor_id),trigger:String(e.trigger),pinned:Number(e.pinned)===1,pinReason:Xn(e.pin_reason),activatedAt:Xn(e.activated_at),failedAt:Xn(e.failed_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function DE(e){return{sequence:Number(e.sequence),id:String(e.id),releaseId:String(e.release_id),fromStatus:Xn(e.from_status),toStatus:String(e.to_status),trafficPercent:e.traffic_percent==null?void 0:Number(e.traffic_percent),health:so(e.health,{}),message:String(e.message),operationId:Xn(e.operation_id),createdAt:String(e.created_at)}}function OE(e,t){let r=[],a=(u,f,h)=>{if(JSON.stringify(f)===JSON.stringify(h))return;if(f&&h&&typeof f==="object"&&typeof h==="object"&&!Array.isArray(f)&&!Array.isArray(h)){for(let b of[...new Set([...Object.keys(f),...Object.keys(h)])].sort())a(u?`${u}.${b}`:b,f[b],h[b]);return}r.push({path:u,...f!==void 0?{before:f}:{},...h!==void 0?{after:h}:{}})};return a("",e,t),r}class fa{controlPlane;now;id;constructor(e,t={}){this.controlPlane=e;this.now=t.now??(()=>new Date),this.id=t.id??(()=>crypto.randomUUID())}registerArtifact(e){if(!TE.test(e.digest)||!/^(?:s3|https|oci|file):/.test(e.uri)||!Number.isInteger(e.size)||e.size<0)throw Error("Artifact requires a SHA-256 digest, supported immutable URI, and non-negative byte size");let t=this.controlPlane.database.query("SELECT * FROM release_artifacts WHERE organization_id=? AND digest=?").get(e.organizationId,e.digest);if(t)return Ay(t);let r=this.id(),a=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO release_artifacts (id, organization_id, digest, kind, uri, size, media_type, provenance, attestation, verified_at, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.digest,e.kind,e.uri,e.size,e.mediaType??"application/octet-stream",JSON.stringify(s(e.provenance??{})),JSON.stringify(s(e.attestation??{})),a,a]),this.getArtifact(r)}getArtifact(e){let t=this.controlPlane.database.query("SELECT * FROM release_artifacts WHERE id=?").get(e);return t?Ay(t):void 0}create(e){let t=this.getArtifact(e.artifactId),r=this.controlPlane.getResource(e.resourceId),a=this.controlPlane.listEnvironments(e.projectId).find((R)=>R.id===e.environmentId);if(!t||t.organizationId!==e.organizationId||t.kind!==e.kind)throw Error("Release artifact does not match the organization and deployable kind");if(!r||r.projectId!==e.projectId||r.environmentId!==e.environmentId||!a)throw Error("Release target scope does not match the resource");if(e.sourceSha&&!xE.test(e.sourceSha))throw Error("Release source must be an immutable commit SHA");us({kind:e.kind,provider:r.provider,hasHealthGate:!!e.healthGate,replicas:e.replicas},e.strategy);let u=s(e.config),f=_E("sha256").update(JSON.stringify(u)).digest("hex"),h=this.active(e.resourceId),b=this.id(),S=this.now().toISOString(),y=e.approvalRequired?"awaiting_approval":"built",k=e.hooks??{migrations:"none",preActivate:[],postActivate:[]};return this.controlPlane.database.run("INSERT INTO releases (id, organization_id, project_id, environment_id, resource_id, artifact_id, kind, source_sha, config_hash, manifest, provenance, strategy, status, health_gate, hooks, drain_seconds, grace_seconds, automatic_rollback, previous_release_id, promoted_from_release_id, actor_id, trigger, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[b,e.organizationId,e.projectId,e.environmentId,e.resourceId,e.artifactId,e.kind,e.sourceSha??null,f,JSON.stringify(s(e.manifest)),JSON.stringify(s(e.provenance??{})),e.strategy,y,e.healthGate?JSON.stringify(e.healthGate):null,JSON.stringify(k),Math.max(0,Math.min(3600,Math.floor(e.drainSeconds??30))),Math.max(0,Math.min(3600,Math.floor(e.graceSeconds??30))),e.automaticRollback===!1?0:1,h?.id??null,e.promotedFromReleaseId??null,e.actorId??null,e.trigger??"manual",S,S]),this.recordTransition(b,void 0,y,{message:e.promotedFromReleaseId?"Immutable artifact promoted without rebuild.":"Immutable release record created."}),this.get(b)}get(e){let t=this.controlPlane.database.query("SELECT * FROM releases WHERE id=?").get(e);return t?Cy(t):void 0}list(e={}){return this.controlPlane.database.query("SELECT * FROM releases ORDER BY created_at DESC, rowid DESC").all().map(Cy).filter((t)=>(!e.projectId||t.projectId===e.projectId)&&(!e.environmentId||t.environmentId===e.environmentId)&&(!e.resourceId||t.resourceId===e.resourceId)&&(!e.status||t.status===e.status))}active(e){return this.list({resourceId:e,status:"active"})[0]}transitions(e){return this.controlPlane.database.query("SELECT * FROM release_transitions WHERE release_id=? ORDER BY sequence").all(e).map(DE)}recordTransition(e,t,r,a){this.controlPlane.database.run("INSERT INTO release_transitions (id, release_id, from_status, to_status, traffic_percent, health, message, operation_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",[this.id(),e,t??null,r,a.trafficPercent??null,JSON.stringify(s(a.health??{})),a.message.slice(0,1000),a.operationId??null,this.now().toISOString()])}progress(e,t){let r=this.get(e);if(!r)throw Error(`Release ${e} was not found`);return this.recordTransition(e,r.status,r.status,t),this.transitions(e).at(-1)}transition(e,t,r){let a=this.get(e);if(!a)throw Error(`Release ${e} was not found`);if(!{built:["awaiting_approval","activating","failed"],awaiting_approval:["built","failed"],activating:["active","failed","rolled_back"],active:["superseded","failed","rolled_back"],failed:["activating","rolled_back"],rolled_back:["activating"],superseded:["activating"]}[a.status].includes(t))throw Error(`Invalid release transition ${a.status} → ${t}`);let f=this.now().toISOString();if(t==="active"){let h=this.active(a.resourceId);if(h&&h.id!==e)this.controlPlane.database.run("UPDATE releases SET status='superseded', updated_at=? WHERE id=?",[f,h.id]),this.recordTransition(h.id,"active","superseded",{message:`Superseded by ${e}.`,operationId:r.operationId})}return this.controlPlane.database.run("UPDATE releases SET status=?, rollback_attempts=rollback_attempts+?, activated_at=CASE WHEN ?='active' THEN ? ELSE activated_at END, failed_at=CASE WHEN ?='failed' THEN ? ELSE failed_at END, updated_at=? WHERE id=?",[t,t==="rolled_back"?1:0,t,f,t,f,f,e]),this.recordTransition(e,a.status,t,r),this.get(e)}approve(e,t){let r=this.get(e);if(!r||r.status!=="awaiting_approval")throw Error("Release is not awaiting approval");let a=this.id(),u=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO release_approvals (id, release_id, environment_id, decision, actor_id, comment, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)",[a,e,r.environmentId,t.decision,t.actorId,t.comment?.slice(0,1000)??null,u]),this.transition(e,t.decision==="approved"?"built":"failed",{message:t.decision==="approved"?"Environment gate approved.":"Environment gate rejected."})}approvals(e){return this.controlPlane.database.query("SELECT * FROM release_approvals WHERE release_id=? ORDER BY created_at").all(e).map((t)=>({id:String(t.id),releaseId:String(t.release_id),environmentId:String(t.environment_id),decision:String(t.decision),actorId:String(t.actor_id),comment:Xn(t.comment),createdAt:String(t.created_at)}))}promote(e,t){let r=this.get(e);if(!r||!["active","superseded"].includes(r.status))throw Error("Only a tested active/superseded release can be promoted");return this.create({organizationId:r.organizationId,projectId:r.projectId,environmentId:t.targetEnvironmentId,resourceId:t.targetResourceId,artifactId:r.artifactId,kind:r.kind,sourceSha:r.sourceSha,config:t.config,manifest:r.manifest,provenance:r.provenance,strategy:t.strategy??r.strategy,healthGate:t.healthGate??r.healthGate,hooks:r.hooks,drainSeconds:r.drainSeconds,graceSeconds:r.graceSeconds,automaticRollback:r.automaticRollback,promotedFromReleaseId:r.id,actorId:t.actorId,trigger:"promotion",approvalRequired:t.approvalRequired})}compare(e,t){let r=this.get(e),a=this.get(t);if(!r||!a)throw Error("Both releases are required for comparison");return{artifactChanged:r.artifactId!==a.artifactId,sourceChanged:r.sourceSha!==a.sourceSha,configChanged:r.configHash!==a.configHash,manifestChanges:OE(r.manifest,a.manifest),dataCaveat:a.hooks.migrations==="none"?"No database migration is recorded.":`Database hooks are ${a.hooks.migrations}; release rollback does not roll back data.`}}pin(e,t,r){if(!this.get(e))throw Error("Release was not found");return this.controlPlane.database.run("UPDATE releases SET pinned=?, pin_reason=?, updated_at=? WHERE id=?",[t?1:0,t?r?.slice(0,500)??"operator":null,this.now().toISOString(),e]),this.get(e)}retentionCandidates(e){let t=Math.max(1,Math.min(100,Math.floor(e.keepPerResource??10))),r=new Map;for(let a of this.list()){let u=r.get(a.resourceId)??[];u.push(a),r.set(a.resourceId,u)}return[...r.values()].flatMap((a)=>a.slice(t)).filter((a)=>new Date(a.createdAt)<e.before&&!a.pinned&&!["active","activating","awaiting_approval"].includes(a.status)&&!this.list().some((u)=>u.previousReleaseId===a.id&&["active","activating"].includes(u.status)))}}class xt{controlPlane;releases;queue;constructor(e){this.controlPlane=e;this.releases=new fa(e),this.queue=new c(e)}enqueueActivation(e,t={}){let r=this.releases.get(e.id);if(!r)throw Error("Release was not found");if(!["built","failed","rolled_back","superseded"].includes(r.status))throw Error(`Release ${r.status} cannot be activated`);let a=t.action??"activate",u=this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,actorId:t.actorId,kind:`release.${a}`,idempotencyKey:`release:${r.id}:${a}:${r.rollbackAttempts}`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:t.targetReleaseId??null},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:r.automaticRollback?2:1,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation;return this.releases.transition(r.id,"activating",{message:`${a} queued.`,operationId:u.id,trafficPercent:0}),u}completeHealthGate(e,t){let r=this.releases.get(e);if(!r||r.status!=="activating")throw Error("Release is not activating");if(t.healthy)return{release:this.releases.transition(r.id,"active",{message:t.message??"Health gate passed; activation completed.",operationId:t.operationId,trafficPercent:100,health:t.health})};let a=this.releases.transition(r.id,"failed",{message:t.message??"Health gate failed.",operationId:t.operationId,trafficPercent:0,health:t.health}),u=r.previousReleaseId?this.releases.get(r.previousReleaseId):void 0;if(!r.automaticRollback||r.rollbackAttempts>=1||!u)return{release:a};let f=this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,kind:"release.rollback",idempotencyKey:`release:${r.id}:automatic-rollback`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:u.id,automatic:!0},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:1,retryClasses:[],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation;return{release:a,rollbackOperation:f}}enqueueRollback(e,t={}){let r=this.releases.get(e.id);if(!r||r.status!=="active")throw Error("Only the active release can be rolled back");let a=t.targetReleaseId?this.releases.get(t.targetReleaseId):r.previousReleaseId?this.releases.get(r.previousReleaseId):void 0;if(!a||a.resourceId!==r.resourceId||!["superseded","active"].includes(a.status))throw Error("Rollback requires a preserved prior release for the same resource");return this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,actorId:t.actorId,kind:"release.rollback",idempotencyKey:`release:${r.id}:manual-rollback:${a.id}`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:a.id,automatic:!1},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:1,retryClasses:[],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation}}function Kf(e){if(e.strategy==="canary")return[5,25,50,100].map((t,r)=>({step:`canary-${t}`,trafficPercent:t,waitSeconds:r===3?e.drainSeconds:e.graceSeconds,requiresHealth:!0}));if(e.strategy==="blue_green")return[{step:"green-health",trafficPercent:0,waitSeconds:e.graceSeconds,requiresHealth:!0},{step:"traffic-switch",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!0}];if(e.strategy==="rolling")return[{step:"rolling-replacement",trafficPercent:50,waitSeconds:e.graceSeconds,requiresHealth:!0},{step:"rolling-complete",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!0}];return[{step:"immutable-switch",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!!e.healthGate}]}async function pu(e,t){if(t.release.artifactId!==t.artifact.id)throw Error("Release activation artifact identity changed");us({kind:t.release.kind,hasHealthGate:!!t.release.healthGate,replicas:Number(t.release.manifest?.replicas)||void 0},t.release.strategy);let r=e.capability(t);if(!r.supported)throw Error(`${t.release.strategy} is unavailable in ${e.name}: ${r.explanation}`);return e.activate({...t,transitions:Kf(t.release)})}async function mu(e,t){if(!t.previous)throw Error("Rollback requires the preserved previous release");return e.rollback({...t,transitions:[{step:"rollback",trafficPercent:0,waitSeconds:t.release.drainSeconds,requiresHealth:!0}]})}var Wf=["release.activate","release.rollback"];function $E(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function fu(e){let t=new xt(e.store),r=async(a)=>{let u=$E(a.operation.input),f=typeof u.releaseId==="string"?u.releaseId:"",h=t.releases.get(f);if(!h)throw Error(`Queued release ${f||"(missing)"} was not found`);if(h.projectId!==a.operation.projectId||h.environmentId!==a.operation.environmentId||h.resourceId!==a.operation.resourceId)throw Error("Queued release does not match the operation scope");let b=t.releases.getArtifact(h.artifactId);if(!b||b.digest!==t.releases.getArtifact(h.artifactId)?.digest)throw Error("Immutable release artifact is unavailable");let S=typeof u.targetReleaseId==="string"&&u.targetReleaseId?u.targetReleaseId:h.previousReleaseId,y=S?t.releases.get(S):void 0;if(y&&(y.resourceId!==h.resourceId||y.artifactId===h.artifactId&&y.id===h.id))throw Error("Rollback target does not match the release resource");let k=await e.resolveDriver(h);a.checkpoint("verify",`Verifying ${b.digest} and ${h.configHash} for ${k.name}.`),a.log(`Artifact ${b.digest}; source ${h.sourceSha??"not recorded"}; config ${h.configHash}.`,{stream:"system"}),a.throwIfCancellationRequested();let R;try{R=a.operation.kind==="release.rollback"?await mu(k,{release:h,artifact:b,previous:y}):await pu(k,{release:h,artifact:b,previous:y})}catch(D){if(a.operation.kind==="release.activate"&&t.releases.get(h.id)?.status==="activating")t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,message:D instanceof Error?D.message:String(D)});throw D}for(let D of R.transitions)t.releases.progress(h.id,{message:`${a.operation.kind==="release.rollback"?"Rollback":"Activation"} traffic at ${D.trafficPercent}%.`,trafficPercent:D.trafficPercent,health:D.observed,operationId:a.operation.id}),a.log(`Traffic ${D.trafficPercent}%: ${D.healthy?"healthy":"unhealthy"}.`,{stream:D.healthy?"step":"stderr",step:"health"});if(a.checkpoint("health","Evaluating the provider health result."),!R.activated||!R.healthy){if(a.operation.kind==="release.activate"&&t.releases.get(h.id)?.status==="activating")t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,health:{resourceVersions:R.resourceVersions},message:R.error??"Provider health gate failed."});throw Error(R.error??`${k.name} reported an unhealthy release`)}if(a.operation.kind==="release.activate"&&h.healthGate?.name){if(!e.resolveHealthGate)throw t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,message:`Named health gate ${h.healthGate.name} is not available to this worker.`}),Error(`Named health gate ${h.healthGate.name} is unavailable`);a.checkpoint("named-health-gate",`Waiting on ${h.healthGate.name}.`);let D=await e.resolveHealthGate(h.healthGate.name,h);if(a.log(`${h.healthGate.name}: ${D.healthy?"healthy":"unhealthy"}${D.message?` — ${D.message}`:""}.`,{stream:D.healthy?"step":"stderr",step:"health"}),!D.healthy)throw t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,health:D.evidence,message:D.message??`Named health gate ${h.healthGate.name} failed.`}),Error(D.message??`Named health gate ${h.healthGate.name} failed`)}if(a.operation.kind==="release.rollback"){let D=t.releases.get(h.id);if(D.status!=="rolled_back")t.releases.transition(D.id,"rolled_back",{message:`Traffic restored through ${k.name}.`,operationId:a.operation.id,trafficPercent:0,health:{resourceVersions:R.resourceVersions}});if(y&&y.status!=="active"){let O=y.status==="activating"?y:t.releases.transition(y.id,"activating",{message:"Rollback target restoring traffic.",operationId:a.operation.id,trafficPercent:0});t.releases.transition(O.id,"active",{message:"Previous immutable release restored.",operationId:a.operation.id,trafficPercent:100,health:{resourceVersions:R.resourceVersions}})}}else t.completeHealthGate(h.id,{healthy:!0,operationId:a.operation.id,health:{providerVersion:R.providerVersion??null,resourceVersions:R.resourceVersions},message:"Provider activation and health gates completed."});return a.checkpoint("finalize","Persisted the terminal release state."),{releaseId:h.id,artifactDigest:b.digest,provider:k.name,providerVersion:R.providerVersion??null,resourceVersions:R.resourceVersions,status:t.releases.get(h.id).status}};return Object.fromEntries(Wf.map((a)=>[a,r]))}import{createCipheriv as NE,createDecipheriv as jE,createHash as Dy,randomBytes as Op}from"node:crypto";var Oy={github:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},gitlab:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},bitbucket:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},gitea:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!1,deployKeys:!0},generic_https:{repositories:!1,branches:!0,tags:!0,webhooks:!1,pullRequests:!1,tokenRefresh:!1,deployKeys:!1},generic_ssh:{repositories:!1,branches:!0,tags:!0,webhooks:!1,pullRequests:!1,tokenRefresh:!1,deployKeys:!0}};function Nt(e){return typeof e==="string"&&e?e:void 0}function co(e,t){try{return typeof e==="string"?JSON.parse(e):t}catch{return t}}function ei(e){return JSON.stringify(s(e))}function ao(e){return Dy("sha256").update(e).digest("hex")}function Py(e){let t=e.trim().replace(/\/$/,""),r=new URL(t.includes("://")?t:`https://${t}`);if(r.username||r.password||r.search||r.hash)throw Error("Source host cannot contain credentials, a query, or a fragment");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&["localhost","127.0.0.1","::1"].includes(r.hostname)))throw Error("Source host must use HTTPS");return`${r.protocol}//${r.host}${r.pathname.replace(/\/$/,"")}`}function _y(e){let t=e.trim();if(t.length<2||t.length>80)throw Error("Connection name must contain 2-80 characters");return t}function $p(e){let t=e.trim().replace(/^\/+|\/+$/g,"");if(!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(t))throw Error("Repository must use owner/name format");return t}function Ty(e){let t=e.trim()||".";if(t.startsWith("/")||t.split("/").includes("..")||/[\0\r\n]/.test(t))throw Error("Monorepo root must stay inside the repository");return t.replace(/^\.\//,"")||"."}function yd(e){return[...new Set((e??[]).map((t)=>t.trim()).filter(Boolean))].slice(0,100)}function BE(e){let t=e.trim();if(/\r|\n/.test(t)||/https?:\/\/[^/@\s]+:[^/@\s]+@/i.test(t))throw Error("Clone URL cannot contain credentials or control characters");if(!/^(?:https?:\/\/|ssh:\/\/|git@[A-Za-z0-9.-]+:)/.test(t))throw Error("Clone URL must use HTTPS or SSH");return t}function ME(e){return{id:String(e.id),organizationId:String(e.organization_id),provider:String(e.provider),name:String(e.name),host:String(e.host),owner:Nt(e.owner),authKind:String(e.auth_kind),credentialConfigured:!!e.credential_ciphertext,credentialFingerprint:Nt(e.credential_fingerprint),grantedScopes:co(e.granted_scopes,[]),capabilities:co(e.capabilities,Oy[String(e.provider)]),status:String(e.status),healthMessage:Nt(e.health_message),lastTestedAt:Nt(e.last_tested_at),lastSyncedAt:Nt(e.last_synced_at),credentialExpiresAt:Nt(e.credential_expires_at),version:Number(e.version),createdByActorId:Nt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Np(e){return{id:String(e.id),connectionId:String(e.connection_id),providerRepositoryId:String(e.provider_repository_id),fullName:String(e.full_name),cloneUrl:String(e.clone_url),defaultBranch:String(e.default_branch),visibility:String(e.visibility),archived:Number(e.archived)===1,metadata:co(e.metadata,{}),syncedAt:String(e.synced_at)}}function xy(e){return{id:String(e.id),projectId:String(e.project_id),environmentId:Nt(e.environment_id),resourceId:Nt(e.resource_id),connectionId:String(e.connection_id),repositoryId:Nt(e.repository_id),repositoryFullName:String(e.repository_full_name),defaultBranch:String(e.default_branch),branchRule:Nt(e.branch_rule),tagRule:Nt(e.tag_rule),monorepoRoot:String(e.monorepo_root),includePaths:co(e.include_paths,[]),excludePaths:co(e.exclude_paths,[]),submodules:Number(e.submodules)===1,cloneDepth:e.clone_depth==null?void 0:Number(e.clone_depth),deployKeyId:Nt(e.deploy_key_id),autoDeploy:Number(e.auto_deploy)===1,pullRequestPreviews:Number(e.pull_request_previews)===1,status:String(e.status),disabledReason:Nt(e.disabled_reason),version:Number(e.version),createdByActorId:Nt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function jp(e){return{id:String(e.id),connectionId:String(e.connection_id),name:String(e.name),publicKey:String(e.public_key),publicKeyFingerprint:String(e.public_key_fingerprint),host:String(e.host),hostKey:String(e.host_key),hostKeyFingerprint:String(e.host_key_fingerprint),createdByActorId:Nt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Bp(e){return{id:String(e.id),connectionId:String(e.connection_id),repositoryId:Nt(e.repository_id),repositoryFullName:String(e.repository_full_name),providerWebhookId:Nt(e.provider_webhook_id),events:co(e.events,[]),status:String(e.status),healthMessage:Nt(e.health_message),lastDeliveryAt:Nt(e.last_delivery_at),lastReconciledAt:Nt(e.last_reconciled_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Mp(e){return{id:String(e.id),connectionId:String(e.connection_id),webhookId:String(e.webhook_id),providerDeliveryId:String(e.provider_delivery_id),event:String(e.event),action:Nt(e.action),commitSha:Nt(e.commit_sha),signatureStatus:String(e.signature_status),status:String(e.status),payloadSummary:co(e.payload_summary,{}),operationId:Nt(e.operation_id),error:Nt(e.error),receivedAt:String(e.received_at),processedAt:Nt(e.processed_at)}}class ha{controlPlane;key;nowFn;idFn;constructor(e,t={}){this.controlPlane=e;this.key=t.encryptionKey?Dy("sha256").update(t.encryptionKey).digest():void 0,this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}run(e,t){this.controlPlane.database.run(e,t)}encrypt(e){if(!this.key)throw Error("Source credential encryption key is not configured");let t=Op(12),r=NE("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){if(!this.key)throw Error("Source credential encryption key is not configured");let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Encrypted source credential is unavailable");let f=jE("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}createConnection(e){if(!this.controlPlane.getOrganization(e.organizationId))throw Error("Source connection organization was not found");let t=this.now(),r=this.idFn(),a=e.credential?JSON.stringify(e.credential):void 0;return this.run(`INSERT INTO source_connections (id, organization_id, provider, name, host, owner, auth_kind, credential_ciphertext, credential_fingerprint, granted_scopes, capabilities, status, credential_expires_at, created_by_actor_id, created_at, updated_at)
75
75
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?, ?, ?)`,[r,e.organizationId,e.provider,_y(e.name),Py(e.host),e.owner?.trim()||null,e.authKind??(a?"access_token":"none"),a?this.encrypt(a):null,a?ao(a).slice(0,16):null,ei([...new Set(e.grantedScopes??[])].sort()),ei(Oy[e.provider]),e.credentialExpiresAt??null,e.createdByActorId??null,t,t]),this.controlPlane.appendEvent({organizationId:e.organizationId,actorId:e.createdByActorId,type:"source.connection.created",payload:{connectionId:r,provider:e.provider,host:Py(e.host),owner:e.owner??null,scopes:e.grantedScopes??[]}}),this.getConnection(r)}getConnection(e){let t=this.controlPlane.database.query("SELECT * FROM source_connections WHERE id = ?").get(e);return t?this.currentConnection(t):void 0}listConnections(e){return this.controlPlane.database.query("SELECT * FROM source_connections WHERE organization_id = ? ORDER BY name").all(e).map((t)=>this.currentConnection(t))}currentConnection(e){let t=ME(e);if(t.status!=="disconnected"&&t.credentialExpiresAt&&new Date(t.credentialExpiresAt).getTime()<=this.nowFn().getTime())return{...t,status:"expired",healthMessage:"Source credential expired; rotate it before deploying."};return t}getCredential(e){let t=this.controlPlane.database.query("SELECT credential_ciphertext FROM source_connections WHERE id = ?").get(e);return t?.credential_ciphertext?JSON.parse(this.decrypt(String(t.credential_ciphertext))):void 0}rotateCredential(e,t,r={}){let a=this.getConnection(e);if(!a||a.status==="disconnected")throw Error("Active source connection was not found");let u=JSON.stringify(t);return this.run("UPDATE source_connections SET credential_ciphertext = ?, credential_fingerprint = ?, credential_expires_at = ?, status = 'pending', health_message = NULL, version = version + 1, updated_at = ? WHERE id = ?",[this.encrypt(u),ao(u).slice(0,16),r.expiresAt??null,this.now(),e]),this.controlPlane.appendEvent({organizationId:a.organizationId,actorId:r.actorId,type:"source.credential.rotated",payload:{connectionId:e,fingerprint:ao(u).slice(0,16),expiresAt:r.expiresAt??null}}),this.getConnection(e)}updateHealth(e,t){let r=this.getConnection(e);if(!r||["disconnected","expired"].includes(r.status))throw Error("Active source connection was not found");let a=this.now(),u=t.grantedScopes?[...new Set(t.grantedScopes.map((f)=>f.trim()).filter(Boolean))].sort():void 0;if(this.run("UPDATE source_connections SET status = ?, health_message = ?, granted_scopes = COALESCE(?, granted_scopes), last_tested_at = COALESCE(?, last_tested_at), last_synced_at = COALESCE(?, last_synced_at), version = version + 1, updated_at = ? WHERE id = ?",[t.status,t.message?.slice(0,1000)??null,u?ei(u):null,t.tested?a:null,t.synced?a:null,a,e]),u&&JSON.stringify(u)!==JSON.stringify([...r.grantedScopes].sort()))this.controlPlane.appendEvent({organizationId:r.organizationId,type:"source.connection.scopes_updated",payload:{connectionId:e,grantedScopes:u}});return this.getConnection(e)}upsertRepository(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status))throw Error("Active source connection was not found");let r=this.now(),a=this.controlPlane.database.query("SELECT id FROM source_repositories WHERE connection_id = ? AND provider_repository_id = ?").get(e.connectionId,e.providerRepositoryId),u=a?String(a.id):this.idFn();return this.run(`INSERT INTO source_repositories (id, connection_id, provider_repository_id, full_name, clone_url, default_branch, visibility, archived, metadata, synced_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
76
76
  ON CONFLICT(connection_id, provider_repository_id) DO UPDATE SET full_name=excluded.full_name, clone_url=excluded.clone_url, default_branch=excluded.default_branch, visibility=excluded.visibility, archived=excluded.archived, metadata=excluded.metadata, synced_at=excluded.synced_at`,[u,e.connectionId,e.providerRepositoryId,$p(e.fullName),BE(e.cloneUrl),e.defaultBranch.trim()||"main",e.visibility,e.archived?1:0,ei(e.metadata),r]),Np(this.controlPlane.database.query("SELECT * FROM source_repositories WHERE id = ?").get(u))}listRepositories(e,t,r=100){let a=t?.trim().toLowerCase();return(a?this.controlPlane.database.query("SELECT * FROM source_repositories WHERE connection_id = ? AND lower(full_name) LIKE ? ORDER BY full_name LIMIT ?").all(e,`%${a}%`,Math.min(500,r)):this.controlPlane.database.query("SELECT * FROM source_repositories WHERE connection_id = ? ORDER BY full_name LIMIT ?").all(e,Math.min(500,r))).map(Np)}getRepository(e){let t=this.controlPlane.database.query("SELECT * FROM source_repositories WHERE id = ?").get(e);return t?Np(t):void 0}createDeployKey(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status)||!t.capabilities.deployKeys)throw Error("An active deploy-key capable source connection is required");if(!/^ssh-(?:ed25519|rsa)\s+[A-Za-z0-9+/=]+/.test(e.publicKey.trim()))throw Error("A valid SSH public key is required");if(!/BEGIN (?:OPENSSH|RSA) PRIVATE KEY/.test(e.privateKey))throw Error("A valid SSH private key is required");if(!/^(?:ssh-ed25519|ssh-rsa|ecdsa-sha2-nistp\d+)\s+[A-Za-z0-9+/=]+/.test(e.hostKey.trim()))throw Error("A pinned SSH host key is required");let r=this.idFn(),a=this.now(),u=`sha256:${ao(e.publicKey.trim())}`,f=`sha256:${ao(e.hostKey.trim())}`;return this.run("INSERT INTO source_deploy_keys (id, connection_id, name, public_key, public_key_fingerprint, private_key_ciphertext, host, host_key, host_key_fingerprint, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.connectionId,_y(e.name),e.publicKey.trim(),u,this.encrypt(e.privateKey),e.host.trim().toLowerCase(),e.hostKey.trim(),f,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:t.organizationId,actorId:e.actorId,type:"source.deploy_key.created",payload:{connectionId:e.connectionId,deployKeyId:r,publicFingerprint:u,hostFingerprint:f}}),jp(this.controlPlane.database.query("SELECT * FROM source_deploy_keys WHERE id = ?").get(r))}getDeployKey(e){let t=this.controlPlane.database.query("SELECT * FROM source_deploy_keys WHERE id = ?").get(e);return t?jp(t):void 0}listDeployKeys(e){return this.controlPlane.database.query("SELECT * FROM source_deploy_keys WHERE connection_id = ? ORDER BY name, created_at").all(e).map(jp)}revokeDeployKey(e,t){let r=this.getDeployKey(e),a=r?this.getConnection(r.connectionId):void 0;if(!r||!a)throw Error("Deploy key was not found");let u=this.listBindings({connectionId:a.id}).filter((h)=>h.deployKeyId===e),f=this.now();return this.controlPlane.database.transaction(()=>{this.run("UPDATE source_bindings SET deploy_key_id=NULL, status='disabled', auto_deploy=0, disabled_reason='Source deploy key was revoked', version=version+1, updated_at=? WHERE deploy_key_id=?",[f,e]),this.run("DELETE FROM source_deploy_keys WHERE id=?",[e])})(),this.controlPlane.appendEvent({organizationId:a.organizationId,actorId:t,type:"source.deploy_key.revoked",level:"warning",payload:{connectionId:a.id,deployKeyId:e,affectedBindingIds:u.map((h)=>h.id)}}),{affectedBindings:u}}getDeployPrivateKey(e){let t=this.controlPlane.database.query("SELECT private_key_ciphertext FROM source_deploy_keys WHERE id = ?").get(e);if(!t)throw Error("Deploy key was not found");return this.decrypt(String(t.private_key_ciphertext))}createBinding(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status))throw Error("Active source connection was not found");if(e.repositoryId&&this.getRepository(e.repositoryId)?.connectionId!==t.id)throw Error("Repository does not belong to this connection");if(e.deployKeyId&&this.getDeployKey(e.deployKeyId)?.connectionId!==t.id)throw Error("Deploy key does not belong to this connection");let r=this.idFn(),a=this.now();return this.run(`INSERT INTO source_bindings (id, project_id, environment_id, resource_id, connection_id, repository_id, repository_full_name, default_branch, branch_rule, tag_rule, monorepo_root, include_paths, exclude_paths, submodules, clone_depth, deploy_key_id, auto_deploy, pull_request_previews, status, created_by_actor_id, created_at, updated_at)
77
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', ?, ?, ?)`,[r,e.projectId,e.environmentId??null,e.resourceId??null,e.connectionId,e.repositoryId??null,$p(e.repositoryFullName),e.defaultBranch?.trim()||"main",e.branchRule?.trim()||null,e.tagRule?.trim()||null,Ty(e.monorepoRoot??"."),ei(yd(e.includePaths)),ei(yd(e.excludePaths)),e.submodules?1:0,e.cloneDepth??null,e.deployKeyId??null,e.autoDeploy===!1?0:1,e.pullRequestPreviews===!1?0:1,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:t.organizationId,projectId:e.projectId,actorId:e.actorId,type:"source.binding.created",payload:{bindingId:r,connectionId:e.connectionId,repository:e.repositoryFullName,branch:e.defaultBranch??"main"}}),this.getBinding(r)}getBinding(e){let t=this.controlPlane.database.query("SELECT * FROM source_bindings WHERE id = ?").get(e);return t?xy(t):void 0}listBindings(e={}){return this.controlPlane.database.query("SELECT * FROM source_bindings ORDER BY created_at DESC").all().map(xy).filter((r)=>(!e.connectionId||r.connectionId===e.connectionId)&&(!e.projectId||r.projectId===e.projectId)&&(!e.status||r.status===e.status))}updateBinding(e,t,r){let a=this.getBinding(e);if(!a||a.version!==t)throw Error(`Source binding ${e} changed since version ${t}`);let u=this.getConnection(a.connectionId);if((!u||["disconnected","expired"].includes(u.status))&&(r.status==="active"||r.autoDeploy===!0))throw Error("Rotate or reconnect the source credential before enabling this binding");if(r.deployKeyId&&this.getDeployKey(r.deployKeyId)?.connectionId!==a.connectionId)throw Error("Deploy key does not belong to this connection");let f=this.now();if(this.controlPlane.database.run("UPDATE source_bindings SET default_branch=?, branch_rule=?, tag_rule=?, monorepo_root=?, include_paths=?, exclude_paths=?, submodules=?, clone_depth=?, deploy_key_id=?, auto_deploy=?, pull_request_previews=?, status=?, disabled_reason=?, version=version+1, updated_at=? WHERE id=? AND version=?",[r.defaultBranch?.trim()||a.defaultBranch,r.branchRule===void 0?a.branchRule??null:r.branchRule.trim()||null,r.tagRule===void 0?a.tagRule??null:r.tagRule.trim()||null,r.monorepoRoot===void 0?a.monorepoRoot:Ty(r.monorepoRoot),ei(r.includePaths===void 0?a.includePaths:yd(r.includePaths)),ei(r.excludePaths===void 0?a.excludePaths:yd(r.excludePaths)),r.submodules??a.submodules?1:0,r.cloneDepth===void 0?a.cloneDepth??null:r.cloneDepth,r.deployKeyId===void 0?a.deployKeyId??null:r.deployKeyId,r.autoDeploy??a.autoDeploy?1:0,r.pullRequestPreviews??a.pullRequestPreviews?1:0,r.status??a.status,r.disabledReason===void 0?a.disabledReason??null:r.disabledReason.slice(0,1000),f,e,t]).changes!==1)throw Error(`Source binding ${e} changed since version ${t}`);let b=this.getConnection(a.connectionId);return this.controlPlane.appendEvent({organizationId:b.organizationId,projectId:a.projectId,actorId:r.actorId,type:"source.binding.updated",payload:{bindingId:e,fromVersion:t,toVersion:t+1,status:r.status??a.status}}),this.getBinding(e)}createWebhook(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status))throw Error("Active source connection was not found");if(e.repositoryId&&this.getRepository(e.repositoryId)?.connectionId!==t.id)throw Error("Repository does not belong to this connection");let r=this.idFn(),a=this.now(),u=e.endpointToken??Op(24).toString("base64url"),f=e.secret??Op(32).toString("base64url"),h=[...new Set(e.events??["push","pull_request"])].filter((b)=>["push","pull_request"].includes(b));if(!h.length)throw Error("At least one supported webhook event is required");return this.run("INSERT INTO source_webhooks (id, connection_id, repository_id, repository_full_name, endpoint_token_hash, endpoint_token_ciphertext, secret_ciphertext, events, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)",[r,e.connectionId,e.repositoryId??null,$p(e.repositoryFullName),ao(u),this.encrypt(u),this.encrypt(f),ei(h),a,a]),this.controlPlane.appendEvent({organizationId:t.organizationId,type:"source.webhook.created",payload:{webhookId:r,connectionId:t.id,repository:e.repositoryFullName,events:h}}),{webhook:{...this.getWebhook(r),endpointToken:u},secret:f}}getWebhook(e){let t=this.controlPlane.database.query("SELECT * FROM source_webhooks WHERE id = ?").get(e);return t?Bp(t):void 0}getWebhookByEndpointToken(e){let t=this.controlPlane.database.query("SELECT * FROM source_webhooks WHERE endpoint_token_hash = ?").get(ao(e));return t?Bp(t):void 0}getWebhookSecret(e){let t=this.controlPlane.database.query("SELECT secret_ciphertext FROM source_webhooks WHERE id = ?").get(e);if(!t)throw Error("Source webhook was not found");return this.decrypt(String(t.secret_ciphertext))}getWebhookEndpointToken(e){let t=this.controlPlane.database.query("SELECT endpoint_token_ciphertext FROM source_webhooks WHERE id = ?").get(e);if(!t?.endpoint_token_ciphertext)throw Error("Source webhook endpoint token is unavailable");return this.decrypt(String(t.endpoint_token_ciphertext))}listWebhooks(e){return this.controlPlane.database.query("SELECT * FROM source_webhooks WHERE connection_id = ? ORDER BY repository_full_name").all(e).map(Bp)}updateWebhookState(e,t){let r=this.getWebhook(e);if(!r)throw Error("Source webhook was not found");let a=this.now();this.run("UPDATE source_webhooks SET provider_webhook_id=COALESCE(?, provider_webhook_id), status=?, health_message=?, last_reconciled_at=COALESCE(?, last_reconciled_at), updated_at=? WHERE id=?",[t.providerWebhookId??null,t.status,t.healthMessage?.slice(0,1000)??null,t.reconciled?a:null,a,e]);let u=this.getConnection(r.connectionId);if(u)this.controlPlane.appendEvent({organizationId:u.organizationId,type:"source.webhook.updated",payload:{webhookId:e,connectionId:u.id,repository:r.repositoryFullName,status:t.status,reconciled:t.reconciled??!1,providerWebhookId:t.providerWebhookId??r.providerWebhookId??null}});return this.getWebhook(e)}getDeliveryByProviderId(e,t){let r=this.controlPlane.database.query("SELECT * FROM source_webhook_deliveries WHERE connection_id = ? AND provider_delivery_id = ?").get(e,t);return r?Mp(r):void 0}recordDelivery(e){let t=this.getDeliveryByProviderId(e.connectionId,e.providerDeliveryId);if(t)return{delivery:t,duplicate:!0};let r=this.idFn(),a=this.now();return this.controlPlane.database.transaction(()=>{this.run("INSERT INTO source_webhook_deliveries (id, connection_id, webhook_id, provider_delivery_id, event, action, commit_sha, signature_status, status, payload_summary, operation_id, error, received_at, processed_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.connectionId,e.webhookId,e.providerDeliveryId,e.event.slice(0,100),e.action?.slice(0,100)??null,e.commitSha?.slice(0,128)??null,e.signatureStatus,e.status,ei(e.payloadSummary??{}),e.operationId??null,e.error?.slice(0,2000)??null,a,["enqueued","ignored","rejected","failed"].includes(e.status)?a:null]),this.run("UPDATE source_webhooks SET last_delivery_at=?, updated_at=? WHERE id=?",[a,a,e.webhookId])})(),{delivery:this.getDeliveryByProviderId(e.connectionId,e.providerDeliveryId),duplicate:!1}}updateDelivery(e,t){this.run("UPDATE source_webhook_deliveries SET status=?, operation_id=?, error=?, processed_at=? WHERE id=?",[t.status,t.operationId??null,t.error?.slice(0,2000)??null,this.now(),e]);let r=this.controlPlane.database.query("SELECT * FROM source_webhook_deliveries WHERE id = ?").get(e);if(!r)throw Error("Source webhook delivery was not found");return Mp(r)}listDeliveries(e,t=100){return this.controlPlane.database.query("SELECT * FROM source_webhook_deliveries WHERE webhook_id = ? ORDER BY received_at DESC LIMIT ?").all(e,Math.min(500,Math.max(1,t))).map(Mp)}disconnectConnection(e,t){let r=this.getConnection(e);if(!r)throw Error("Source connection was not found");let a=this.listBindings({connectionId:e,status:"active"}),u=this.now();return this.controlPlane.database.transaction(()=>{this.run("UPDATE source_connections SET status='disconnected', credential_ciphertext=NULL, health_message='Disconnected by an administrator', version=version+1, updated_at=? WHERE id=?",[u,e]),this.run("UPDATE source_bindings SET status='disabled', auto_deploy=0, disabled_reason='Source connection was disconnected', version=version+1, updated_at=? WHERE connection_id=? AND status='active'",[u,e]),this.run("UPDATE source_webhooks SET status='disabled', health_message='Source connection was disconnected', updated_at=? WHERE connection_id=?",[u,e])})(),this.controlPlane.appendEvent({organizationId:r.organizationId,actorId:t,type:"source.connection.disconnected",level:"warning",payload:{connectionId:e,affectedBindingIds:a.map((f)=>f.id),affectedRepositories:a.map((f)=>f.repositoryFullName)}}),{connection:this.getConnection(e),affectedBindings:a}}}import{createSign as LE}from"node:crypto";class Ar extends Error{status;retryAfterSeconds;constructor(e,t,r){super(e);this.status=t;this.retryAfterSeconds=r;this.name="SourceProviderError"}}var Ny={repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0};function _i(e){let t=Number(e??"1");return Number.isInteger(t)&&t>0?t:1}function Ti(e){return Math.max(1,Math.min(100,e??50))}function _n(e){let t=e.trim().replace(/^\/+|\/+$/g,"");if(!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(t))throw Error("Repository must use owner/name format");return t}function ta(e){let t=new URL(e);if(t.username||t.password||t.protocol!=="https:")throw Error("Webhook endpoint must be credential-free HTTPS");return t.href}function $y(e){return Buffer.from(e).toString("base64url")}function FE(e,t){if(!e.appId||!e.privateKey)throw Error("GitHub App credentials require appId and privateKey");let r=$y(JSON.stringify({alg:"RS256",typ:"JWT"})),a=Math.floor(t.getTime()/1000)-30,u=$y(JSON.stringify({iat:a,exp:a+540,iss:e.appId})),f=LE("RSA-SHA256");return f.update(`${r}.${u}`),f.end(),`${r}.${u}.${f.sign(e.privateKey).toString("base64url")}`}class ra{connection;credential;capabilities=Ny;fetchFn;timeoutMs;nowFn;constructor(e,t,r={}){this.connection=e;this.credential=t;this.fetchFn=r.fetch??((a,u)=>globalThis.fetch(a,u)),this.timeoutMs=Math.max(100,r.timeoutMs??20000),this.nowFn=r.now??(()=>new Date)}async request(e,t={}){let r=new URL(`${this.apiRoot().replace(/\/$/,"")}/`),a=new URL(e.replace(/^\//,""),r);if(a.origin!==r.origin)throw Error("Provider pagination cannot leave the configured host");let u=new AbortController,f=setTimeout(()=>u.abort(),this.timeoutMs);try{let h=await this.fetchFn(a,{...t,redirect:"error",signal:u.signal,headers:{Accept:"application/json","User-Agent":"ts-cloud-source/1",...await this.authorization(),...t.headers}});if(!h.ok){let b=Number(h.headers.get("retry-after")??""),S=h.headers.get("x-request-id")??h.headers.get("x-github-request-id");throw new Ar(`Source provider request failed (${h.status})${S?` [request ${S}]`:""}`,h.status,Number.isFinite(b)?b:void 0)}if(h.status===204)return{data:void 0,headers:h.headers};return{data:await h.json(),headers:h.headers}}catch(h){if(h instanceof Ar)throw h;if(u.signal.aborted)throw new Ar(`Source provider request exceeded ${this.timeoutMs}ms`);throw new Ar(h instanceof Error?h.message.replace(/(?:token|password|secret)=[^\s&]+/gi,"$1=[REDACTED]"):"Source provider request failed")}finally{clearTimeout(f)}}async deleteWebhook(e,t){await this.request(this.webhookPath(e,t),{method:"DELETE"})}}class hu extends ra{provider="github";installationToken;apiRoot(){return this.connection.host==="https://github.com"?"https://api.github.com":`${this.connection.host}/api/v3`}async authorization(){if(this.credential?.token)return{Authorization:`Bearer ${this.credential.token}`,"X-GitHub-Api-Version":"2022-11-28"};if(!this.credential?.installationId)return{};if(!this.installationToken||this.installationToken.expiresAt<this.nowFn().getTime()+60000){let e=FE(this.credential,this.nowFn()),t=this.apiRoot().replace(/\/$/,""),r=new AbortController,a=setTimeout(()=>r.abort(),this.timeoutMs);try{let u=await this.fetchFn(`${t}/app/installations/${encodeURIComponent(this.credential.installationId)}/access_tokens`,{method:"POST",signal:r.signal,redirect:"error",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"X-GitHub-Api-Version":"2022-11-28","User-Agent":"ts-cloud-source/1"}});if(!u.ok)throw new Ar(`GitHub App token refresh failed (${u.status})`,u.status);let f=await u.json();this.installationToken={value:f.token,expiresAt:new Date(f.expires_at).getTime()}}finally{clearTimeout(a)}}return{Authorization:`Bearer ${this.installationToken.value}`,"X-GitHub-Api-Version":"2022-11-28"}}async testConnection(){let e=this.credential?.installationId?"/installation/repositories?per_page=1":"/user",{data:t,headers:r}=await this.request(e);return{ok:!0,account:t.login??this.connection.owner,scopes:(r.get("x-oauth-scopes")??this.connection.grantedScopes.join(",")).split(",").map((a)=>a.trim()).filter(Boolean),message:"GitHub connection is healthy"}}async listRepositories(e={}){let t=Ti(e.limit),r=_i(e.cursor),a=this.credential?.installationId?`/installation/repositories?per_page=${t}&page=${r}`:`/user/repos?per_page=${t}&page=${r}&sort=updated`,{data:u}=await this.request(a),f=Array.isArray(u)?u:u.repositories;return{repositories:(e.search?f.filter((b)=>b.full_name.toLowerCase().includes(e.search.toLowerCase())):f).map((b)=>({providerRepositoryId:String(b.id),fullName:b.full_name,cloneUrl:b.clone_url,defaultBranch:b.default_branch||"main",visibility:b.visibility??(b.private?"private":"public"),archived:!!b.archived,metadata:{}})),nextCursor:f.length===t?String(r+1):void 0}}async refs(e,t,r={}){let a=Ti(r.limit),u=_i(r.cursor),{data:f}=await this.request(`/repos/${_n(e)}/${t}?per_page=${a}&page=${u}`);return{refs:f.map((h)=>({name:h.name,commitSha:h.commit.sha,protected:h.protected})),nextCursor:f.length===a?String(u+1):void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/repos/${_n(e)}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:String(e.id),active:e.active,events:e.events,url:e.config.url??""}}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:JSON.stringify({name:"web",active:!0,events:t.events,config:{url:ta(t.url),content_type:"json",secret:t.secret,insecure_ssl:"0"}}),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PATCH",body:JSON.stringify({active:!0,events:r.events,config:{url:ta(r.url),content_type:"json",secret:r.secret,insecure_ssl:"0"}}),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){await this.request(`/repos/${_n(e)}/statuses/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:r.state,target_url:r.url,description:r.description.slice(0,140),context:r.context??"ts-cloud/preview"})})}}class Au extends ra{provider="gitlab";apiRoot(){return`${this.connection.host}/api/v4`}async authorization(){return this.credential?.token?{"PRIVATE-TOKEN":this.credential.token}:{}}async testConnection(){let{data:e}=await this.request("/user");return{ok:!0,account:e.username,scopes:this.connection.grantedScopes,message:"GitLab connection is healthy"}}async listRepositories(e={}){let t=Ti(e.limit),r=_i(e.cursor),a=e.search?`&search=${encodeURIComponent(e.search)}`:"",{data:u,headers:f}=await this.request(`/projects?membership=true&simple=true&order_by=last_activity_at&per_page=${t}&page=${r}${a}`);return{repositories:u.map((h)=>({providerRepositoryId:String(h.id),fullName:h.path_with_namespace,cloneUrl:h.http_url_to_repo,defaultBranch:h.default_branch??"main",visibility:h.visibility??"unknown",archived:!!h.archived,metadata:{}})),nextCursor:f.get("x-next-page")||void 0}}async refs(e,t,r={}){let a=Ti(r.limit),u=_i(r.cursor),{data:f,headers:h}=await this.request(`/projects/${encodeURIComponent(_n(e))}/repository/${t}?per_page=${a}&page=${u}`);return{refs:f.map((b)=>({name:b.name,commitSha:b.commit.id,protected:b.protected})),nextCursor:h.get("x-next-page")||void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/projects/${encodeURIComponent(_n(e))}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:String(e.id),active:!0,events:[...e.push_events?["push"]:[],...e.merge_requests_events?["pull_request"]:[]],url:e.url}}body(e){return JSON.stringify({url:ta(e.url),token:e.secret,enable_ssl_verification:!0,push_events:e.events.includes("push"),merge_requests_events:e.events.includes("pull_request")})}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:this.body(t),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PUT",body:this.body(r),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){let a=r.state==="failure"||r.state==="error"?"failed":r.state;await this.request(`/projects/${encodeURIComponent(_n(e))}/statuses/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:a,target_url:r.url,description:r.description.slice(0,255),name:r.context??"ts-cloud/preview"})})}}class yu extends ra{provider="bitbucket";apiRoot(){return this.connection.host==="https://bitbucket.org"?"https://api.bitbucket.org/2.0":`${this.connection.host}/2.0`}async authorization(){return this.credential?.token?{Authorization:`Bearer ${this.credential.token}`}:{}}async testConnection(){let{data:e}=await this.request("/user");return{ok:!0,account:e.username??e.display_name,scopes:this.connection.grantedScopes,message:"Bitbucket connection is healthy"}}async listRepositories(e={}){if(!this.connection.owner)throw Error("Bitbucket repository discovery requires an owner/workspace");let t=_i(e.cursor),r=Ti(e.limit),a=e.search?`&q=name~%22${encodeURIComponent(e.search)}%22`:"",{data:u}=await this.request(`/repositories/${encodeURIComponent(this.connection.owner)}?pagelen=${r}&page=${t}${a}`);return{repositories:u.values.map((f)=>({providerRepositoryId:f.uuid,fullName:f.full_name,cloneUrl:f.links.clone.find((h)=>h.name==="https")?.href??f.links.clone[0]?.href??"",defaultBranch:f.mainbranch?.name??"main",visibility:f.is_private?"private":"public",archived:!1,metadata:{}})),nextCursor:u.next?String(t+1):void 0}}async refs(e,t,r={}){let a=_i(r.cursor),u=Ti(r.limit),{data:f}=await this.request(`/repositories/${_n(e)}/refs/${t}?pagelen=${u}&page=${a}`);return{refs:f.values.map((h)=>({name:h.name,commitSha:h.target.hash})),nextCursor:f.next?String(a+1):void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/repositories/${_n(e)}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:e.uuid,active:e.active,events:e.events.map((t)=>t.replace("repo:push","push").replace("pullrequest:","pull_request:")),url:e.url}}body(e){return JSON.stringify({description:"ts-cloud deploy",url:ta(e.url),active:!0,events:e.events.map((t)=>t==="push"?"repo:push":t.replace("pull_request:","pullrequest:"))})}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:this.body(t),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.values.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PUT",body:this.body(r),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){let a=r.state==="success"?"SUCCESSFUL":r.state==="pending"?"INPROGRESS":"FAILED";await this.request(`/repositories/${_n(e)}/commit/${encodeURIComponent(t)}/statuses/build/ts-cloud-preview`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:a,key:"ts-cloud-preview",name:r.context??"ts-cloud/preview",url:r.url,description:r.description.slice(0,255)})})}}class Su extends ra{provider="gitea";capabilities={...Ny,tokenRefresh:!1};apiRoot(){return`${this.connection.host}/api/v1`}async authorization(){return this.credential?.token?{Authorization:`token ${this.credential.token}`}:{}}async testConnection(){let{data:e}=await this.request("/user");return{ok:!0,account:e.login,scopes:this.connection.grantedScopes,message:"Gitea connection is healthy"}}async listRepositories(e={}){let t=_i(e.cursor),r=Ti(e.limit),a=e.search?`/repos/search?q=${encodeURIComponent(e.search)}&limit=${r}&page=${t}`:`/user/repos?limit=${r}&page=${t}`,{data:u,headers:f}=await this.request(a),h=Array.isArray(u)?u:u.data;return{repositories:h.map((b)=>({providerRepositoryId:String(b.id),fullName:b.full_name,cloneUrl:b.clone_url,defaultBranch:b.default_branch??"main",visibility:b.private?"private":"public",archived:!!b.archived,metadata:{}})),nextCursor:f.get("x-hasmore")==="true"||h.length===r?String(t+1):void 0}}async refs(e,t,r={}){let a=_i(r.cursor),u=Ti(r.limit),{data:f}=await this.request(`/repos/${_n(e)}/${t}?limit=${u}&page=${a}`);return{refs:f.map((h)=>({name:h.name,commitSha:h.commit.id})),nextCursor:f.length===u?String(a+1):void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/repos/${_n(e)}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:String(e.id),active:e.active,events:e.events??[],url:e.config.url??""}}body(e){return JSON.stringify({type:"gitea",active:!0,events:e.events,config:{url:ta(e.url),content_type:"json",secret:e.secret,insecure_ssl:"0"}})}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:this.body(t),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PATCH",body:this.body(r),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){await this.request(`/repos/${_n(e)}/statuses/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:r.state,target_url:r.url,description:r.description.slice(0,140),context:r.context??"ts-cloud/preview"})})}}function ot(e,t,r={}){switch(e.provider){case"github":return new hu(e,t,r);case"gitlab":return new Au(e,t,r);case"bitbucket":return new yu(e,t,r);case"gitea":return new Su(e,t,r);default:throw Error(`${e.provider} uses bounded Git discovery instead of a hosted provider API`)}}import{createHmac as zE,timingSafeEqual as UE}from"node:crypto";function Vr(e,t){if(e instanceof Headers)return e.get(t)??void 0;return Object.entries(e).find(([a])=>a.toLowerCase()===t.toLowerCase())?.[1]}function jy(e,t){let r=Buffer.from(e),a=Buffer.from(t);return r.length===a.length&&UE(r,a)}function qE(e,t){return zE("sha256",e).update(t).digest("hex")}function VE(e,t,r,a,u){if(e==="gitlab")return jy(Vr(r,"x-gitlab-token")??"",t);let f=e==="github"?Vr(r,"x-hub-signature-256"):e==="gitea"?Vr(r,"x-gitea-signature"):Vr(r,"x-hub-signature")??Vr(r,"x-ts-cloud-signature");if(!f)return!1;if(e==="generic_https"||e==="generic_ssh"){let h=Number(Vr(r,"x-ts-cloud-timestamp"));if(!Number.isFinite(h)||Math.abs(u.getTime()-h*1000)>300000)return!1}return jy(f.replace(/^sha256=/,""),qE(t,a))}function WE(e,t){return{github:["x-github-delivery"],gitlab:["x-gitlab-event-uuid","x-request-id"],bitbucket:["x-request-uuid"],gitea:["x-gitea-delivery"],generic_https:["x-ts-cloud-delivery"],generic_ssh:["x-ts-cloud-delivery"]}[e].map((a)=>Vr(t,a)?.trim()).find(Boolean)}function xi(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");return/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(t)?t:""}function Lp(e){return[...new Set(e.flatMap((t)=>{if(!t||typeof t!=="object")return[];let r=t;return[...r.added??[],...r.modified??[],...r.removed??[]].map(String)}).filter((t)=>t&&!t.includes("\x00")).slice(0,500))]}function Wf(e,t,r){let a=e,u=t,f=r;if(a==="github"){let h=Vr(u,"x-github-event"),b=xi(f.repository?.full_name);if(h==="push")return{event:"push",repository:b,ref:String(f.ref??""),branch:String(f.ref??"").replace(/^refs\/heads\//,""),tag:String(f.ref??"").startsWith("refs/tags/")?String(f.ref).replace(/^refs\/tags\//,""):void 0,commitSha:String(f.after??f.head_commit?.id??""),changedPaths:Lp(f.commits??[]),deleted:f.deleted===!0||/^0{40,64}$/.test(String(f.after??""))};if(h==="pull_request")return{event:"pull_request",action:String(f.action??""),repository:b,branch:String(f.pull_request?.head?.ref??""),commitSha:String(f.pull_request?.head?.sha??""),changedPaths:[],pullRequestNumber:Number(f.number)||void 0,fork:xi(f.pull_request?.head?.repo?.full_name)!==b}}if(a==="gitlab"){let h=String(f.object_kind??"").toLowerCase(),b=xi(f.project?.path_with_namespace);if(h==="push"||h==="tag_push")return{event:"push",repository:b,ref:String(f.ref??""),branch:String(f.ref??"").replace(/^refs\/heads\//,""),tag:h==="tag_push"?String(f.ref??"").replace(/^refs\/tags\//,""):void 0,commitSha:String(f.checkout_sha??f.after??""),changedPaths:Lp(f.commits??[]),deleted:/^0{40,64}$/.test(String(f.after??""))};if(h==="merge_request")return{event:"pull_request",action:String(f.object_attributes?.action??f.object_attributes?.state??""),repository:b,branch:String(f.object_attributes?.source_branch??""),commitSha:String(f.object_attributes?.last_commit?.id??""),changedPaths:[],pullRequestNumber:Number(f.object_attributes?.iid)||void 0,fork:f.object_attributes?.source_project_id!==f.object_attributes?.target_project_id}}if(a==="bitbucket"){let h=Vr(u,"x-event-key")??"",b=xi(f.repository?.full_name);if(h==="repo:push"){let S=f.push?.changes?.[0]??{},y=S.new??S.old??{},k=S.new?.target??S.old?.target;return{event:"push",repository:b,ref:String(y.name??""),branch:y.type==="branch"?String(y.name):void 0,tag:y.type==="tag"?String(y.name):void 0,commitSha:String(k?.hash??""),changedPaths:[],deleted:S.closed===!0||S.new==null}}if(h.startsWith("pullrequest:"))return{event:"pull_request",action:h.replace("pullrequest:",""),repository:b,branch:String(f.pullrequest?.source?.branch?.name??""),commitSha:String(f.pullrequest?.source?.commit?.hash??""),changedPaths:[],pullRequestNumber:Number(f.pullrequest?.id)||void 0,fork:xi(f.pullrequest?.source?.repository?.full_name)!==b}}if(a==="gitea"){let h=Vr(u,"x-gitea-event"),b=xi(f.repository?.full_name);if(h==="push")return{event:"push",repository:b,ref:String(f.ref??""),branch:String(f.ref??"").replace(/^refs\/heads\//,""),tag:String(f.ref??"").startsWith("refs/tags/")?String(f.ref).replace(/^refs\/tags\//,""):void 0,commitSha:String(f.after??""),changedPaths:Lp(f.commits??[]),deleted:f.deleted===!0||/^0{40,64}$/.test(String(f.after??""))};if(h==="pull_request")return{event:"pull_request",action:String(f.action??""),repository:b,branch:String(f.pull_request?.head?.ref??""),commitSha:String(f.pull_request?.head?.sha??""),changedPaths:[],pullRequestNumber:Number(f.number)||void 0,fork:xi(f.pull_request?.head?.repo?.full_name)!==b}}if(a==="generic_https"||a==="generic_ssh"){if(f.event!=="push"&&f.event!=="pull_request")return;return{event:f.event,action:typeof f.action==="string"?f.action:void 0,repository:xi(f.repository),ref:typeof f.ref==="string"?f.ref:void 0,branch:typeof f.branch==="string"?f.branch:void 0,tag:typeof f.tag==="string"?f.tag:void 0,commitSha:String(f.commitSha??""),changedPaths:Array.isArray(f.changedPaths)?f.changedPaths.map(String).slice(0,500):[],pullRequestNumber:Number(f.pullRequestNumber)||void 0,fork:f.fork===!0,deleted:f.deleted===!0}}return}function Zo(e,t){let r="^";for(let a=0;a<t.length;a++){let u=t[a];if(u==="*"&&t[a+1]==="*")r+=".*",a++;else if(u==="*")r+="[^/]*";else if(u==="?")r+="[^/]";else r+=u.replace(/[|\\{}()[\]^$+?.]/g,"\\$&")}return new RegExp(`${r}$`).test(e)}function HE(e,t){if(t.event==="pull_request")return e.pullRequestPreviews;if(!e.autoDeploy)return!1;if(t.tag)return!!e.tagRule&&Zo(t.tag,e.tagRule);return Zo(t.branch??"",e.branchRule??e.defaultBranch)}function KE(e,t){if(!t.length)return!0;return t.filter((a)=>!e.excludePaths.some((u)=>Zo(a,u))).some((a)=>!e.includePaths.length||e.includePaths.some((u)=>Zo(a,u)))}function By(e,t){return Vr(t,e==="github"?"x-github-event":e==="gitlab"?"x-gitlab-event":e==="bitbucket"?"x-event-key":e==="gitea"?"x-gitea-event":"x-ts-cloud-event")??"unknown"}function lo(){return{accepted:!1,duplicate:!1,status:"rejected",operations:[],message:"Webhook unavailable"}}async function Iu(e){if(e.rawBody.byteLength>2097152)return lo();let t=e.sources.getWebhookByEndpointToken(e.endpointToken);if(!t||t.status==="disabled")return lo();let r=e.sources.getConnection(t.connectionId);if(!r||r.status==="disconnected"||r.status==="expired")return lo();let a=WE(r.provider,e.headers);if(!a||a.length>200)return lo();if(!VE(r.provider,e.sources.getWebhookSecret(t.id),e.headers,e.rawBody,e.now??new Date))return e.sources.recordDelivery({connectionId:r.id,webhookId:t.id,providerDeliveryId:a,event:By(r.provider,e.headers),signatureStatus:Vr(e.headers,"x-hub-signature-256")||Vr(e.headers,"x-gitlab-token")||Vr(e.headers,"x-hub-signature")||Vr(e.headers,"x-gitea-signature")?"invalid":"missing",status:"rejected",error:"Webhook signature verification failed"}),lo();let f;try{f=JSON.parse(new TextDecoder().decode(e.rawBody))}catch{return lo()}let h=Wf(r.provider,e.headers,f);if(!h||!h.repository||!/^[a-f0-9]{7,64}$/i.test(h.commitSha))return e.sources.recordDelivery({connectionId:r.id,webhookId:t.id,providerDeliveryId:a,event:By(r.provider,e.headers),signatureStatus:"verified",status:"rejected",error:"Unsupported or malformed source event"}),lo();let b=e.sources.recordDelivery({connectionId:r.id,webhookId:t.id,providerDeliveryId:a,event:h.event,action:h.action,commitSha:h.commitSha,signatureStatus:"verified",status:"accepted",payloadSummary:{repository:h.repository,ref:h.ref??null,branch:h.branch??null,tag:h.tag??null,commitSha:h.commitSha,pullRequestNumber:h.pullRequestNumber??null,changedPathCount:h.changedPaths.length}});if(b.duplicate&&b.delivery.status!=="accepted")return{accepted:!0,duplicate:!0,status:"duplicate",operations:[],message:"Delivery already processed"};let S=new We(e.controlPlane),y=e.sources.listBindings({connectionId:r.id,status:"active"}).filter((O)=>{if(O.repositoryFullName.toLowerCase()!==h.repository.toLowerCase()||!KE(O,h.changedPaths))return!1;let M=O.resourceId?S.getDefinitionForResource(O.resourceId):void 0,z=h.event==="push"&&!!M?.branchRule&&!!h.branch&&Zo(h.branch,M.branchRule);return HE(O,h)||z});if(!y.length)return e.sources.updateDelivery(b.delivery.id,{status:"ignored"}),{accepted:!0,duplicate:b.duplicate,status:"ignored",operations:[],message:"Verified event did not match an active deployment rule"};let k=new c(e.controlPlane),R=new Set(["closed","merged","declined"]),D=y.flatMap((O)=>{if(h.event==="push"&&O.resourceId&&h.branch){let z=S.getDefinitionForResource(O.resourceId);if(z?.branchRule&&Zo(h.branch,z.branchRule)){let J=S.findForBranch(z.id,h.repository,h.branch);if(h.deleted){if(!z.cleanupOnClose||!J||J.status==="destroyed")return[];let te=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:"preview.destroy",idempotencyKey:`preview:${J.id}:branch-delete:${a}`,correlationId:`preview:${J.id}`,input:{previewId:J.id,reason:"branch_deleted",source:{repository:h.repository,commitSha:h.commitSha,branch:h.branch}},lockKey:`preview:${J.id}`,providerKey:r.provider,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(J.id,"queued",{operationId:te.id}),[te]}let Z=S.upsert({definitionId:z.id,sourceProvider:r.provider,repository:h.repository,branch:h.branch,commitSha:h.commitSha});if(!Z.changed)return[];let oe=Z.created?"preview.create":"preview.update",G=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:oe,idempotencyKey:`preview:${Z.preview.id}:${h.commitSha}`,correlationId:`preview:${Z.preview.id}`,input:{previewId:Z.preview.id,source:{connectionId:r.id,bindingId:O.id,repository:h.repository,commitSha:h.commitSha,branch:h.branch,monorepoRoot:O.monorepoRoot,submodules:O.submodules,cloneDepth:O.cloneDepth??null}},lockKey:`preview:${Z.preview.id}`,providerKey:r.provider,buildSlot:!0,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(Z.preview.id,"queued",{operationId:G.id}),[G]}}if(h.event==="pull_request"&&O.resourceId&&h.pullRequestNumber){let z=S.getDefinitionForResource(O.resourceId);if(z){let J=R.has(String(h.action??"").toLowerCase()),Z=S.findForPullRequest(z.id,h.repository,h.pullRequestNumber);if(J){if(!z.cleanupOnClose||!Z||Z.status==="destroyed")return[];let oe=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:"preview.destroy",idempotencyKey:`preview:${Z.id}:destroy:${a}`,correlationId:`preview:${Z.id}`,input:{previewId:Z.id,reason:"pull_request_closed",source:{repository:h.repository,commitSha:h.commitSha,branch:h.branch??null,pullRequestNumber:h.pullRequestNumber}},lockKey:`preview:${Z.id}`,providerKey:r.provider,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(Z.id,"queued",{operationId:oe.id}),[oe]}try{let oe=S.upsert({definitionId:z.id,sourceProvider:r.provider,repository:h.repository,branch:h.branch??`pr-${h.pullRequestNumber}`,pullRequestNumber:h.pullRequestNumber,fork:h.fork,commitSha:h.commitSha});if(!oe.changed)return[];let G=oe.created?"preview.create":"preview.update",te=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:G,idempotencyKey:`preview:${oe.preview.id}:${h.commitSha}`,correlationId:`preview:${oe.preview.id}`,input:{previewId:oe.preview.id,source:{connectionId:r.id,bindingId:O.id,repository:h.repository,commitSha:h.commitSha,branch:h.branch??null,pullRequestNumber:h.pullRequestNumber,fork:!!h.fork,monorepoRoot:O.monorepoRoot,submodules:O.submodules,cloneDepth:O.cloneDepth??null},inheritedSecretNames:oe.inheritedSecrets},lockKey:`preview:${oe.preview.id}`,providerKey:r.provider,buildSlot:!0,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(oe.preview.id,"queued",{operationId:te.id}),[te]}catch(oe){return e.controlPlane.appendEvent({projectId:O.projectId,resourceId:O.resourceId,type:"preview.rejected",level:"warning",payload:{repository:h.repository,pullRequestNumber:h.pullRequestNumber,fork:!!h.fork,reason:oe instanceof Error?oe.message:String(oe)}}),[]}}}let M=h.event==="pull_request"?"deploy.preview":"deploy.source";return[k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:M,idempotencyKey:`source:${r.id}:${a}:${O.id}:${h.commitSha}`,correlationId:`source:${a}`,input:{source:{connectionId:r.id,bindingId:O.id,repository:h.repository,commitSha:h.commitSha,branch:h.branch??null,tag:h.tag??null,monorepoRoot:O.monorepoRoot,submodules:O.submodules,cloneDepth:O.cloneDepth??null},preview:h.event==="pull_request"?{number:h.pullRequestNumber??null,action:h.action??null}:null},lockKey:O.resourceId?`resource:${O.resourceId}`:`environment:${O.environmentId??O.projectId}`,providerKey:r.provider,buildSlot:!0,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:h.event==="pull_request"?14:90}).operation]});if(!D.length)return e.sources.updateDelivery(b.delivery.id,{status:"ignored"}),{accepted:!0,duplicate:b.duplicate,status:"ignored",operations:[],message:"Verified event required no preview lifecycle change"};return e.sources.updateDelivery(b.delivery.id,{status:"enqueued",operationId:D[0]?.id}),e.controlPlane.appendEvent({organizationId:r.organizationId,projectId:y[0]?.projectId,operationId:D[0]?.id,type:"source.webhook.enqueued",payload:{webhookId:t.id,deliveryId:b.delivery.id,repository:h.repository,commitSha:h.commitSha,operationIds:D.map((O)=>O.id)}}),{accepted:!0,duplicate:b.duplicate,status:"enqueued",operations:D,message:`${D.length} deployment operation${D.length===1?"":"s"} enqueued`}}function yr(e,t){if(!t.endpointToken)throw Error("The webhook endpoint token is only available at creation time");let r=new URL(e);if(r.protocol!=="https:"&&!["localhost","127.0.0.1","::1"].includes(r.hostname))throw Error("Webhook base URL must use HTTPS");return new URL(`/api/source/webhooks/${encodeURIComponent(t.endpointToken)}`,r).href}import{chmodSync as My,mkdtempSync as JE,rmSync as GE,writeFileSync as Ly}from"node:fs";import{tmpdir as QE}from"node:os";import{join as vd,resolve as YE}from"node:path";function zy(e,t){let r=e.trim();if(/\r|\n|\0/.test(r))throw Error("Git remote contains control characters");if(r.startsWith("https://")){let u=new URL(r);if(u.username||u.password||u.search||u.hash)throw Error("HTTPS Git remotes cannot contain credentials, queries, or fragments");return u.href}let a=r.startsWith("ssh://")?new URL(r).hostname:r.match(/^git@([A-Za-z0-9.-]+):/)?.[1];if(!a)throw Error("Git remote must use credential-free HTTPS or SSH");if(!t||t.host.toLowerCase()!==a.toLowerCase())throw Error("SSH Git remote requires a deploy key with a pinned key for the same host");return r}function ZE(e,t,r){let a=e.replaceAll(t,"[REMOTE]").slice(0,4000);for(let u of[r?.token,r?.privateKey])if(u)a=a.replaceAll(u,"[REDACTED]");return a}function XE(e){let t={PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin",HOME:"/nonexistent",GIT_TERMINAL_PROMPT:"0",GIT_CONFIG_NOSYSTEM:"1",GIT_OPTIONAL_LOCKS:"0"},r;if(e.credential?.token){let a=e.credential.username??"oauth2";t.GIT_CONFIG_COUNT="1",t.GIT_CONFIG_KEY_0="http.extraHeader",t.GIT_CONFIG_VALUE_0=`Authorization: Basic ${Buffer.from(`${a}:${e.credential.token}`).toString("base64")}`}if(e.deployKey){r=JE(vd(QE(),"ts-cloud-git-transport-"));let a=vd(r,"key"),u=vd(r,"known_hosts");Ly(a,e.deployKey.privateKey,{mode:384}),Ly(u,`${e.deployKey.host} ${e.deployKey.hostKey}
77
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', ?, ?, ?)`,[r,e.projectId,e.environmentId??null,e.resourceId??null,e.connectionId,e.repositoryId??null,$p(e.repositoryFullName),e.defaultBranch?.trim()||"main",e.branchRule?.trim()||null,e.tagRule?.trim()||null,Ty(e.monorepoRoot??"."),ei(yd(e.includePaths)),ei(yd(e.excludePaths)),e.submodules?1:0,e.cloneDepth??null,e.deployKeyId??null,e.autoDeploy===!1?0:1,e.pullRequestPreviews===!1?0:1,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:t.organizationId,projectId:e.projectId,actorId:e.actorId,type:"source.binding.created",payload:{bindingId:r,connectionId:e.connectionId,repository:e.repositoryFullName,branch:e.defaultBranch??"main"}}),this.getBinding(r)}getBinding(e){let t=this.controlPlane.database.query("SELECT * FROM source_bindings WHERE id = ?").get(e);return t?xy(t):void 0}listBindings(e={}){return this.controlPlane.database.query("SELECT * FROM source_bindings ORDER BY created_at DESC").all().map(xy).filter((r)=>(!e.connectionId||r.connectionId===e.connectionId)&&(!e.projectId||r.projectId===e.projectId)&&(!e.status||r.status===e.status))}updateBinding(e,t,r){let a=this.getBinding(e);if(!a||a.version!==t)throw Error(`Source binding ${e} changed since version ${t}`);let u=this.getConnection(a.connectionId);if((!u||["disconnected","expired"].includes(u.status))&&(r.status==="active"||r.autoDeploy===!0))throw Error("Rotate or reconnect the source credential before enabling this binding");if(r.deployKeyId&&this.getDeployKey(r.deployKeyId)?.connectionId!==a.connectionId)throw Error("Deploy key does not belong to this connection");let f=this.now();if(this.controlPlane.database.run("UPDATE source_bindings SET default_branch=?, branch_rule=?, tag_rule=?, monorepo_root=?, include_paths=?, exclude_paths=?, submodules=?, clone_depth=?, deploy_key_id=?, auto_deploy=?, pull_request_previews=?, status=?, disabled_reason=?, version=version+1, updated_at=? WHERE id=? AND version=?",[r.defaultBranch?.trim()||a.defaultBranch,r.branchRule===void 0?a.branchRule??null:r.branchRule.trim()||null,r.tagRule===void 0?a.tagRule??null:r.tagRule.trim()||null,r.monorepoRoot===void 0?a.monorepoRoot:Ty(r.monorepoRoot),ei(r.includePaths===void 0?a.includePaths:yd(r.includePaths)),ei(r.excludePaths===void 0?a.excludePaths:yd(r.excludePaths)),r.submodules??a.submodules?1:0,r.cloneDepth===void 0?a.cloneDepth??null:r.cloneDepth,r.deployKeyId===void 0?a.deployKeyId??null:r.deployKeyId,r.autoDeploy??a.autoDeploy?1:0,r.pullRequestPreviews??a.pullRequestPreviews?1:0,r.status??a.status,r.disabledReason===void 0?a.disabledReason??null:r.disabledReason.slice(0,1000),f,e,t]).changes!==1)throw Error(`Source binding ${e} changed since version ${t}`);let b=this.getConnection(a.connectionId);return this.controlPlane.appendEvent({organizationId:b.organizationId,projectId:a.projectId,actorId:r.actorId,type:"source.binding.updated",payload:{bindingId:e,fromVersion:t,toVersion:t+1,status:r.status??a.status}}),this.getBinding(e)}createWebhook(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status))throw Error("Active source connection was not found");if(e.repositoryId&&this.getRepository(e.repositoryId)?.connectionId!==t.id)throw Error("Repository does not belong to this connection");let r=this.idFn(),a=this.now(),u=e.endpointToken??Op(24).toString("base64url"),f=e.secret??Op(32).toString("base64url"),h=[...new Set(e.events??["push","pull_request"])].filter((b)=>["push","pull_request"].includes(b));if(!h.length)throw Error("At least one supported webhook event is required");return this.run("INSERT INTO source_webhooks (id, connection_id, repository_id, repository_full_name, endpoint_token_hash, endpoint_token_ciphertext, secret_ciphertext, events, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?)",[r,e.connectionId,e.repositoryId??null,$p(e.repositoryFullName),ao(u),this.encrypt(u),this.encrypt(f),ei(h),a,a]),this.controlPlane.appendEvent({organizationId:t.organizationId,type:"source.webhook.created",payload:{webhookId:r,connectionId:t.id,repository:e.repositoryFullName,events:h}}),{webhook:{...this.getWebhook(r),endpointToken:u},secret:f}}getWebhook(e){let t=this.controlPlane.database.query("SELECT * FROM source_webhooks WHERE id = ?").get(e);return t?Bp(t):void 0}getWebhookByEndpointToken(e){let t=this.controlPlane.database.query("SELECT * FROM source_webhooks WHERE endpoint_token_hash = ?").get(ao(e));return t?Bp(t):void 0}getWebhookSecret(e){let t=this.controlPlane.database.query("SELECT secret_ciphertext FROM source_webhooks WHERE id = ?").get(e);if(!t)throw Error("Source webhook was not found");return this.decrypt(String(t.secret_ciphertext))}getWebhookEndpointToken(e){let t=this.controlPlane.database.query("SELECT endpoint_token_ciphertext FROM source_webhooks WHERE id = ?").get(e);if(!t?.endpoint_token_ciphertext)throw Error("Source webhook endpoint token is unavailable");return this.decrypt(String(t.endpoint_token_ciphertext))}listWebhooks(e){return this.controlPlane.database.query("SELECT * FROM source_webhooks WHERE connection_id = ? ORDER BY repository_full_name").all(e).map(Bp)}updateWebhookState(e,t){let r=this.getWebhook(e);if(!r)throw Error("Source webhook was not found");let a=this.now();this.run("UPDATE source_webhooks SET provider_webhook_id=COALESCE(?, provider_webhook_id), status=?, health_message=?, last_reconciled_at=COALESCE(?, last_reconciled_at), updated_at=? WHERE id=?",[t.providerWebhookId??null,t.status,t.healthMessage?.slice(0,1000)??null,t.reconciled?a:null,a,e]);let u=this.getConnection(r.connectionId);if(u)this.controlPlane.appendEvent({organizationId:u.organizationId,type:"source.webhook.updated",payload:{webhookId:e,connectionId:u.id,repository:r.repositoryFullName,status:t.status,reconciled:t.reconciled??!1,providerWebhookId:t.providerWebhookId??r.providerWebhookId??null}});return this.getWebhook(e)}getDeliveryByProviderId(e,t){let r=this.controlPlane.database.query("SELECT * FROM source_webhook_deliveries WHERE connection_id = ? AND provider_delivery_id = ?").get(e,t);return r?Mp(r):void 0}recordDelivery(e){let t=this.getDeliveryByProviderId(e.connectionId,e.providerDeliveryId);if(t)return{delivery:t,duplicate:!0};let r=this.idFn(),a=this.now();return this.controlPlane.database.transaction(()=>{this.run("INSERT INTO source_webhook_deliveries (id, connection_id, webhook_id, provider_delivery_id, event, action, commit_sha, signature_status, status, payload_summary, operation_id, error, received_at, processed_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.connectionId,e.webhookId,e.providerDeliveryId,e.event.slice(0,100),e.action?.slice(0,100)??null,e.commitSha?.slice(0,128)??null,e.signatureStatus,e.status,ei(e.payloadSummary??{}),e.operationId??null,e.error?.slice(0,2000)??null,a,["enqueued","ignored","rejected","failed"].includes(e.status)?a:null]),this.run("UPDATE source_webhooks SET last_delivery_at=?, updated_at=? WHERE id=?",[a,a,e.webhookId])})(),{delivery:this.getDeliveryByProviderId(e.connectionId,e.providerDeliveryId),duplicate:!1}}updateDelivery(e,t){this.run("UPDATE source_webhook_deliveries SET status=?, operation_id=?, error=?, processed_at=? WHERE id=?",[t.status,t.operationId??null,t.error?.slice(0,2000)??null,this.now(),e]);let r=this.controlPlane.database.query("SELECT * FROM source_webhook_deliveries WHERE id = ?").get(e);if(!r)throw Error("Source webhook delivery was not found");return Mp(r)}listDeliveries(e,t=100){return this.controlPlane.database.query("SELECT * FROM source_webhook_deliveries WHERE webhook_id = ? ORDER BY received_at DESC LIMIT ?").all(e,Math.min(500,Math.max(1,t))).map(Mp)}disconnectConnection(e,t){let r=this.getConnection(e);if(!r)throw Error("Source connection was not found");let a=this.listBindings({connectionId:e,status:"active"}),u=this.now();return this.controlPlane.database.transaction(()=>{this.run("UPDATE source_connections SET status='disconnected', credential_ciphertext=NULL, health_message='Disconnected by an administrator', version=version+1, updated_at=? WHERE id=?",[u,e]),this.run("UPDATE source_bindings SET status='disabled', auto_deploy=0, disabled_reason='Source connection was disconnected', version=version+1, updated_at=? WHERE connection_id=? AND status='active'",[u,e]),this.run("UPDATE source_webhooks SET status='disabled', health_message='Source connection was disconnected', updated_at=? WHERE connection_id=?",[u,e])})(),this.controlPlane.appendEvent({organizationId:r.organizationId,actorId:t,type:"source.connection.disconnected",level:"warning",payload:{connectionId:e,affectedBindingIds:a.map((f)=>f.id),affectedRepositories:a.map((f)=>f.repositoryFullName)}}),{connection:this.getConnection(e),affectedBindings:a}}}import{createSign as LE}from"node:crypto";class Ar extends Error{status;retryAfterSeconds;constructor(e,t,r){super(e);this.status=t;this.retryAfterSeconds=r;this.name="SourceProviderError"}}var Ny={repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0};function _i(e){let t=Number(e??"1");return Number.isInteger(t)&&t>0?t:1}function Ti(e){return Math.max(1,Math.min(100,e??50))}function _n(e){let t=e.trim().replace(/^\/+|\/+$/g,"");if(!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(t))throw Error("Repository must use owner/name format");return t}function ta(e){let t=new URL(e);if(t.username||t.password||t.protocol!=="https:")throw Error("Webhook endpoint must be credential-free HTTPS");return t.href}function $y(e){return Buffer.from(e).toString("base64url")}function FE(e,t){if(!e.appId||!e.privateKey)throw Error("GitHub App credentials require appId and privateKey");let r=$y(JSON.stringify({alg:"RS256",typ:"JWT"})),a=Math.floor(t.getTime()/1000)-30,u=$y(JSON.stringify({iat:a,exp:a+540,iss:e.appId})),f=LE("RSA-SHA256");return f.update(`${r}.${u}`),f.end(),`${r}.${u}.${f.sign(e.privateKey).toString("base64url")}`}class ra{connection;credential;capabilities=Ny;fetchFn;timeoutMs;nowFn;constructor(e,t,r={}){this.connection=e;this.credential=t;this.fetchFn=r.fetch??((a,u)=>globalThis.fetch(a,u)),this.timeoutMs=Math.max(100,r.timeoutMs??20000),this.nowFn=r.now??(()=>new Date)}async request(e,t={}){let r=new URL(`${this.apiRoot().replace(/\/$/,"")}/`),a=new URL(e.replace(/^\//,""),r);if(a.origin!==r.origin)throw Error("Provider pagination cannot leave the configured host");let u=new AbortController,f=setTimeout(()=>u.abort(),this.timeoutMs);try{let h=await this.fetchFn(a,{...t,redirect:"error",signal:u.signal,headers:{Accept:"application/json","User-Agent":"ts-cloud-source/1",...await this.authorization(),...t.headers}});if(!h.ok){let b=Number(h.headers.get("retry-after")??""),S=h.headers.get("x-request-id")??h.headers.get("x-github-request-id");throw new Ar(`Source provider request failed (${h.status})${S?` [request ${S}]`:""}`,h.status,Number.isFinite(b)?b:void 0)}if(h.status===204)return{data:void 0,headers:h.headers};return{data:await h.json(),headers:h.headers}}catch(h){if(h instanceof Ar)throw h;if(u.signal.aborted)throw new Ar(`Source provider request exceeded ${this.timeoutMs}ms`);throw new Ar(h instanceof Error?h.message.replace(/(?:token|password|secret)=[^\s&]+/gi,"$1=[REDACTED]"):"Source provider request failed")}finally{clearTimeout(f)}}async deleteWebhook(e,t){await this.request(this.webhookPath(e,t),{method:"DELETE"})}}class hu extends ra{provider="github";installationToken;apiRoot(){return this.connection.host==="https://github.com"?"https://api.github.com":`${this.connection.host}/api/v3`}async authorization(){if(this.credential?.token)return{Authorization:`Bearer ${this.credential.token}`,"X-GitHub-Api-Version":"2022-11-28"};if(!this.credential?.installationId)return{};if(!this.installationToken||this.installationToken.expiresAt<this.nowFn().getTime()+60000){let e=FE(this.credential,this.nowFn()),t=this.apiRoot().replace(/\/$/,""),r=new AbortController,a=setTimeout(()=>r.abort(),this.timeoutMs);try{let u=await this.fetchFn(`${t}/app/installations/${encodeURIComponent(this.credential.installationId)}/access_tokens`,{method:"POST",signal:r.signal,redirect:"error",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"X-GitHub-Api-Version":"2022-11-28","User-Agent":"ts-cloud-source/1"}});if(!u.ok)throw new Ar(`GitHub App token refresh failed (${u.status})`,u.status);let f=await u.json();this.installationToken={value:f.token,expiresAt:new Date(f.expires_at).getTime()}}finally{clearTimeout(a)}}return{Authorization:`Bearer ${this.installationToken.value}`,"X-GitHub-Api-Version":"2022-11-28"}}async testConnection(){let e=this.credential?.installationId?"/installation/repositories?per_page=1":"/user",{data:t,headers:r}=await this.request(e);return{ok:!0,account:t.login??this.connection.owner,scopes:(r.get("x-oauth-scopes")??this.connection.grantedScopes.join(",")).split(",").map((a)=>a.trim()).filter(Boolean),message:"GitHub connection is healthy"}}async listRepositories(e={}){let t=Ti(e.limit),r=_i(e.cursor),a=this.credential?.installationId?`/installation/repositories?per_page=${t}&page=${r}`:`/user/repos?per_page=${t}&page=${r}&sort=updated`,{data:u}=await this.request(a),f=Array.isArray(u)?u:u.repositories;return{repositories:(e.search?f.filter((b)=>b.full_name.toLowerCase().includes(e.search.toLowerCase())):f).map((b)=>({providerRepositoryId:String(b.id),fullName:b.full_name,cloneUrl:b.clone_url,defaultBranch:b.default_branch||"main",visibility:b.visibility??(b.private?"private":"public"),archived:!!b.archived,metadata:{}})),nextCursor:f.length===t?String(r+1):void 0}}async refs(e,t,r={}){let a=Ti(r.limit),u=_i(r.cursor),{data:f}=await this.request(`/repos/${_n(e)}/${t}?per_page=${a}&page=${u}`);return{refs:f.map((h)=>({name:h.name,commitSha:h.commit.sha,protected:h.protected})),nextCursor:f.length===a?String(u+1):void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/repos/${_n(e)}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:String(e.id),active:e.active,events:e.events,url:e.config.url??""}}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:JSON.stringify({name:"web",active:!0,events:t.events,config:{url:ta(t.url),content_type:"json",secret:t.secret,insecure_ssl:"0"}}),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PATCH",body:JSON.stringify({active:!0,events:r.events,config:{url:ta(r.url),content_type:"json",secret:r.secret,insecure_ssl:"0"}}),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){await this.request(`/repos/${_n(e)}/statuses/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:r.state,target_url:r.url,description:r.description.slice(0,140),context:r.context??"ts-cloud/preview"})})}}class Au extends ra{provider="gitlab";apiRoot(){return`${this.connection.host}/api/v4`}async authorization(){return this.credential?.token?{"PRIVATE-TOKEN":this.credential.token}:{}}async testConnection(){let{data:e}=await this.request("/user");return{ok:!0,account:e.username,scopes:this.connection.grantedScopes,message:"GitLab connection is healthy"}}async listRepositories(e={}){let t=Ti(e.limit),r=_i(e.cursor),a=e.search?`&search=${encodeURIComponent(e.search)}`:"",{data:u,headers:f}=await this.request(`/projects?membership=true&simple=true&order_by=last_activity_at&per_page=${t}&page=${r}${a}`);return{repositories:u.map((h)=>({providerRepositoryId:String(h.id),fullName:h.path_with_namespace,cloneUrl:h.http_url_to_repo,defaultBranch:h.default_branch??"main",visibility:h.visibility??"unknown",archived:!!h.archived,metadata:{}})),nextCursor:f.get("x-next-page")||void 0}}async refs(e,t,r={}){let a=Ti(r.limit),u=_i(r.cursor),{data:f,headers:h}=await this.request(`/projects/${encodeURIComponent(_n(e))}/repository/${t}?per_page=${a}&page=${u}`);return{refs:f.map((b)=>({name:b.name,commitSha:b.commit.id,protected:b.protected})),nextCursor:h.get("x-next-page")||void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/projects/${encodeURIComponent(_n(e))}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:String(e.id),active:!0,events:[...e.push_events?["push"]:[],...e.merge_requests_events?["pull_request"]:[]],url:e.url}}body(e){return JSON.stringify({url:ta(e.url),token:e.secret,enable_ssl_verification:!0,push_events:e.events.includes("push"),merge_requests_events:e.events.includes("pull_request")})}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:this.body(t),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PUT",body:this.body(r),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){let a=r.state==="failure"||r.state==="error"?"failed":r.state;await this.request(`/projects/${encodeURIComponent(_n(e))}/statuses/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:a,target_url:r.url,description:r.description.slice(0,255),name:r.context??"ts-cloud/preview"})})}}class yu extends ra{provider="bitbucket";apiRoot(){return this.connection.host==="https://bitbucket.org"?"https://api.bitbucket.org/2.0":`${this.connection.host}/2.0`}async authorization(){return this.credential?.token?{Authorization:`Bearer ${this.credential.token}`}:{}}async testConnection(){let{data:e}=await this.request("/user");return{ok:!0,account:e.username??e.display_name,scopes:this.connection.grantedScopes,message:"Bitbucket connection is healthy"}}async listRepositories(e={}){if(!this.connection.owner)throw Error("Bitbucket repository discovery requires an owner/workspace");let t=_i(e.cursor),r=Ti(e.limit),a=e.search?`&q=name~%22${encodeURIComponent(e.search)}%22`:"",{data:u}=await this.request(`/repositories/${encodeURIComponent(this.connection.owner)}?pagelen=${r}&page=${t}${a}`);return{repositories:u.values.map((f)=>({providerRepositoryId:f.uuid,fullName:f.full_name,cloneUrl:f.links.clone.find((h)=>h.name==="https")?.href??f.links.clone[0]?.href??"",defaultBranch:f.mainbranch?.name??"main",visibility:f.is_private?"private":"public",archived:!1,metadata:{}})),nextCursor:u.next?String(t+1):void 0}}async refs(e,t,r={}){let a=_i(r.cursor),u=Ti(r.limit),{data:f}=await this.request(`/repositories/${_n(e)}/refs/${t}?pagelen=${u}&page=${a}`);return{refs:f.values.map((h)=>({name:h.name,commitSha:h.target.hash})),nextCursor:f.next?String(a+1):void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/repositories/${_n(e)}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:e.uuid,active:e.active,events:e.events.map((t)=>t.replace("repo:push","push").replace("pullrequest:","pull_request:")),url:e.url}}body(e){return JSON.stringify({description:"ts-cloud deploy",url:ta(e.url),active:!0,events:e.events.map((t)=>t==="push"?"repo:push":t.replace("pull_request:","pullrequest:"))})}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:this.body(t),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.values.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PUT",body:this.body(r),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){let a=r.state==="success"?"SUCCESSFUL":r.state==="pending"?"INPROGRESS":"FAILED";await this.request(`/repositories/${_n(e)}/commit/${encodeURIComponent(t)}/statuses/build/ts-cloud-preview`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:a,key:"ts-cloud-preview",name:r.context??"ts-cloud/preview",url:r.url,description:r.description.slice(0,255)})})}}class Su extends ra{provider="gitea";capabilities={...Ny,tokenRefresh:!1};apiRoot(){return`${this.connection.host}/api/v1`}async authorization(){return this.credential?.token?{Authorization:`token ${this.credential.token}`}:{}}async testConnection(){let{data:e}=await this.request("/user");return{ok:!0,account:e.login,scopes:this.connection.grantedScopes,message:"Gitea connection is healthy"}}async listRepositories(e={}){let t=_i(e.cursor),r=Ti(e.limit),a=e.search?`/repos/search?q=${encodeURIComponent(e.search)}&limit=${r}&page=${t}`:`/user/repos?limit=${r}&page=${t}`,{data:u,headers:f}=await this.request(a),h=Array.isArray(u)?u:u.data;return{repositories:h.map((b)=>({providerRepositoryId:String(b.id),fullName:b.full_name,cloneUrl:b.clone_url,defaultBranch:b.default_branch??"main",visibility:b.private?"private":"public",archived:!!b.archived,metadata:{}})),nextCursor:f.get("x-hasmore")==="true"||h.length===r?String(t+1):void 0}}async refs(e,t,r={}){let a=_i(r.cursor),u=Ti(r.limit),{data:f}=await this.request(`/repos/${_n(e)}/${t}?limit=${u}&page=${a}`);return{refs:f.map((h)=>({name:h.name,commitSha:h.commit.id})),nextCursor:f.length===u?String(a+1):void 0}}listBranches(e,t){return this.refs(e,"branches",t)}listTags(e,t){return this.refs(e,"tags",t)}webhookPath(e,t){return`/repos/${_n(e)}/hooks${t?`/${encodeURIComponent(t)}`:""}`}hook(e){return{providerWebhookId:String(e.id),active:e.active,events:e.events??[],url:e.config.url??""}}body(e){return JSON.stringify({type:"gitea",active:!0,events:e.events,config:{url:ta(e.url),content_type:"json",secret:e.secret,insecure_ssl:"0"}})}async createWebhook(e,t){let{data:r}=await this.request(this.webhookPath(e),{method:"POST",body:this.body(t),headers:{"Content-Type":"application/json"}});return this.hook(r)}async listWebhooks(e){let{data:t}=await this.request(this.webhookPath(e));return t.map((r)=>this.hook(r))}async updateWebhook(e,t,r){let{data:a}=await this.request(this.webhookPath(e,t),{method:"PATCH",body:this.body(r),headers:{"Content-Type":"application/json"}});return this.hook(a)}async setCommitStatus(e,t,r){await this.request(`/repos/${_n(e)}/statuses/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({state:r.state,target_url:r.url,description:r.description.slice(0,140),context:r.context??"ts-cloud/preview"})})}}function ot(e,t,r={}){switch(e.provider){case"github":return new hu(e,t,r);case"gitlab":return new Au(e,t,r);case"bitbucket":return new yu(e,t,r);case"gitea":return new Su(e,t,r);default:throw Error(`${e.provider} uses bounded Git discovery instead of a hosted provider API`)}}import{createHmac as zE,timingSafeEqual as UE}from"node:crypto";function Vr(e,t){if(e instanceof Headers)return e.get(t)??void 0;return Object.entries(e).find(([a])=>a.toLowerCase()===t.toLowerCase())?.[1]}function jy(e,t){let r=Buffer.from(e),a=Buffer.from(t);return r.length===a.length&&UE(r,a)}function qE(e,t){return zE("sha256",e).update(t).digest("hex")}function VE(e,t,r,a,u){if(e==="gitlab")return jy(Vr(r,"x-gitlab-token")??"",t);let f=e==="github"?Vr(r,"x-hub-signature-256"):e==="gitea"?Vr(r,"x-gitea-signature"):Vr(r,"x-hub-signature")??Vr(r,"x-ts-cloud-signature");if(!f)return!1;if(e==="generic_https"||e==="generic_ssh"){let h=Number(Vr(r,"x-ts-cloud-timestamp"));if(!Number.isFinite(h)||Math.abs(u.getTime()-h*1000)>300000)return!1}return jy(f.replace(/^sha256=/,""),qE(t,a))}function WE(e,t){return{github:["x-github-delivery"],gitlab:["x-gitlab-event-uuid","x-request-id"],bitbucket:["x-request-uuid"],gitea:["x-gitea-delivery"],generic_https:["x-ts-cloud-delivery"],generic_ssh:["x-ts-cloud-delivery"]}[e].map((a)=>Vr(t,a)?.trim()).find(Boolean)}function xi(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");return/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(t)?t:""}function Lp(e){return[...new Set(e.flatMap((t)=>{if(!t||typeof t!=="object")return[];let r=t;return[...r.added??[],...r.modified??[],...r.removed??[]].map(String)}).filter((t)=>t&&!t.includes("\x00")).slice(0,500))]}function Jf(e,t,r){let a=e,u=t,f=r;if(a==="github"){let h=Vr(u,"x-github-event"),b=xi(f.repository?.full_name);if(h==="push")return{event:"push",repository:b,ref:String(f.ref??""),branch:String(f.ref??"").replace(/^refs\/heads\//,""),tag:String(f.ref??"").startsWith("refs/tags/")?String(f.ref).replace(/^refs\/tags\//,""):void 0,commitSha:String(f.after??f.head_commit?.id??""),changedPaths:Lp(f.commits??[]),deleted:f.deleted===!0||/^0{40,64}$/.test(String(f.after??""))};if(h==="pull_request")return{event:"pull_request",action:String(f.action??""),repository:b,branch:String(f.pull_request?.head?.ref??""),commitSha:String(f.pull_request?.head?.sha??""),changedPaths:[],pullRequestNumber:Number(f.number)||void 0,fork:xi(f.pull_request?.head?.repo?.full_name)!==b}}if(a==="gitlab"){let h=String(f.object_kind??"").toLowerCase(),b=xi(f.project?.path_with_namespace);if(h==="push"||h==="tag_push")return{event:"push",repository:b,ref:String(f.ref??""),branch:String(f.ref??"").replace(/^refs\/heads\//,""),tag:h==="tag_push"?String(f.ref??"").replace(/^refs\/tags\//,""):void 0,commitSha:String(f.checkout_sha??f.after??""),changedPaths:Lp(f.commits??[]),deleted:/^0{40,64}$/.test(String(f.after??""))};if(h==="merge_request")return{event:"pull_request",action:String(f.object_attributes?.action??f.object_attributes?.state??""),repository:b,branch:String(f.object_attributes?.source_branch??""),commitSha:String(f.object_attributes?.last_commit?.id??""),changedPaths:[],pullRequestNumber:Number(f.object_attributes?.iid)||void 0,fork:f.object_attributes?.source_project_id!==f.object_attributes?.target_project_id}}if(a==="bitbucket"){let h=Vr(u,"x-event-key")??"",b=xi(f.repository?.full_name);if(h==="repo:push"){let S=f.push?.changes?.[0]??{},y=S.new??S.old??{},k=S.new?.target??S.old?.target;return{event:"push",repository:b,ref:String(y.name??""),branch:y.type==="branch"?String(y.name):void 0,tag:y.type==="tag"?String(y.name):void 0,commitSha:String(k?.hash??""),changedPaths:[],deleted:S.closed===!0||S.new==null}}if(h.startsWith("pullrequest:"))return{event:"pull_request",action:h.replace("pullrequest:",""),repository:b,branch:String(f.pullrequest?.source?.branch?.name??""),commitSha:String(f.pullrequest?.source?.commit?.hash??""),changedPaths:[],pullRequestNumber:Number(f.pullrequest?.id)||void 0,fork:xi(f.pullrequest?.source?.repository?.full_name)!==b}}if(a==="gitea"){let h=Vr(u,"x-gitea-event"),b=xi(f.repository?.full_name);if(h==="push")return{event:"push",repository:b,ref:String(f.ref??""),branch:String(f.ref??"").replace(/^refs\/heads\//,""),tag:String(f.ref??"").startsWith("refs/tags/")?String(f.ref).replace(/^refs\/tags\//,""):void 0,commitSha:String(f.after??""),changedPaths:Lp(f.commits??[]),deleted:f.deleted===!0||/^0{40,64}$/.test(String(f.after??""))};if(h==="pull_request")return{event:"pull_request",action:String(f.action??""),repository:b,branch:String(f.pull_request?.head?.ref??""),commitSha:String(f.pull_request?.head?.sha??""),changedPaths:[],pullRequestNumber:Number(f.number)||void 0,fork:xi(f.pull_request?.head?.repo?.full_name)!==b}}if(a==="generic_https"||a==="generic_ssh"){if(f.event!=="push"&&f.event!=="pull_request")return;return{event:f.event,action:typeof f.action==="string"?f.action:void 0,repository:xi(f.repository),ref:typeof f.ref==="string"?f.ref:void 0,branch:typeof f.branch==="string"?f.branch:void 0,tag:typeof f.tag==="string"?f.tag:void 0,commitSha:String(f.commitSha??""),changedPaths:Array.isArray(f.changedPaths)?f.changedPaths.map(String).slice(0,500):[],pullRequestNumber:Number(f.pullRequestNumber)||void 0,fork:f.fork===!0,deleted:f.deleted===!0}}return}function Zo(e,t){let r="^";for(let a=0;a<t.length;a++){let u=t[a];if(u==="*"&&t[a+1]==="*")r+=".*",a++;else if(u==="*")r+="[^/]*";else if(u==="?")r+="[^/]";else r+=u.replace(/[|\\{}()[\]^$+?.]/g,"\\$&")}return new RegExp(`${r}$`).test(e)}function HE(e,t){if(t.event==="pull_request")return e.pullRequestPreviews;if(!e.autoDeploy)return!1;if(t.tag)return!!e.tagRule&&Zo(t.tag,e.tagRule);return Zo(t.branch??"",e.branchRule??e.defaultBranch)}function KE(e,t){if(!t.length)return!0;return t.filter((a)=>!e.excludePaths.some((u)=>Zo(a,u))).some((a)=>!e.includePaths.length||e.includePaths.some((u)=>Zo(a,u)))}function By(e,t){return Vr(t,e==="github"?"x-github-event":e==="gitlab"?"x-gitlab-event":e==="bitbucket"?"x-event-key":e==="gitea"?"x-gitea-event":"x-ts-cloud-event")??"unknown"}function lo(){return{accepted:!1,duplicate:!1,status:"rejected",operations:[],message:"Webhook unavailable"}}async function Iu(e){if(e.rawBody.byteLength>2097152)return lo();let t=e.sources.getWebhookByEndpointToken(e.endpointToken);if(!t||t.status==="disabled")return lo();let r=e.sources.getConnection(t.connectionId);if(!r||r.status==="disconnected"||r.status==="expired")return lo();let a=WE(r.provider,e.headers);if(!a||a.length>200)return lo();if(!VE(r.provider,e.sources.getWebhookSecret(t.id),e.headers,e.rawBody,e.now??new Date))return e.sources.recordDelivery({connectionId:r.id,webhookId:t.id,providerDeliveryId:a,event:By(r.provider,e.headers),signatureStatus:Vr(e.headers,"x-hub-signature-256")||Vr(e.headers,"x-gitlab-token")||Vr(e.headers,"x-hub-signature")||Vr(e.headers,"x-gitea-signature")?"invalid":"missing",status:"rejected",error:"Webhook signature verification failed"}),lo();let f;try{f=JSON.parse(new TextDecoder().decode(e.rawBody))}catch{return lo()}let h=Jf(r.provider,e.headers,f);if(!h||!h.repository||!/^[a-f0-9]{7,64}$/i.test(h.commitSha))return e.sources.recordDelivery({connectionId:r.id,webhookId:t.id,providerDeliveryId:a,event:By(r.provider,e.headers),signatureStatus:"verified",status:"rejected",error:"Unsupported or malformed source event"}),lo();let b=e.sources.recordDelivery({connectionId:r.id,webhookId:t.id,providerDeliveryId:a,event:h.event,action:h.action,commitSha:h.commitSha,signatureStatus:"verified",status:"accepted",payloadSummary:{repository:h.repository,ref:h.ref??null,branch:h.branch??null,tag:h.tag??null,commitSha:h.commitSha,pullRequestNumber:h.pullRequestNumber??null,changedPathCount:h.changedPaths.length}});if(b.duplicate&&b.delivery.status!=="accepted")return{accepted:!0,duplicate:!0,status:"duplicate",operations:[],message:"Delivery already processed"};let S=new We(e.controlPlane),y=e.sources.listBindings({connectionId:r.id,status:"active"}).filter((O)=>{if(O.repositoryFullName.toLowerCase()!==h.repository.toLowerCase()||!KE(O,h.changedPaths))return!1;let M=O.resourceId?S.getDefinitionForResource(O.resourceId):void 0,z=h.event==="push"&&!!M?.branchRule&&!!h.branch&&Zo(h.branch,M.branchRule);return HE(O,h)||z});if(!y.length)return e.sources.updateDelivery(b.delivery.id,{status:"ignored"}),{accepted:!0,duplicate:b.duplicate,status:"ignored",operations:[],message:"Verified event did not match an active deployment rule"};let k=new c(e.controlPlane),R=new Set(["closed","merged","declined"]),D=y.flatMap((O)=>{if(h.event==="push"&&O.resourceId&&h.branch){let z=S.getDefinitionForResource(O.resourceId);if(z?.branchRule&&Zo(h.branch,z.branchRule)){let J=S.findForBranch(z.id,h.repository,h.branch);if(h.deleted){if(!z.cleanupOnClose||!J||J.status==="destroyed")return[];let te=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:"preview.destroy",idempotencyKey:`preview:${J.id}:branch-delete:${a}`,correlationId:`preview:${J.id}`,input:{previewId:J.id,reason:"branch_deleted",source:{repository:h.repository,commitSha:h.commitSha,branch:h.branch}},lockKey:`preview:${J.id}`,providerKey:r.provider,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(J.id,"queued",{operationId:te.id}),[te]}let Z=S.upsert({definitionId:z.id,sourceProvider:r.provider,repository:h.repository,branch:h.branch,commitSha:h.commitSha});if(!Z.changed)return[];let oe=Z.created?"preview.create":"preview.update",G=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:oe,idempotencyKey:`preview:${Z.preview.id}:${h.commitSha}`,correlationId:`preview:${Z.preview.id}`,input:{previewId:Z.preview.id,source:{connectionId:r.id,bindingId:O.id,repository:h.repository,commitSha:h.commitSha,branch:h.branch,monorepoRoot:O.monorepoRoot,submodules:O.submodules,cloneDepth:O.cloneDepth??null}},lockKey:`preview:${Z.preview.id}`,providerKey:r.provider,buildSlot:!0,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(Z.preview.id,"queued",{operationId:G.id}),[G]}}if(h.event==="pull_request"&&O.resourceId&&h.pullRequestNumber){let z=S.getDefinitionForResource(O.resourceId);if(z){let J=R.has(String(h.action??"").toLowerCase()),Z=S.findForPullRequest(z.id,h.repository,h.pullRequestNumber);if(J){if(!z.cleanupOnClose||!Z||Z.status==="destroyed")return[];let oe=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:"preview.destroy",idempotencyKey:`preview:${Z.id}:destroy:${a}`,correlationId:`preview:${Z.id}`,input:{previewId:Z.id,reason:"pull_request_closed",source:{repository:h.repository,commitSha:h.commitSha,branch:h.branch??null,pullRequestNumber:h.pullRequestNumber}},lockKey:`preview:${Z.id}`,providerKey:r.provider,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(Z.id,"queued",{operationId:oe.id}),[oe]}try{let oe=S.upsert({definitionId:z.id,sourceProvider:r.provider,repository:h.repository,branch:h.branch??`pr-${h.pullRequestNumber}`,pullRequestNumber:h.pullRequestNumber,fork:h.fork,commitSha:h.commitSha});if(!oe.changed)return[];let G=oe.created?"preview.create":"preview.update",te=k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:G,idempotencyKey:`preview:${oe.preview.id}:${h.commitSha}`,correlationId:`preview:${oe.preview.id}`,input:{previewId:oe.preview.id,source:{connectionId:r.id,bindingId:O.id,repository:h.repository,commitSha:h.commitSha,branch:h.branch??null,pullRequestNumber:h.pullRequestNumber,fork:!!h.fork,monorepoRoot:O.monorepoRoot,submodules:O.submodules,cloneDepth:O.cloneDepth??null},inheritedSecretNames:oe.inheritedSecrets},lockKey:`preview:${oe.preview.id}`,providerKey:r.provider,buildSlot:!0,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return S.transition(oe.preview.id,"queued",{operationId:te.id}),[te]}catch(oe){return e.controlPlane.appendEvent({projectId:O.projectId,resourceId:O.resourceId,type:"preview.rejected",level:"warning",payload:{repository:h.repository,pullRequestNumber:h.pullRequestNumber,fork:!!h.fork,reason:oe instanceof Error?oe.message:String(oe)}}),[]}}}let M=h.event==="pull_request"?"deploy.preview":"deploy.source";return[k.enqueue({projectId:O.projectId,environmentId:O.environmentId,resourceId:O.resourceId,kind:M,idempotencyKey:`source:${r.id}:${a}:${O.id}:${h.commitSha}`,correlationId:`source:${a}`,input:{source:{connectionId:r.id,bindingId:O.id,repository:h.repository,commitSha:h.commitSha,branch:h.branch??null,tag:h.tag??null,monorepoRoot:O.monorepoRoot,submodules:O.submodules,cloneDepth:O.cloneDepth??null},preview:h.event==="pull_request"?{number:h.pullRequestNumber??null,action:h.action??null}:null},lockKey:O.resourceId?`resource:${O.resourceId}`:`environment:${O.environmentId??O.projectId}`,providerKey:r.provider,buildSlot:!0,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:h.event==="pull_request"?14:90}).operation]});if(!D.length)return e.sources.updateDelivery(b.delivery.id,{status:"ignored"}),{accepted:!0,duplicate:b.duplicate,status:"ignored",operations:[],message:"Verified event required no preview lifecycle change"};return e.sources.updateDelivery(b.delivery.id,{status:"enqueued",operationId:D[0]?.id}),e.controlPlane.appendEvent({organizationId:r.organizationId,projectId:y[0]?.projectId,operationId:D[0]?.id,type:"source.webhook.enqueued",payload:{webhookId:t.id,deliveryId:b.delivery.id,repository:h.repository,commitSha:h.commitSha,operationIds:D.map((O)=>O.id)}}),{accepted:!0,duplicate:b.duplicate,status:"enqueued",operations:D,message:`${D.length} deployment operation${D.length===1?"":"s"} enqueued`}}function yr(e,t){if(!t.endpointToken)throw Error("The webhook endpoint token is only available at creation time");let r=new URL(e);if(r.protocol!=="https:"&&!["localhost","127.0.0.1","::1"].includes(r.hostname))throw Error("Webhook base URL must use HTTPS");return new URL(`/api/source/webhooks/${encodeURIComponent(t.endpointToken)}`,r).href}import{chmodSync as My,mkdtempSync as JE,rmSync as GE,writeFileSync as Ly}from"node:fs";import{tmpdir as QE}from"node:os";import{join as vd,resolve as YE}from"node:path";function zy(e,t){let r=e.trim();if(/\r|\n|\0/.test(r))throw Error("Git remote contains control characters");if(r.startsWith("https://")){let u=new URL(r);if(u.username||u.password||u.search||u.hash)throw Error("HTTPS Git remotes cannot contain credentials, queries, or fragments");return u.href}let a=r.startsWith("ssh://")?new URL(r).hostname:r.match(/^git@([A-Za-z0-9.-]+):/)?.[1];if(!a)throw Error("Git remote must use credential-free HTTPS or SSH");if(!t||t.host.toLowerCase()!==a.toLowerCase())throw Error("SSH Git remote requires a deploy key with a pinned key for the same host");return r}function ZE(e,t,r){let a=e.replaceAll(t,"[REMOTE]").slice(0,4000);for(let u of[r?.token,r?.privateKey])if(u)a=a.replaceAll(u,"[REDACTED]");return a}function XE(e){let t={PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin",HOME:"/nonexistent",GIT_TERMINAL_PROMPT:"0",GIT_CONFIG_NOSYSTEM:"1",GIT_OPTIONAL_LOCKS:"0"},r;if(e.credential?.token){let a=e.credential.username??"oauth2";t.GIT_CONFIG_COUNT="1",t.GIT_CONFIG_KEY_0="http.extraHeader",t.GIT_CONFIG_VALUE_0=`Authorization: Basic ${Buffer.from(`${a}:${e.credential.token}`).toString("base64")}`}if(e.deployKey){r=JE(vd(QE(),"ts-cloud-git-transport-"));let a=vd(r,"key"),u=vd(r,"known_hosts");Ly(a,e.deployKey.privateKey,{mode:384}),Ly(u,`${e.deployKey.host} ${e.deployKey.hostKey}
78
78
  `,{mode:384}),My(a,384),My(u,384),t.GIT_SSH_COMMAND=`ssh -i ${a} -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=${u} -o GlobalKnownHostsFile=/dev/null -o BatchMode=yes`}return{env:t,cleanup:()=>{if(r)GE(r,{recursive:!0,force:!0})}}}async function uo(e,t,r){let a=XE(r),u=Bun.spawn([r.executable??"git",...e],{stdout:"pipe",stderr:"pipe",env:a.env}),f=Math.max(100,r.timeoutMs??120000),h,b=new Promise((S,y)=>{h=setTimeout(()=>{u.kill(),y(Error(`Git operation exceeded ${f}ms`))},f)});try{let S=Promise.all([u.exited,new Response(u.stdout).text(),new Response(u.stderr).text()]),[y,k,R]=await Promise.race([S,b]);if(y!==0)throw Error(ZE(R||`Git exited with ${y}`,t,r.credential));return k}finally{if(h)clearTimeout(h);a.cleanup()}}function Fy(e,t){let r=new Map;for(let a of e.split(`
79
79
  `)){let u=a.trim().match(/^([a-f0-9]{40,64})\s+(.+)$/i);if(!u||!u[2].startsWith(t)||u[2].endsWith("^{}"))continue;let f=u[2].slice(t.length);r.set(f,{name:f,commitSha:u[1]})}return[...r.values()].sort((a,u)=>a.name.localeCompare(u.name))}async function Aa(e,t={}){let r=zy(e,t.deployKey),a=await uo(["ls-remote","--heads","--tags","--",r],r,t);return{branches:Fy(a,"refs/heads/"),tags:Fy(a,"refs/tags/")}}async function ya(e,t={}){let r=zy(e.remote,t.deployKey),a=YE(e.destination),u=e.ref?.trim()||e.binding.defaultBranch;if(!/^[A-Za-z0-9._/-]{1,255}$/.test(u)||u.startsWith("-")||u.includes(".."))throw Error("Git ref contains unsupported characters");let f=["clone","--no-tags","--single-branch","--branch",u],h=[...new Set(e.sparsePaths??[])];if(h.some((S)=>!S||S.startsWith("/")||S.split("/").includes("..")||/[\0\r\n]/.test(S)))throw Error("Sparse checkout paths must stay inside the repository");if(h.length)f.push("--filter=blob:none","--no-checkout");if(e.binding.cloneDepth)f.push("--depth",String(e.binding.cloneDepth));if(e.binding.submodules)f.push("--recurse-submodules","--shallow-submodules");if(f.push("--",r,a),await uo(f,r,t),h.length)await uo(["-C",a,"sparse-checkout","set","--cone","--",...h],r,t),await uo(["-C",a,"checkout","--force"],r,t);if(e.commitSha){if(!/^[a-f0-9]{40,64}$/i.test(e.commitSha))throw Error("Expected source commit must be an immutable 40-64 character SHA");await uo(["-C",a,"fetch","--no-tags","--depth","1","origin",e.commitSha],r,t),await uo(["-C",a,"checkout","--detach","--force",e.commitSha],r,t)}let b=(await uo(["-C",a,"rev-parse","HEAD"],r,t)).trim();if(!/^[a-f0-9]{40,64}$/i.test(b))throw Error("Git clone did not produce a valid commit SHA");if(e.commitSha&&b.toLowerCase()!==e.commitSha.toLowerCase())throw Error(`Git checkout resolved ${b} instead of the requested immutable commit`);return{directory:e.binding.monorepoRoot==="."?a:vd(a,e.binding.monorepoRoot),commitSha:b}}function na(e){return["github","gitlab","bitbucket","gitea"].includes(e)}async function Sa(e,t,r){let a=e.getConnection(t);if(!a||["disconnected","expired"].includes(a.status))throw Error("Active source connection was not found");try{if(na(a.provider)){let h=await ot(a,e.getCredential(a.id)).testConnection();return e.updateHealth(a.id,{status:h.ok?"healthy":"degraded",message:h.message,tested:!0,grantedScopes:h.scopes})}let u=r?e.getRepository(r):e.listRepositories(a.id,void 0,1)[0];if(!u)return e.updateHealth(a.id,{status:"degraded",message:"Add a repository URL before testing this generic connection.",tested:!0});let f=a.provider==="generic_ssh"?e.listBindings({connectionId:a.id}).map((h)=>h.deployKeyId).filter(Boolean).map((h)=>e.getDeployKey(h)).find(Boolean):void 0;return await Aa(u.cloneUrl,{credential:e.getCredential(a.id),deployKey:f?{...f,privateKey:e.getDeployPrivateKey(f.id)}:void 0}),e.updateHealth(a.id,{status:"healthy",message:"Git repository access is healthy.",tested:!0})}catch(u){return e.updateHealth(a.id,{status:"degraded",message:u instanceof Error?u.message:"Connection test failed",tested:!0})}}async function gs(e,t,r={}){let a=e.getConnection(t);if(!a||!na(a.provider)||["disconnected","expired"].includes(a.status))throw Error("A hosted active source connection is required for repository discovery");let u=ot(a,e.getCredential(a.id)),f=[],h;for(let b=0;b<Math.min(20,Math.max(1,r.maxPages??10));b++){let S=await u.listRepositories({cursor:h,search:r.search,limit:100});for(let y of S.repositories)f.push(e.upsertRepository({connectionId:a.id,...y}));if(h=S.nextCursor,!h)break}return e.updateHealth(a.id,{status:"healthy",message:`${f.length} repositories synchronized.`,synced:!0}),f}async function ps(e,t){let r=e.getConnection(t.connectionId);if(!r||["disconnected","expired"].includes(r.status))throw Error("Active source connection was not found");if(na(r.provider)){let b=ot(r,e.getCredential(r.id));return t.type==="tags"?b.listTags(t.repository,t):b.listBranches(t.repository,t)}let a=t.repositoryId?e.getRepository(t.repositoryId):e.listRepositories(r.id).find((b)=>b.fullName===t.repository);if(!a||a.connectionId!==r.id)throw Error("Generic repository metadata was not found");let u=t.deployKeyId?e.getDeployKey(t.deployKeyId):void 0;if(u&&u.connectionId!==r.id)throw Error("Deploy key does not belong to this connection");let f=await Aa(a.cloneUrl,{credential:e.getCredential(r.id),deployKey:u?{...u,privateKey:e.getDeployPrivateKey(u.id)}:void 0});return{refs:(t.type==="tags"?f.tags:f.branches).slice(0,Math.min(500,t.limit??100))}}async function In(e,t,r){let a=e.getWebhook(t),u=a?e.getConnection(a.connectionId):void 0;if(!a||!u||["disconnected","expired"].includes(u.status))throw Error("Active source webhook was not found");let f=yr(r,{...a,endpointToken:e.getWebhookEndpointToken(a.id)});if(!na(u.provider))return e.updateWebhookState(a.id,{status:"healthy",healthMessage:"Manual webhook endpoint is ready.",reconciled:!0});try{let h=ot(u,e.getCredential(u.id)),b=e.getWebhookSecret(a.id),S=a.providerWebhookId?await h.updateWebhook(a.repositoryFullName,a.providerWebhookId,{url:f,secret:b,events:a.events}):await h.createWebhook(a.repositoryFullName,{url:f,secret:b,events:a.events});return e.updateWebhookState(a.id,{providerWebhookId:S.providerWebhookId,status:S.active?"healthy":"degraded",healthMessage:S.active?"Provider webhook is synchronized.":"Provider webhook exists but is inactive.",reconciled:!0})}catch(h){return e.updateWebhookState(a.id,{status:"degraded",healthMessage:h instanceof Error?h.message:"Webhook reconciliation failed",reconciled:!0})}}async function bu(e,t){let r=e.getWebhook(t),a=r?e.getConnection(r.connectionId):void 0;if(!r||!a)throw Error("Source webhook was not found");if(na(a.provider)&&r.providerWebhookId&&!["disconnected","expired"].includes(a.status))await ot(a,e.getCredential(a.id)).deleteWebhook(r.repositoryFullName,r.providerWebhookId);return e.updateWebhookState(r.id,{status:"disabled",healthMessage:"Webhook disabled."})}var ms="1.6.0";function Ia(){let e={type:"object",required:["error"],properties:{error:{type:"object",required:["code","message","requestId"],properties:{code:{type:"string"},message:{type:"string"},requestId:{type:"string",format:"uuid"},details:{}}}}},t=(a)=>({type:"object",required:["data","page","requestId"],properties:{data:{type:"array",items:a},page:{type:"object",required:["hasMore"],properties:{nextCursor:{type:"string"},hasMore:{type:"boolean"}}},requestId:{type:"string",format:"uuid"}}}),r=(a)=>({"200":{description:"A stable cursor page.",content:{"application/json":{schema:t(a)}}},default:{$ref:"#/components/responses/Error"}});return{openapi:"3.1.0",info:{title:"ts-cloud API",version:ms,description:"Additive changes are released within v1. Breaking request or response changes require a new URL version."},servers:[{url:"/"}],security:[{bearerAuth:[]}],paths:{...Uo(),"/api/v1/projects":{get:{operationId:"listProjects",summary:"List accessible projects",parameters:[{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/Project"})}},"/api/v1/projects/{projectId}/environments":{get:{operationId:"listEnvironments",summary:"List accessible project environments",parameters:[{$ref:"#/components/parameters/ProjectId"},{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/Environment"})}},"/api/v1/services":{get:{operationId:"listServices",summary:"List accessible services",parameters:[{name:"projectId",in:"query",required:!0,schema:{type:"string"}},{name:"environmentId",in:"query",schema:{type:"string"}},{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/Service"})}},"/api/v1/source/connections":{get:{operationId:"listSourceConnections",summary:"List safe Git connection metadata",parameters:[{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/SourceConnection"})},post:{operationId:"createSourceConnection",summary:"Create an encrypted Git connection",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",required:["provider","name","host"],properties:{provider:{type:"string",enum:["github","gitlab","bitbucket","gitea","generic_https","generic_ssh"]},name:{type:"string"},host:{type:"string",format:"uri"},token:{type:"string",writeOnly:!0},repositoryFullName:{type:"string"},repositoryUrl:{type:"string"}}}}}},responses:{"201":{description:"Encrypted connection created."},default:{$ref:"#/components/responses/Error"}}},delete:{operationId:"disconnectSourceConnection",summary:"Preview or safely disconnect a Git connection",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",required:["id"],properties:{id:{type:"string"},preview:{type:"boolean"}}}}}},responses:{"200":{description:"Impact preview or disconnected connection."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/source/repositories":{get:{operationId:"listSourceRepositories",summary:"List or synchronize granted repositories",parameters:[{name:"connectionId",in:"query",required:!0,schema:{type:"string"}},{name:"sync",in:"query",schema:{type:"boolean"}},{name:"search",in:"query",schema:{type:"string"}},{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/SourceRepository"})}},"/api/v1/source/refs":{get:{operationId:"listSourceRefs",summary:"List repository branches or tags",parameters:[{name:"connectionId",in:"query",required:!0,schema:{type:"string"}},{name:"repository",in:"query",required:!0,schema:{type:"string"}},{name:"repositoryId",in:"query",schema:{type:"string"}},{name:"type",in:"query",schema:{type:"string",enum:["branches","tags"]}}],responses:{"200":{description:"Provider reference page."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/source/bindings":{post:{operationId:"createSourceBinding",summary:"Bind a repository to an application",requestBody:{required:!0,content:{"application/json":{schema:{$ref:"#/components/schemas/SourceBindingRequest"}}}},responses:{"201":{description:"Source binding created."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/source/webhooks":{post:{operationId:"createSourceWebhook",summary:"Create and optionally reconcile a signed webhook",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",required:["connectionId","repositoryFullName","baseUrl"],properties:{connectionId:{type:"string"},repositoryId:{type:"string"},repositoryFullName:{type:"string"},baseUrl:{type:"string",format:"uri"},events:{type:"array",items:{type:"string",enum:["push","pull_request"]}},reconcile:{type:"boolean"}}}}}},responses:{"201":{description:"Webhook endpoint created; endpoint is revealed once."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/application-detections":{post:{operationId:"detectApplication",summary:"Detect bounded application build candidates",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",required:["files"],properties:{files:{type:"array",maxItems:1e4,items:{$ref:"#/components/schemas/DetectionFile"}}}}}}},responses:{"200":{description:"Ranked detection candidates with evidence."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/application-plans":{post:{operationId:"planApplication",summary:"Validate and normalize an application manifest",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",required:["draft"],properties:{draft:{$ref:"#/components/schemas/ApplicationInput"},suppliedSecretNames:{type:"array",uniqueItems:!0,items:{type:"string"}}}}}}},responses:{"200":{description:"Validated plan, config patch, capabilities, costs, and missing secret names."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/application-drafts":{get:{operationId:"listApplicationDrafts",summary:"List resumable secret-free drafts",parameters:[{name:"projectId",in:"query",required:!0,schema:{type:"string"}},{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/ApplicationDraft"})},post:{operationId:"createApplicationDraft",summary:"Create a resumable application draft",requestBody:{required:!0,content:{"application/json":{schema:{$ref:"#/components/schemas/ApplicationDraftCreateRequest"}}}},responses:{"201":{description:"Draft created."},default:{$ref:"#/components/responses/Error"}}},patch:{operationId:"updateApplicationDraft",summary:"Optimistically update a draft",requestBody:{required:!0,content:{"application/json":{schema:{allOf:[{$ref:"#/components/schemas/ApplicationDraftCreateRequest"},{type:"object",required:["id","version","step"],properties:{id:{type:"string"},version:{type:"integer",minimum:1}}}]}}}},responses:{"200":{description:"Updated draft."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/applications":{post:{operationId:"createApplication",summary:"Confirm and queue an application plan",parameters:[{name:"Idempotency-Key",in:"header",required:!0,schema:{type:"string",minLength:8,maxLength:128}}],requestBody:{required:!0,content:{"application/json":{schema:{type:"object",additionalProperties:!1,required:["draftId","version","confirmEnvironment"],properties:{draftId:{type:"string"},version:{type:"integer",minimum:1},confirmEnvironment:{type:"string",description:"Exact target environment slug."}}}}}},responses:{"202":{description:"Application operation queued; identical requests replay safely."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/application-artifacts":{post:{operationId:"uploadApplicationArtifact",summary:"Inspect and store a bounded ZIP or TAR source artifact",parameters:[{name:"X-Project-Id",in:"header",required:!0,schema:{type:"string"}},{name:"X-Artifact-Filename",in:"header",required:!0,schema:{type:"string"}}],requestBody:{required:!0,content:{"application/octet-stream":{schema:{type:"string",format:"binary",maxLength:104857600}}}},responses:{"201":{description:"Deduplicated artifact metadata; archive contents are never executed."},"413":{$ref:"#/components/responses/Error"},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/registry-connections":{get:{operationId:"listRegistryConnections",summary:"List safe private-registry metadata",parameters:[{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/RegistryConnection"})},post:{operationId:"createRegistryConnection",summary:"Create an encrypted private-registry connection",requestBody:{required:!0,content:{"application/json":{schema:{$ref:"#/components/schemas/RegistryConnectionRequest"}}}},responses:{"201":{description:"Encrypted registry connection created."},default:{$ref:"#/components/responses/Error"}}},patch:{operationId:"updateRegistryConnection",summary:"Test access or rotate write-only credentials",requestBody:{required:!0,content:{"application/json":{schema:{allOf:[{$ref:"#/components/schemas/RegistryConnectionRequest"},{type:"object",required:["id","action"],properties:{id:{type:"string"},action:{type:"string",enum:["test","rotate"]},image:{type:"string"}}}]}}}},responses:{"200":{description:"Safe connection health metadata."},default:{$ref:"#/components/responses/Error"}}},delete:{operationId:"disconnectRegistryConnection",summary:"Disconnect and erase registry credentials",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",additionalProperties:!1,required:["id"],properties:{id:{type:"string"}}}}}},responses:{"200":{description:"Credentials erased and connection disconnected."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/queue":{get:{operationId:"listQueue",summary:"List authorized durable operations and blocking metadata",parameters:[{name:"projectId",in:"query",schema:{type:"string"}},{name:"state",in:"query",schema:{type:"string",enum:["queued","running","succeeded","failed","cancelled","timed_out"]}},{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/QueueOperation"})}},"/api/v1/preview-definitions":{get:{operationId:"listPreviewDefinitions",summary:"List preview policies",responses:r({type:"object"})},post:{operationId:"createPreviewDefinition",summary:"Configure bounded preview policy",responses:{"200":{description:"Preview definition created."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/previews":{get:{operationId:"listPreviews",summary:"List authorized persistent previews",responses:r({type:"object"})},post:{operationId:"createPreview",summary:"Create or update one immutable preview identity",responses:{"200":{description:"Preview deployment queued."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/previews/{previewId}/destroy":{post:{operationId:"destroyPreview",summary:"Confirm tagged preview teardown",responses:{"200":{description:"Teardown queued."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/previews/{previewId}/extend":{post:{operationId:"extendPreview",summary:"Extend preview TTL",responses:{"200":{description:"Expiry extended."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/previews/{previewId}/rebuild":{post:{operationId:"rebuildPreview",summary:"Rebuild the exact recorded commit",responses:{"200":{description:"Rebuild queued."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/previews/cleanup":{post:{operationId:"cleanupPreviews",summary:"Dry-run or queue TTL/keep-count teardown",responses:{"200":{description:"Cleanup plan or operations."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/compose-templates":{get:{operationId:"listComposeTemplates",summary:"List pinned verified application templates",responses:r({type:"object"})}},"/api/v1/compose-applications":{get:{operationId:"listComposeApplications",summary:"List authorized multi-service applications",responses:r({type:"object"})},post:{operationId:"createComposeApplication",summary:"Import Compose or materialize a template",responses:{"200":{description:"Editable normalized application."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/compose-applications/preview":{post:{operationId:"previewComposeApplication",summary:"Parse and diagnose Compose without mutation",responses:{"200":{description:"Normalized preview and actionable diagnostics."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/compose-applications/{applicationId}/services":{get:{operationId:"listComposeServices",summary:"Inspect per-service desired and observed state",responses:{"200":{description:"Service topology and status."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/compose-applications/{applicationId}/{action}":{post:{operationId:"operateComposeApplication",summary:"Deploy, redeploy, start, stop, scale, or delete through the durable queue",responses:{"200":{description:"Scoped operation queued."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/release-artifacts":{post:{operationId:"createReleaseArtifact",summary:"Register a verified content-addressed artifact",responses:{"200":{description:"Artifact identity registered."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/releases":{get:{operationId:"listReleases",summary:"List unified authorized release history",responses:r({type:"object"})},post:{operationId:"createRelease",summary:"Create an immutable release from an existing artifact",responses:{"200":{description:"Release record created."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/releases/capabilities":{get:{operationId:"getReleaseCapabilities",summary:"Explain supported strategies, capacity, cost, and rollback",responses:{"200":{description:"Provider-aware strategy capabilities."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/releases/{releaseId}":{get:{operationId:"getRelease",summary:"Inspect provenance, approvals, health, and transitions",responses:{"200":{description:"Release detail."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/releases/{releaseId}/{action}":{post:{operationId:"operateRelease",summary:"Promote, approve, activate, roll back, report health, or pin",responses:{"200":{description:"Release lifecycle updated."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/queue/settings":{get:{operationId:"getQueueSettings",summary:"Get effective concurrency limits",responses:{"200":{description:"Queue concurrency settings."},default:{$ref:"#/components/responses/Error"}}},patch:{operationId:"updateQueueSettings",summary:"Confirm and audit production concurrency changes",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",additionalProperties:!1,required:["confirm","concurrency"],properties:{confirm:{const:"update queue limits"},concurrency:{$ref:"#/components/schemas/QueueConcurrency"}}}}}},responses:{"200":{description:"Updated effective limits."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/queue/history":{delete:{operationId:"clearQueueHistory",summary:"Clear terminal jobs whose retention has elapsed",requestBody:{required:!0,content:{"application/json":{schema:{type:"object",additionalProperties:!1,required:["confirm"],properties:{confirm:{const:"clear completed"},before:{type:"string",format:"date-time"},projectId:{type:"string"}}}}}},responses:{"200":{description:"Eligible history cleared with an audit event."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/operations/{operationId}/logs":{get:{operationId:"listOperationLogs",summary:"Resume ordered sanitized operation logs from a cursor",parameters:[{$ref:"#/components/parameters/OperationId"},{name:"after",in:"query",schema:{type:"integer",minimum:0}},{$ref:"#/components/parameters/Limit"}],responses:{"200":{description:"Ordered log chunks and next cursor."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/operations/{operationId}/logs/stream":{get:{operationId:"streamOperationLogs",summary:"Stream authorized operation logs with Last-Event-ID resume",parameters:[{$ref:"#/components/parameters/OperationId"},{name:"Last-Event-ID",in:"header",schema:{type:"integer",minimum:0}}],responses:{"200":{description:"Server-sent log and completion events.",content:{"text/event-stream":{schema:{type:"string"}}}},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/operations/{operationId}/cancel":{post:{operationId:"cancelOperation",summary:"Cancel queued work or request cooperative running cancellation",parameters:[{$ref:"#/components/parameters/OperationId"}],requestBody:{content:{"application/json":{schema:{type:"object"}}}},responses:{"200":{description:"Cancellation state recorded."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/operations/{operationId}/retry":{post:{operationId:"retryOperation",summary:"Retry an allow-listed failure class within the attempt limit",parameters:[{$ref:"#/components/parameters/OperationId"}],requestBody:{required:!0,content:{"application/json":{schema:{type:"object",additionalProperties:!1,required:["errorClass"],properties:{errorClass:{type:"string"},delayMs:{type:"integer",minimum:0}}}}}},responses:{"200":{description:"Retry queued."},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/deployments":{post:{operationId:"createDeployment",summary:"Queue a deployment",parameters:[{name:"Idempotency-Key",in:"header",required:!0,schema:{type:"string",minLength:8,maxLength:128}}],requestBody:{required:!0,content:{"application/json":{schema:{$ref:"#/components/schemas/DeploymentRequest"}}}},responses:{"202":{description:"Queued operation.",content:{"application/json":{schema:{$ref:"#/components/schemas/OperationResponse"}}}},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/operations":{get:{operationId:"listOperations",summary:"List scoped operations",parameters:[{name:"projectId",in:"query",schema:{type:"string"}},{$ref:"#/components/parameters/Limit"},{$ref:"#/components/parameters/Cursor"}],responses:r({$ref:"#/components/schemas/Operation"})}},"/api/v1/events":{get:{operationId:"listEvents",summary:"List scoped audit events",parameters:[{name:"projectId",in:"query",schema:{type:"string"}},{name:"after",in:"query",schema:{type:"integer",minimum:0}},{$ref:"#/components/parameters/Limit"}],responses:r({$ref:"#/components/schemas/Event"})}},"/api/v1/events/stream":{get:{operationId:"streamEvents",summary:"Stream scoped audit events",responses:{"200":{description:"Authenticated server-sent event stream.",content:{"text/event-stream":{schema:{type:"string"}}}},default:{$ref:"#/components/responses/Error"}}}},"/api/v1/openapi.json":{get:{operationId:"getOpenApi",summary:"Get the OpenAPI contract",security:[],responses:{"200":{description:"OpenAPI 3.1 contract."}}}}},components:{securitySchemes:{bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"tsc_v1"}},parameters:{Limit:{name:"limit",in:"query",schema:{type:"integer",minimum:1,maximum:100,default:50}},Cursor:{name:"cursor",in:"query",schema:{type:"string"}},ProjectId:{name:"projectId",in:"path",required:!0,schema:{type:"string"}},OperationId:{name:"operationId",in:"path",required:!0,schema:{type:"string"}}},responses:{Error:{description:"Stable error envelope.",content:{"application/json":{schema:e}}}},schemas:{Project:{type:"object",required:["id","slug","name"],properties:{id:{type:"string"},slug:{type:"string"},name:{type:"string"},description:{type:"string"}}},Environment:{type:"object",required:["id","projectId","slug","name","kind"],properties:{id:{type:"string"},projectId:{type:"string"},slug:{type:"string"},name:{type:"string"},kind:{type:"string"},region:{type:"string"}}},Service:{type:"object",required:["id","projectId","kind","slug","name"],properties:{id:{type:"string"},projectId:{type:"string"},environmentId:{type:"string"},kind:{type:"string"},slug:{type:"string"},name:{type:"string"},metadata:{type:"object",additionalProperties:!0}}},SourceConnection:{type:"object",required:["id","provider","name","host","status","credentialConfigured"],properties:{id:{type:"string"},provider:{type:"string"},name:{type:"string"},host:{type:"string"},status:{type:"string"},credentialConfigured:{type:"boolean"},credentialFingerprint:{type:"string"},grantedScopes:{type:"array",items:{type:"string"}}}},SourceRepository:{type:"object",required:["id","connectionId","fullName","cloneUrl","defaultBranch"],properties:{id:{type:"string"},connectionId:{type:"string"},fullName:{type:"string"},cloneUrl:{type:"string"},defaultBranch:{type:"string"},visibility:{type:"string"},archived:{type:"boolean"}}},SourceBindingRequest:{type:"object",additionalProperties:!1,required:["projectId","connectionId","repositoryFullName"],properties:{projectId:{type:"string"},environmentId:{type:"string"},resourceId:{type:"string"},connectionId:{type:"string"},repositoryId:{type:"string"},repositoryFullName:{type:"string"},defaultBranch:{type:"string"},branchRule:{type:"string"},tagRule:{type:"string"},monorepoRoot:{type:"string"},includePaths:{type:"array",items:{type:"string"}},excludePaths:{type:"array",items:{type:"string"}},submodules:{type:"boolean"},cloneDepth:{type:"integer",minimum:1},deployKeyId:{type:"string"},autoDeploy:{type:"boolean"},pullRequestPreviews:{type:"boolean"}}},DetectionFile:{type:"object",additionalProperties:!1,required:["path"],properties:{path:{type:"string"},size:{type:"integer",minimum:0},content:{type:"string",maxLength:262144}}},ApplicationInput:{type:"object",additionalProperties:!1,required:["schemaVersion","name","slug","projectId","environmentId","source","build","runtime"],properties:{schemaVersion:{const:1},name:{type:"string"},slug:{type:"string"},projectId:{type:"string"},environmentId:{type:"string"},source:{type:"object",required:["kind"],properties:{kind:{type:"string",enum:["git","local","artifact","image"]}},additionalProperties:!0},build:{type:"object",required:["kind"],properties:{kind:{type:"string",enum:["dockerfile","buildpack","static","server","serverless","prebuilt_image"]},secretNames:{type:"array",uniqueItems:!0,items:{type:"string"}}},additionalProperties:!0},runtime:{type:"object",required:["architecture","target"],properties:{architecture:{type:"string",enum:["x86_64","arm64"]},target:{type:"string",enum:["server","serverless","container"]},port:{type:"integer",minimum:1,maximum:65535},healthCheck:{type:"object",additionalProperties:!0}},additionalProperties:!0},environment:{type:"object",additionalProperties:{oneOf:[{type:"string"},{type:"object",additionalProperties:!1,required:["secretRef"],properties:{secretRef:{type:"string"}}}]}},requiredSecretNames:{type:"array",uniqueItems:!0,items:{type:"string"}},domain:{type:"object",properties:{hostname:{type:"string"},path:{type:"string"},tls:{type:"boolean"}}}}},ApplicationDraftCreateRequest:{type:"object",additionalProperties:!1,required:["projectId","draft"],properties:{projectId:{type:"string"},name:{type:"string"},draft:{$ref:"#/components/schemas/ApplicationInput"},step:{type:"string",enum:["source","build","runtime","environment","domain","review"]},suppliedSecretNames:{type:"array",uniqueItems:!0,description:"Names only; values must use the secrets boundary.",items:{type:"string"}}}},ApplicationDraft:{type:"object",required:["id","projectId","input","step","status","version"],properties:{id:{type:"string"},projectId:{type:"string"},input:{$ref:"#/components/schemas/ApplicationInput"},step:{type:"string"},suppliedSecretNames:{type:"array",items:{type:"string"}},status:{type:"string",enum:["draft","ready","applied"]},version:{type:"integer"},createdAt:{type:"string",format:"date-time"},updatedAt:{type:"string",format:"date-time"}}},RegistryConnectionRequest:{type:"object",properties:{provider:{type:"string",enum:["docker_hub","ghcr","ecr","gcr","generic"]},name:{type:"string"},host:{type:"string"},username:{type:"string",writeOnly:!0},password:{type:"string",writeOnly:!0},token:{type:"string",writeOnly:!0},credentialExpiresAt:{type:"string",format:"date-time"},expiresAt:{type:"string",format:"date-time"}}},RegistryConnection:{type:"object",required:["id","provider","name","host","credentialConfigured","status","version"],properties:{id:{type:"string"},provider:{type:"string"},name:{type:"string"},host:{type:"string"},credentialConfigured:{type:"boolean"},credentialFingerprint:{type:"string"},credentialExpiresAt:{type:"string",format:"date-time"},status:{type:"string",enum:["pending","healthy","degraded","expired","disconnected"]},healthMessage:{type:"string"},lastTestedAt:{type:"string",format:"date-time"},version:{type:"integer"}}},QueueConcurrency:{type:"object",additionalProperties:!1,properties:{project:{type:"integer",minimum:1,maximum:100},environment:{type:"integer",minimum:1,maximum:100},provider:{type:"integer",minimum:1,maximum:100},builds:{type:"integer",minimum:1,maximum:100}}},QueueOperation:{allOf:[{$ref:"#/components/schemas/Operation"},{type:"object",required:["queue"],properties:{queue:{type:"object",required:["maxAttempts","availableAt","timeoutSeconds","retryClasses","resumePolicy","cancellationMode","retentionUntil"],properties:{lockKey:{type:"string"},providerKey:{type:"string"},buildSlot:{type:"boolean"},maxAttempts:{type:"integer"},availableAt:{type:"string",format:"date-time"},timeoutSeconds:{type:"integer"},heartbeatAt:{type:"string",format:"date-time"},currentStep:{type:"string"},blockedReason:{type:"string"},retryClasses:{type:"array",items:{type:"string"}},resumePolicy:{type:"string",enum:["fail","requeue"]},cancellationMode:{type:"string",enum:["cooperative","provider_non_cancellable"]},retentionUntil:{type:"string",format:"date-time"}}},approximatePosition:{type:"object",properties:{ahead:{type:"integer"},precision:{const:"bounded"}}}}}]},DeploymentRequest:{type:"object",additionalProperties:!1,required:["projectId","environmentId"],properties:{projectId:{type:"string"},environmentId:{type:"string"},serviceId:{type:"string"},action:{type:"string",enum:["deploy","rollback"],default:"deploy"},revision:{type:"string"}}},Operation:{type:"object",required:["id","state","kind","correlationId","createdAt"],properties:{id:{type:"string"},state:{type:"string"},kind:{type:"string"},correlationId:{type:"string"},createdAt:{type:"string",format:"date-time"}}},OperationResponse:{type:"object",required:["operation","idempotentReplay","requestId"],properties:{operation:{$ref:"#/components/schemas/Operation"},idempotentReplay:{type:"boolean"},requestId:{type:"string",format:"uuid"}}},Event:{type:"object",required:["id","sequence","type","level","correlationId","createdAt"],properties:{id:{type:"string"},sequence:{type:"integer"},type:{type:"string"},level:{type:"string"},correlationId:{type:"string"},payload:{},createdAt:{type:"string",format:"date-time"}}}}}}}function tR(e){return Buffer.from(JSON.stringify(e)).toString("base64url")}function rR(e){if(!e)return;try{let t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"));return t&&typeof t==="object"&&!Array.isArray(t)?t:void 0}catch{return}}function Kr(e,t,r,a=["createdAt","id"]){let u=Math.min(100,Math.max(1,Number(t.searchParams.get("limit"))||50)),f=rR(t.searchParams.get("cursor"));if(t.searchParams.has("cursor")&&!f)throw new i("invalid_cursor","The pagination cursor is invalid.",400);let h=0;if(f){let k=e.findIndex((R)=>a.every((D)=>R[D]===f[D]));if(k<0)throw new i("invalid_cursor","The pagination cursor is no longer available.",400);h=k+1}let b=e.slice(h,h+u),S=h+u<e.length,y=b.at(-1);return{data:b,page:{hasMore:S,nextCursor:S&&y?tR(Object.fromEntries(a.map((k)=>[k,y[k]]))):void 0},requestId:r}}function ba(e){let t=new Ki(e.controlPlane,e.identities),r=new c(e.controlPlane),a=new Jr(e.controlPlane),u=new Yr(e.controlPlane),f=new xt(e.controlPlane),h=e.spend?.store??new Fi(e.controlPlane,{now:e.now}),b={store:h,service:e.spend?.service??new ar(h)},S=new Map,y=e.now??(()=>new Date),k=e.rateLimit??120,R=(O,M,z,J={})=>new Response(JSON.stringify(O),{status:M,headers:{"content-type":"application/json; charset=utf-8","cache-control":"no-store","x-request-id":z,"x-api-version":ms,...J}}),D=(O,M,z,J,Z,oe)=>R({error:{code:O,message:M,requestId:J,details:Z}},z,J,oe);return async(O,M)=>{let z=new URL(O.url);if(!z.pathname.startsWith("/api/v1"))return;let J=crypto.randomUUID();if(z.pathname==="/api/v1/openapi.json"&&O.method==="GET")return R(Ia(),200,J,{"cache-control":"public, max-age=300"});let Z=O.headers.get("authorization")??"",oe=Z.startsWith("Bearer ")?Z.slice(7).trim():"",G=oe?e.identities.verifyToken(oe,M):void 0;if(!G)return D("unauthorized","A valid bearer token is required.",401,J,void 0,{"www-authenticate":'Bearer realm="ts-cloud", error="invalid_token"'});let te=S.get(G.token.id),he=y().getTime(),ye=!te||he-te.start>=60000?{start:he,count:0}:te;ye.count+=1,S.set(G.token.id,ye);let ie=Math.max(0,k-ye.count),xe={"x-ratelimit-limit":String(k),"x-ratelimit-remaining":String(ie),"x-ratelimit-reset":String(Math.ceil((ye.start+60000)/1000))};if(ye.count>k)return D("rate_limited","API rate limit exceeded.",429,J,void 0,{...xe,"retry-after":String(Math.max(1,Math.ceil((ye.start+60000-he)/1000)))});try{let ee,De=async()=>{let W=await O.text();if(W.length>1048576)throw new i("payload_too_large","Request body exceeds 1 MB.",413);try{return JSON.parse(W)}catch{throw new i("invalid_json","Request body must be valid JSON.",400)}},Ge=/^\/api\/v1\/projects\/([^/]+)\/environments$/.exec(z.pathname),pt=/^\/api\/v1\/operations\/([^/]+)\/logs(?:\/(stream))?$/.exec(z.pathname),Bt=/^\/api\/v1\/operations\/([^/]+)\/(cancel|retry)$/.exec(z.pathname),Ze=/^\/api\/v1\/previews\/([^/]+)\/(destroy|extend|rebuild)$/.exec(z.pathname),wt=/^\/api\/v1\/compose-applications\/([^/]+)\/(deploy|redeploy|start|stop|scale|delete)$/.exec(z.pathname),zt=/^\/api\/v1\/compose-applications\/([^/]+)\/services$/.exec(z.pathname),rt=/^\/api\/v1\/releases\/([^/]+)\/(promote|approve|activate|rollback|health|pin)$/.exec(z.pathname);if(O.method==="GET"&&z.pathname==="/api/v1/projects")ee=Kr(t.listProjects(G),z,J);else if(O.method==="GET"&&Ge)ee=Kr(t.listEnvironments(G,decodeURIComponent(Ge[1])),z,J);else if(O.method==="GET"&&z.pathname==="/api/v1/services"){let W=z.searchParams.get("projectId");if(!W)throw new i("validation_error","projectId is required.",422);ee=Kr(t.listServices(G,W,z.searchParams.get("environmentId")??void 0),z,J)}else if(O.method==="GET"&&z.pathname==="/api/v1/operations")ee=Kr(t.listOperations(G,z.searchParams.get("projectId")??void 0),z,J);else if(O.method==="GET"&&z.pathname==="/api/v1/previews"){let W=z.searchParams.get("projectId")??void 0,se=a.previews.listInstances({projectId:W}).filter((le)=>{try{return t.authorize(G,"deployments:read",{type:"resource",id:le.resourceId}),!0}catch{return!1}}).map((le)=>({...le}));ee=Kr(se,z,J)}else if(O.method==="GET"&&z.pathname==="/api/v1/compose-templates")ee=Kr(Wr().map((W)=>({...W})),z,J,["id","version"]);else if(O.method==="GET"&&z.pathname==="/api/v1/releases/capabilities"){let W=String(z.searchParams.get("kind")??"");ee={capabilities:Sn({kind:W,hasHealthGate:z.searchParams.get("health")==="true",replicas:Number(z.searchParams.get("replicas"))||1}),requestId:J}}else if(O.method==="GET"&&z.pathname==="/api/v1/releases"){let W=z.searchParams.get("projectId");if(!W)throw new i("validation_error","projectId is required.",422);t.authorize(G,"project:read",{type:"project",id:W});let se=f.releases.list({projectId:W,environmentId:z.searchParams.get("environmentId")??void 0,resourceId:z.searchParams.get("resourceId")??void 0}).filter((le)=>{try{return t.authorize(G,"deployments:read",{type:"resource",id:le.resourceId}),!0}catch{return!1}}).map((le)=>({...le,artifact:f.releases.getArtifact(le.artifactId),transitions:f.releases.transitions(le.id),approvals:f.releases.approvals(le.id)}));ee=Kr(se,z,J)}else if(O.method==="POST"&&z.pathname==="/api/v1/release-artifacts"){let W=await De();t.authorize(G,"applications:manage",{type:"organization"}),ee={artifact:f.releases.registerArtifact({organizationId:G.serviceAccount.organizationId,digest:String(W.digest??""),kind:String(W.kind??""),uri:String(W.uri??""),size:Number(W.size),mediaType:typeof W.mediaType==="string"?W.mediaType:void 0,provenance:W.provenance,attestation:W.attestation}),requestId:J}}else if(O.method==="POST"&&z.pathname==="/api/v1/releases"){let W=await De(),se=String(W.resourceId??"");t.authorize(G,"applications:manage",{type:"resource",id:se}),ee={release:f.releases.create({organizationId:G.serviceAccount.organizationId,projectId:String(W.projectId??""),environmentId:String(W.environmentId??""),resourceId:se,artifactId:String(W.artifactId??""),kind:String(W.kind??""),sourceSha:typeof W.sourceSha==="string"?W.sourceSha:void 0,config:W.config??{},manifest:W.manifest??{},provenance:W.provenance,strategy:String(W.strategy??"atomic"),healthGate:W.healthGate,hooks:W.hooks,drainSeconds:Number(W.drainSeconds)||void 0,graceSeconds:Number(W.graceSeconds)||void 0,automaticRollback:W.automaticRollback!==!1,actorId:G.actor.id,trigger:typeof W.trigger==="string"?W.trigger:"api",approvalRequired:W.approvalRequired===!0,replicas:Number(W.replicas)||void 0}),requestId:J}}else if(O.method==="GET"&&/^\/api\/v1\/releases\/[^/]+$/.test(z.pathname)){let W=decodeURIComponent(z.pathname.split("/").at(-1)),se=f.releases.get(W);if(!se)throw new i("not_found","Release was not found.",404);t.authorize(G,"deployments:read",{type:"resource",id:se.resourceId}),ee={release:se,artifact:f.releases.getArtifact(se.artifactId),transitions:f.releases.transitions(W),approvals:f.releases.approvals(W),requestId:J}}else if(O.method==="POST"&&rt){let W=f.releases.get(decodeURIComponent(rt[1]));if(!W)throw new i("not_found","Release was not found.",404);let se=await De(),le=rt[2];if(le==="promote"){let Ce=String(se.targetResourceId??"");t.authorize(G,"deployments:create",{type:"resource",id:Ce}),ee={release:f.releases.promote(W.id,{targetEnvironmentId:String(se.targetEnvironmentId??""),targetResourceId:Ce,config:se.config??{},strategy:se.strategy,healthGate:se.healthGate,actorId:G.actor.id,approvalRequired:se.approvalRequired===!0}),requestId:J}}else if(le==="approve")t.authorize(G,"deployments:create",{type:"resource",id:W.resourceId}),ee={release:f.releases.approve(W.id,{actorId:G.actor.id,decision:se.decision==="rejected"?"rejected":"approved",comment:typeof se.comment==="string"?se.comment:void 0}),requestId:J};else if(le==="activate")t.authorize(G,"deployments:create",{type:"resource",id:W.resourceId}),ee={operation:t.operation(f.enqueueActivation(W,{actorId:G.actor.id})),requestId:J};else if(le==="rollback")t.authorize(G,"deployments:create",{type:"resource",id:W.resourceId}),ee={operation:t.operation(f.enqueueRollback(W,{actorId:G.actor.id,targetReleaseId:typeof se.targetReleaseId==="string"?se.targetReleaseId:void 0})),requestId:J};else if(le==="health"){t.authorize(G,"deployments:create",{type:"resource",id:W.resourceId});let Ce=f.completeHealthGate(W.id,{healthy:se.healthy===!0,operationId:typeof se.operationId==="string"?se.operationId:void 0,health:se.health,message:typeof se.message==="string"?se.message:void 0});ee={release:Ce.release,rollbackOperation:Ce.rollbackOperation?t.operation(Ce.rollbackOperation):void 0,requestId:J}}else t.authorize(G,"deployments:create",{type:"resource",id:W.resourceId}),ee={release:f.releases.pin(W.id,se.pinned!==!1,typeof se.reason==="string"?se.reason:void 0),requestId:J}}else if(O.method==="GET"&&z.pathname==="/api/v1/compose-applications"){let W=z.searchParams.get("projectId");if(!W)throw new i("validation_error","projectId is required.",422);t.authorize(G,"project:read",{type:"project",id:W});let se=u.applications.list({projectId:W,environmentId:z.searchParams.get("environmentId")??void 0}).filter((le)=>{try{return t.authorize(G,"deployments:read",{type:"resource",id:le.resourceId}),!0}catch{return!1}}).map((le)=>({...le,services:u.applications.services(le.id)}));ee=Kr(se,z,J)}else if(O.method==="POST"&&z.pathname==="/api/v1/compose-applications/preview"){let W=await De(),se=String(W.projectId??"");t.authorize(G,"project:read",{type:"project",id:se}),ee={result:u.applications.preview(String(W.source??""),{name:String(W.name??""),slug:typeof W.slug==="string"?W.slug:void 0,projectId:se,environmentId:String(W.environmentId??"")}),requestId:J}}else if(O.method==="POST"&&z.pathname==="/api/v1/compose-applications"){let W=await De(),se=String(W.projectId??"");t.authorize(G,"applications:manage",{type:"environment",id:String(W.environmentId??"")});let le={name:String(W.name??""),slug:typeof W.slug==="string"?W.slug:void 0,projectId:se,environmentId:String(W.environmentId??""),createdByActorId:G.actor.id},Ce=typeof W.templateId==="string"?u.applications.fromTemplate(W.templateId,W.inputs&&typeof W.inputs==="object"&&!Array.isArray(W.inputs)?W.inputs:{},{...le,version:typeof W.templateVersion==="string"?W.templateVersion:void 0}):u.applications.import(String(W.source??""),le);ee={application:Ce.application,diagnostics:Ce.parsed.diagnostics,requestId:J}}else if(O.method==="GET"&&zt){let W=u.applications.get(decodeURIComponent(zt[1]));if(!W)throw new i("not_found","Compose application was not found.",404);t.authorize(G,"deployments:read",{type:"resource",id:W.resourceId}),ee={application:W,services:u.applications.services(W.id),requestId:J}}else if(O.method==="POST"&&wt){let W=u.applications.get(decodeURIComponent(wt[1]));if(!W)throw new i("not_found","Compose application was not found.",404);let se=wt[2],le=await De();t.authorize(G,se==="delete"||se==="stop"?"deployments:cancel":"deployments:create",{type:"resource",id:W.resourceId}),ee={operation:t.operation(u.enqueue(W,se,{actorId:G.actor.id,service:typeof le.service==="string"?le.service:void 0,replicas:Number.isFinite(Number(le.replicas))?Number(le.replicas):void 0,removeVolumes:le.removeVolumes===!0,confirmation:typeof le.confirm==="string"?le.confirm:void 0})),requestId:J}}else if(O.method==="GET"&&z.pathname==="/api/v1/preview-definitions"){let W=z.searchParams.get("projectId");if(!W)throw new i("validation_error","projectId is required.",422);t.authorize(G,"project:read",{type:"project",id:W}),ee=Kr(a.previews.listDefinitions(W).map((se)=>({...se})),z,J)}else if(O.method==="POST"&&z.pathname==="/api/v1/preview-definitions"){let W=await De();t.authorize(G,"config:write",{type:"resource",id:String(W.resourceId??"")}),ee={definition:a.previews.createDefinition({...W,projectId:String(W.projectId??""),resourceId:String(W.resourceId??""),baseEnvironmentId:String(W.baseEnvironmentId??""),domainPattern:String(W.domainPattern??""),createdByActorId:G.actor.id}),requestId:J}}else if(O.method==="POST"&&z.pathname==="/api/v1/previews"){let W=await De(),se=a.previews.getDefinition(String(W.definitionId??""));if(!se)throw new i("not_found","Preview definition was not found.",404);t.authorize(G,"deployments:create",{type:"resource",id:se.resourceId});let le=a.previews.upsert({definitionId:se.id,sourceProvider:"api",repository:typeof W.repository==="string"?W.repository:"api",branch:String(W.branch??""),pullRequestNumber:Number(W.pullRequestNumber)||void 0,fork:W.fork===!0,commitSha:String(W.commitSha??""),createdByActorId:G.actor.id});ee={preview:le.preview,operation:t.operation(a.enqueueDeploy(le.preview,{created:le.created,actorId:G.actor.id})),requestId:J}}else if(O.method==="POST"&&Ze){let W=a.previews.getInstance(decodeURIComponent(Ze[1]));if(!W)throw new i("not_found","Preview was not found.",404);let se=await De(),le=Ze[2];if(le==="destroy"){if(t.authorize(G,"deployments:cancel",{type:"resource",id:W.resourceId}),se.confirm!==W.name)throw new i("confirmation_required",`Type ${W.name} to confirm preview teardown.`,409);ee={operation:t.operation(a.enqueueDestroy(W,"api",G.actor.id)),requestId:J}}else if(le==="extend")t.authorize(G,"deployments:create",{type:"resource",id:W.resourceId}),ee={preview:a.previews.extend(W.id,Number(se.hours)),requestId:J};else t.authorize(G,"deployments:create",{type:"resource",id:W.resourceId}),ee={operation:t.operation(a.enqueueDeploy(W,{actorId:G.actor.id,reason:"manual_rebuild"})),requestId:J}}else if(O.method==="POST"&&z.pathname==="/api/v1/previews/cleanup"){t.authorize(G,"automation:manage",{type:"organization"});let W=await De();if(!W.dryRun&&W.confirm!=="cleanup previews")throw new i("confirmation_required","Type cleanup previews to confirm preview cleanup.",409);ee={...a.cleanup({dryRun:W.dryRun===!0,maxAgeHours:Number(W.maxAgeHours)||void 0,keepCount:Number(W.keepCount)||void 0,actorId:G.actor.id}),requestId:J}}else if(O.method==="GET"&&z.pathname==="/api/v1/queue"){let W=z.searchParams.get("projectId")??void 0,se=z.searchParams.get("state"),le=r.list({projectId:W,state:["queued","running","succeeded","failed","cancelled","timed_out"].includes(se)?se:void 0,limit:500}).filter((Ce)=>{let gt=Ce.operation.resourceId?{type:"resource",id:Ce.operation.resourceId}:Ce.operation.environmentId?{type:"environment",id:Ce.operation.environmentId}:Ce.operation.projectId?{type:"project",id:Ce.operation.projectId}:{type:"organization"};try{return t.authorize(G,"deployments:read",gt),!0}catch{return!1}}).map((Ce)=>({...t.operation(Ce.operation),queue:Ce.job,approximatePosition:Ce.approximatePosition}));ee=Kr(le,z,J)}else if(O.method==="GET"&&z.pathname==="/api/v1/queue/settings")t.authorize(G,"deployments:read",G.token.scope),ee={concurrency:r.limits,requestId:J};else if(O.method==="PATCH"&&z.pathname==="/api/v1/queue/settings"){t.authorize(G,"automation:manage",{type:"organization"});let W=await De();if(W.confirm!=="update queue limits")throw new i("confirmation_required","Type update queue limits to confirm production concurrency changes.",409);ee={concurrency:r.configureConcurrency(W.concurrency??{},{organizationId:G.serviceAccount.organizationId,actorId:G.actor.id}),requestId:J}}else if(O.method==="DELETE"&&z.pathname==="/api/v1/queue/history"){t.authorize(G,"automation:manage",{type:"organization"});let W=await De();if(W.confirm!=="clear completed")throw new i("confirmation_required","Type clear completed to confirm queue retention cleanup.",409);ee={deleted:r.clearCompleted({before:typeof W.before==="string"?W.before:void 0,actorId:G.actor.id,projectId:typeof W.projectId==="string"?W.projectId:void 0}),requestId:J}}else if(O.method==="GET"&&pt){let W=e.controlPlane.getOperation(decodeURIComponent(pt[1]));if(!W)throw new i("not_found","Operation was not found.",404);let se=W.resourceId?{type:"resource",id:W.resourceId}:W.environmentId?{type:"environment",id:W.environmentId}:W.projectId?{type:"project",id:W.projectId}:{type:"organization"};t.authorize(G,"deployments:read",se);let le=O.headers.get("last-event-id")?.trim(),Ce=Number(le||z.searchParams.get("after")||0);if(pt[2]==="stream"){let kt=new TextEncoder,_e=Ce,ht,nt=!1,Ke=new ReadableStream({start(Br){let _o=()=>{if(nt)return;if(!e.identities.verifyToken(oe,M)){if(nt=!0,ht)clearInterval(ht);Br.close();return}let Qn=r.logs(W.id,{after:_e,limit:500});for(let qt of Qn)_e=qt.sequence,Br.enqueue(kt.encode(`id: ${qt.sequence}
80
80
  event: log
@@ -116,15 +116,15 @@ data: ${JSON.stringify(nt)}
116
116
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[r,e.organizationId,e.projectId,e.environmentId??null,e.releaseId,e.kind,e.format,e.digest,Hn(e.summary),e.content??null,e.sensitive?1:0,a]),this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,type:"security.release_artifact.created",payload:{artifactId:r,releaseId:e.releaseId,kind:e.kind,format:e.format,digest:e.digest,sensitive:e.sensitive}}),Up(this.controlPlane.database.query("SELECT * FROM release_security_artifacts WHERE id = ?").get(r))}listReleaseArtifacts(e,t=!1){return this.controlPlane.database.query("SELECT * FROM release_security_artifacts WHERE release_id = ? ORDER BY created_at, kind").all(e).map(Up).map((r)=>r.sensitive&&!t?{...r,content:void 0}:r)}summary(e,t,r){let a=this.listFindings({organizationId:e,projectId:t,environmentId:r,limit:1000}),u=this.listScanRuns({organizationId:e,projectId:t,environmentId:r,limit:1000}),f={info:0,low:0,medium:0,high:0,critical:0};for(let b of a)if(b.status==="open"||b.status==="acknowledged")f[b.severity]++;let h={passed:0,failed:0,skipped:0,unavailable:0,unsupported:0,stale:0};for(let b of u)h[b.status]++;return{open:f,waived:a.filter((b)=>b.status==="waived").length,resolved:a.filter((b)=>b.status==="resolved").length,checks:h,lastScannedAt:u[0]?.completedAt}}exportPosture(e){let t=this.controlPlane.listProjects().filter((r)=>r.organizationId===e);return s({format:"ts-cloud-security-posture",version:1,exportedAt:this.now(),organizationId:e,policies:this.listPolicies(e),findings:this.listFindings({organizationId:e,limit:1000}),waivers:this.listWaivers().filter((r)=>this.getFinding(r.findingId)?.organizationId===e),scans:t.flatMap((r)=>this.listScanRuns({organizationId:e,projectId:r.id,limit:1000})),decisions:t.flatMap((r)=>this.controlPlane.listEnvironments(r.id).flatMap((a)=>this.listDecisions(a.id,1000)))})}}import{existsSync as sR,readdirSync as aR,readFileSync as cR,statSync as dR}from"node:fs";import{extname as lR,join as uR,relative as Jy,sep as pR}from"node:path";var Cu=[{name:"AWS Access Key ID",pattern:/(?:^|[^A-Z0-9])((AKIA|ABIA|ACCA|ASIA)[A-Z0-9]{16})(?:[^A-Z0-9]|$)/g,severity:"critical",description:"AWS Access Key ID detected"},{name:"AWS Secret Access Key",pattern:/(?:aws_secret_access_key|aws_secret_key|secret_access_key|secretAccessKey)['"]?\s*[=:]\s*['"]?([A-Za-z0-9/+=]{40})['"]?/gi,severity:"critical",description:"AWS Secret Access Key detected"},{name:"AWS Secret Key (Generic)",pattern:/(?:^|['"`:=\s])([A-Za-z0-9/+=]{40})(?:['"`\s]|$)/g,severity:"high",description:"Potential AWS Secret Key (40-char base64)"},{name:"Generic API Key",pattern:/(?:api[_-]?key|apikey|api[_-]?secret)\s*[=:]\s*['"]?([A-Za-z0-9_\-]{20,})['"]?/gi,severity:"high",description:"Generic API key detected"},{name:"RSA Private Key",pattern:/-----BEGIN RSA PRIVATE KEY-----/g,severity:"critical",description:"RSA private key detected"},{name:"OpenSSH Private Key",pattern:/-----BEGIN OPENSSH PRIVATE KEY-----/g,severity:"critical",description:"OpenSSH private key detected"},{name:"EC Private Key",pattern:/-----BEGIN EC PRIVATE KEY-----/g,severity:"critical",description:"EC private key detected"},{name:"PGP Private Key",pattern:/-----BEGIN PGP PRIVATE KEY BLOCK-----/g,severity:"critical",description:"PGP private key detected"},{name:"GitHub Token",pattern:/(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,}/g,severity:"critical",description:"GitHub personal access token detected"},{name:"GitHub OAuth",pattern:/github[_-]?oauth[_-]?token\s*[=:]\s*['"]?([A-Za-z0-9_]{40})['"]?/gi,severity:"critical",description:"GitHub OAuth token detected"},{name:"Slack Token",pattern:/xox[baprs]-[0-9]{10,13}-[0-9]{10,13}[a-zA-Z0-9-]*/g,severity:"critical",description:"Slack token detected"},{name:"Slack Webhook",pattern:/https:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]+\/B[A-Z0-9]+\/[A-Za-z0-9]+/g,severity:"high",description:"Slack webhook URL detected"},{name:"Discord Webhook",pattern:/https:\/\/discord(?:app)?\.com\/api\/webhooks\/[0-9]+\/[A-Za-z0-9_-]+/g,severity:"high",description:"Discord webhook URL detected"},{name:"JWT Token",pattern:/eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*/g,severity:"high",description:"JWT token detected"},{name:"Google API Key",pattern:/AIza[0-9A-Za-z_-]{35}/g,severity:"critical",description:"Google API key detected"},{name:"Google OAuth ID",pattern:/[0-9]+-[A-Za-z0-9_]{32}\.apps\.googleusercontent\.com/g,severity:"high",description:"Google OAuth client ID detected"},{name:"Firebase API Key",pattern:/(?:firebase[_-]?api[_-]?key)\s*[=:]\s*['"]?([A-Za-z0-9_-]{39})['"]?/gi,severity:"critical",description:"Firebase API key detected"},{name:"Cloudflare API Token",pattern:/(?:cloudflare[_-]?api[_-]?token|cf[_-]?api[_-]?token)\s*[=:]\s*['"]?([A-Za-z0-9_-]{40})['"]?/gi,severity:"critical",description:"Cloudflare API token detected"},{name:"Azure Client Secret",pattern:/(?:azure[_-]?client[_-]?secret|client[_-]?secret)\s*[=:]\s*['"]?([A-Za-z0-9~._-]{34,})['"]?/gi,severity:"critical",description:"Azure client secret detected"},{name:"Heroku API Key",pattern:/(?:heroku[_-]?api[_-]?key)\s*[=:]\s*['"]?([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['"]?/gi,severity:"critical",description:"Heroku API key detected"},{name:"Database Connection String",pattern:/(?:mysql|postgres|postgresql|mongodb|redis|mongodb\+srv):\/\/[^:]+:[^@]+@[^/\s]+/gi,severity:"critical",description:"Database connection string with credentials detected"},{name:"Database Password",pattern:/(?:db[_-]?password|database[_-]?password|mysql[_-]?password|postgres[_-]?password)\s*[=:]\s*['"]?([^'"\s]{8,})['"]?/gi,severity:"critical",description:"Database password detected"},{name:"Stripe API Key",pattern:/(?:sk|pk)_(?:test|live)_[0-9a-zA-Z]{24,}/g,severity:"critical",description:"Stripe API key detected"},{name:"PayPal Client ID",pattern:/(?:paypal[_-]?client[_-]?id)\s*[=:]\s*['"]?([A-Za-z0-9_-]{80})['"]?/gi,severity:"high",description:"PayPal client ID detected"},{name:"Square Access Token",pattern:/sq0[a-z]{3}-[0-9A-Za-z_-]{22,}/g,severity:"critical",description:"Square access token detected"},{name:"Twilio API Key",pattern:/SK[a-f0-9]{32}/g,severity:"critical",description:"Twilio API key detected"},{name:"SendGrid API Key",pattern:/SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}/g,severity:"critical",description:"SendGrid API key detected"},{name:"Mailgun API Key",pattern:/key-[0-9a-zA-Z]{32}/g,severity:"critical",description:"Mailgun API key detected"},{name:"Password in Code",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"]([^'"]{8,})['"](?!\s*[,\]])/gi,severity:"high",description:"Hardcoded password detected"},{name:"Secret/Token Assignment",pattern:/(?:secret|token|auth[_-]?token|access[_-]?token)\s*[=:]\s*['"]([A-Za-z0-9_\-/+=]{16,})['"](?!\s*[,\]])/gi,severity:"high",description:"Hardcoded secret or token detected"},{name:"NPM Token",pattern:/(?:npm[_-]?token)\s*[=:]\s*['"]?([A-Za-z0-9_-]{36})['"]?/gi,severity:"critical",description:"NPM token detected"},{name:"SSH Private Key Path Exposed",pattern:/~\/\.ssh\/id_[a-z]+|\/home\/[^/]+\/\.ssh\/id_[a-z]+/g,severity:"medium",description:"SSH private key path exposed"},{name:"Env Variable with Secret",pattern:/(?:process\.env\.)((?=[A-Z_]*(?:SECRET|KEY|TOKEN|PASSWORD|CREDENTIAL|AUTH))[A-Z_]+)\s*(?:===?\s*['"]([^'"]+)['"])?/g,severity:"medium",description:"Environment variable containing secret may be exposed"}],gR=[".js",".jsx",".ts",".tsx",".mjs",".cjs",".vue",".svelte",".html",".htm",".css",".scss",".less",".json",".yaml",".yml",".toml",".xml",".env",".config",".conf"],mR=["node_modules",".git",".svn",".hg","dist","build","coverage",".nyc_output","__pycache__",".pytest_cache","vendor",".idea",".vscode",".turbo",".next",".nuxt","framework.bak","pantry",".pantry","tests","test","__tests__","spec","__mocks__",".github",".gitlab",".circleci",".claude/worktrees"],fR=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb","bun.lock","*.min.js","*.min.css","*.map","*.d.ts","*.test.ts","*.test.js","*.spec.ts","*.spec.js",".env",".env.*"];class Cn{patterns;excludeDirs;excludeFiles;maxFileSize;constructor(e){this.patterns=[...Cu,...e?.customPatterns||[]],this.excludeDirs=[...mR,...e?.excludeDirs||[]],this.excludeFiles=[...fR,...e?.excludeFiles||[]],this.maxFileSize=e?.maxFileSize||1048576}async scan(e){let t=Date.now(),r=[],a=0,{directory:u,exclude:f=[],include:h,skipPatterns:b=[]}=e,S=e.failOnSeverity||"critical";if(!sR(u))throw Error(`Directory not found: ${u}`);let y=this.getFilesToScan(u,[...this.excludeDirs,...f],h);for(let M of y){let z=Jy(u,M);if(this.shouldExcludeFile(z))continue;try{if(dR(M).size>this.maxFileSize)continue;let Z=cR(M,"utf-8"),oe=this.scanContent(Z,z,b);r.push(...oe),a++}catch{continue}}let k={critical:r.filter((M)=>M.pattern.severity==="critical").length,high:r.filter((M)=>M.pattern.severity==="high").length,medium:r.filter((M)=>M.pattern.severity==="medium").length,low:r.filter((M)=>M.pattern.severity==="low").length},R=["low","medium","high","critical"],D=R.indexOf(S),O=!0;for(let M=D;M<R.length;M++)if(k[R[M]]>0){O=!1;break}return{passed:O,findings:r,scannedFiles:a,duration:Date.now()-t,summary:k}}scanContent(e,t,r){let a=[],u=e.split(`
117
117
  `);for(let f of this.patterns){if(r.includes(f.name))continue;f.pattern.lastIndex=0;let h;while((h=f.pattern.exec(e))!==null){let b=e.substring(0,h.index),S=b.split(`
118
118
  `).length,y=b.lastIndexOf(`
119
- `),k=h.index-y,R=u[S-1]||"";if(this.isLikelyPlaceholder(h[0],R))continue;let D=h[1]||h[0];if(f.name==="AWS Secret Key (Generic)"&&/^[a-f0-9]{40}$/i.test(D))continue;if(f.name==="AWS Secret Key (Generic)"&&!this.hasSecretCharacterDiversity(D))continue;if(f.name==="AWS Secret Key (Generic)"&&/^(?:Actions|Commands|Controllers|Handlers|Jobs|Listeners|Middleware|Models|Resources|Services)\//.test(D))continue;if(this.isLowEntropy(D))continue;a.push({file:t,line:S,column:k,match:this.maskSecret(h[0]),pattern:f,context:this.maskSecret(R.trim())})}}return a}isLikelyPlaceholder(e,t){let r=["example","placeholder","your_","YOUR_","xxx","XXX","***","test","TEST","dummy","DUMMY","fake","FAKE","sample","SAMPLE","<your","${","{{","process.env","import.meta.env","CHANGEME","TODO","FIXME"],a=e.toLowerCase(),u=t.toLowerCase();for(let h of r)if(a.includes(h.toLowerCase())||u.includes(h.toLowerCase()))return!0;let f=t.trim();if(f.startsWith("//")||f.startsWith("#")||f.startsWith("*")||f.startsWith("/*")){if(u.includes("example")||u.includes("format:")||u.includes("e.g."))return!0}return!1}isLowEntropy(e){if(e.length<8)return!1;if(new Set(e).size<8)return!0;if(/(.)\1{3,}/.test(e))return!0;return!1}hasSecretCharacterDiversity(e){let t=/[\d+=]/.test(e),r=[/[a-z]/.test(e),/[A-Z]/.test(e),/\d/.test(e),/[/+=]/.test(e)];return t&&r.filter(Boolean).length>=3}maskSecret(e){if(e.length<=8)return"*".repeat(e.length);let t=Math.min(4,Math.floor(e.length*0.2));return e.substring(0,t)+"*".repeat(e.length-t*2)+e.substring(e.length-t)}getFilesToScan(e,t,r){let a=[],u=r||gR,f=t.filter((S)=>!S.includes("/")),h=t.filter((S)=>S.includes("/")).map((S)=>S.replace(/^\.\//,"").replace(/\/+$/,"")),b=(S)=>{let y=aR(S,{withFileTypes:!0});for(let k of y){let R=uR(S,k.name);if(k.isDirectory()){let D=Jy(e,R).split(pR).join("/");if(!f.includes(k.name)&&!h.includes(D))b(R)}else if(k.isFile()){let D=lR(k.name).toLowerCase();if(u.includes(D)||k.name.startsWith(".env")||k.name.endsWith(".config"))a.push(R)}}};return b(e),a}shouldExcludeFile(e){let t=e.split("/").pop()||"";for(let r of this.excludeFiles)if(r.startsWith("*")){let a=r.substring(1);if(t.endsWith(a))return!0}else if(r.endsWith("*")){let a=r.substring(0,r.length-1);if(t.startsWith(a))return!0}else if(t===r)return!0;return!1}addPattern(e){this.patterns.push(e)}getPatterns(){return[...this.patterns]}}async function Jf(e){return new Cn().scan(e)}function Xf(e){let t=[];if(t.push(`
119
+ `),k=h.index-y,R=u[S-1]||"";if(this.isLikelyPlaceholder(h[0],R))continue;let D=h[1]||h[0];if(f.name==="AWS Secret Key (Generic)"&&/^[a-f0-9]{40}$/i.test(D))continue;if(f.name==="AWS Secret Key (Generic)"&&!this.hasSecretCharacterDiversity(D))continue;if(f.name==="AWS Secret Key (Generic)"&&/^(?:Actions|Commands|Controllers|Handlers|Jobs|Listeners|Middleware|Models|Resources|Services)\//.test(D))continue;if(this.isLowEntropy(D))continue;a.push({file:t,line:S,column:k,match:this.maskSecret(h[0]),pattern:f,context:this.maskSecret(R.trim())})}}return a}isLikelyPlaceholder(e,t){let r=["example","placeholder","your_","YOUR_","xxx","XXX","***","test","TEST","dummy","DUMMY","fake","FAKE","sample","SAMPLE","<your","${","{{","process.env","import.meta.env","CHANGEME","TODO","FIXME"],a=e.toLowerCase(),u=t.toLowerCase();for(let h of r)if(a.includes(h.toLowerCase())||u.includes(h.toLowerCase()))return!0;let f=t.trim();if(f.startsWith("//")||f.startsWith("#")||f.startsWith("*")||f.startsWith("/*")){if(u.includes("example")||u.includes("format:")||u.includes("e.g."))return!0}return!1}isLowEntropy(e){if(e.length<8)return!1;if(new Set(e).size<8)return!0;if(/(.)\1{3,}/.test(e))return!0;return!1}hasSecretCharacterDiversity(e){let t=/[\d+=]/.test(e),r=[/[a-z]/.test(e),/[A-Z]/.test(e),/\d/.test(e),/[/+=]/.test(e)];return t&&r.filter(Boolean).length>=3}maskSecret(e){if(e.length<=8)return"*".repeat(e.length);let t=Math.min(4,Math.floor(e.length*0.2));return e.substring(0,t)+"*".repeat(e.length-t*2)+e.substring(e.length-t)}getFilesToScan(e,t,r){let a=[],u=r||gR,f=t.filter((S)=>!S.includes("/")),h=t.filter((S)=>S.includes("/")).map((S)=>S.replace(/^\.\//,"").replace(/\/+$/,"")),b=(S)=>{let y=aR(S,{withFileTypes:!0});for(let k of y){let R=uR(S,k.name);if(k.isDirectory()){let D=Jy(e,R).split(pR).join("/");if(!f.includes(k.name)&&!h.includes(D))b(R)}else if(k.isFile()){let D=lR(k.name).toLowerCase();if(u.includes(D)||k.name.startsWith(".env")||k.name.endsWith(".config"))a.push(R)}}};return b(e),a}shouldExcludeFile(e){let t=e.split("/").pop()||"";for(let r of this.excludeFiles)if(r.startsWith("*")){let a=r.substring(1);if(t.endsWith(a))return!0}else if(r.endsWith("*")){let a=r.substring(0,r.length-1);if(t.startsWith(a))return!0}else if(t===r)return!0;return!1}addPattern(e){this.patterns.push(e)}getPatterns(){return[...this.patterns]}}async function Xf(e){return new Cn().scan(e)}function Yf(e){let t=[];if(t.push(`
120
120
  Security Scan Results`),t.push("=".repeat(50)),t.push(`Files scanned: ${e.scannedFiles}`),t.push(`Duration: ${e.duration}ms`),t.push(""),t.push("Summary:"),t.push(` Critical: ${e.summary.critical}`),t.push(` High: ${e.summary.high}`),t.push(` Medium: ${e.summary.medium}`),t.push(` Low: ${e.summary.low}`),t.push(""),e.findings.length>0){t.push("Findings:"),t.push("-".repeat(50));for(let r of e.findings)t.push(`
121
121
  [${r.pattern.severity.toUpperCase()}] ${r.pattern.name}`),t.push(` File: ${r.file}:${r.line}:${r.column}`),t.push(` Match: ${r.match}`),t.push(` Context: ${r.context}`),t.push(` Description: ${r.pattern.description}`)}return t.push(""),t.push(e.passed?"✓ Security scan passed":"✗ Security scan failed"),t.join(`
122
- `)}function hR(e,t){return{status:"unavailable",findings:[],error:`${e.id} exceeded its ${t}ms timeout`,metadata:{timeoutMs:t}}}class Ot{posture;defaultTimeoutMs;nowFn;constructor(e,t={}){this.posture=e;this.defaultTimeoutMs=t.defaultTimeoutMs??60000,this.nowFn=t.now??(()=>new Date)}async run(e,t){let r=this.nowFn(),a=Math.max(100,e.timeoutMs??this.defaultTimeoutMs),u=new AbortController,f,h=new Promise((k)=>{f=setTimeout(()=>{u.abort(),k(hR(e,a))},a)}),b;try{b=await Promise.race([e.scan({...t,signal:u.signal}),h])}catch(k){b={status:"unavailable",findings:[],error:k instanceof Error?k.message:String(k)}}finally{if(f)clearTimeout(f)}let S=this.nowFn(),y={...t,scannerId:e.id,scannerVersion:e.version,status:b.status,findings:b.findings,metadata:b.metadata,error:b.error,startedAt:r.toISOString(),completedAt:S.toISOString(),durationMs:Math.max(0,S.getTime()-r.getTime())};return this.posture.recordScan(y)}async runAll(e,t){return Promise.all(e.map((r)=>this.run(r,t)))}}class En{scanner;id="source-secrets";version="1.0.0";timeoutMs=30000;constructor(e=new Cn){this.scanner=e}async scan(e){if(!e.artifactRoot)return{status:"skipped",findings:[],error:"No artifact root was supplied"};let t=await this.scanner.scan({directory:e.artifactRoot,failOnSeverity:"critical"});return{status:t.passed?"passed":"failed",findings:t.findings.map((r)=>({...e,ruleId:r.pattern.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),severity:r.pattern.severity,title:r.pattern.name,description:r.pattern.description,subject:`${r.file}:${r.line}`,evidence:{file:r.file,line:r.line,column:r.column,match:r.match,context:r.context},remediation:"Remove the credential, rotate it at its issuer, and use a managed secret or environment reference."})),metadata:{scannedFiles:t.scannedFiles,summary:t.summary}}}}function yR(e){let t=e?.toLowerCase();return t==="critical"||t==="high"||t==="medium"||t==="low"?t:"info"}class Ca{id="trivy-image";version;timeoutMs;constructor(e={}){this.version=e.version??"local",this.timeoutMs=e.timeoutMs??120000,this.executable=e.executable??"trivy"}executable;async scan(e){if(!e.imageRef)return{status:"skipped",findings:[],error:"No image reference was supplied"};let t;try{t=Bun.spawn([this.executable,"image","--format","json","--quiet","--scanners","vuln",e.imageRef],{stdout:"pipe",stderr:"pipe",env:{PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin",HOME:"/nonexistent",TRIVY_NO_PROGRESS:"true"}})}catch(S){return{status:"unsupported",findings:[],error:S instanceof Error?S.message:String(S)}}let r=()=>t.kill();e.signal.addEventListener("abort",r,{once:!0});let[a,u,f]=await Promise.all([t.exited,new Response(t.stdout).text(),new Response(t.stderr).text()]);if(e.signal.removeEventListener("abort",r),a!==0)return{status:/not found|enoent/i.test(f)?"unsupported":"unavailable",findings:[],error:f.slice(0,2000)||`Trivy exited with ${a}`};let h=JSON.parse(u),b=[];for(let S of h.Results??[])for(let y of S.Vulnerabilities??[]){let k=y.VulnerabilityID??"unknown-vulnerability";b.push({...e,ruleId:k,severity:yR(y.Severity),title:y.Title||k,description:y.Description||`${k} affects ${y.PkgName??"an image package"}.`,subject:`${e.imageRef}:${y.PkgName??"unknown"}:${y.InstalledVersion??"unknown"}`,evidence:{image:e.imageRef,target:S.Target??"",cve:k,package:y.PkgName??"",installedVersion:y.InstalledVersion??"",fixedVersion:y.FixedVersion??"",reference:y.PrimaryURL??""},remediation:y.FixedVersion?`Upgrade ${y.PkgName} to ${y.FixedVersion} or later.`:"Remove or replace the affected package and rescan the image."})}return{status:b.length?"failed":"passed",findings:b,metadata:{imageRef:e.imageRef,vulnerabilityCount:b.length,localOnly:!0}}}}class Yf{actions;id="aws-iam-capabilities";version="1.0.0";timeoutMs=30000;client;constructor(e,t={}){this.actions=e;if(this.resourceArns=t.resourceArns??["*"],t.client)this.client=t.client;else{let r=new Te(t.region),a=new Re(t.region);this.client={getCallerIdentity:()=>r.getCallerIdentity(),simulatePrincipalPolicy:(u)=>a.simulatePrincipalPolicy(u)}}}resourceArns;async scan(e){let t=await this.client.getCallerIdentity();if(!t.Arn)return{status:"unavailable",findings:[],error:"AWS returned no caller ARN"};let r=t.Arn;if(r.includes(":assumed-role/"))return{status:"unsupported",findings:[],error:"AWS policy simulation requires the underlying IAM role ARN; use an IAM role/user ARN or provider-native access analysis.",metadata:{account:t.Account??"",principalType:"assumed-role"}};let f=(await this.client.simulatePrincipalPolicy({PolicySourceArn:r,ActionNames:this.actions,ResourceArns:this.resourceArns})).EvaluationResults.filter((h)=>h.EvalDecision!=="allowed").map((h)=>({...e,ruleId:`iam-${h.EvalActionName.toLowerCase().replace(/[^a-z0-9]+/g,"-")}`,severity:"high",title:`Missing AWS capability: ${h.EvalActionName}`,description:`The active AWS principal is ${h.EvalDecision||"not allowed"} for this deployment action.`,subject:`${r}:${h.EvalActionName}`,evidence:{account:t.Account??"",principalArn:r,action:h.EvalActionName,decision:h.EvalDecision,missingContext:h.MissingContextValues??[]},remediation:"Grant the deployment principal the least-privilege action on the required resources, then rerun the capability check."}));return{status:f.length?"failed":"passed",findings:f,metadata:{account:t.Account??"",principalArn:r,evaluatedActions:this.actions.length}}}}import{createHash as vR,createVerify as bR}from"node:crypto";import{existsSync as SR,readFileSync as wR}from"node:fs";import{basename as kR,join as IR,resolve as Gy}from"node:path";function Xo(e){return vR("sha256").update(e).digest("hex")}function ER(e){let t=[["dependencies","required"],["optionalDependencies","optional"],["devDependencies","excluded"],["peerDependencies","required"]],r=new Map;for(let[a,u]of t){let f=e[a];if(!f||typeof f!=="object"||Array.isArray(f))continue;for(let[h,b]of Object.entries(f)){let S=String(b).replace(/^[~^]/,""),y=`${h}@${S}`;if(!r.has(y))r.set(y,{type:"library",name:h,version:S,purl:`pkg:npm/${encodeURIComponent(h)}@${encodeURIComponent(S)}`,scope:u})}}return[...r.values()].sort((a,u)=>`${a.name}@${a.version}`.localeCompare(`${u.name}@${u.version}`))}function Eu(e,t={}){let r=IR(Gy(e),"package.json");if(!SR(r))throw Error(`Cannot generate an SBOM: ${r} was not found`);let a=wR(r,"utf8"),u=JSON.parse(a),f=String(u.name??kR(Gy(e))),h=String(u.version??"0.0.0"),b=Xo(a);return{bomFormat:"CycloneDX",specVersion:"1.5",serialNumber:t.serial??`urn:uuid:${crypto.randomUUID()}`,version:1,metadata:{timestamp:(t.now??new Date).toISOString(),component:{type:"application",name:f,version:h,purl:`pkg:npm/${encodeURIComponent(f)}@${encodeURIComponent(h)}`,hashes:[{alg:"SHA-256",content:b}]},tools:[{vendor:"ts-cloud",name:"security-posture",version:"1.0.0"}]},components:ER(u)}}async function vu(e,t={}){let r=Bun.spawn([t.executable??"syft",e,"-o","cyclonedx-json"],{stdout:"pipe",stderr:"pipe",env:{PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin",HOME:"/nonexistent",SYFT_CHECK_FOR_APP_UPDATE:"false"}}),a=()=>r.kill();t.signal?.addEventListener("abort",a,{once:!0});let[u,f,h]=await Promise.all([r.exited,new Response(r.stdout).text(),new Response(r.stderr).text()]);if(t.signal?.removeEventListener("abort",a),u!==0)throw Error(h.slice(0,2000)||`Syft exited with ${u}`);return JSON.parse(f)}function Ea(e,t,r){let a=JSON.stringify(r);return e.addReleaseArtifact({...t,kind:"sbom",format:`cyclonedx-${r.specVersion}+json`,digest:`sha256:${Xo(a)}`,summary:{component:r.metadata.component.name,version:r.metadata.component.version,components:r.components.length},content:a,sensitive:!0})}function Tu(e,t,r){let a={total:r.length,critical:0,high:0,medium:0,low:0,info:0,fixable:0};for(let f of r){a[f.severity]++;let h=f.evidence;if(typeof h.fixedVersion==="string"&&h.fixedVersion)a.fixable++}let u=JSON.stringify({releaseId:t.releaseId,generatedAt:new Date().toISOString(),findings:r.map((f)=>({id:f.id,ruleId:f.ruleId,severity:f.severity,subject:f.subject,remediation:f.remediation}))});return e.addReleaseArtifact({...t,kind:"vulnerability_summary",format:"ts-cloud-vulnerability-summary+json",digest:`sha256:${Xo(u)}`,summary:a,content:u,sensitive:!0})}function wu(e){if(!e.artifact&&!e.artifactSha256)throw Error("Release provenance requires artifact content or a SHA-256 digest");return{_type:"https://in-toto.io/Statement/v1",subject:[{name:e.artifactName,digest:{sha256:e.artifactSha256?.replace(/^sha256:/,"")??Xo(e.artifact)}}],predicateType:"https://slsa.dev/provenance/v1",predicate:{buildDefinition:{buildType:"https://ts-cloud.dev/build/v1",externalParameters:e.externalParameters??{},internalParameters:{},resolvedDependencies:e.resolvedDependencies??[]},runDetails:{builder:{id:"https://ts-cloud.dev/builders/local/v1"},metadata:{invocationId:e.invocationId,startedOn:e.startedAt,finishedOn:e.completedAt}}}}}function Ru(e,t,r){let a=JSON.stringify(r);return e.addReleaseArtifact({...t,kind:"provenance",format:"in-toto+slsa-v1+json",digest:`sha256:${Xo(a)}`,summary:{subjects:r.subject.length,builder:r.predicate.runDetails.builder.id,buildType:r.predicate.buildDefinition.buildType},content:a,sensitive:!0})}function _S(e){let t=e.expectedSha256.replace(/^sha256:/,"").toLowerCase(),r=Xo(e.artifact)===t;if(!e.signature||!e.publicKey)return{digestValid:r,signature:"not_configured"};try{let a=bR("SHA256");return a.update(e.artifact),a.end(),{digestValid:r,signature:a.verify(e.publicKey,Buffer.from(e.signature,"base64"))?"verified":"invalid"}}catch{return{digestValid:r,signature:"invalid"}}}function ue(e,t){let r=e.environments.get(t);if(!r)throw Error(`Security scope for environment '${t}' was not found`);return{organizationId:e.organization.id,projectId:e.project.id,environmentId:r.id}}function Du(e,t){let r=new bn(e.store),a=r.listPolicies(e.organization.id);for(let[u,f]of e.environments){if(a.some((b)=>b.environmentId===f.id))continue;let h=u==="production"||f.kind==="production";a.push(r.createPolicy({organizationId:e.organization.id,environmentId:f.id,name:h?"Production baseline":"Environment baseline",scannerFailMode:h?"closed":"open",requiredScanners:["source-secrets"],rules:h?[{minimumSeverity:"critical",action:"block"},{minimumSeverity:"high",action:"block"},{minimumSeverity:"medium",action:"warn"},{minimumSeverity:"low",action:"record"}]:[{minimumSeverity:"critical",action:"warn"},{minimumSeverity:"high",action:"warn"},{minimumSeverity:"low",action:"record"}],actorId:t}))}return a}function LS(e,t,r,a={}){let u=r.findings.map((f)=>({...t,ruleId:f.pattern.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),severity:f.pattern.severity,title:f.pattern.name,description:f.pattern.description,subject:`${f.file}:${f.line}`,evidence:{file:f.file,line:f.line,column:f.column,match:f.match,context:f.context},remediation:"Remove and rotate the credential, then reference it through a managed secret or environment variable."}));return e.recordScan({...t,scannerId:"source-secrets",scannerVersion:a.scannerVersion??"1.0.0",status:a.skipped?"skipped":r.passed?"passed":"failed",findings:a.skipped?[]:u,metadata:{scannedFiles:r.scannedFiles,durationMs:r.duration,summary:r.summary},durationMs:r.duration,error:a.skipped?"The operator explicitly skipped source-secret scanning.":void 0})}function $S(e,t,r="The operator explicitly skipped source-secret scanning."){return e.recordScan({...t,scannerId:"source-secrets",scannerVersion:"1.0.0",status:"skipped",findings:[],error:r})}function RR(e,t){let r=[],a=t.security;if(a?.firewall&&!["active","configured","ok"].includes(String(a.firewall.status)))r.push({...e,ruleId:"host-firewall-disabled",severity:"high",title:"Host firewall is not active",description:String(a.firewall.summary??"The host firewall did not report an active configuration."),subject:"host:firewall",evidence:{status:String(a.firewall.status??"unknown"),rules:Array.isArray(a.firewall.rules)?a.firewall.rules.length:0},remediation:"Apply the declarative firewall policy and confirm only required listeners are public."});for(let u of a?.ports??[]){let f=String(u.listen??""),h=Number(f.match(/:(\d+)$/)?.[1]);if(u.exposure==="public"&&Number.isFinite(h)&&![22,80,443].includes(h))r.push({...e,ruleId:"unexpected-public-listener",severity:"medium",title:`Unexpected public listener on port ${h}`,description:`${String(u.processName??"A process")} is listening publicly outside the standard SSH/HTTP/HTTPS ports.`,subject:`host:port:${h}`,evidence:{protocol:String(u.proto??""),listen:f,process:String(u.processName??"")},remediation:"Bind the service to loopback/private networking or explicitly document and firewall the required public port."})}for(let u of a?.tlsCertificates??[]){let f=Number(u.daysRemaining);if(Number.isFinite(f)&&f<30)r.push({...e,ruleId:"tls-certificate-expiry",severity:f<14?"high":"medium",title:`TLS certificate expires in ${f} days`,description:`${String(u.domain??"A configured domain")} needs renewal.`,subject:`tls:${String(u.domain??"unknown")}`,evidence:{domain:String(u.domain??""),daysRemaining:f,expires:String(u.expires??"")},remediation:"Renew the certificate and verify automatic renewal can complete before expiry."})}for(let u of t.diagnostics??[]){if(u.status==="pass"||u.status==="ok")continue;r.push({...e,ruleId:`diagnostic-${String(u.name??"unknown").toLowerCase().replace(/[^a-z0-9]+/g,"-")}`,severity:u.status==="fail"?"high":"medium",title:String(u.name??"Host security check"),description:String(u.detail??"The host security diagnostic did not pass."),subject:`diagnostic:${String(u.name??"unknown")}`,evidence:{status:String(u.status??"unknown")},remediation:"Follow the diagnostic guidance, rerun the check, and confirm the finding resolves."})}return r}function fs(e,t,r){let a=!!r.security||Array.isArray(r.diagnostics),u=a?RR(t,r):[];return e.recordScan({...t,scannerId:"host-posture",scannerVersion:"1.0.0",status:!a?"unavailable":u.length?"failed":"passed",findings:u,metadata:{source:"dashboard-live-probe",checks:Array.isArray(r.diagnostics)?r.diagnostics.length:0},error:a?void 0:"Live host posture data was unavailable; source and provider checks remain usable."})}function hs(e,t){let r=e.evaluateGate({...t.scope,operationId:t.operationId}),a=e.listFindings({...t.scope,limit:1000}).filter((u)=>u.status!=="resolved");return{decision:r,summary:{desiredConfigHash:t.desiredConfigHash??null,securityImpact:{critical:a.filter((u)=>u.severity==="critical").length,high:a.filter((u)=>u.severity==="high").length,waived:a.filter((u)=>u.status==="waived").length,assigned:a.filter((u)=>!!u.ownerActorId).length},blockingFindingIds:r.findingIds,policy:{id:r.policyId,version:r.policyVersion},scannerVersions:r.scannerVersions}}}async function MS(e,t){let r=t.scanner??new Ca({timeoutMs:t.scannerTimeoutMs}),u=await new Ot(e,{defaultTimeoutMs:t.scannerTimeoutMs??120000}).run(r,{...t.scope,releaseId:t.releaseId,imageRef:t.imageRef}),f={...t.scope,releaseId:t.releaseId};Tu(e,f,u.findings);let h=t.generateImageSbom??vu,b=new AbortController,S=Math.max(100,t.sbomTimeoutMs??120000),y,k=new Promise((O,M)=>{y=setTimeout(()=>{b.abort(),M(Error(`syft-sbom exceeded its ${S}ms timeout`))},S)}),R="unavailable";try{let O=await Promise.race([h(t.imageRef,{signal:b.signal}),k]);Ea(e,f,O),e.recordScan({...t.scope,releaseId:t.releaseId,scannerId:"syft-sbom",scannerVersion:"local",status:"passed",metadata:{imageRef:t.imageRef,format:`cyclonedx-${O.specVersion}+json`,components:O.components.length,localOnly:!0}}),R="image"}catch(O){let M=O instanceof Error?O.message:String(O);try{let z=Eu(t.artifactRoot);Ea(e,f,z),e.recordScan({...t.scope,releaseId:t.releaseId,scannerId:"syft-sbom",scannerVersion:"local",status:"unsupported",error:`Image inventory was unavailable; attached a package-manifest SBOM instead. ${M}`,metadata:{imageRef:t.imageRef,fallback:"package-manifest",components:z.components.length,localOnly:!0}}),R="manifest"}catch(z){e.recordScan({...t.scope,releaseId:t.releaseId,scannerId:"syft-sbom",scannerVersion:"local",status:"unavailable",error:`Image and manifest SBOM generation were unavailable. ${M}; ${z instanceof Error?z.message:String(z)}`,metadata:{imageRef:t.imageRef,localOnly:!0}})}}finally{if(y)clearTimeout(y)}let D=wu({artifactName:t.imageRef,artifact:t.imageSha256?void 0:t.imageRef,artifactSha256:t.imageSha256,invocationId:t.invocationId,startedAt:t.startedAt,completedAt:t.completedAt??new Date().toISOString(),externalParameters:t.externalParameters??{imageRef:t.imageRef}});return Ru(e,f,D),{scan:u,sbomSource:R}}function Ee(e,t,r){return[e,t,r].map((a)=>encodeURIComponent(a)).join(":")}function Zf(e){return Object.fromEntries(["start","stop","restart","redeploy","scale","logs","exec","inspect","files"].map((t)=>[t,{supported:!1,reason:e}]))}function _t(e,t,r=["exec","files"]){let a=Zf(t);for(let u of e)a[u]={supported:!0,requiresConfirmation:!["logs","inspect"].includes(u),requiresRecentAuth:r.includes(u)};return a}var AR=/(?:secret|password|passwd|token|api[_-]?key|private[_-]?key|credential|authorization|cookie)/i;function Le(e){let t=String(e??"").trim().toLowerCase();if(["active","running","ready","healthy","available","steady","active:running"].includes(t))return"running";if(["activating","pending","provisioning","starting","created","initializing"].includes(t))return"starting";if(["deactivating","stopping","draining","terminating"].includes(t))return"stopping";if(["inactive","stopped","complete","completed","exited","disabled"].includes(t))return"stopped";if(["degraded","unhealthy","warning"].includes(t))return"degraded";if(["failed","dead","error","crashed","oomkilled"].includes(t))return"failed";return"unknown"}function $e(e){if(Array.isArray(e))return e.map((r)=>$e(r));if(!e||typeof e!=="object")return e;let t={};for(let[r,a]of Object.entries(e))t[r]=AR.test(r)?"[REDACTED]":$e(a);return t}function Lt(e,t=new Date){if(!e)return;let r=new Date(e).getTime();return Number.isFinite(r)?Math.max(0,Math.floor((t.getTime()-r)/1000)):void 0}function Pu(e){let t=Number(e);return Number.isFinite(t)&&t>=0?t:void 0}function CR(e){let t=String(e?.message??e);if(/(?:unauthorized|accessdenied|forbidden|credentials)/i.test(t))return"unauthorized";if(/(?:timeout|unreachable|econnrefused|enotfound|network)/i.test(t))return"unreachable";return"error"}async function ku(e,t={},r={}){let a=t.now??new Date,u=Math.max(100,r.timeoutMs??1e4),f=Math.max(1,r.staleAfterSeconds??60),h=await Promise.all(e.map(async(S)=>{try{let y=await Promise.race([S.discover({...t,now:a}),new Promise((k,R)=>setTimeout(()=>R(Error(`Runtime source ${S.id} timed out after ${u}ms`)),u))]);return{workloads:y,source:{id:S.id,provider:S.provider,status:"fresh",discoveredAt:a.toISOString(),staleAfterSeconds:f,itemCount:y.length}}}catch(y){return{workloads:[],source:{id:S.id,provider:S.provider,status:CR(y),discoveredAt:a.toISOString(),staleAfterSeconds:f,itemCount:0,message:String(y?.message??y).slice(0,500)}}}})),b=h.map((S)=>S.source);return{generatedAt:a.toISOString(),workloads:h.flatMap((S)=>S.workloads).sort((S,y)=>S.name.localeCompare(y.name)||S.id.localeCompare(y.id)),sources:b,degraded:b.some((S)=>S.status!=="fresh")}}function es(e){return e?.split("/").at(-1)??e?.split(":").at(-1)??"unknown"}function Nu(e,t,r,a="ecs:aws",u=[]){let f=r.now??new Date;return e.map((h)=>{let b=h.serviceName??es(h.serviceArn),S=t.filter((Z)=>!h.clusterArn||Z.clusterArn===h.clusterArn),y=S.some((Z)=>!!Z.group)?S.filter((Z)=>Z.group===`service:${b}`):S,k=h.status==="ACTIVE"?(h.runningCount??0)<(h.desiredCount??0)?"degraded":"running":Le(h.status),R=u.find((Z)=>Z.taskDefinitionArn===h.taskDefinition),D=Array.isArray(R?.containerDefinitions)?R.containerDefinitions:[],O=[...new Set(D.map((Z)=>Z.logConfiguration?.options?.["awslogs-group"]).filter((Z)=>typeof Z==="string"))],M=D.flatMap((Z)=>(Z.mountPoints??[]).map((oe)=>({source:oe.sourceVolume,target:oe.containerPath,type:"volume",readOnly:!!oe.readOnly}))),z=D.flatMap((Z)=>(Z.portMappings??[]).map((oe,G)=>({id:`${Z.name??"container"}:${G}`,name:Z.name,mode:R?.networkMode,ports:[{container:oe.containerPort,host:oe.hostPort,protocol:oe.protocol}]}))),J=r.project&&r.environment&&b.startsWith(`${r.project}-${r.environment}-`)?b.slice(`${r.project}-${r.environment}-`.length):b;return{id:Ee("ecs",a,h.serviceArn??b),provider:"ecs",kind:"service",name:b,status:k,rawStatus:h.status,health:k==="running"?"healthy":k==="failed"||k==="degraded"?"unhealthy":"unknown",desiredReplicas:h.desiredCount,runningReplicas:h.runningCount,image:D[0]?.image,runtime:h.launchType??"ECS",version:es(h.taskDefinition),ageSeconds:Lt(h.deployments?.[0]?.createdAt,f),restartCount:0,tags:{},links:{project:r.project,environment:r.environment,service:J,release:es(h.taskDefinition),providerId:h.serviceArn},replicas:y.map((Z)=>{let oe=Le(Z.lastStatus);return{id:Ee("ecs",a,Z.taskArn??es(Z.taskArn)),name:es(Z.taskArn),status:oe,rawStatus:Z.lastStatus,createdAt:Z.createdAt,startedAt:Z.startedAt,stoppedAt:Z.stoppedAt,host:Z.containerInstanceArn,containers:(Z.containers??[]).map((G)=>({id:G.containerArn??G.name??"container",name:G.name??"container",image:D.find((te)=>te.name===G.name)?.image,imageDigest:G.imageDigest,status:Le(G.lastStatus),rawStatus:G.lastStatus,exitCode:G.exitCode,reason:G.reason,runtime:"ecs"}))}}),networks:z,mounts:M,capabilities:_t(["start","stop","restart","redeploy","scale","inspect",...O.length?["logs"]:[]],"This ECS runtime does not expose exec or file transfer; logs require an awslogs task-definition driver"),config:$e({clusterArn:h.clusterArn,taskDefinition:h.taskDefinition,launchType:h.launchType,pendingCount:h.pendingCount,deployments:h.deployments,logGroups:O,executionRoleArn:R?.executionRoleArn,taskRoleArn:R?.taskRoleArn,cpu:R?.cpu,memory:R?.memory}),discoveredAt:f.toISOString(),sourceId:a}})}function Bu(e,t,r="lambda:aws"){let a=t.now??new Date;return e.map((u)=>{let f=u.FunctionName??es(u.FunctionArn),h=u.State==="Active"?"running":Le(u.State);return{id:Ee("lambda",r,u.FunctionArn??f),provider:"lambda",kind:"function",name:f,status:h,rawStatus:u.State,health:h==="running"?"healthy":h==="failed"?"unhealthy":"unknown",desiredReplicas:void 0,runningReplicas:void 0,image:void 0,runtime:u.Runtime,version:u.Version,architecture:u.Architectures?.join(", "),ageSeconds:Lt(u.LastModified,a),restartCount:0,tags:{},links:{project:t.project,environment:t.environment,service:f,providerId:u.FunctionArn},resources:{memoryLimitBytes:u.MemorySize==null?void 0:u.MemorySize*1024*1024},replicas:[],networks:[],mounts:[],capabilities:_t(["logs","inspect"],"Lambda has no persistent process to start, stop, restart, exec, or browse files; deploy a release to replace code"),config:$e({handler:u.Handler,timeout:u.Timeout,codeSize:u.CodeSize,stateReason:u.StateReason,environmentKeys:Object.keys(u.Environment?.Variables??{})}),discoveredAt:a.toISOString(),sourceId:r}})}function eh(e){let t=e.trim();if(!t)return[];let r=JSON.parse(t);if(!Array.isArray(r))throw Error("Docker inspect output must be an array");return r.filter((a)=>a&&typeof a.Id==="string")}function PR(e){let t=Object.entries(e.NetworkSettings?.Ports??{}).flatMap(([r,a])=>{let[u,f]=r.split("/");return(a??[]).map((h)=>({container:Number(u)||void 0,host:Number(h.HostPort)||void 0,protocol:f,address:h.HostIp}))});return Object.entries(e.NetworkSettings?.Networks??{}).map(([r,a])=>({id:a.NetworkID||r,name:r,mode:e.HostConfig?.NetworkMode,addresses:[a.IPAddress,a.GlobalIPv6Address].filter(Boolean),ports:t}))}function _R(e){return(e.Mounts??[]).filter((t)=>!!t.Destination).map((t)=>({source:t.Source,target:t.Destination,type:t.Type,readOnly:t.RW===!1}))}function th(e,t,r=t.server??"local"){let a=t.now??new Date;return e.map((u)=>{let f=u.State?.OOMKilled?"oomkilled":u.State?.Restarting?"starting":u.State?.Status,h=Le(f),b=(u.Name??u.Id.slice(0,12)).replace(/^\//,""),S=u.Config?.Labels??{},y=_R(u),k=PR(u),R={id:u.Id,name:b,image:u.Config?.Image,imageDigest:u.Image,runtime:"docker",status:h,rawStatus:f,exitCode:u.State?.ExitCode,reason:u.State?.Error,resources:{memoryLimitBytes:u.HostConfig?.Memory||void 0},networks:k,mounts:y};return{id:Ee("docker",r,u.Id),provider:"docker",kind:"container",name:b,status:h,rawStatus:f,health:h==="running"?"healthy":h==="failed"?"unhealthy":"unknown",desiredReplicas:1,runningReplicas:h==="running"?1:0,image:u.Config?.Image,runtime:"docker",ageSeconds:Lt(u.State?.StartedAt,a),restartCount:u.RestartCount??0,tags:S,links:{project:t.project,environment:t.environment,server:t.server??r.replace(/^docker:/,""),service:S["com.docker.compose.service"]??S["ts-cloud.service"]??b,release:S["ts-cloud.release"],providerId:u.Id},resources:R.resources,replicas:[{id:Ee("docker",r,`${u.Id}:0`),name:b,status:h,rawStatus:f,startedAt:u.State?.StartedAt,stoppedAt:u.State?.FinishedAt,restartCount:u.RestartCount,containers:[R],resources:R.resources}],networks:k,mounts:y,capabilities:_t(["start","stop","restart","logs","exec","inspect","files"],"Use the owning Compose service for redeploy and scale"),config:$e({image:u.Config?.Image,labels:S,environmentKeys:(u.Config?.Env??[]).map((D)=>D.split("=",1)[0]),networkMode:u.HostConfig?.NetworkMode}),discoveredAt:a.toISOString(),sourceId:r}})}class va{inspect;id;provider="docker";constructor(e,t="docker:local"){this.inspect=e;this.id=t}async discover(e){return th(eh(await this.inspect(e)),e,this.id)}}function rh(e){let t=[];for(let r of e.split(`
123
- `)){if(!r.startsWith("TSCLOUD_SYSTEMD\t"))continue;let[,a,u,f,h,b,S,y,k,R,D,O,M,z]=r.split("\t");if(!a||!/^[A-Za-z0-9_.@:-]+\.service$/.test(a))continue;t.push({unit:a,load:u,active:f,sub:h,description:b,enabled:S,pid:Number(y)||void 0,memoryBytes:Pu(k),restartCount:Number(R)||0,activeSince:D||void 0,fragmentPath:O||void 0,workingDirectory:M?.startsWith("/")?M:void 0,user:z||void 0})}return t}function nh(e,t,r=t.server??"local"){let a=t.now??new Date;return e.map((u)=>{let f=Le(u.active==="active"?u.sub||u.active:u.active),h=u.unit.replace(/\.service$/,""),b=/^(.*?) (?:release [^ ]+|queue worker|daemon |scheduler)(?: |$)/.exec(u.description??"")?.[1]??(t.project&&h.startsWith(`${t.project}-`)?h.slice(t.project.length+1).split("@",1)[0]:void 0),S=h.includes("@")?h.slice(h.indexOf("@")+1):void 0,y=u.workingDirectory?[{target:u.workingDirectory,type:"working-directory"}]:[],k=["start","stop","restart","logs","exec","inspect",...y.length?["files"]:[]];return{id:Ee("systemd",r,u.unit),provider:"systemd",kind:"service",name:h,displayName:u.description||h,status:f,rawStatus:[u.load,u.active,u.sub].filter(Boolean).join("/"),health:f==="running"?"healthy":f==="failed"?"unhealthy":"unknown",desiredReplicas:1,runningReplicas:f==="running"?1:0,ageSeconds:Lt(u.activeSince,a),restartCount:u.restartCount,tags:{enabled:u.enabled??"unknown"},links:{project:t.project,environment:t.environment,server:t.server??r.replace(/^systemd:/,""),service:b,release:S,providerId:u.unit},resources:{memoryBytes:u.memoryBytes},replicas:[{id:Ee("systemd",r,`${u.unit}:main`),name:"main",status:f,pid:u.pid,startedAt:u.activeSince,restartCount:u.restartCount,resources:{memoryBytes:u.memoryBytes}}],networks:[],mounts:y,capabilities:_t(k,y.length?"This systemd runtime does not support redeploy or replica scaling through the scoped explorer":"File transfer requires a provider-reported service working directory; redeploy and scaling are unavailable"),config:$e({fragmentPath:u.fragmentPath,workingDirectory:u.workingDirectory,user:u.user,environment:u.environment,enabled:u.enabled}),discoveredAt:a.toISOString(),sourceId:r}})}class Ta{read;id;provider="systemd";constructor(e,t="systemd:local"){this.read=e;this.id=t}async discover(e){return nh(rh(await this.read(e)),e,this.id)}}function TR(e,t){if(!e.success)throw Error(e.error||e.perInstance?.[0]?.error||`${t} discovery failed`);return e.perInstance?.[0]?.output??""}function xR(){return["set -uo pipefail",'command -v systemctl >/dev/null 2>&1 || { echo "systemctl is unavailable" >&2; exit 127; }',"systemctl list-units --type=service --all --plain --no-legend 2>/dev/null | awk '{print $1}' | while IFS= read -r unit; do",' [ -n "$unit" ] || continue',' clean() { printf "%s" "$1" | tr "\\t\\r\\n" " "; }',' load=$(systemctl show "$unit" -p LoadState --value 2>/dev/null || true)',' active=$(systemctl show "$unit" -p ActiveState --value 2>/dev/null || true)',' sub=$(systemctl show "$unit" -p SubState --value 2>/dev/null || true)',' description=$(systemctl show "$unit" -p Description --value 2>/dev/null || true)',' enabled=$(systemctl is-enabled "$unit" 2>/dev/null || true)',' pid=$(systemctl show "$unit" -p MainPID --value 2>/dev/null || true)',' memory=$(systemctl show "$unit" -p MemoryCurrent --value 2>/dev/null || true)',' restarts=$(systemctl show "$unit" -p NRestarts --value 2>/dev/null || true)',' since=$(systemctl show "$unit" -p ActiveEnterTimestamp --value 2>/dev/null || true)',' fragment=$(systemctl show "$unit" -p FragmentPath --value 2>/dev/null || true)',' working=$(systemctl show "$unit" -p WorkingDirectory --value 2>/dev/null || true)',' user=$(systemctl show "$unit" -p User --value 2>/dev/null || true)',' printf "TSCLOUD_SYSTEMD\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n" "$(clean "$unit")" "$(clean "$load")" "$(clean "$active")" "$(clean "$sub")" "$(clean "$description")" "$(clean "$enabled")" "$(clean "$pid")" "$(clean "$memory")" "$(clean "$restarts")" "$(clean "$since")" "$(clean "$fragment")" "$(clean "$working")" "$(clean "$user")"',"done"]}function DR(){return["set -uo pipefail",'if ! command -v docker >/dev/null 2>&1; then echo "[]"; exit 0; fi',"ids=$(docker ps -aq)",'if [ -z "$ids" ]; then echo "[]"; else docker inspect $ids; fi']}function Qy(e,t,r,a,u){let f=`${e}:${r.id}`,h=async()=>TR(await t.runRemoteDeploy({targets:[r],commands:e==="systemd"?xR():DR(),timeoutSeconds:30,comment:`ts-cloud runtime discovery:${e}`,tags:{Project:a.project.slug,Environment:u,Role:"app"}}),f);return e==="systemd"?new Ta(h,f):new va(h,f)}async function bd(e,t=100){let r=[],a;for(let u=0;u<t;u++){let f=await e(a);if(r.push(...f.items),!f.nextToken)return r;a=f.nextToken}throw Error(`Provider pagination exceeded ${t} pages`)}class xu{client;prefix;id="ecs:aws";provider="ecs";constructor(e,t){this.client=e;this.prefix=t}async discover(e){let t=await bd(async(f)=>{let h=await this.client.listClusters({nextToken:f,maxResults:100});return{items:h.clusterArns??[],nextToken:h.nextToken}}),r=[],a=[],u=[];for(let f of t){let h=(await bd(async(b)=>{let S=await this.client.listServices(f,{nextToken:b,maxResults:100});return{items:S.serviceArns??[],nextToken:S.nextToken}})).filter((b)=>b.split("/").at(-1)?.startsWith(this.prefix));for(let b=0;b<h.length;b+=10){let S=await this.client.describeServices({cluster:f,services:h.slice(b,b+10)});r.push(...S.services??[])}for(let b of r.filter((S)=>S.clusterArn===f||!S.clusterArn)){let S=await bd(async(y)=>{let k=await this.client.listTasks(f,b.serviceName,{nextToken:y,maxResults:100});return{items:k.taskArns??[],nextToken:k.nextToken}});for(let y=0;y<S.length;y+=100){let k=await this.client.describeTasks(f,S.slice(y,y+100));a.push(...k.tasks??[])}}}if(this.client.describeTaskDefinition)for(let f of[...new Set(r.map((h)=>h.taskDefinition).filter((h)=>!!h))]){let h=await this.client.describeTaskDefinition(f);if(h.taskDefinition)u.push(h.taskDefinition)}return Nu(r,a,e,this.id,u)}}class Ou{client;prefix;id="lambda:aws";provider="lambda";constructor(e,t){this.client=e;this.prefix=t}async discover(e){let t=(await bd(async(r)=>{let a=await this.client.listFunctions({Marker:r,MaxItems:50});return{items:a.Functions??[],nextToken:a.NextMarker}})).filter((r)=>r.FunctionName?.startsWith(this.prefix));return Bu(t,e,this.id)}}async function ih(e,t,r={}){let a=[],u=K(e),f=be(e),h=e.aws?.profile,b=e.aws?.region??e.project.region??"us-east-1",S=`${e.project.slug}-${t}`;if(u!=="serverless"){let y=r.driver??F({config:e}),k=await y.findComputeTargets({slug:e.project.slug,environment:t,role:"app"});for(let R of k)a.push(Qy("systemd",y,R,e,t)),a.push(Qy("docker",y,R,e,t))}if(f==="aws")a.push(new xu(r.ecs??new dt(b,h),S)),a.push(new Ou(r.lambda??new T(b,h),S));return a}async function ge(e,t,r={}){let a={project:e.project.slug,environment:t};try{return await ku(await ih(e,t,r),a)}catch(u){return{generatedAt:new Date().toISOString(),workloads:[],sources:[{id:"runtime:bootstrap",provider:be(e)==="aws"?"ecs":"systemd",status:"error",discoveredAt:new Date().toISOString(),staleAfterSeconds:60,itemCount:0,message:String(u?.message??u).slice(0,500)}],degraded:!0}}}var Yy=65536,ia=49152,kd=/^[A-Za-z0-9_.@:-]+\.service$/,Id=/^[a-fA-F0-9]{12,128}$/,OR=["/boot","/dev","/etc","/proc","/root","/run","/sys","/var/run"];function ts(e){let t=Buffer.from(e);return t.byteLength<=Yy?e:`${t.subarray(0,Yy-24).toString("utf8")}
124
- [output truncated]`}function Sd(e){return{success:!1,instanceCount:0,perInstance:[],error:e instanceof Error?e.message:String(e)}}function jn(e){return`'${e.replaceAll("'",`'"'"'`)}'`}function $R(e,t){return Number.isFinite(e)?Math.min(1e4,Math.max(0,Math.floor(e))):t}function NR(e){let t=e.config,r=typeof t.clusterArn==="string"?t.clusterArn:void 0,a=e.links.providerId||e.name;return r&&a?{cluster:r,service:a}:void 0}function jR(e,t){return e.find((r)=>r.id===t.links.server)??(e.length===1?e[0]:void 0)}function BR(e,t){if(e.provider==="systemd"){let r=e.links.providerId;if(!r||!kd.test(r)||!["start","stop","restart"].includes(t))return;return[`systemctl ${t} ${r}`,`systemctl is-active ${r} 2>/dev/null || true`]}if(e.provider==="docker"){let r=e.links.providerId;if(!r||!Id.test(r)||!["start","stop","restart"].includes(t))return;return[`docker ${t} ${r}`,`docker inspect --format '{{.State.Status}}' ${r}`]}return}function sh(e,t){if(!t.startsWith("/")||t.includes("\x00"))return{ok:!1,error:"An absolute path is required."};let r=[];for(let b of t.split("/")){if(!b||b===".")continue;if(b===".."){if(!r.length)return{ok:!1,error:"Path traversal is not allowed."};r.pop()}else r.push(b)}let a=`/${r.join("/")}`;if(OR.some((b)=>a===b||a.startsWith(`${b}/`)))return{ok:!1,error:"Sensitive host paths are not available through runtime file access."};let u=e.links.project?.replace(/[^A-Za-z0-9_-]/g,""),f=e.links.service?.replace(/[^A-Za-z0-9_-]/g,"");if(![...u&&f?[`/var/www/${u}/${f}`,`/srv/${u}/${f}`]:[],...e.mounts.map((b)=>b.target).filter((b)=>b.startsWith("/"))].some((b)=>a===b||a.startsWith(`${b.replace(/\/$/,"")}/`)))return{ok:!1,error:"Path is outside this service’s owned roots."};return{ok:!0,path:a}}function MR(e,t){let r=e.links.project?.replace(/[^A-Za-z0-9_-]/g,""),a=e.links.service?.replace(/[^A-Za-z0-9_-]/g,"");return[...r&&a?[`/var/www/${r}/${a}`,`/srv/${r}/${a}`]:[],...e.mounts.map((u)=>u.target).filter((u)=>u.startsWith("/"))].sort((u,f)=>f.length-u.length).find((u)=>t===u||t.startsWith(`${u.replace(/\/$/,"")}/`))}var _u={process:["ps","-eo","pid,ppid,user,%cpu,%mem,etime,command","--sort=-%cpu"],sockets:["ss","-lntup"],filesystem:["df","-h"]};class ve{config;environment;dependencies;region;profile;constructor(e,t,r={}){this.config=e;this.environment=t;this.dependencies=r;this.region=e.aws?.region??e.project.region??"us-east-1",this.profile=e.aws?.profile}async inventory(){return this.dependencies.inventory?.()??ge(this.config,this.environment,{driver:this.dependencies.driver})}async workload(e){return(await this.inventory()).workloads.find((t)=>t.id===e)}async remote(e,t,r,a){let u=this.dependencies.driver??F({config:this.config}),f=await u.findComputeTargets({slug:this.config.project.slug,environment:this.environment,role:"app"}),h=jR(f,e);if(!h)throw Error("The workload server is no longer reachable in this scope.");return u.runRemoteDeploy({targets:[h],commands:t,timeoutSeconds:r,comment:a,tags:{Project:this.config.project.slug,Environment:this.environment,Role:"app"}})}async run(e){let t=await this.workload(e.workloadId),r={workloadId:e.workloadId,action:e.action};if(!t)return{...r,ok:!1,error:"Workload was not found in the current project and environment."};let a=t.capabilities[e.action];if(!a.supported)return{...r,ok:!1,error:a.reason??`${e.action} is unsupported for ${t.provider}.`};if(a.requiresConfirmation&&e.confirm!==t.name)return{...r,ok:!1,error:`Type "${t.name}" to ${e.action} this workload.`};if(a.requiresRecentAuth&&!e.recentAuth)return{...r,ok:!1,error:"Sign in again before using elevated runtime access."};if(e.action==="inspect")return{...r,ok:!0,workload:t};if(t.provider==="systemd"||t.provider==="docker"){let u=BR(t,e.action);if(!u)return{...r,ok:!1,error:`${e.action} is not implemented for ${t.provider}.`};let f=await this.remote(t,["set -uo pipefail",...u],60,`ts-cloud runtime:${e.action}`).catch(Sd);return{...r,ok:f.success,command:u[0],stdout:ts(f.perInstance?.[0]?.output??""),stderr:ts(f.perInstance?.[0]?.error??f.error??""),error:f.success?void 0:f.error??"Runtime operation failed."}}if(t.provider==="ecs"){let u=NR(t);if(!u)return{...r,ok:!1,error:"ECS cluster or service identity is unavailable."};let f=this.dependencies.ecs??new dt(this.region,this.profile);if(e.action==="scale"){let h=$R(e.replicas,t.desiredReplicas??1);return await f.scaleService(u.cluster,u.service,h),{...r,ok:!0,command:`ecs scale ${t.name} ${h}`}}if(e.action==="start"||e.action==="stop"){let h=e.action==="stop"?0:Math.max(1,t.desiredReplicas??1);return await f.scaleService(u.cluster,u.service,h),{...r,ok:!0,command:`ecs scale ${t.name} ${h}`}}if(e.action==="restart"||e.action==="redeploy")return await f.forceNewDeployment(u.cluster,u.service),{...r,ok:!0,command:`ecs redeploy ${t.name}`}}return{...r,ok:!1,error:`${e.action} is not implemented for ${t.provider}.`}}async exec(e){let t={workloadId:e.workloadId,preset:e.preset},r=await this.workload(e.workloadId);if(!r)return{...t,ok:!1,error:"Workload was not found in the current project and environment."};if(process.env.TS_CLOUD_RUNTIME_EXEC==="0")return{...t,ok:!1,error:"Runtime exec is disabled by TS_CLOUD_RUNTIME_EXEC."};if(!r.capabilities.exec.supported)return{...t,ok:!1,error:r.capabilities.exec.reason??"Exec is unsupported for this workload."};if(e.confirm!==r.name)return{...t,ok:!1,error:`Type "${r.name}" to open exec access.`};if(!e.recentAuth)return{...t,ok:!1,error:"Sign in again before using elevated runtime access."};let a=e.preset&&_u[e.preset];if(!a&&!e.command?.trim())return{...t,ok:!1,error:"Choose a diagnostic preset or provide a command."};if(e.command&&r.provider!=="docker")return{...t,ok:!1,error:"Free-form exec is restricted to isolated containers; use a diagnostic preset for system services."};let u=r.links.providerId??"",f;if(r.provider==="docker"&&Id.test(u)){let b=e.command?.trim()||a.map(jn).join(" ");f=`docker exec ${u} sh -lc ${jn(b)}`}else if(r.provider==="systemd"&&kd.test(u)&&e.preset)f=e.preset==="process"?`systemctl status ${u} --no-pager --full`:_u[e.preset].map(jn).join(" ");if(!f)return{...t,ok:!1,error:"Exec target identity is invalid or unsupported."};let h=await this.remote(r,["set -uo pipefail",f],60,"ts-cloud runtime:exec").catch(Sd);return{...t,ok:h.success,command:f,stdout:ts(h.perInstance?.[0]?.output??""),stderr:ts(h.perInstance?.[0]?.error??h.error??""),error:h.success?void 0:h.error??"Exec command failed."}}async readFile(e){let t={workloadId:e.workloadId,path:e.path},r=await this.fileTarget(e);if("error"in r)return{...t,ok:!1,error:r.error};let{workload:a,path:u,root:f,providerId:h}=r,S=`sh -c ${jn('resolved=$(realpath -m "$1"); root=$(realpath -m "$3"); case "$resolved" in "$root"|"$root"/*) ;; *) exit 73;; esac; test -f "$resolved"; size=$(wc -c < "$resolved"); printf "__TSCLOUD_SIZE__=%s\\n" "$size"; head -c "$2" "$resolved" | base64')} sh ${jn(u)} ${ia} ${jn(f)}`,y=a.provider==="docker"?`docker exec ${h} ${S}`:S,k=await this.remote(a,[y],30,"ts-cloud runtime:file-read").catch(Sd);if(!k.success)return{...t,ok:!1,error:k.error??k.perInstance?.[0]?.error??"File read failed."};let R=k.perInstance?.[0]?.output??"",D=/__TSCLOUD_SIZE__=(\d+)\r?\n/.exec(R);if(!D)return{...t,ok:!1,error:"The remote file response was invalid."};let O=Number(D[1]),M=R.slice((D.index??0)+D[0].length).replace(/\s+/g,"");if(Buffer.from(M,"base64").byteLength>ia)return{...t,ok:!1,error:"The remote file exceeded the transfer limit."};return{...t,ok:!0,contentBase64:M,size:O,truncated:O>ia}}async writeFile(e){let t={workloadId:e.workloadId,path:e.path},r=await this.fileTarget(e);if("error"in r)return{...t,ok:!1,error:r.error};if(!/^[A-Za-z0-9+/]*={0,2}$/.test(e.contentBase64))return{...t,ok:!1,error:"File content must be valid base64."};let a=Buffer.from(e.contentBase64,"base64");if(a.toString("base64")!==e.contentBase64)return{...t,ok:!1,error:"File content must be canonical base64."};if(a.byteLength>ia)return{...t,ok:!1,error:`File uploads are limited to ${ia} bytes.`};let{workload:u,path:f,root:h,providerId:b}=r,y=`sh -c ${jn('resolved=$(realpath -m "$1"); root=$(realpath -m "$2"); case "$resolved" in "$root"|"$root"/*) ;; *) exit 73;; esac; mkdir -p "$(dirname "$resolved")"; tmp="$resolved.ts-cloud-$$"; base64 -d > "$tmp"; chmod 600 "$tmp"; mv "$tmp" "$resolved"')} sh ${jn(f)} ${jn(h)}`,k=u.provider==="docker"?`printf %s ${jn(e.contentBase64)} | docker exec -i ${b} ${y}`:`printf %s ${jn(e.contentBase64)} | ${y}`,R=await this.remote(u,[k],30,"ts-cloud runtime:file-write").catch(Sd);return{...t,ok:R.success,size:a.byteLength,truncated:!1,error:R.success?void 0:R.error??R.perInstance?.[0]?.error??"File write failed."}}async fileTarget(e){let t=await this.workload(e.workloadId);if(!t)return{error:"Workload was not found in the current project and environment."};if(process.env.TS_CLOUD_RUNTIME_FILE_ACCESS==="0")return{error:"Runtime file access is disabled by TS_CLOUD_RUNTIME_FILE_ACCESS."};if(!t.capabilities.files.supported)return{error:t.capabilities.files.reason??"File access is unsupported for this workload."};if(e.confirm!==t.name)return{error:`Type "${t.name}" to access workload files.`};if(!e.recentAuth)return{error:"Sign in again before using elevated runtime access."};let r=sh(t,e.path);if(!r.ok)return{error:r.error};let a=MR(t,r.path),u=t.links.providerId??"";if(!a||t.provider==="systemd"&&!kd.test(u)||t.provider==="docker"&&!Id.test(u))return{error:"File target identity is invalid or unsupported."};return{workload:t,path:r.path,root:a,providerId:u}}async logs(e,t={}){let r=await this.workload(e);if(!r)throw Error("Workload was not found in the current project and environment.");if(!r.capabilities.logs.supported)throw Error(r.capabilities.logs.reason??"Logs are unsupported for this workload.");let a=Math.min(1000,Math.max(1,Math.floor(t.limit??200)));if(r.provider==="lambda"||r.provider==="ecs"){let k=this.dependencies.logs??new we(this.region,this.profile),R=r.config.logGroups,D=r.provider==="lambda"?`/aws/lambda/${r.name}`:Array.isArray(R)&&typeof R[0]==="string"?R[0]:void 0;if(!D)throw Error("The ECS task definition does not declare an awslogs group.");let O=await k.filterLogEvents({logGroupName:D,startTime:t.since?.getTime(),limit:a}),M=(O.events??[]).slice(0,a).map((z)=>({timestamp:z.timestamp==null?void 0:new Date(z.timestamp).toISOString(),message:ts(String(z.message??""))}));return{workloadId:e,provider:r.provider,lines:M,nextCursor:O.nextToken,truncated:(O.events?.length??0)>=a}}let u=r.links.providerId??"",f=t.since&&Number.isFinite(t.since.getTime())?t.since:void 0,h=r.provider==="systemd"&&kd.test(u)?`journalctl -u ${u} --no-pager -n ${a} -o short-iso${f?` --since ${jn(f.toISOString())}`:""}`:r.provider==="docker"&&Id.test(u)?`docker logs --timestamps --tail ${a}${f?` --since ${Math.floor(f.getTime()/1000)}`:""} ${u} 2>&1`:void 0;if(!h)throw Error("Log target identity is invalid.");let b=await this.remote(r,[h],30,"ts-cloud runtime:logs");if(!b.success)throw Error(b.error??b.perInstance?.[0]?.error??"Log read failed.");let S=ts(b.perInstance?.[0]?.output??""),y=S.split(`
122
+ `)}function hR(e,t){return{status:"unavailable",findings:[],error:`${e.id} exceeded its ${t}ms timeout`,metadata:{timeoutMs:t}}}class Ot{posture;defaultTimeoutMs;nowFn;constructor(e,t={}){this.posture=e;this.defaultTimeoutMs=t.defaultTimeoutMs??60000,this.nowFn=t.now??(()=>new Date)}async run(e,t){let r=this.nowFn(),a=Math.max(100,e.timeoutMs??this.defaultTimeoutMs),u=new AbortController,f,h=new Promise((k)=>{f=setTimeout(()=>{u.abort(),k(hR(e,a))},a)}),b;try{b=await Promise.race([e.scan({...t,signal:u.signal}),h])}catch(k){b={status:"unavailable",findings:[],error:k instanceof Error?k.message:String(k)}}finally{if(f)clearTimeout(f)}let S=this.nowFn(),y={...t,scannerId:e.id,scannerVersion:e.version,status:b.status,findings:b.findings,metadata:b.metadata,error:b.error,startedAt:r.toISOString(),completedAt:S.toISOString(),durationMs:Math.max(0,S.getTime()-r.getTime())};return this.posture.recordScan(y)}async runAll(e,t){return Promise.all(e.map((r)=>this.run(r,t)))}}class En{scanner;id="source-secrets";version="1.0.0";timeoutMs=30000;constructor(e=new Cn){this.scanner=e}async scan(e){if(!e.artifactRoot)return{status:"skipped",findings:[],error:"No artifact root was supplied"};let t=await this.scanner.scan({directory:e.artifactRoot,failOnSeverity:"critical"});return{status:t.passed?"passed":"failed",findings:t.findings.map((r)=>({...e,ruleId:r.pattern.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),severity:r.pattern.severity,title:r.pattern.name,description:r.pattern.description,subject:`${r.file}:${r.line}`,evidence:{file:r.file,line:r.line,column:r.column,match:r.match,context:r.context},remediation:"Remove the credential, rotate it at its issuer, and use a managed secret or environment reference."})),metadata:{scannedFiles:t.scannedFiles,summary:t.summary}}}}function yR(e){let t=e?.toLowerCase();return t==="critical"||t==="high"||t==="medium"||t==="low"?t:"info"}class Ca{id="trivy-image";version;timeoutMs;constructor(e={}){this.version=e.version??"local",this.timeoutMs=e.timeoutMs??120000,this.executable=e.executable??"trivy"}executable;async scan(e){if(!e.imageRef)return{status:"skipped",findings:[],error:"No image reference was supplied"};let t;try{t=Bun.spawn([this.executable,"image","--format","json","--quiet","--scanners","vuln",e.imageRef],{stdout:"pipe",stderr:"pipe",env:{PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin",HOME:"/nonexistent",TRIVY_NO_PROGRESS:"true"}})}catch(S){return{status:"unsupported",findings:[],error:S instanceof Error?S.message:String(S)}}let r=()=>t.kill();e.signal.addEventListener("abort",r,{once:!0});let[a,u,f]=await Promise.all([t.exited,new Response(t.stdout).text(),new Response(t.stderr).text()]);if(e.signal.removeEventListener("abort",r),a!==0)return{status:/not found|enoent/i.test(f)?"unsupported":"unavailable",findings:[],error:f.slice(0,2000)||`Trivy exited with ${a}`};let h=JSON.parse(u),b=[];for(let S of h.Results??[])for(let y of S.Vulnerabilities??[]){let k=y.VulnerabilityID??"unknown-vulnerability";b.push({...e,ruleId:k,severity:yR(y.Severity),title:y.Title||k,description:y.Description||`${k} affects ${y.PkgName??"an image package"}.`,subject:`${e.imageRef}:${y.PkgName??"unknown"}:${y.InstalledVersion??"unknown"}`,evidence:{image:e.imageRef,target:S.Target??"",cve:k,package:y.PkgName??"",installedVersion:y.InstalledVersion??"",fixedVersion:y.FixedVersion??"",reference:y.PrimaryURL??""},remediation:y.FixedVersion?`Upgrade ${y.PkgName} to ${y.FixedVersion} or later.`:"Remove or replace the affected package and rescan the image."})}return{status:b.length?"failed":"passed",findings:b,metadata:{imageRef:e.imageRef,vulnerabilityCount:b.length,localOnly:!0}}}}class Zf{actions;id="aws-iam-capabilities";version="1.0.0";timeoutMs=30000;client;constructor(e,t={}){this.actions=e;if(this.resourceArns=t.resourceArns??["*"],t.client)this.client=t.client;else{let r=new Te(t.region),a=new Re(t.region);this.client={getCallerIdentity:()=>r.getCallerIdentity(),simulatePrincipalPolicy:(u)=>a.simulatePrincipalPolicy(u)}}}resourceArns;async scan(e){let t=await this.client.getCallerIdentity();if(!t.Arn)return{status:"unavailable",findings:[],error:"AWS returned no caller ARN"};let r=t.Arn;if(r.includes(":assumed-role/"))return{status:"unsupported",findings:[],error:"AWS policy simulation requires the underlying IAM role ARN; use an IAM role/user ARN or provider-native access analysis.",metadata:{account:t.Account??"",principalType:"assumed-role"}};let f=(await this.client.simulatePrincipalPolicy({PolicySourceArn:r,ActionNames:this.actions,ResourceArns:this.resourceArns})).EvaluationResults.filter((h)=>h.EvalDecision!=="allowed").map((h)=>({...e,ruleId:`iam-${h.EvalActionName.toLowerCase().replace(/[^a-z0-9]+/g,"-")}`,severity:"high",title:`Missing AWS capability: ${h.EvalActionName}`,description:`The active AWS principal is ${h.EvalDecision||"not allowed"} for this deployment action.`,subject:`${r}:${h.EvalActionName}`,evidence:{account:t.Account??"",principalArn:r,action:h.EvalActionName,decision:h.EvalDecision,missingContext:h.MissingContextValues??[]},remediation:"Grant the deployment principal the least-privilege action on the required resources, then rerun the capability check."}));return{status:f.length?"failed":"passed",findings:f,metadata:{account:t.Account??"",principalArn:r,evaluatedActions:this.actions.length}}}}import{createHash as vR,createVerify as bR}from"node:crypto";import{existsSync as SR,readFileSync as wR}from"node:fs";import{basename as kR,join as IR,resolve as Gy}from"node:path";function Xo(e){return vR("sha256").update(e).digest("hex")}function ER(e){let t=[["dependencies","required"],["optionalDependencies","optional"],["devDependencies","excluded"],["peerDependencies","required"]],r=new Map;for(let[a,u]of t){let f=e[a];if(!f||typeof f!=="object"||Array.isArray(f))continue;for(let[h,b]of Object.entries(f)){let S=String(b).replace(/^[~^]/,""),y=`${h}@${S}`;if(!r.has(y))r.set(y,{type:"library",name:h,version:S,purl:`pkg:npm/${encodeURIComponent(h)}@${encodeURIComponent(S)}`,scope:u})}}return[...r.values()].sort((a,u)=>`${a.name}@${a.version}`.localeCompare(`${u.name}@${u.version}`))}function Eu(e,t={}){let r=IR(Gy(e),"package.json");if(!SR(r))throw Error(`Cannot generate an SBOM: ${r} was not found`);let a=wR(r,"utf8"),u=JSON.parse(a),f=String(u.name??kR(Gy(e))),h=String(u.version??"0.0.0"),b=Xo(a);return{bomFormat:"CycloneDX",specVersion:"1.5",serialNumber:t.serial??`urn:uuid:${crypto.randomUUID()}`,version:1,metadata:{timestamp:(t.now??new Date).toISOString(),component:{type:"application",name:f,version:h,purl:`pkg:npm/${encodeURIComponent(f)}@${encodeURIComponent(h)}`,hashes:[{alg:"SHA-256",content:b}]},tools:[{vendor:"ts-cloud",name:"security-posture",version:"1.0.0"}]},components:ER(u)}}async function vu(e,t={}){let r=Bun.spawn([t.executable??"syft",e,"-o","cyclonedx-json"],{stdout:"pipe",stderr:"pipe",env:{PATH:process.env.PATH??"/usr/local/bin:/usr/bin:/bin",HOME:"/nonexistent",SYFT_CHECK_FOR_APP_UPDATE:"false"}}),a=()=>r.kill();t.signal?.addEventListener("abort",a,{once:!0});let[u,f,h]=await Promise.all([r.exited,new Response(r.stdout).text(),new Response(r.stderr).text()]);if(t.signal?.removeEventListener("abort",a),u!==0)throw Error(h.slice(0,2000)||`Syft exited with ${u}`);return JSON.parse(f)}function Ea(e,t,r){let a=JSON.stringify(r);return e.addReleaseArtifact({...t,kind:"sbom",format:`cyclonedx-${r.specVersion}+json`,digest:`sha256:${Xo(a)}`,summary:{component:r.metadata.component.name,version:r.metadata.component.version,components:r.components.length},content:a,sensitive:!0})}function Tu(e,t,r){let a={total:r.length,critical:0,high:0,medium:0,low:0,info:0,fixable:0};for(let f of r){a[f.severity]++;let h=f.evidence;if(typeof h.fixedVersion==="string"&&h.fixedVersion)a.fixable++}let u=JSON.stringify({releaseId:t.releaseId,generatedAt:new Date().toISOString(),findings:r.map((f)=>({id:f.id,ruleId:f.ruleId,severity:f.severity,subject:f.subject,remediation:f.remediation}))});return e.addReleaseArtifact({...t,kind:"vulnerability_summary",format:"ts-cloud-vulnerability-summary+json",digest:`sha256:${Xo(u)}`,summary:a,content:u,sensitive:!0})}function wu(e){if(!e.artifact&&!e.artifactSha256)throw Error("Release provenance requires artifact content or a SHA-256 digest");return{_type:"https://in-toto.io/Statement/v1",subject:[{name:e.artifactName,digest:{sha256:e.artifactSha256?.replace(/^sha256:/,"")??Xo(e.artifact)}}],predicateType:"https://slsa.dev/provenance/v1",predicate:{buildDefinition:{buildType:"https://ts-cloud.dev/build/v1",externalParameters:e.externalParameters??{},internalParameters:{},resolvedDependencies:e.resolvedDependencies??[]},runDetails:{builder:{id:"https://ts-cloud.dev/builders/local/v1"},metadata:{invocationId:e.invocationId,startedOn:e.startedAt,finishedOn:e.completedAt}}}}}function Ru(e,t,r){let a=JSON.stringify(r);return e.addReleaseArtifact({...t,kind:"provenance",format:"in-toto+slsa-v1+json",digest:`sha256:${Xo(a)}`,summary:{subjects:r.subject.length,builder:r.predicate.runDetails.builder.id,buildType:r.predicate.buildDefinition.buildType},content:a,sensitive:!0})}function LS(e){let t=e.expectedSha256.replace(/^sha256:/,"").toLowerCase(),r=Xo(e.artifact)===t;if(!e.signature||!e.publicKey)return{digestValid:r,signature:"not_configured"};try{let a=bR("SHA256");return a.update(e.artifact),a.end(),{digestValid:r,signature:a.verify(e.publicKey,Buffer.from(e.signature,"base64"))?"verified":"invalid"}}catch{return{digestValid:r,signature:"invalid"}}}function ue(e,t){let r=e.environments.get(t);if(!r)throw Error(`Security scope for environment '${t}' was not found`);return{organizationId:e.organization.id,projectId:e.project.id,environmentId:r.id}}function Du(e,t){let r=new bn(e.store),a=r.listPolicies(e.organization.id);for(let[u,f]of e.environments){if(a.some((b)=>b.environmentId===f.id))continue;let h=u==="production"||f.kind==="production";a.push(r.createPolicy({organizationId:e.organization.id,environmentId:f.id,name:h?"Production baseline":"Environment baseline",scannerFailMode:h?"closed":"open",requiredScanners:["source-secrets"],rules:h?[{minimumSeverity:"critical",action:"block"},{minimumSeverity:"high",action:"block"},{minimumSeverity:"medium",action:"warn"},{minimumSeverity:"low",action:"record"}]:[{minimumSeverity:"critical",action:"warn"},{minimumSeverity:"high",action:"warn"},{minimumSeverity:"low",action:"record"}],actorId:t}))}return a}function $S(e,t,r,a={}){let u=r.findings.map((f)=>({...t,ruleId:f.pattern.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),severity:f.pattern.severity,title:f.pattern.name,description:f.pattern.description,subject:`${f.file}:${f.line}`,evidence:{file:f.file,line:f.line,column:f.column,match:f.match,context:f.context},remediation:"Remove and rotate the credential, then reference it through a managed secret or environment variable."}));return e.recordScan({...t,scannerId:"source-secrets",scannerVersion:a.scannerVersion??"1.0.0",status:a.skipped?"skipped":r.passed?"passed":"failed",findings:a.skipped?[]:u,metadata:{scannedFiles:r.scannedFiles,durationMs:r.duration,summary:r.summary},durationMs:r.duration,error:a.skipped?"The operator explicitly skipped source-secret scanning.":void 0})}function MS(e,t,r="The operator explicitly skipped source-secret scanning."){return e.recordScan({...t,scannerId:"source-secrets",scannerVersion:"1.0.0",status:"skipped",findings:[],error:r})}function RR(e,t){let r=[],a=t.security;if(a?.firewall&&!["active","configured","ok"].includes(String(a.firewall.status)))r.push({...e,ruleId:"host-firewall-disabled",severity:"high",title:"Host firewall is not active",description:String(a.firewall.summary??"The host firewall did not report an active configuration."),subject:"host:firewall",evidence:{status:String(a.firewall.status??"unknown"),rules:Array.isArray(a.firewall.rules)?a.firewall.rules.length:0},remediation:"Apply the declarative firewall policy and confirm only required listeners are public."});for(let u of a?.ports??[]){let f=String(u.listen??""),h=Number(f.match(/:(\d+)$/)?.[1]);if(u.exposure==="public"&&Number.isFinite(h)&&![22,80,443].includes(h))r.push({...e,ruleId:"unexpected-public-listener",severity:"medium",title:`Unexpected public listener on port ${h}`,description:`${String(u.processName??"A process")} is listening publicly outside the standard SSH/HTTP/HTTPS ports.`,subject:`host:port:${h}`,evidence:{protocol:String(u.proto??""),listen:f,process:String(u.processName??"")},remediation:"Bind the service to loopback/private networking or explicitly document and firewall the required public port."})}for(let u of a?.tlsCertificates??[]){let f=Number(u.daysRemaining);if(Number.isFinite(f)&&f<30)r.push({...e,ruleId:"tls-certificate-expiry",severity:f<14?"high":"medium",title:`TLS certificate expires in ${f} days`,description:`${String(u.domain??"A configured domain")} needs renewal.`,subject:`tls:${String(u.domain??"unknown")}`,evidence:{domain:String(u.domain??""),daysRemaining:f,expires:String(u.expires??"")},remediation:"Renew the certificate and verify automatic renewal can complete before expiry."})}for(let u of t.diagnostics??[]){if(u.status==="pass"||u.status==="ok")continue;r.push({...e,ruleId:`diagnostic-${String(u.name??"unknown").toLowerCase().replace(/[^a-z0-9]+/g,"-")}`,severity:u.status==="fail"?"high":"medium",title:String(u.name??"Host security check"),description:String(u.detail??"The host security diagnostic did not pass."),subject:`diagnostic:${String(u.name??"unknown")}`,evidence:{status:String(u.status??"unknown")},remediation:"Follow the diagnostic guidance, rerun the check, and confirm the finding resolves."})}return r}function fs(e,t,r){let a=!!r.security||Array.isArray(r.diagnostics),u=a?RR(t,r):[];return e.recordScan({...t,scannerId:"host-posture",scannerVersion:"1.0.0",status:!a?"unavailable":u.length?"failed":"passed",findings:u,metadata:{source:"dashboard-live-probe",checks:Array.isArray(r.diagnostics)?r.diagnostics.length:0},error:a?void 0:"Live host posture data was unavailable; source and provider checks remain usable."})}function hs(e,t){let r=e.evaluateGate({...t.scope,operationId:t.operationId}),a=e.listFindings({...t.scope,limit:1000}).filter((u)=>u.status!=="resolved");return{decision:r,summary:{desiredConfigHash:t.desiredConfigHash??null,securityImpact:{critical:a.filter((u)=>u.severity==="critical").length,high:a.filter((u)=>u.severity==="high").length,waived:a.filter((u)=>u.status==="waived").length,assigned:a.filter((u)=>!!u.ownerActorId).length},blockingFindingIds:r.findingIds,policy:{id:r.policyId,version:r.policyVersion},scannerVersions:r.scannerVersions}}}async function FS(e,t){let r=t.scanner??new Ca({timeoutMs:t.scannerTimeoutMs}),u=await new Ot(e,{defaultTimeoutMs:t.scannerTimeoutMs??120000}).run(r,{...t.scope,releaseId:t.releaseId,imageRef:t.imageRef}),f={...t.scope,releaseId:t.releaseId};Tu(e,f,u.findings);let h=t.generateImageSbom??vu,b=new AbortController,S=Math.max(100,t.sbomTimeoutMs??120000),y,k=new Promise((O,M)=>{y=setTimeout(()=>{b.abort(),M(Error(`syft-sbom exceeded its ${S}ms timeout`))},S)}),R="unavailable";try{let O=await Promise.race([h(t.imageRef,{signal:b.signal}),k]);Ea(e,f,O),e.recordScan({...t.scope,releaseId:t.releaseId,scannerId:"syft-sbom",scannerVersion:"local",status:"passed",metadata:{imageRef:t.imageRef,format:`cyclonedx-${O.specVersion}+json`,components:O.components.length,localOnly:!0}}),R="image"}catch(O){let M=O instanceof Error?O.message:String(O);try{let z=Eu(t.artifactRoot);Ea(e,f,z),e.recordScan({...t.scope,releaseId:t.releaseId,scannerId:"syft-sbom",scannerVersion:"local",status:"unsupported",error:`Image inventory was unavailable; attached a package-manifest SBOM instead. ${M}`,metadata:{imageRef:t.imageRef,fallback:"package-manifest",components:z.components.length,localOnly:!0}}),R="manifest"}catch(z){e.recordScan({...t.scope,releaseId:t.releaseId,scannerId:"syft-sbom",scannerVersion:"local",status:"unavailable",error:`Image and manifest SBOM generation were unavailable. ${M}; ${z instanceof Error?z.message:String(z)}`,metadata:{imageRef:t.imageRef,localOnly:!0}})}}finally{if(y)clearTimeout(y)}let D=wu({artifactName:t.imageRef,artifact:t.imageSha256?void 0:t.imageRef,artifactSha256:t.imageSha256,invocationId:t.invocationId,startedAt:t.startedAt,completedAt:t.completedAt??new Date().toISOString(),externalParameters:t.externalParameters??{imageRef:t.imageRef}});return Ru(e,f,D),{scan:u,sbomSource:R}}function Ee(e,t,r){return[e,t,r].map((a)=>encodeURIComponent(a)).join(":")}function eh(e){return Object.fromEntries(["start","stop","restart","redeploy","scale","logs","exec","inspect","files"].map((t)=>[t,{supported:!1,reason:e}]))}function _t(e,t,r=["exec","files"]){let a=eh(t);for(let u of e)a[u]={supported:!0,requiresConfirmation:!["logs","inspect"].includes(u),requiresRecentAuth:r.includes(u)};return a}var AR=/(?:secret|password|passwd|token|api[_-]?key|private[_-]?key|credential|authorization|cookie)/i;function Le(e){let t=String(e??"").trim().toLowerCase();if(["active","running","ready","healthy","available","steady","active:running"].includes(t))return"running";if(["activating","pending","provisioning","starting","created","initializing"].includes(t))return"starting";if(["deactivating","stopping","draining","terminating"].includes(t))return"stopping";if(["inactive","stopped","complete","completed","exited","disabled"].includes(t))return"stopped";if(["degraded","unhealthy","warning"].includes(t))return"degraded";if(["failed","dead","error","crashed","oomkilled"].includes(t))return"failed";return"unknown"}function $e(e){if(Array.isArray(e))return e.map((r)=>$e(r));if(!e||typeof e!=="object")return e;let t={};for(let[r,a]of Object.entries(e))t[r]=AR.test(r)?"[REDACTED]":$e(a);return t}function Lt(e,t=new Date){if(!e)return;let r=new Date(e).getTime();return Number.isFinite(r)?Math.max(0,Math.floor((t.getTime()-r)/1000)):void 0}function Pu(e){let t=Number(e);return Number.isFinite(t)&&t>=0?t:void 0}function CR(e){let t=String(e?.message??e);if(/(?:unauthorized|accessdenied|forbidden|credentials)/i.test(t))return"unauthorized";if(/(?:timeout|unreachable|econnrefused|enotfound|network)/i.test(t))return"unreachable";return"error"}async function ku(e,t={},r={}){let a=t.now??new Date,u=Math.max(100,r.timeoutMs??1e4),f=Math.max(1,r.staleAfterSeconds??60),h=await Promise.all(e.map(async(S)=>{try{let y=await Promise.race([S.discover({...t,now:a}),new Promise((k,R)=>setTimeout(()=>R(Error(`Runtime source ${S.id} timed out after ${u}ms`)),u))]);return{workloads:y,source:{id:S.id,provider:S.provider,status:"fresh",discoveredAt:a.toISOString(),staleAfterSeconds:f,itemCount:y.length}}}catch(y){return{workloads:[],source:{id:S.id,provider:S.provider,status:CR(y),discoveredAt:a.toISOString(),staleAfterSeconds:f,itemCount:0,message:String(y?.message??y).slice(0,500)}}}})),b=h.map((S)=>S.source);return{generatedAt:a.toISOString(),workloads:h.flatMap((S)=>S.workloads).sort((S,y)=>S.name.localeCompare(y.name)||S.id.localeCompare(y.id)),sources:b,degraded:b.some((S)=>S.status!=="fresh")}}function es(e){return e?.split("/").at(-1)??e?.split(":").at(-1)??"unknown"}function Nu(e,t,r,a="ecs:aws",u=[]){let f=r.now??new Date;return e.map((h)=>{let b=h.serviceName??es(h.serviceArn),S=t.filter((Z)=>!h.clusterArn||Z.clusterArn===h.clusterArn),y=S.some((Z)=>!!Z.group)?S.filter((Z)=>Z.group===`service:${b}`):S,k=h.status==="ACTIVE"?(h.runningCount??0)<(h.desiredCount??0)?"degraded":"running":Le(h.status),R=u.find((Z)=>Z.taskDefinitionArn===h.taskDefinition),D=Array.isArray(R?.containerDefinitions)?R.containerDefinitions:[],O=[...new Set(D.map((Z)=>Z.logConfiguration?.options?.["awslogs-group"]).filter((Z)=>typeof Z==="string"))],M=D.flatMap((Z)=>(Z.mountPoints??[]).map((oe)=>({source:oe.sourceVolume,target:oe.containerPath,type:"volume",readOnly:!!oe.readOnly}))),z=D.flatMap((Z)=>(Z.portMappings??[]).map((oe,G)=>({id:`${Z.name??"container"}:${G}`,name:Z.name,mode:R?.networkMode,ports:[{container:oe.containerPort,host:oe.hostPort,protocol:oe.protocol}]}))),J=r.project&&r.environment&&b.startsWith(`${r.project}-${r.environment}-`)?b.slice(`${r.project}-${r.environment}-`.length):b;return{id:Ee("ecs",a,h.serviceArn??b),provider:"ecs",kind:"service",name:b,status:k,rawStatus:h.status,health:k==="running"?"healthy":k==="failed"||k==="degraded"?"unhealthy":"unknown",desiredReplicas:h.desiredCount,runningReplicas:h.runningCount,image:D[0]?.image,runtime:h.launchType??"ECS",version:es(h.taskDefinition),ageSeconds:Lt(h.deployments?.[0]?.createdAt,f),restartCount:0,tags:{},links:{project:r.project,environment:r.environment,service:J,release:es(h.taskDefinition),providerId:h.serviceArn},replicas:y.map((Z)=>{let oe=Le(Z.lastStatus);return{id:Ee("ecs",a,Z.taskArn??es(Z.taskArn)),name:es(Z.taskArn),status:oe,rawStatus:Z.lastStatus,createdAt:Z.createdAt,startedAt:Z.startedAt,stoppedAt:Z.stoppedAt,host:Z.containerInstanceArn,containers:(Z.containers??[]).map((G)=>({id:G.containerArn??G.name??"container",name:G.name??"container",image:D.find((te)=>te.name===G.name)?.image,imageDigest:G.imageDigest,status:Le(G.lastStatus),rawStatus:G.lastStatus,exitCode:G.exitCode,reason:G.reason,runtime:"ecs"}))}}),networks:z,mounts:M,capabilities:_t(["start","stop","restart","redeploy","scale","inspect",...O.length?["logs"]:[]],"This ECS runtime does not expose exec or file transfer; logs require an awslogs task-definition driver"),config:$e({clusterArn:h.clusterArn,taskDefinition:h.taskDefinition,launchType:h.launchType,pendingCount:h.pendingCount,deployments:h.deployments,logGroups:O,executionRoleArn:R?.executionRoleArn,taskRoleArn:R?.taskRoleArn,cpu:R?.cpu,memory:R?.memory}),discoveredAt:f.toISOString(),sourceId:a}})}function Bu(e,t,r="lambda:aws"){let a=t.now??new Date;return e.map((u)=>{let f=u.FunctionName??es(u.FunctionArn),h=u.State==="Active"?"running":Le(u.State);return{id:Ee("lambda",r,u.FunctionArn??f),provider:"lambda",kind:"function",name:f,status:h,rawStatus:u.State,health:h==="running"?"healthy":h==="failed"?"unhealthy":"unknown",desiredReplicas:void 0,runningReplicas:void 0,image:void 0,runtime:u.Runtime,version:u.Version,architecture:u.Architectures?.join(", "),ageSeconds:Lt(u.LastModified,a),restartCount:0,tags:{},links:{project:t.project,environment:t.environment,service:f,providerId:u.FunctionArn},resources:{memoryLimitBytes:u.MemorySize==null?void 0:u.MemorySize*1024*1024},replicas:[],networks:[],mounts:[],capabilities:_t(["logs","inspect"],"Lambda has no persistent process to start, stop, restart, exec, or browse files; deploy a release to replace code"),config:$e({handler:u.Handler,timeout:u.Timeout,codeSize:u.CodeSize,stateReason:u.StateReason,environmentKeys:Object.keys(u.Environment?.Variables??{})}),discoveredAt:a.toISOString(),sourceId:r}})}function th(e){let t=e.trim();if(!t)return[];let r=JSON.parse(t);if(!Array.isArray(r))throw Error("Docker inspect output must be an array");return r.filter((a)=>a&&typeof a.Id==="string")}function PR(e){let t=Object.entries(e.NetworkSettings?.Ports??{}).flatMap(([r,a])=>{let[u,f]=r.split("/");return(a??[]).map((h)=>({container:Number(u)||void 0,host:Number(h.HostPort)||void 0,protocol:f,address:h.HostIp}))});return Object.entries(e.NetworkSettings?.Networks??{}).map(([r,a])=>({id:a.NetworkID||r,name:r,mode:e.HostConfig?.NetworkMode,addresses:[a.IPAddress,a.GlobalIPv6Address].filter(Boolean),ports:t}))}function _R(e){return(e.Mounts??[]).filter((t)=>!!t.Destination).map((t)=>({source:t.Source,target:t.Destination,type:t.Type,readOnly:t.RW===!1}))}function rh(e,t,r=t.server??"local"){let a=t.now??new Date;return e.map((u)=>{let f=u.State?.OOMKilled?"oomkilled":u.State?.Restarting?"starting":u.State?.Status,h=Le(f),b=(u.Name??u.Id.slice(0,12)).replace(/^\//,""),S=u.Config?.Labels??{},y=_R(u),k=PR(u),R={id:u.Id,name:b,image:u.Config?.Image,imageDigest:u.Image,runtime:"docker",status:h,rawStatus:f,exitCode:u.State?.ExitCode,reason:u.State?.Error,resources:{memoryLimitBytes:u.HostConfig?.Memory||void 0},networks:k,mounts:y};return{id:Ee("docker",r,u.Id),provider:"docker",kind:"container",name:b,status:h,rawStatus:f,health:h==="running"?"healthy":h==="failed"?"unhealthy":"unknown",desiredReplicas:1,runningReplicas:h==="running"?1:0,image:u.Config?.Image,runtime:"docker",ageSeconds:Lt(u.State?.StartedAt,a),restartCount:u.RestartCount??0,tags:S,links:{project:t.project,environment:t.environment,server:t.server??r.replace(/^docker:/,""),service:S["com.docker.compose.service"]??S["ts-cloud.service"]??b,release:S["ts-cloud.release"],providerId:u.Id},resources:R.resources,replicas:[{id:Ee("docker",r,`${u.Id}:0`),name:b,status:h,rawStatus:f,startedAt:u.State?.StartedAt,stoppedAt:u.State?.FinishedAt,restartCount:u.RestartCount,containers:[R],resources:R.resources}],networks:k,mounts:y,capabilities:_t(["start","stop","restart","logs","exec","inspect","files"],"Use the owning Compose service for redeploy and scale"),config:$e({image:u.Config?.Image,labels:S,environmentKeys:(u.Config?.Env??[]).map((D)=>D.split("=",1)[0]),networkMode:u.HostConfig?.NetworkMode}),discoveredAt:a.toISOString(),sourceId:r}})}class va{inspect;id;provider="docker";constructor(e,t="docker:local"){this.inspect=e;this.id=t}async discover(e){return rh(th(await this.inspect(e)),e,this.id)}}function nh(e){let t=[];for(let r of e.split(`
123
+ `)){if(!r.startsWith("TSCLOUD_SYSTEMD\t"))continue;let[,a,u,f,h,b,S,y,k,R,D,O,M,z]=r.split("\t");if(!a||!/^[A-Za-z0-9_.@:-]+\.service$/.test(a))continue;t.push({unit:a,load:u,active:f,sub:h,description:b,enabled:S,pid:Number(y)||void 0,memoryBytes:Pu(k),restartCount:Number(R)||0,activeSince:D||void 0,fragmentPath:O||void 0,workingDirectory:M?.startsWith("/")?M:void 0,user:z||void 0})}return t}function ih(e,t,r=t.server??"local"){let a=t.now??new Date;return e.map((u)=>{let f=Le(u.active==="active"?u.sub||u.active:u.active),h=u.unit.replace(/\.service$/,""),b=/^(.*?) (?:release [^ ]+|queue worker|daemon |scheduler)(?: |$)/.exec(u.description??"")?.[1]??(t.project&&h.startsWith(`${t.project}-`)?h.slice(t.project.length+1).split("@",1)[0]:void 0),S=h.includes("@")?h.slice(h.indexOf("@")+1):void 0,y=u.workingDirectory?[{target:u.workingDirectory,type:"working-directory"}]:[],k=["start","stop","restart","logs","exec","inspect",...y.length?["files"]:[]];return{id:Ee("systemd",r,u.unit),provider:"systemd",kind:"service",name:h,displayName:u.description||h,status:f,rawStatus:[u.load,u.active,u.sub].filter(Boolean).join("/"),health:f==="running"?"healthy":f==="failed"?"unhealthy":"unknown",desiredReplicas:1,runningReplicas:f==="running"?1:0,ageSeconds:Lt(u.activeSince,a),restartCount:u.restartCount,tags:{enabled:u.enabled??"unknown"},links:{project:t.project,environment:t.environment,server:t.server??r.replace(/^systemd:/,""),service:b,release:S,providerId:u.unit},resources:{memoryBytes:u.memoryBytes},replicas:[{id:Ee("systemd",r,`${u.unit}:main`),name:"main",status:f,pid:u.pid,startedAt:u.activeSince,restartCount:u.restartCount,resources:{memoryBytes:u.memoryBytes}}],networks:[],mounts:y,capabilities:_t(k,y.length?"This systemd runtime does not support redeploy or replica scaling through the scoped explorer":"File transfer requires a provider-reported service working directory; redeploy and scaling are unavailable"),config:$e({fragmentPath:u.fragmentPath,workingDirectory:u.workingDirectory,user:u.user,environment:u.environment,enabled:u.enabled}),discoveredAt:a.toISOString(),sourceId:r}})}class Ta{read;id;provider="systemd";constructor(e,t="systemd:local"){this.read=e;this.id=t}async discover(e){return ih(nh(await this.read(e)),e,this.id)}}function TR(e,t){if(!e.success)throw Error(e.error||e.perInstance?.[0]?.error||`${t} discovery failed`);return e.perInstance?.[0]?.output??""}function xR(){return["set -uo pipefail",'command -v systemctl >/dev/null 2>&1 || { echo "systemctl is unavailable" >&2; exit 127; }',"systemctl list-units --type=service --all --plain --no-legend 2>/dev/null | awk '{print $1}' | while IFS= read -r unit; do",' [ -n "$unit" ] || continue',' clean() { printf "%s" "$1" | tr "\\t\\r\\n" " "; }',' load=$(systemctl show "$unit" -p LoadState --value 2>/dev/null || true)',' active=$(systemctl show "$unit" -p ActiveState --value 2>/dev/null || true)',' sub=$(systemctl show "$unit" -p SubState --value 2>/dev/null || true)',' description=$(systemctl show "$unit" -p Description --value 2>/dev/null || true)',' enabled=$(systemctl is-enabled "$unit" 2>/dev/null || true)',' pid=$(systemctl show "$unit" -p MainPID --value 2>/dev/null || true)',' memory=$(systemctl show "$unit" -p MemoryCurrent --value 2>/dev/null || true)',' restarts=$(systemctl show "$unit" -p NRestarts --value 2>/dev/null || true)',' since=$(systemctl show "$unit" -p ActiveEnterTimestamp --value 2>/dev/null || true)',' fragment=$(systemctl show "$unit" -p FragmentPath --value 2>/dev/null || true)',' working=$(systemctl show "$unit" -p WorkingDirectory --value 2>/dev/null || true)',' user=$(systemctl show "$unit" -p User --value 2>/dev/null || true)',' printf "TSCLOUD_SYSTEMD\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n" "$(clean "$unit")" "$(clean "$load")" "$(clean "$active")" "$(clean "$sub")" "$(clean "$description")" "$(clean "$enabled")" "$(clean "$pid")" "$(clean "$memory")" "$(clean "$restarts")" "$(clean "$since")" "$(clean "$fragment")" "$(clean "$working")" "$(clean "$user")"',"done"]}function DR(){return["set -uo pipefail",'if ! command -v docker >/dev/null 2>&1; then echo "[]"; exit 0; fi',"ids=$(docker ps -aq)",'if [ -z "$ids" ]; then echo "[]"; else docker inspect $ids; fi']}function Qy(e,t,r,a,u){let f=`${e}:${r.id}`,h=async()=>TR(await t.runRemoteDeploy({targets:[r],commands:e==="systemd"?xR():DR(),timeoutSeconds:30,comment:`ts-cloud runtime discovery:${e}`,tags:{Project:a.project.slug,Environment:u,Role:"app"}}),f);return e==="systemd"?new Ta(h,f):new va(h,f)}async function bd(e,t=100){let r=[],a;for(let u=0;u<t;u++){let f=await e(a);if(r.push(...f.items),!f.nextToken)return r;a=f.nextToken}throw Error(`Provider pagination exceeded ${t} pages`)}class xu{client;prefix;id="ecs:aws";provider="ecs";constructor(e,t){this.client=e;this.prefix=t}async discover(e){let t=await bd(async(f)=>{let h=await this.client.listClusters({nextToken:f,maxResults:100});return{items:h.clusterArns??[],nextToken:h.nextToken}}),r=[],a=[],u=[];for(let f of t){let h=(await bd(async(b)=>{let S=await this.client.listServices(f,{nextToken:b,maxResults:100});return{items:S.serviceArns??[],nextToken:S.nextToken}})).filter((b)=>b.split("/").at(-1)?.startsWith(this.prefix));for(let b=0;b<h.length;b+=10){let S=await this.client.describeServices({cluster:f,services:h.slice(b,b+10)});r.push(...S.services??[])}for(let b of r.filter((S)=>S.clusterArn===f||!S.clusterArn)){let S=await bd(async(y)=>{let k=await this.client.listTasks(f,b.serviceName,{nextToken:y,maxResults:100});return{items:k.taskArns??[],nextToken:k.nextToken}});for(let y=0;y<S.length;y+=100){let k=await this.client.describeTasks(f,S.slice(y,y+100));a.push(...k.tasks??[])}}}if(this.client.describeTaskDefinition)for(let f of[...new Set(r.map((h)=>h.taskDefinition).filter((h)=>!!h))]){let h=await this.client.describeTaskDefinition(f);if(h.taskDefinition)u.push(h.taskDefinition)}return Nu(r,a,e,this.id,u)}}class Ou{client;prefix;id="lambda:aws";provider="lambda";constructor(e,t){this.client=e;this.prefix=t}async discover(e){let t=(await bd(async(r)=>{let a=await this.client.listFunctions({Marker:r,MaxItems:50});return{items:a.Functions??[],nextToken:a.NextMarker}})).filter((r)=>r.FunctionName?.startsWith(this.prefix));return Bu(t,e,this.id)}}async function sh(e,t,r={}){let a=[],u=K(e),f=be(e),h=e.aws?.profile,b=e.aws?.region??e.project.region??"us-east-1",S=`${e.project.slug}-${t}`;if(u!=="serverless"){let y=r.driver??F({config:e}),k=await y.findComputeTargets({slug:e.project.slug,environment:t,role:"app"});for(let R of k)a.push(Qy("systemd",y,R,e,t)),a.push(Qy("docker",y,R,e,t))}if(f==="aws")a.push(new xu(r.ecs??new dt(b,h),S)),a.push(new Ou(r.lambda??new T(b,h),S));return a}async function ge(e,t,r={}){let a={project:e.project.slug,environment:t};try{return await ku(await sh(e,t,r),a)}catch(u){return{generatedAt:new Date().toISOString(),workloads:[],sources:[{id:"runtime:bootstrap",provider:be(e)==="aws"?"ecs":"systemd",status:"error",discoveredAt:new Date().toISOString(),staleAfterSeconds:60,itemCount:0,message:String(u?.message??u).slice(0,500)}],degraded:!0}}}var Yy=65536,ia=49152,kd=/^[A-Za-z0-9_.@:-]+\.service$/,Id=/^[a-fA-F0-9]{12,128}$/,OR=["/boot","/dev","/etc","/proc","/root","/run","/sys","/var/run"];function ts(e){let t=Buffer.from(e);return t.byteLength<=Yy?e:`${t.subarray(0,Yy-24).toString("utf8")}
124
+ [output truncated]`}function Sd(e){return{success:!1,instanceCount:0,perInstance:[],error:e instanceof Error?e.message:String(e)}}function jn(e){return`'${e.replaceAll("'",`'"'"'`)}'`}function $R(e,t){return Number.isFinite(e)?Math.min(1e4,Math.max(0,Math.floor(e))):t}function NR(e){let t=e.config,r=typeof t.clusterArn==="string"?t.clusterArn:void 0,a=e.links.providerId||e.name;return r&&a?{cluster:r,service:a}:void 0}function jR(e,t){return e.find((r)=>r.id===t.links.server)??(e.length===1?e[0]:void 0)}function BR(e,t){if(e.provider==="systemd"){let r=e.links.providerId;if(!r||!kd.test(r)||!["start","stop","restart"].includes(t))return;return[`systemctl ${t} ${r}`,`systemctl is-active ${r} 2>/dev/null || true`]}if(e.provider==="docker"){let r=e.links.providerId;if(!r||!Id.test(r)||!["start","stop","restart"].includes(t))return;return[`docker ${t} ${r}`,`docker inspect --format '{{.State.Status}}' ${r}`]}return}function oh(e,t){if(!t.startsWith("/")||t.includes("\x00"))return{ok:!1,error:"An absolute path is required."};let r=[];for(let b of t.split("/")){if(!b||b===".")continue;if(b===".."){if(!r.length)return{ok:!1,error:"Path traversal is not allowed."};r.pop()}else r.push(b)}let a=`/${r.join("/")}`;if(OR.some((b)=>a===b||a.startsWith(`${b}/`)))return{ok:!1,error:"Sensitive host paths are not available through runtime file access."};let u=e.links.project?.replace(/[^A-Za-z0-9_-]/g,""),f=e.links.service?.replace(/[^A-Za-z0-9_-]/g,"");if(![...u&&f?[`/var/www/${u}/${f}`,`/srv/${u}/${f}`]:[],...e.mounts.map((b)=>b.target).filter((b)=>b.startsWith("/"))].some((b)=>a===b||a.startsWith(`${b.replace(/\/$/,"")}/`)))return{ok:!1,error:"Path is outside this service’s owned roots."};return{ok:!0,path:a}}function MR(e,t){let r=e.links.project?.replace(/[^A-Za-z0-9_-]/g,""),a=e.links.service?.replace(/[^A-Za-z0-9_-]/g,"");return[...r&&a?[`/var/www/${r}/${a}`,`/srv/${r}/${a}`]:[],...e.mounts.map((u)=>u.target).filter((u)=>u.startsWith("/"))].sort((u,f)=>f.length-u.length).find((u)=>t===u||t.startsWith(`${u.replace(/\/$/,"")}/`))}var _u={process:["ps","-eo","pid,ppid,user,%cpu,%mem,etime,command","--sort=-%cpu"],sockets:["ss","-lntup"],filesystem:["df","-h"]};class ve{config;environment;dependencies;region;profile;constructor(e,t,r={}){this.config=e;this.environment=t;this.dependencies=r;this.region=e.aws?.region??e.project.region??"us-east-1",this.profile=e.aws?.profile}async inventory(){return this.dependencies.inventory?.()??ge(this.config,this.environment,{driver:this.dependencies.driver})}async workload(e){return(await this.inventory()).workloads.find((t)=>t.id===e)}async remote(e,t,r,a){let u=this.dependencies.driver??F({config:this.config}),f=await u.findComputeTargets({slug:this.config.project.slug,environment:this.environment,role:"app"}),h=jR(f,e);if(!h)throw Error("The workload server is no longer reachable in this scope.");return u.runRemoteDeploy({targets:[h],commands:t,timeoutSeconds:r,comment:a,tags:{Project:this.config.project.slug,Environment:this.environment,Role:"app"}})}async run(e){let t=await this.workload(e.workloadId),r={workloadId:e.workloadId,action:e.action};if(!t)return{...r,ok:!1,error:"Workload was not found in the current project and environment."};let a=t.capabilities[e.action];if(!a.supported)return{...r,ok:!1,error:a.reason??`${e.action} is unsupported for ${t.provider}.`};if(a.requiresConfirmation&&e.confirm!==t.name)return{...r,ok:!1,error:`Type "${t.name}" to ${e.action} this workload.`};if(a.requiresRecentAuth&&!e.recentAuth)return{...r,ok:!1,error:"Sign in again before using elevated runtime access."};if(e.action==="inspect")return{...r,ok:!0,workload:t};if(t.provider==="systemd"||t.provider==="docker"){let u=BR(t,e.action);if(!u)return{...r,ok:!1,error:`${e.action} is not implemented for ${t.provider}.`};let f=await this.remote(t,["set -uo pipefail",...u],60,`ts-cloud runtime:${e.action}`).catch(Sd);return{...r,ok:f.success,command:u[0],stdout:ts(f.perInstance?.[0]?.output??""),stderr:ts(f.perInstance?.[0]?.error??f.error??""),error:f.success?void 0:f.error??"Runtime operation failed."}}if(t.provider==="ecs"){let u=NR(t);if(!u)return{...r,ok:!1,error:"ECS cluster or service identity is unavailable."};let f=this.dependencies.ecs??new dt(this.region,this.profile);if(e.action==="scale"){let h=$R(e.replicas,t.desiredReplicas??1);return await f.scaleService(u.cluster,u.service,h),{...r,ok:!0,command:`ecs scale ${t.name} ${h}`}}if(e.action==="start"||e.action==="stop"){let h=e.action==="stop"?0:Math.max(1,t.desiredReplicas??1);return await f.scaleService(u.cluster,u.service,h),{...r,ok:!0,command:`ecs scale ${t.name} ${h}`}}if(e.action==="restart"||e.action==="redeploy")return await f.forceNewDeployment(u.cluster,u.service),{...r,ok:!0,command:`ecs redeploy ${t.name}`}}return{...r,ok:!1,error:`${e.action} is not implemented for ${t.provider}.`}}async exec(e){let t={workloadId:e.workloadId,preset:e.preset},r=await this.workload(e.workloadId);if(!r)return{...t,ok:!1,error:"Workload was not found in the current project and environment."};if(process.env.TS_CLOUD_RUNTIME_EXEC==="0")return{...t,ok:!1,error:"Runtime exec is disabled by TS_CLOUD_RUNTIME_EXEC."};if(!r.capabilities.exec.supported)return{...t,ok:!1,error:r.capabilities.exec.reason??"Exec is unsupported for this workload."};if(e.confirm!==r.name)return{...t,ok:!1,error:`Type "${r.name}" to open exec access.`};if(!e.recentAuth)return{...t,ok:!1,error:"Sign in again before using elevated runtime access."};let a=e.preset&&_u[e.preset];if(!a&&!e.command?.trim())return{...t,ok:!1,error:"Choose a diagnostic preset or provide a command."};if(e.command&&r.provider!=="docker")return{...t,ok:!1,error:"Free-form exec is restricted to isolated containers; use a diagnostic preset for system services."};let u=r.links.providerId??"",f;if(r.provider==="docker"&&Id.test(u)){let b=e.command?.trim()||a.map(jn).join(" ");f=`docker exec ${u} sh -lc ${jn(b)}`}else if(r.provider==="systemd"&&kd.test(u)&&e.preset)f=e.preset==="process"?`systemctl status ${u} --no-pager --full`:_u[e.preset].map(jn).join(" ");if(!f)return{...t,ok:!1,error:"Exec target identity is invalid or unsupported."};let h=await this.remote(r,["set -uo pipefail",f],60,"ts-cloud runtime:exec").catch(Sd);return{...t,ok:h.success,command:f,stdout:ts(h.perInstance?.[0]?.output??""),stderr:ts(h.perInstance?.[0]?.error??h.error??""),error:h.success?void 0:h.error??"Exec command failed."}}async readFile(e){let t={workloadId:e.workloadId,path:e.path},r=await this.fileTarget(e);if("error"in r)return{...t,ok:!1,error:r.error};let{workload:a,path:u,root:f,providerId:h}=r,S=`sh -c ${jn('resolved=$(realpath -m "$1"); root=$(realpath -m "$3"); case "$resolved" in "$root"|"$root"/*) ;; *) exit 73;; esac; test -f "$resolved"; size=$(wc -c < "$resolved"); printf "__TSCLOUD_SIZE__=%s\\n" "$size"; head -c "$2" "$resolved" | base64')} sh ${jn(u)} ${ia} ${jn(f)}`,y=a.provider==="docker"?`docker exec ${h} ${S}`:S,k=await this.remote(a,[y],30,"ts-cloud runtime:file-read").catch(Sd);if(!k.success)return{...t,ok:!1,error:k.error??k.perInstance?.[0]?.error??"File read failed."};let R=k.perInstance?.[0]?.output??"",D=/__TSCLOUD_SIZE__=(\d+)\r?\n/.exec(R);if(!D)return{...t,ok:!1,error:"The remote file response was invalid."};let O=Number(D[1]),M=R.slice((D.index??0)+D[0].length).replace(/\s+/g,"");if(Buffer.from(M,"base64").byteLength>ia)return{...t,ok:!1,error:"The remote file exceeded the transfer limit."};return{...t,ok:!0,contentBase64:M,size:O,truncated:O>ia}}async writeFile(e){let t={workloadId:e.workloadId,path:e.path},r=await this.fileTarget(e);if("error"in r)return{...t,ok:!1,error:r.error};if(!/^[A-Za-z0-9+/]*={0,2}$/.test(e.contentBase64))return{...t,ok:!1,error:"File content must be valid base64."};let a=Buffer.from(e.contentBase64,"base64");if(a.toString("base64")!==e.contentBase64)return{...t,ok:!1,error:"File content must be canonical base64."};if(a.byteLength>ia)return{...t,ok:!1,error:`File uploads are limited to ${ia} bytes.`};let{workload:u,path:f,root:h,providerId:b}=r,y=`sh -c ${jn('resolved=$(realpath -m "$1"); root=$(realpath -m "$2"); case "$resolved" in "$root"|"$root"/*) ;; *) exit 73;; esac; mkdir -p "$(dirname "$resolved")"; tmp="$resolved.ts-cloud-$$"; base64 -d > "$tmp"; chmod 600 "$tmp"; mv "$tmp" "$resolved"')} sh ${jn(f)} ${jn(h)}`,k=u.provider==="docker"?`printf %s ${jn(e.contentBase64)} | docker exec -i ${b} ${y}`:`printf %s ${jn(e.contentBase64)} | ${y}`,R=await this.remote(u,[k],30,"ts-cloud runtime:file-write").catch(Sd);return{...t,ok:R.success,size:a.byteLength,truncated:!1,error:R.success?void 0:R.error??R.perInstance?.[0]?.error??"File write failed."}}async fileTarget(e){let t=await this.workload(e.workloadId);if(!t)return{error:"Workload was not found in the current project and environment."};if(process.env.TS_CLOUD_RUNTIME_FILE_ACCESS==="0")return{error:"Runtime file access is disabled by TS_CLOUD_RUNTIME_FILE_ACCESS."};if(!t.capabilities.files.supported)return{error:t.capabilities.files.reason??"File access is unsupported for this workload."};if(e.confirm!==t.name)return{error:`Type "${t.name}" to access workload files.`};if(!e.recentAuth)return{error:"Sign in again before using elevated runtime access."};let r=oh(t,e.path);if(!r.ok)return{error:r.error};let a=MR(t,r.path),u=t.links.providerId??"";if(!a||t.provider==="systemd"&&!kd.test(u)||t.provider==="docker"&&!Id.test(u))return{error:"File target identity is invalid or unsupported."};return{workload:t,path:r.path,root:a,providerId:u}}async logs(e,t={}){let r=await this.workload(e);if(!r)throw Error("Workload was not found in the current project and environment.");if(!r.capabilities.logs.supported)throw Error(r.capabilities.logs.reason??"Logs are unsupported for this workload.");let a=Math.min(1000,Math.max(1,Math.floor(t.limit??200)));if(r.provider==="lambda"||r.provider==="ecs"){let k=this.dependencies.logs??new we(this.region,this.profile),R=r.config.logGroups,D=r.provider==="lambda"?`/aws/lambda/${r.name}`:Array.isArray(R)&&typeof R[0]==="string"?R[0]:void 0;if(!D)throw Error("The ECS task definition does not declare an awslogs group.");let O=await k.filterLogEvents({logGroupName:D,startTime:t.since?.getTime(),limit:a}),M=(O.events??[]).slice(0,a).map((z)=>({timestamp:z.timestamp==null?void 0:new Date(z.timestamp).toISOString(),message:ts(String(z.message??""))}));return{workloadId:e,provider:r.provider,lines:M,nextCursor:O.nextToken,truncated:(O.events?.length??0)>=a}}let u=r.links.providerId??"",f=t.since&&Number.isFinite(t.since.getTime())?t.since:void 0,h=r.provider==="systemd"&&kd.test(u)?`journalctl -u ${u} --no-pager -n ${a} -o short-iso${f?` --since ${jn(f.toISOString())}`:""}`:r.provider==="docker"&&Id.test(u)?`docker logs --timestamps --tail ${a}${f?` --since ${Math.floor(f.getTime()/1000)}`:""} ${u} 2>&1`:void 0;if(!h)throw Error("Log target identity is invalid.");let b=await this.remote(r,[h],30,"ts-cloud runtime:logs");if(!b.success)throw Error(b.error??b.perInstance?.[0]?.error??"Log read failed.");let S=ts(b.perInstance?.[0]?.output??""),y=S.split(`
125
125
  `).filter(Boolean).slice(-a).map((k)=>{let R=/^(\d{4}-\d{2}-\d{2}T\S+)\s+(.*)$/.exec(k);return{timestamp:R?.[1],message:R?.[2]??k}});return{workloadId:e,provider:r.provider,lines:y,truncated:S.includes("[output truncated]")||y.length>=a}}}import{randomUUID as LR}from"node:crypto";class wa{records=new Map;maxBufferBytes;ttlMs;now;constructor(e={}){this.maxBufferBytes=Math.max(1024,e.maxBufferBytes??262144),this.ttlMs=Math.max(1000,e.ttlMs??900000),this.now=e.now??(()=>new Date)}create(e,t){this.sweep();let r=this.now().toISOString(),a={id:LR(),workloadId:t,kind:e,state:"open",chunks:[],cursor:0,droppedBytes:0,bufferedBytes:0,createdAt:r,updatedAt:r,abort:new AbortController,listeners:new Set};return this.records.set(a.id,a),this.snapshot(a,0)}signal(e){return this.records.get(e)?.abort.signal}append(e,t,r="stdout"){let a=this.records.get(e);if(!a||a.state!=="open"||!t)return a?this.snapshot(a,a.cursor):void 0;let u=Buffer.from(t),f=u.byteLength>this.maxBufferBytes?u.subarray(u.byteLength-this.maxBufferBytes).toString("utf8"):t,h={cursor:++a.cursor,stream:r,data:f,at:this.now().toISOString()};a.chunks.push(h),a.bufferedBytes+=Buffer.byteLength(f),a.updatedAt=h.at;while(a.bufferedBytes>this.maxBufferBytes&&a.chunks.length>1){let b=a.chunks.shift(),S=Buffer.byteLength(b.data);a.bufferedBytes-=S,a.droppedBytes+=S}return this.publish(a),this.snapshot(a,h.cursor-1)}read(e,t,r=0){let a=this.records.get(e);if(!a||a.workloadId!==t)return;return a.updatedAt=this.now().toISOString(),this.snapshot(a,Math.max(0,Math.floor(r)))}close(e,t="complete",r){let a=this.records.get(e);if(!a||a.state!=="open")return a?this.snapshot(a,a.cursor):void 0;if(a.state=t,a.error=r,a.updatedAt=this.now().toISOString(),t==="cancelled")a.abort.abort();return this.publish(a),this.snapshot(a,a.cursor)}cancel(e,t){let r=this.records.get(e);if(!r||r.workloadId!==t)return;return this.close(e,"cancelled")}subscribe(e,t,r){let a=this.records.get(e);if(!a||a.workloadId!==t)return;return a.listeners.add(r),()=>a.listeners.delete(r)}sweep(){let e=this.now().getTime()-this.ttlMs,t=0;for(let[r,a]of this.records){if(new Date(a.updatedAt).getTime()>e)continue;a.abort.abort(),this.records.delete(r),t++}return t}clear(){for(let e of this.records.values())e.abort.abort();this.records.clear()}snapshot(e,t){let r=e.chunks[0]?.cursor??e.cursor+1,a=t>0&&t<r-1;return{id:e.id,workloadId:e.workloadId,kind:e.kind,state:e.state,chunks:e.chunks.filter((u)=>a||u.cursor>t),cursor:e.cursor,reset:a,droppedBytes:e.droppedBytes,createdAt:e.createdAt,updatedAt:e.updatedAt,error:e.error}}publish(e){let t=this.snapshot(e,0);for(let r of e.listeners)r(t)}}var FR={every_minute:"* * * * *",every_five_minutes:"*/5 * * * *",hourly:"0 * * * *",daily:"0 0 * * *",weekly:"0 0 * * 0"},zR={JAN:1,FEB:2,MAR:3,APR:4,MAY:5,JUN:6,JUL:7,AUG:8,SEP:9,OCT:10,NOV:11,DEC:12},Zy={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6};function Xy(e){try{return new Intl.DateTimeFormat("en",{timeZone:e}).format(new Date),e}catch{throw Error(`Unknown schedule timezone: ${e}`)}}function Ed(e,t,r,a){let u=t[e.toUpperCase()]??Number(e);if(!Number.isInteger(u)||u<r||u>a)throw Error(`Schedule field value ${e} is outside ${r}-${a}.`);return u}function rs(e,t,r,a={},u){if(e==="*"||e==="?")return;let f=new Set;for(let h of e.split(",")){let[b,S]=h.split("/"),y=S?Ed(S,{},1,r-t+1):1,k,R;if(b==="*")k=t,R=r;else if(b.includes("-")){let D=b.split("-");k=Ed(D[0],a,t,r),R=Ed(D[1],a,t,r)}else k=Ed(b,a,t,r),R=k;if(R<k)throw Error("Schedule ranges must be ascending.");for(let D=k;D<=R;D+=y)f.add(u?u(D):D===7&&r===7?0:D)}return f}function UR(e,t){let r=Object.fromEntries(new Intl.DateTimeFormat("en-US",{timeZone:t,year:"numeric",month:"numeric",day:"numeric",weekday:"short",hour:"numeric",minute:"numeric",hourCycle:"h23"}).formatToParts(e).map((a)=>[a.type,a.value]));return{minute:Number(r.minute),hour:Number(r.hour),day:Number(r.day),month:Number(r.month),weekday:Zy[r.weekday.toUpperCase()],year:Number(r.year),key:`${r.year}-${r.month}-${r.day} ${r.hour}:${r.minute}`}}function ev(e){let r=(e.startsWith("cron(")?e.slice(5,-1).trim():e.trim()).split(/\s+/);if(r.length!==5&&r.length!==6)throw Error("Cron schedules require five standard fields or six EventBridge fields.");let[a,u,f,h,b,S]=r,y=r.length===6;return{minute:rs(a,0,59),hour:rs(u,0,23),day:rs(f,1,31),month:rs(h,1,12,zR),weekday:rs(b,y?1:0,7,Zy,y?(k)=>k===7?6:k-1:void 0),year:S?rs(S,1970,2199):void 0,dayWildcard:f==="*"||f==="?",weekdayWildcard:b==="*"||b==="?"}}function qR(e,t){if(!((!t.minute||t.minute.has(e.minute))&&(!t.hour||t.hour.has(e.hour))&&(!t.month||t.month.has(e.month))&&(!t.year||t.year.has(e.year))))return!1;let a=!t.day||t.day.has(e.day),u=!t.weekday||t.weekday.has(e.weekday);return t.dayWildcard?u:t.weekdayWildcard?a:a||u}function tv(e){let t=/^rate\(\s*(\d+)\s+(minute|minutes|hour|hours|day|days)\s*\)$/i.exec(e);if(!t)return;let r=Number(t[1]);if(r<1)throw Error("Rate amount must be positive.");return r*(t[2].toLowerCase().startsWith("minute")?60000:t[2].toLowerCase().startsWith("hour")?3600000:86400000)}function at(e){let t=e.trim(),r=FR[t.toLowerCase()]??t;if(!r)throw Error("Schedule expression is required.");let a=tv(r);if(a){let u=a/60000;return{original:t,normalized:`rate(${u} minutes)`,kind:"rate",description:u%1440===0?`Every ${u/1440} day(s)`:u%60===0?`Every ${u/60} hour(s)`:`Every ${u} minute(s)`}}return ev(r),{original:t,normalized:r.startsWith("cron(")?r:`cron(${r})`,kind:"cron",description:`Cron ${r.replace(/^cron\(|\)$/g,"")}`}}function $t(e,t,r=new Date,a=5){let u=at(e),f=Xy(t),h=Math.min(20,Math.max(1,a)),b=tv(u.normalized);if(b)return Array.from({length:h},(O,M)=>new Date(r.getTime()+b*(M+1)).toISOString());let S=ev(u.normalized),y=[],k=new Set,R=new Date(Math.floor(r.getTime()/60000)*60000+60000),D=0;while(y.length<h&&D<1100000){let O=UR(R,f);if(qR(O,S)&&!k.has(O.key))y.push(R.toISOString()),k.add(O.key);R=new Date(R.getTime()+60000),D++}if(y.length<h)throw Error("Schedule produced no runs within the bounded preview horizon.");return y}function Mt(e,t="UTC",r=new Date,a=5){let u=at(e),f=$t(u.normalized,t,r,a),h=u.kind==="cron"?["Server cron and EventBridge use the same wall-clock preview; provider-specific extensions are retained only when supported."]:["Rate schedules use elapsed-time intervals and are not shifted by DST."];return{...u,timezone:Xy(t),nextRuns:f,capabilities:{server:u.kind==="cron",eventbridge:!0,notes:h}}}function vn(e){let t=at(e.expression),r=t.normalized.slice(5,-1).trim().split(/\s+/),a=t.kind==="cron"&&r.length===5;if(e.provider==="server")return{provider:"server",supported:a,features:{timezone:!0,flexibleWindow:!1,catchUp:!1,replaceOverlap:!1},notes:[t.kind==="rate"?"Server cron requires a cron expression; use an equivalent cron schedule.":r.length!==5?"EventBridge six-field cron extensions cannot be installed as server cron.":"Cron is reconciled through a root-owned ts-cloud entry.",e.missedRunPolicy==="catch_up"?"Catch-up is handled by the control plane, not cron.":"Missed runs are skipped by cron."]};if(e.provider==="eventbridge")return{provider:"eventbridge",supported:!0,features:{timezone:!0,flexibleWindow:!0,catchUp:!1,replaceOverlap:!1},notes:["Five-field cron is translated explicitly to EventBridge six-field syntax. Flexible windows are provider-native; overlap and catch-up remain control-plane policies."]};if(e.provider==="lambda")return{provider:"lambda",supported:!0,features:{timezone:!0,flexibleWindow:!0,catchUp:!1,replaceOverlap:!1},notes:["The schedule invokes one immutable Lambda target."]};return{provider:"platform",supported:!0,features:{timezone:!0,flexibleWindow:!0,catchUp:!0,replaceOverlap:!0},notes:["The durable control-plane worker enforces all configured policies."]}}function As(e){let t=vn({...e,provider:"server"});if(!t.supported)throw Error(t.notes.join(" "));let a=at(e.expression).normalized.slice(5,-1);return{path:`/etc/cron.d/ts-cloud-${e.id}`,content:`CRON_TZ=${e.timezone}
126
126
  ${a} root /usr/local/bin/cloud jobs:dispatch ${e.id} --scheduled >/dev/null 2>&1
127
- `}}function VR(e){let t=at(e);if(t.kind==="rate")return e;let r=t.normalized.slice(5,-1).trim().split(/\s+/);if(r.length===6)return t.normalized;let[a,u,f,h,b]=r,S=b==="*"?"?":b.replace(/(^|[,-])0(?=$|[,-])/g,(y,k)=>`${k}1`);return f==="*"&&b!=="*"?`cron(${a} ${u} ? ${h} ${S} *)`:`cron(${a} ${u} ${f} ${h} ? *)`}function Lu(e){let t=vn(e);if(!t.supported)throw Error(t.notes.join(" "));return{Name:`ts-cloud-${e.id}`,ScheduleExpression:VR(e.expression),ScheduleExpressionTimezone:e.timezone,State:e.enabled?"ENABLED":"DISABLED",FlexibleTimeWindow:e.flexibleMinutes?{Mode:"FLEXIBLE",MaximumWindowInMinutes:e.flexibleMinutes}:{Mode:"OFF"},Target:{kind:e.target.kind,functionName:e.target.functionName??null,payloadRefs:e.payloadRefs},RetryPolicy:{MaximumRetryAttempts:e.retryPolicy.maxAttempts,MaximumEventAgeInSeconds:e.timeoutSeconds},DeadLetterRef:e.retryPolicy.deadLetterRef??null}}function FS(e,t){if(!t)return{status:"unavailable",observedState:{message:"Provider observation is unavailable."}};let r=String(t.expression??""),a=t.enabled;return{status:r&&r!==e.normalizedExpression||typeof a==="boolean"&&a!==e.enabled?"drifted":"in_sync",observedState:t}}function oh(e){if(e.provider==="server"){let t=As(e);return{path:t.path,content:t.content,enabled:e.enabled}}if(e.provider==="eventbridge")return Lu(e);throw Error(`No reconciliation adapter is configured for ${e.provider} schedules.`)}function Wp(e,t){if(Array.isArray(e))return Array.isArray(t)&&e.length===t.length&&e.every((r,a)=>Wp(r,t[a]));if(e&&typeof e==="object"){if(!t||typeof t!=="object"||Array.isArray(t))return!1;return Object.entries(e).every(([r,a])=>Wp(a,t[r]))}return e===t}class ah{transport;provider="server";constructor(e){this.transport=e}async observe(e){let t=As(e),r=await this.transport.read(t.path);return r==null?void 0:{path:t.path,content:r,enabled:!0}}async apply(e,t){let r=String(t.path??"");if(!e.enabled){await this.transport.removeRootOwned(r);return}await this.transport.writeRootOwned(r,String(t.content??""))}async remove(e){await this.transport.removeRootOwned(As(e).path)}matches(e,t){if(e.enabled===!1)return!1;return e.path===t.path&&e.content===t.content}}class ch{transport;provider="eventbridge";constructor(e){this.transport=e}observe(e){return this.transport.get(`ts-cloud-${e.id}`)}apply(e,t){return this.transport.put(t)}remove(e){return this.transport.remove(`ts-cloud-${e.id}`)}matches(e,t){return Wp(e,t)}}class dh{store;constructor(e){this.store=e}async reconcile(e,t,r={}){if(t.provider!==e.provider)return this.store.reconcile(e.id,"unsupported",{provider:t.provider,message:`Adapter ${t.provider} cannot reconcile ${e.provider}.`});try{let a=oh(e),u=await t.observe(e);if(u&&t.matches(a,u))return this.store.reconcile(e.id,"in_sync",{provider:t.provider,observed:u});if(r.apply===!1)return this.store.reconcile(e.id,u?"drifted":"unavailable",{provider:t.provider,observed:u??null,applyRequired:!0});if(await t.apply(e,a),!e.enabled)return this.store.reconcile(e.id,"in_sync",{provider:t.provider,observed:null,disabled:!0});let f=await t.observe(e);return this.store.reconcile(e.id,f&&t.matches(a,f)?"in_sync":"drifted",{provider:t.provider,observed:f??null,applied:!0})}catch(a){return this.store.reconcile(e.id,"unavailable",{provider:t.provider,error:a instanceof Error?a.message:String(a)})}}async remove(e,t){if(e.origin==="config")throw Error("Config-defined jobs must be removed from configuration, not destructively deleted.");if(t.provider!==e.provider)throw Error(`Adapter ${t.provider} cannot remove ${e.provider}.`);await t.remove(e),this.store.remove(e.id)}}function WR(e){if(e.queues===!0)return[{queue:"default",processes:e.queueConcurrency??1}];if(!Array.isArray(e.queues))return[];return e.queues.map((t)=>{if(typeof t==="string")return{queue:t,processes:e.queueConcurrency??1};let[r,a]=Object.entries(t)[0]??["default",e.queueConcurrency??1];return{queue:r,processes:a}})}function Ra(e,t,r){let a=new Set,u=new Set,f=new Map(r.resources.map((R)=>[R.slug,R])),h=0,b=0;for(let[R,D]of Object.entries(t.sites??{})){let O=f.get(R);if(D.scheduler){let J=`config:site:${R}:scheduler`;a.add(J),e.upsertConfigJob({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,resourceId:O?.id,name:`${R} scheduler`,provider:"server",expression:"* * * * *",timezone:"UTC",flexibleMinutes:0,target:{kind:"dashboard_operation",operationId:`scheduler:run:${R}`},payloadRefs:{},missedRunPolicy:"skip",overlapPolicy:"forbid",retryPolicy:{maxAttempts:3,backoffSeconds:30},timeoutSeconds:300,enabled:!0,origin:"config",sourceKey:J,observedState:{source:"cloud.config.ts"},reconciliationStatus:"pending"}),h++}let M=D,z=Array.isArray(M.queues??M.workers)?M.queues??M.workers:[];for(let[J,Z]of z.entries()){let oe=typeof Z==="string"?{queue:Z}:Z,G=String(oe.queue??oe.name??"default"),te=`config:site:${R}:worker:${J}:${G}`;u.add(te),e.upsertWorker({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,resourceId:O?.id,name:`${R}:${G}`,provider:"systemd",queue:G,processes:Number(oe.processes)||1,timeoutSeconds:Number(oe.timeout)||60,restartPolicy:"always",target:{operationId:`worker:restart:${R}`,site:R},enabled:!0,origin:"config",sourceKey:te,observedState:{source:"cloud.config.ts",currentJob:null,failures:0},reconciliationStatus:"pending"}),b++}}let S=t.infrastructure?.compute?.backups;if(S?.enabled)a.add("config:platform:backup"),e.upsertConfigJob({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,name:"Scheduled backup",provider:"server",expression:String(S.schedule??"0 2 * * *"),timezone:String(S.timezone??"UTC"),flexibleMinutes:0,target:{kind:"dashboard_operation",operationId:"backup:run"},payloadRefs:{},missedRunPolicy:"skip",overlapPolicy:"forbid",retryPolicy:{maxAttempts:3,backoffSeconds:60},timeoutSeconds:3600,enabled:!0,origin:"config",sourceKey:"config:platform:backup",observedState:{source:"cloud.config.ts"},reconciliationStatus:"pending"}),h++;let y=t.environments?.[r.environment.slug]?.app;if(y){if(y.scheduler!=="off"){let R=`config:serverless:${r.environment.slug}:scheduler`;a.add(R),e.upsertConfigJob({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,name:`${r.environment.name} serverless scheduler`,provider:"eventbridge",expression:"rate(1 minute)",timezone:"UTC",flexibleMinutes:0,target:{kind:"serverless_scheduler",action:"schedule:run"},payloadRefs:{},missedRunPolicy:y.scheduler==="sub-minute"?"catch_up":"skip",overlapPolicy:"forbid",retryPolicy:{maxAttempts:3,backoffSeconds:30},timeoutSeconds:y.cliTimeout??900,enabled:!0,origin:"config",sourceKey:R,observedState:{source:"cloud.config.ts",mode:y.scheduler??"on"},reconciliationStatus:"pending"}),h++}for(let{queue:R,processes:D}of WR(y)){let O=`config:serverless:${r.environment.slug}:worker:${R}`;u.add(O),e.upsertWorker({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,name:`${r.environment.name}:${R}`,provider:"lambda",queue:R,processes:D,timeoutSeconds:y.queueTimeout??120,restartPolicy:"on_failure",target:{function:"queue",queue:R},enabled:!0,origin:"config",sourceKey:O,observedState:{source:"cloud.config.ts",currentJob:null,failures:0},reconciliationStatus:"pending"}),b++}}let k=0;for(let R of e.list(r.project.id,{environmentId:r.environment.id}).filter((D)=>D.origin==="config"&&D.sourceKey&&!a.has(D.sourceKey)))e.reconcile(R.id,"drifted",{...R.observedState,reason:"Definition is no longer present in configuration; retained for non-destructive review."}),k++;for(let R of e.listWorkers(r.project.id,r.environment.id).filter((D)=>D.origin==="config"&&D.sourceKey&&!u.has(D.sourceKey)))e.reconcileWorker(R.id,"drifted",{...R.observedState,reason:"Definition is no longer present in configuration; retained for non-destructive review."}),k++;return{jobs:h,workers:b,drifted:k}}class Da{store;queue;constructor(e,t={}){this.store=e;this.queue=t.queue??new c(e.controlPlane)}enqueue(e,t){let r=new Date(t.scheduledFor??this.store.now()).toISOString(),a=`${e.id}:${t.trigger==="manual"?crypto.randomUUID():r}`,u=this.store.activeExecution(e.id);if(u&&e.overlapPolicy==="forbid")return this.store.createExecution({jobId:e.id,trigger:t.trigger,scheduledFor:r,idempotencyKey:a,status:"skipped",output:{reason:"overlap_forbidden",activeExecutionId:u.id}});if(u&&e.overlapPolicy==="replace"&&u.operationId)try{this.queue.requestCancellation(u.operationId,t.actorId)}catch{}let f=this.store.createExecution({jobId:e.id,trigger:t.trigger,scheduledFor:r,idempotencyKey:a,status:"queued",output:{semantics:"at_least_once"}});if(f.operationId)return f;let h=this.queue.enqueue({projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:t.actorId,kind:"job.execute",input:{jobId:e.id,executionId:f.id},idempotencyKey:`job-execution:${f.id}`,lockKey:e.overlapPolicy==="allow"?`job-execution:${f.id}`:`job:${e.id}`,maxAttempts:e.retryPolicy.maxAttempts,timeoutSeconds:e.timeoutSeconds,retryClasses:["job_transient"],resumePolicy:"requeue"}).operation;return this.store.attachOperation(f.id,h.id)}tick(e=this.store.now()){let t=[];for(let r of this.store.due(e.toISOString())){let a=r.nextRunAt,u=$t(r.normalizedExpression,r.timezone,e,1)[0];if(r.missedRunPolicy==="catch_up"){let f=a,h=0;while(f<=e.toISOString()&&h<10)t.push(this.enqueue(r,{trigger:f===a?"scheduled":"catch_up",scheduledFor:f})),f=$t(r.normalizedExpression,r.timezone,new Date(f),1)[0],h++}else t.push(this.enqueue(r,{trigger:"scheduled",scheduledFor:a}));this.store.markScheduled(r.id,a,u)}return t}}function $u(e){return{"job.execute":async(r)=>{let a=r.operation.input&&typeof r.operation.input==="object"&&!Array.isArray(r.operation.input)?r.operation.input:{},u=e.store.get(String(a.jobId??"")),f=e.store.getExecution(String(a.executionId??""));if(!u||!f)throw Error("Scheduled job execution is no longer available.");e.store.transitionExecution(f.id,"running",{attempt:r.operation.attempt}),r.checkpoint("execute",`Running ${u.name} on ${u.provider}.`),r.log(`Trigger ${f.trigger}; scheduled for ${f.scheduledFor}; semantics at-least-once.`,{stream:"system"});let h=await e.executor(u,u.target,r);if(h.stdout)r.log(h.stdout,{stream:"stdout"});if(h.stderr)r.log(h.stderr,{stream:"stderr"});if(!h.ok){if(e.store.transitionExecution(f.id,r.operation.attempt>=u.retryPolicy.maxAttempts?"dead":"failed",{attempt:r.operation.attempt,error:h.stderr??"Job execution failed."}),h.retryable)throw new ae(h.stderr??"Scheduled job failed transiently.","job_transient");throw Error(h.stderr??"Scheduled job failed.")}return e.store.transitionExecution(f.id,"succeeded",{attempt:r.operation.attempt,output:h.output??{}}),{jobId:u.id,executionId:f.id,provider:u.provider}}}}var Lr=(e)=>typeof e==="string"&&e?e:void 0,rv=(e)=>Number(e)===1,po=(e)=>{try{return JSON.parse(String(e))}catch{return{}}},Oi=(e,t,r,a)=>{let u=Number(e);return Number.isFinite(u)?Math.min(a,Math.max(r,Math.floor(u))):t};function Ad(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:Lr(e.environment_id),resourceId:Lr(e.resource_id),name:String(e.name),provider:String(e.provider),expression:String(e.expression),normalizedExpression:String(e.normalized_expression),timezone:String(e.timezone),startsAt:Lr(e.starts_at),endsAt:Lr(e.ends_at),flexibleMinutes:Number(e.flexible_minutes),target:po(e.target),payloadRefs:po(e.payload_refs),missedRunPolicy:String(e.missed_run_policy),overlapPolicy:String(e.overlap_policy),retryPolicy:po(e.retry_policy),timeoutSeconds:Number(e.timeout_seconds),enabled:rv(e.enabled),origin:String(e.origin),sourceKey:Lr(e.source_key),ownerActorId:Lr(e.owner_actor_id),observedState:po(e.observed_state),reconciliationStatus:String(e.reconciliation_status),nextRunAt:Lr(e.next_run_at),lastScheduledFor:Lr(e.last_scheduled_for),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Cd(e){return{id:String(e.id),jobId:String(e.job_id),operationId:Lr(e.operation_id),trigger:String(e.trigger),scheduledFor:String(e.scheduled_for),idempotencyKey:String(e.idempotency_key),status:String(e.status),attempt:Number(e.attempt),startedAt:Lr(e.started_at),finishedAt:Lr(e.finished_at),output:po(e.output),error:Lr(e.error),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Hp(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:Lr(e.environment_id),resourceId:Lr(e.resource_id),name:String(e.name),provider:String(e.provider),queue:String(e.queue),processes:Number(e.processes),timeoutSeconds:Number(e.timeout_seconds),restartPolicy:String(e.restart_policy),target:po(e.target),enabled:rv(e.enabled),origin:String(e.origin),sourceKey:Lr(e.source_key),ownerActorId:Lr(e.owner_actor_id),observedState:po(e.observed_state),reconciliationStatus:String(e.reconciliation_status),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Pa{controlPlane;options;constructor(e,t={}){this.controlPlane=e;this.options=t}now(){return this.options.now?.()??new Date}create(e){if(!e.name.trim())throw Error("Scheduled jobs require a name.");let t=Mt(e.expression,e.timezone,this.now(),1),r=crypto.randomUUID(),a=this.now().toISOString(),u=e.startsAt?new Date(e.startsAt).toISOString():void 0,f=e.endsAt?new Date(e.endsAt).toISOString():void 0;if(u&&f&&u>=f)throw Error("Schedule start must be before end.");let h=t.nextRuns.find((b)=>(!u||b>=u)&&(!f||b<=f));return this.controlPlane.database.run("INSERT INTO scheduled_jobs (id,organization_id,project_id,environment_id,resource_id,name,provider,expression,normalized_expression,timezone,starts_at,ends_at,flexible_minutes,target,payload_refs,missed_run_policy,overlap_policy,retry_policy,timeout_seconds,enabled,origin,source_key,owner_actor_id,observed_state,reconciliation_status,next_run_at,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[r,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.name.trim().slice(0,120),e.provider,e.expression,t.normalized,e.timezone,u??null,f??null,Oi(e.flexibleMinutes,0,0,1440),JSON.stringify(e.target),JSON.stringify(e.payloadRefs),e.missedRunPolicy,e.overlapPolicy,JSON.stringify({maxAttempts:Oi(e.retryPolicy.maxAttempts,3,1,20),backoffSeconds:Oi(e.retryPolicy.backoffSeconds,30,0,86400),deadLetterRef:e.retryPolicy.deadLetterRef}),Oi(e.timeoutSeconds,900,1,86400),e.enabled?1:0,e.origin,e.sourceKey??null,e.ownerActorId??null,JSON.stringify(e.observedState),e.reconciliationStatus,h??null,1,a,a]),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM scheduled_jobs WHERE id=?").get(e);return t?Ad(t):void 0}getBySource(e,t,r){let a=this.controlPlane.database.query("SELECT * FROM scheduled_jobs WHERE project_id=? AND environment_id IS ? AND source_key=?").get(e,t??null,r);return a?Ad(a):void 0}list(e,t={}){let r=["project_id=?"],a=[e];if(t.environmentId)r.push("environment_id=?"),a.push(t.environmentId);if(t.resourceIds?.length)r.push(`resource_id IN (${t.resourceIds.map(()=>"?").join(",")})`),a.push(...t.resourceIds);if(t.enabled!=null)r.push("enabled=?"),a.push(t.enabled?1:0);return this.controlPlane.database.query(`SELECT * FROM scheduled_jobs WHERE ${r.join(" AND ")} ORDER BY next_run_at IS NULL,next_run_at,name`).all(...a).map(Ad)}setEnabled(e,t){this.controlPlane.database.run("UPDATE scheduled_jobs SET enabled=?,version=version+1,updated_at=? WHERE id=?",[t?1:0,this.now().toISOString(),e]);let r=this.get(e);if(!r)throw Error("Scheduled job was not found.");return r}updateSchedule(e,t){let r=this.get(e);if(!r)throw Error("Scheduled job was not found.");let a=t.expression??r.expression,u=t.timezone??r.timezone,f=Mt(a,u,this.now(),1),h=this.now().toISOString();return this.controlPlane.database.run("UPDATE scheduled_jobs SET expression=?,normalized_expression=?,timezone=?,missed_run_policy=?,overlap_policy=?,timeout_seconds=?,next_run_at=?,reconciliation_status=?,version=version+1,updated_at=? WHERE id=?",[a,f.normalized,u,t.missedRunPolicy??r.missedRunPolicy,t.overlapPolicy??r.overlapPolicy,Oi(t.timeoutSeconds,r.timeoutSeconds,1,86400),f.nextRuns[0],"pending",h,e]),this.get(e)}remove(e){let t=this.get(e);if(!t)throw Error("Scheduled job was not found.");if(t.origin==="config")throw Error("Config-defined jobs must be removed from configuration, not destructively deleted.");this.controlPlane.database.run("DELETE FROM scheduled_jobs WHERE id=?",[e])}markScheduled(e,t,r){this.controlPlane.database.run("UPDATE scheduled_jobs SET last_scheduled_for=?,next_run_at=?,updated_at=? WHERE id=?",[t,r??null,this.now().toISOString(),e])}reconcile(e,t,r){return this.controlPlane.database.run("UPDATE scheduled_jobs SET reconciliation_status=?,observed_state=?,updated_at=? WHERE id=?",[t,JSON.stringify(r),this.now().toISOString(),e]),this.get(e)}upsertConfigJob(e){let t=this.getBySource(e.projectId,e.environmentId,e.sourceKey);if(!t)return this.create(e);let r=Mt(e.expression,e.timezone,this.now(),1),a=this.now().toISOString();if(t.resourceId===e.resourceId&&t.name===e.name&&t.provider===e.provider&&t.expression===e.expression&&t.normalizedExpression===r.normalized&&t.timezone===e.timezone&&JSON.stringify(t.target)===JSON.stringify(e.target)&&JSON.stringify(t.payloadRefs)===JSON.stringify(e.payloadRefs)&&t.missedRunPolicy===e.missedRunPolicy&&t.overlapPolicy===e.overlapPolicy&&JSON.stringify(t.retryPolicy)===JSON.stringify(e.retryPolicy)&&t.timeoutSeconds===e.timeoutSeconds&&t.enabled===e.enabled)return t;return this.controlPlane.database.run("UPDATE scheduled_jobs SET resource_id=?,name=?,provider=?,expression=?,normalized_expression=?,timezone=?,target=?,payload_refs=?,missed_run_policy=?,overlap_policy=?,retry_policy=?,timeout_seconds=?,enabled=?,observed_state=?,reconciliation_status=?,next_run_at=COALESCE(next_run_at,?),version=version+1,updated_at=? WHERE id=?",[e.resourceId??null,e.name,e.provider,e.expression,r.normalized,e.timezone,JSON.stringify(e.target),JSON.stringify(e.payloadRefs),e.missedRunPolicy,e.overlapPolicy,JSON.stringify(e.retryPolicy),e.timeoutSeconds,e.enabled?1:0,JSON.stringify(e.observedState),e.reconciliationStatus,r.nextRuns[0],a,t.id]),this.get(t.id)}due(e=this.now().toISOString()){return this.controlPlane.database.query("SELECT * FROM scheduled_jobs WHERE enabled=1 AND next_run_at IS NOT NULL AND next_run_at<=? AND (starts_at IS NULL OR starts_at<=?) AND (ends_at IS NULL OR ends_at>=?) ORDER BY next_run_at LIMIT 200").all(e,e,e).map(Ad)}createExecution(e){let t=this.controlPlane.database.query("SELECT * FROM job_executions WHERE idempotency_key=?").get(e.idempotencyKey);if(t)return Cd(t);let r=crypto.randomUUID(),a=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO job_executions (id,job_id,operation_id,trigger,scheduled_for,idempotency_key,status,attempt,output,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?)",[r,e.jobId,e.operationId??null,e.trigger,e.scheduledFor,e.idempotencyKey,e.status,0,JSON.stringify(e.output),a,a]),this.getExecution(r)}getExecution(e){let t=this.controlPlane.database.query("SELECT * FROM job_executions WHERE id=?").get(e);return t?Cd(t):void 0}listExecutions(e,t=100){return this.controlPlane.database.query("SELECT * FROM job_executions WHERE job_id=? ORDER BY scheduled_for DESC,created_at DESC LIMIT ?").all(e,Math.min(1000,Math.max(1,t))).map(Cd)}activeExecution(e){let t=this.controlPlane.database.query("SELECT * FROM job_executions WHERE job_id=? AND status IN ('queued','running') ORDER BY created_at DESC LIMIT 1").get(e);return t?Cd(t):void 0}attachOperation(e,t){return this.controlPlane.database.run("UPDATE job_executions SET operation_id=?,updated_at=? WHERE id=?",[t,this.now().toISOString(),e]),this.getExecution(e)}transitionExecution(e,t,r={}){let a=this.now().toISOString(),u=t==="running"?a:null,f=["succeeded","failed","skipped","dead"].includes(t)?a:null;return this.controlPlane.database.run("UPDATE job_executions SET status=?,attempt=COALESCE(?,attempt),started_at=COALESCE(started_at,?),finished_at=?,output=COALESCE(?,output),error=?,updated_at=? WHERE id=?",[t,r.attempt??null,u,f,r.output?JSON.stringify(r.output):null,r.error?.slice(0,2000)??null,a,e]),this.getExecution(e)}upsertWorker(e){let t=e.sourceKey?this.controlPlane.database.query("SELECT * FROM worker_definitions WHERE project_id=? AND source_key=? AND environment_id IS ?").get(e.projectId,e.sourceKey,e.environmentId??null):void 0,r=t?Hp(t):void 0,a=r?.id??crypto.randomUUID(),u=this.now().toISOString(),f=Oi(e.processes,1,0,1000),h=Oi(e.timeoutSeconds,60,1,86400);if(r&&r.resourceId===e.resourceId&&r.name===e.name.slice(0,120)&&r.provider===e.provider&&r.queue===e.queue.slice(0,200)&&r.processes===f&&r.timeoutSeconds===h&&r.restartPolicy===e.restartPolicy&&JSON.stringify(r.target)===JSON.stringify(e.target)&&r.enabled===e.enabled)return r;return this.controlPlane.database.run("INSERT INTO worker_definitions (id,organization_id,project_id,environment_id,resource_id,name,provider,queue,processes,timeout_seconds,restart_policy,target,enabled,origin,source_key,owner_actor_id,observed_state,reconciliation_status,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET name=excluded.name,resource_id=excluded.resource_id,provider=excluded.provider,queue=excluded.queue,processes=excluded.processes,timeout_seconds=excluded.timeout_seconds,restart_policy=excluded.restart_policy,target=excluded.target,enabled=excluded.enabled,observed_state=excluded.observed_state,reconciliation_status=excluded.reconciliation_status,version=worker_definitions.version+1,updated_at=excluded.updated_at",[a,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.name.slice(0,120),e.provider,e.queue.slice(0,200),f,h,e.restartPolicy,JSON.stringify(e.target),e.enabled?1:0,e.origin,e.sourceKey??null,e.ownerActorId??null,JSON.stringify(e.observedState),e.reconciliationStatus,1,r?.createdAt??u,u]),this.getWorker(a)}getWorker(e){let t=this.controlPlane.database.query("SELECT * FROM worker_definitions WHERE id=?").get(e);return t?Hp(t):void 0}listWorkers(e,t){return this.controlPlane.database.query(`SELECT * FROM worker_definitions WHERE project_id=?${t?" AND environment_id=?":""} ORDER BY name`).all(e,...t?[t]:[]).map(Hp)}setWorkerProcesses(e,t){this.controlPlane.database.run("UPDATE worker_definitions SET processes=?,reconciliation_status='pending',version=version+1,updated_at=? WHERE id=?",[Oi(t,1,0,1000),this.now().toISOString(),e]);let r=this.getWorker(e);if(!r)throw Error("Worker was not found.");return r}reconcileWorker(e,t,r){this.controlPlane.database.run("UPDATE worker_definitions SET reconciliation_status=?,observed_state=?,updated_at=? WHERE id=?",[t,JSON.stringify(r),this.now().toISOString(),e]);let a=this.getWorker(e);if(!a)throw Error("Worker was not found.");return a}}var Fr=(e,t="none",r=!1)=>({supported:!0,downtime:t,destructive:r,explanation:e}),$r=(e)=>({supported:!1,downtime:"none",destructive:!1,explanation:e});function Tn(e,t){let r=["aws_rds","aws_aurora","aws_elasticache"].includes(t),a=["server","container"].includes(t),u=["postgres","mysql","mariadb"].includes(e),f=e==="redis",h={};return h.create=t==="external"?$r("External services can be adopted as read-only inventory."):Fr(r?"Provision through the provider API.":"Provision through the owning runtime driver.","possible"),h.observe=t==="external"?$r("External observation requires a configured provider adapter."):Fr("Provider/runtime health and endpoint metadata are observable."),h.connect=Fr("Connection guidance uses secret references and never returns a password by default."),h.backup=u&&(r||a)?Fr(r?"Create a provider snapshot.":"Create a consistent engine-native dump.","possible"):$r("This cache path is not a durable backup source."),h.restore=r&&u?Fr("Restore creates a reviewed provider target.","required",!0):$r("Restore requires a configured provider restore runner."),h.restart=t==="external"?$r("External restart requires a configured provider adapter."):Fr(r?"Provider restart/failover semantics apply.":"Restart the owning service unit.","required"),h.resize=t==="aws_elasticache"?$r("ElastiCache resizing requires a replication-group migration runner."):r?Fr("Provider plan/storage modification may enter a maintenance window.","possible"):a?Fr("Edit host/container resources and reconcile.","required"):$r("External resize requires a configured provider adapter."),h.version=a?$r("Runtime version upgrades require an explicit image migration runner."):r&&t!=="aws_elasticache"?Fr(u?"Major versions require compatibility preflight and backup.":"Engine upgrades require a maintenance window.","required"):$r("External upgrades require a configured provider adapter."),h.rotate=t==="aws_elasticache"||t==="external"||a&&!u&&!f?$r("Credential rotation is not available for this provider/engine path."):Fr("Rotate through the secret backend, update the engine, then flag dependent releases."),h.expose=a?$r("Direct container publishing is refused; use a reviewed firewall and proxy policy."):t==="aws_rds"?Fr("Exposure is reconciled through security groups; public access defaults off."):$r("Exposure changes require a provider-specific network runner."),h.delete=t==="external"?$r("External deletion requires a configured provider adapter."):Fr(r?"Final snapshot is supported where the provider allows it.":"A final engine backup is required unless explicitly retained.","required",!0),h.logs=a?Fr("Read bounded service logs from the runtime."):$r("Provider log export is not configured for this adapter."),h.slow_queries=a&&u?Fr("Read bounded runtime logs after engine slow-query logging is enabled."):$r("A slow-query log runner is not configured for this provider."),h.users=a&&u?Fr("Logical users can be listed; creation requires a referenced secondary credential."):$r("User management requires an engine connection runner."),h.databases=a&&u?Fr("Logical databases can be listed, created, and confirmation-gated for deletion."):$r("Logical database management requires an engine connection runner."),{actions:h,endpointTypes:r?["internal","external","tunnel"]:["internal","tunnel"],metrics:f?["connections","memory","evictions","hit_rate","latency"]:["connections","cpu","storage","read_latency","write_latency","iops"]}}var is=(e)=>e==null?void 0:String(e),_d=(e)=>Number(e)===1,Pd=(e)=>{try{return JSON.parse(String(e))}catch{return{}}};function nv(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:is(e.environment_id),resourceId:is(e.resource_id),name:String(e.name),engine:String(e.engine),provider:String(e.provider),placement:String(e.placement),engineVersion:is(e.engine_version),plan:String(e.plan),storageGb:e.storage_gb==null?void 0:Number(e.storage_gb),highAvailability:_d(e.high_availability),publicExposure:_d(e.public_exposure),allowedCidrs:Pd(e.allowed_cidrs),desiredState:Pd(e.desired_state),observedState:Pd(e.observed_state),capabilities:Pd(e.capabilities),credentialRef:is(e.credential_ref),status:String(e.status),origin:String(e.origin),managementEnabled:_d(e.management_enabled),ownerActorId:is(e.owner_actor_id),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class ka{controlPlane;now;constructor(e,t=()=>new Date){this.controlPlane=e;this.now=t}create(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Data service names must be 2-63 lowercase letters, numbers, or dashes.");if(e.publicExposure&&(!e.allowedCidrs.length||e.allowedCidrs.includes("0.0.0.0/0")))throw Error("Public exposure requires explicit narrow CIDRs; 0.0.0.0/0 is refused.");let t=crypto.randomUUID(),r=this.now().toISOString(),a=Tn(e.engine,e.provider);return this.controlPlane.database.run("INSERT INTO data_services (id,organization_id,project_id,environment_id,resource_id,name,engine,provider,placement,engine_version,plan,storage_gb,high_availability,public_exposure,allowed_cidrs,desired_state,observed_state,capabilities,credential_ref,status,origin,management_enabled,owner_actor_id,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.name,e.engine,e.provider,e.placement,e.engineVersion??null,e.plan,e.storageGb??null,e.highAvailability?1:0,e.publicExposure?1:0,JSON.stringify(e.allowedCidrs),JSON.stringify(e.desiredState),JSON.stringify(e.observedState),JSON.stringify(a),e.credentialRef??null,e.status,e.origin,e.managementEnabled?1:0,e.ownerActorId??null,1,r,r]),this.get(t)}get(e){let t=this.controlPlane.database.query("SELECT * FROM data_services WHERE id=?").get(e);return t?nv(t):void 0}list(e,t){return this.controlPlane.database.query(`SELECT * FROM data_services WHERE project_id=?${t?" AND environment_id=?":""} ORDER BY name`).all(e,...t?[t]:[]).map(nv)}update(e,t,r){let a=this.get(e);if(!a)throw Error("Data service was not found.");if(a.version!==t)throw Error("Data service changed; refresh before retrying.");let u={...a,...r};if(u.publicExposure&&(!u.allowedCidrs.length||u.allowedCidrs.includes("0.0.0.0/0")))throw Error("Public exposure requires explicit narrow CIDRs; 0.0.0.0/0 is refused.");if(this.controlPlane.database.run("UPDATE data_services SET plan=?,storage_gb=?,engine_version=?,high_availability=?,public_exposure=?,allowed_cidrs=?,desired_state=?,observed_state=?,status=?,management_enabled=?,credential_ref=?,version=version+1,updated_at=? WHERE id=? AND version=?",[u.plan,u.storageGb??null,u.engineVersion??null,u.highAvailability?1:0,u.publicExposure?1:0,JSON.stringify(u.allowedCidrs),JSON.stringify(u.desiredState),JSON.stringify(u.observedState),u.status,u.managementEnabled?1:0,u.credentialRef??null,this.now().toISOString(),e,t]).changes!==1)throw Error("Data service changed; refresh before retrying.");return this.get(e)}credential(e){let t=this.controlPlane.database.query("SELECT * FROM data_service_credentials WHERE service_id=? ORDER BY version DESC LIMIT 1").get(e);return t?{id:String(t.id),serviceId:String(t.service_id),username:String(t.username),secretRef:String(t.secret_ref),version:Number(t.version),createdAt:String(t.created_at),rotatedAt:is(t.rotated_at)}:void 0}saveCredential(e,t,r){let a=this.credential(e),u=a?.id??crypto.randomUUID(),f=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO data_service_credentials (id,service_id,username,secret_ref,version,created_at,rotated_at) VALUES (?,?,?,?,?,?,?) ON CONFLICT(service_id,username) DO UPDATE SET secret_ref=excluded.secret_ref,version=data_service_credentials.version+1,rotated_at=excluded.rotated_at",[u,e,t,r,a?.version??1,a?.createdAt??f,a?f:null]),this.credential(e)}addDependency(e){let t=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO data_service_dependencies (service_id,resource_id,secret_ref,requires_redeploy,created_at) VALUES (?,?,?,?,?) ON CONFLICT(service_id,resource_id) DO UPDATE SET secret_ref=excluded.secret_ref,requires_redeploy=excluded.requires_redeploy",[e.serviceId,e.resourceId,e.secretRef,e.requiresRedeploy?1:0,t]),{...e,createdAt:t}}dependencies(e){return this.controlPlane.database.query("SELECT * FROM data_service_dependencies WHERE service_id=? ORDER BY resource_id").all(e).map((t)=>({serviceId:String(t.service_id),resourceId:String(t.resource_id),secretRef:String(t.secret_ref),requiresRedeploy:_d(t.requires_redeploy),createdAt:String(t.created_at)}))}removeDependency(e,t){return this.controlPlane.database.run("DELETE FROM data_service_dependencies WHERE service_id=? AND resource_id=?",[e,t]).changes===1}remove(e){this.controlPlane.database.run("DELETE FROM data_services WHERE id=?",[e])}}function iv(){let t=crypto.getRandomValues(new Uint8Array(40));return Array.from(t,(r)=>"ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*_-+="[r%69]).join("")}function Mu(e,t){return t.map((r)=>{let a=r.type==="tunnel"?"127.0.0.1":r.host,u=e.engine==="redis"?`redis-cli -h ${a} -p ${r.port}${r.tls?" --tls":""}`:e.engine==="postgres"?`psql "host=${a} port=${r.port} dbname=${r.database??"postgres"} sslmode=${r.tls?"require":"disable"}"`:e.engine==="mongodb"?`mongosh "mongodb://${a}:${r.port}/${r.database??"admin"}${r.tls?"?tls=true":""}"`:e.engine==="libsql"?`turso db shell ${r.tls?"https":"http"}://${a}:${r.port}`:`mysql --host=${a} --port=${r.port} --database=${r.database??"mysql"} --ssl-mode=${r.tls?"REQUIRED":"DISABLED"}`;return{type:r.type,command:u,secretRef:e.credentialRef}})}class ys{store;queue;secrets;constructor(e,t,r){this.store=e;this.queue=t;this.secrets=r}async create(e){let t,r;if(e.provider!=="aws_elasticache"){let a=e.username??"app",u=iv();r=`secret://data-services/${e.projectId}/${e.name}/${a}`,await this.secrets.put(r,u),t={username:a,password:u,secretRef:r}}try{let a=this.store.create({...e,credentialRef:r,status:"planning"});if(t)this.store.saveCredential(a.id,t.username,t.secretRef);let u=this.enqueue(a,"create",{});return{service:a,credential:t,operationId:u}}catch(a){if(r)await this.secrets.remove(r);throw a}}plan(e,t,r={}){let a=e.capabilities.actions[t],u=t==="version"&&String(r.engineVersion??"").split(".")[0]!==String(e.engineVersion??"").split(".")[0];return{service:e,action:t,capability:a,changes:r,preflight:{backupRequired:["delete","restore"].includes(t)||u,compatibilityRequired:u,typedConfirmation:a.destructive?e.name:void 0,retentionChoiceRequired:t==="delete"},warnings:[...a.downtime!=="none"?[`Downtime is ${a.downtime}.`]:[],...e.origin==="adopted"&&!e.managementEnabled?["Adopted resource is read-only until management is explicitly enabled."]:[]]}}enqueue(e,t,r,a){let u=this.plan(e,t,r);if(!u.capability.supported)throw Error(u.capability.explanation);if(e.origin==="adopted"&&!e.managementEnabled&&t!=="observe")throw Error("Adopted resources remain read-only until management is explicitly enabled.");if(u.preflight.typedConfirmation&&r.confirm!==u.preflight.typedConfirmation)throw Error(`Type ${u.preflight.typedConfirmation} to confirm ${t}.`);if(u.preflight.retentionChoiceRequired&&!["final_backup","retain"].includes(String(r.retention??"")))throw Error("Deletion requires retention final_backup or retain.");if(u.preflight.compatibilityRequired&&(r.compatibilityReviewed!==!0||!r.backupId))throw Error("Major version changes require compatibilityReviewed=true and a backupId.");if(t==="restore"){let f=String(r.backupId??""),h=String(r.targetId??"");if(!f||!h)throw Error("Restore requires both backupId and targetId.");if(h===e.placement)throw Error("Restore targetId must differ from the source placement.");if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(h))throw Error("Restore targetId must be 2-63 lowercase letters, numbers, or dashes.")}return this.queue.enqueue({projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:a,kind:"data_service.action",input:{serviceId:e.id,action:t,...r},lockKey:`data-service:${e.id}`,providerKey:e.provider,maxAttempts:3,timeoutSeconds:7200,retryClasses:["provider_transient"],resumePolicy:"requeue"}).operation.id}async rotate(e,t,r){let a=this.store.credential(e.id);if(!a)throw Error("Data service credential metadata was not found.");let u=iv(),f=`${a.secretRef}/v${a.version+1}`;await this.secrets.put(f,u);try{return await t.action(e,"rotate",{username:a.username,secretRef:f},u,r),this.store.saveCredential(e.id,a.username,f),this.store.update(e.id,e.version,{credentialRef:f}),{credential:{username:a.username,password:u,secretRef:f},dependencies:this.store.dependencies(e.id).filter((h)=>h.requiresRedeploy).map((h)=>h.resourceId)}}catch(h){throw await this.secrets.remove(f),h}}}function Fu(e){return{"data_service.action":async(t)=>{let r=t.operation.input,a=e.store.get(String(r.serviceId??"")),u=String(r.action??"");if(!a)throw Error("Data service was not found.");let f=e.resolveAdapter(a);if(!f||f.provider!==a.provider||!f.engines.includes(a.engine))throw Error(`No ${a.provider}/${a.engine} adapter is configured.`);if(u==="rotate"){let b=await new ys(e.store,new c(e.store.controlPlane),e.secrets).rotate(a,f,t);return{serviceId:a.id,action:u,username:b.credential.username,secretRef:b.credential.secretRef,dependencies:b.dependencies}}let h=a.credentialRef?await e.secrets.resolve(a.credentialRef):void 0;try{let b=u==="observe"?await f.observe(a):u==="create"?await f.apply(a,h,t):await f.action(a,u,r,h,t),S=e.store.get(a.id);return e.store.update(a.id,S.version,{observedState:b,status:u==="delete"?r.retention==="retain"?"retained":"deleting":"available"}),{serviceId:a.id,action:u,observed:b}}catch(b){let S=e.store.get(a.id);if(e.store.update(a.id,S.version,{status:"failed",observedState:{...S.observedState,error:b instanceof Error?b.message:String(b)}}),/temporar|timeout|unavailable|throttl/i.test(b instanceof Error?b.message:String(b)))throw new ae(b instanceof Error?b.message:String(b),"provider_transient");throw b}}}}class os{transport;constructor(e){this.transport=e}observe(e){return this.transport.observe(e.placement)}apply(e,t){return this.transport.apply({id:e.placement,name:e.name,engine:e.engine,engineVersion:e.engineVersion??null,plan:e.plan,storageGb:e.storageGb??null,highAvailability:e.highAvailability,publicExposure:e.publicExposure,allowedCidrs:e.allowedCidrs,username:e.desiredState.username??"app",desiredState:e.desiredState},t)}action(e,t,r,a,u){return this.transport.execute(e.placement,t,{engine:e.engine,engineVersion:e.engineVersion??null,plan:e.plan,desiredState:e.desiredState,...r},a,u)}}class Na extends os{provider="aws_rds";engines=["postgres","mysql","mariadb"]}class Ba extends os{provider="aws_aurora";engines=["postgres","mysql"]}class xa extends os{provider="aws_elasticache";engines=["redis"]}class Oa extends os{provider="server";engines=["postgres","mysql","mariadb","redis","mongodb","libsql"]}class _a extends os{provider="container";engines=["postgres","mysql","mariadb","redis","mongodb","libsql"]}var $d=(e,t)=>{let r=e.desiredState;return e[t]??(r&&typeof r==="object"&&!Array.isArray(r)?r[t]:void 0)},Jt=(e,t,r)=>{let a=$d(e,t);return a==null?r:String(a)},nn=(e,t)=>{let r=$d(e,t);return r==null?void 0:Number(r)},$i=(e,t)=>{let r=$d(e,t);return r==null?void 0:r===!0||r==="true"},ss=(e,t)=>{let r=$d(e,t);return Array.isArray(r)?r.map(String):[]},Od=(e,t)=>Jt(t,"snapshotId")??`${e}-final-${new Date().toISOString().replace(/[^0-9]/g,"").slice(0,14)}`;function xd(e){if(!e)throw Error("RDS instance was not found.");return{providerId:e.DBInstanceIdentifier??null,status:e.DBInstanceStatus??"unknown",engine:e.Engine??null,engineVersion:e.EngineVersion??null,plan:e.DBInstanceClass??null,storageGb:e.AllocatedStorage??null,highAvailability:e.MultiAZ??!1,publicExposure:e.PubliclyAccessible??!1,endpoint:e.Endpoint?.Address??null,port:e.Endpoint?.Port??null,username:e.MasterUsername??null,database:e.DBName??null,encrypted:e.StorageEncrypted??!1}}class La{client;constructor(e=new ne){this.client=e}async observe(e){return xd(await this.client.describeDBInstance(e))}async apply(e,t){let r=String(e.id),a=await this.client.createDBInstance({DBInstanceIdentifier:r,DBInstanceClass:String(e.plan),Engine:String(e.engine),MasterUsername:Jt(e,"username","app"),MasterUserPassword:t,DBName:Jt(e,"database"),AllocatedStorage:nn(e,"storageGb"),VpcSecurityGroupIds:ss(e,"securityGroupIds"),DBSubnetGroupName:Jt(e,"subnetGroup"),BackupRetentionPeriod:nn(e,"backupRetentionDays")??7,MultiAZ:$i(e,"highAvailability"),EngineVersion:Jt(e,"engineVersion"),PubliclyAccessible:$i(e,"publicExposure")??!1,StorageType:Jt(e,"storageType","gp3"),StorageEncrypted:!0,KmsKeyId:Jt(e,"kmsKeyId"),DeletionProtection:!0,Tags:[{Key:"managed-by",Value:"ts-cloud"}]});return xd(a.DBInstance)}async execute(e,t,r,a,u){if(t==="observe")return this.observe(e);if(t==="restart")return await this.client.rebootDBInstance({DBInstanceIdentifier:e}),{status:"rebooting"};if(t==="backup"){let f=Od(e,r);return await this.client.createDBSnapshot({DBInstanceIdentifier:e,DBSnapshotIdentifier:f}),{status:"snapshotting",snapshotId:f}}if(t==="restore"){let f=String(r.targetId),h=await this.client.restoreDBInstanceFromDBSnapshot({DBInstanceIdentifier:f,DBSnapshotIdentifier:String(r.backupId),DBInstanceClass:Jt(r,"plan"),DBSubnetGroupName:Jt(r,"subnetGroup"),MultiAZ:$i(r,"highAvailability"),PubliclyAccessible:!1,StorageType:Jt(r,"storageType"),VpcSecurityGroupIds:ss(r,"securityGroupIds"),DeletionProtection:!0,Tags:[{Key:"managed-by",Value:"ts-cloud"}]});return{...xd(h.DBInstance),sourceId:e,restoreTargetId:f}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};let f=Od(e,r);return await this.client.modifyDBInstance({DBInstanceIdentifier:e,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBInstance({DBInstanceIdentifier:e,SkipFinalSnapshot:!1,FinalDBSnapshotIdentifier:f,DeleteAutomatedBackups:!1}),{status:"deleting",finalSnapshotId:f}}if(["resize","version","rotate","expose"].includes(t)){let f=await this.client.modifyDBInstance({DBInstanceIdentifier:e,DBInstanceClass:Jt(r,"plan"),AllocatedStorage:nn(r,"storageGb"),MasterUserPassword:t==="rotate"?a:void 0,EngineVersion:Jt(r,"engineVersion"),MultiAZ:$i(r,"highAvailability"),PubliclyAccessible:$i(r,"publicExposure"),VpcSecurityGroupIds:ss(r,"securityGroupIds"),ApplyImmediately:$i(r,"applyImmediately")??!0});return xd(f.DBInstance)}throw Error(`RDS action ${t} requires an engine connection runner.`)}}function Kp(e){if(!e)throw Error("Aurora cluster was not found.");return{providerId:e.DBClusterIdentifier??null,status:e.Status??"unknown",engine:e.Engine??null,engineVersion:e.EngineVersion??null,endpoint:e.Endpoint??null,readerEndpoint:e.ReaderEndpoint??null,port:e.Port??null,username:e.MasterUsername??null,database:e.DatabaseName??null,encrypted:e.StorageEncrypted??!1,highAvailability:e.MultiAZ??!0}}class $a{client;constructor(e=new ne){this.client=e}async observe(e){let t=await this.client.describeDBClusters({DBClusterIdentifier:e});return Kp(t.DBClusters?.[0])}async apply(e,t){let r=String(e.id),a=String(e.engine)==="postgres"?"aurora-postgresql":"aurora-mysql";return await this.client.createDBCluster({DBClusterIdentifier:r,Engine:a,EngineVersion:Jt(e,"engineVersion"),MasterUsername:Jt(e,"username","app"),MasterUserPassword:t,DatabaseName:Jt(e,"database"),DBSubnetGroupName:Jt(e,"subnetGroup"),VpcSecurityGroupIds:ss(e,"securityGroupIds"),BackupRetentionPeriod:nn(e,"backupRetentionDays")??7,StorageEncrypted:!0,KmsKeyId:Jt(e,"kmsKeyId"),DeletionProtection:!0,ServerlessV2ScalingConfiguration:{MinCapacity:nn(e,"minCapacity")??0.5,MaxCapacity:nn(e,"maxCapacity")??4}}),await this.client.createDBInstance({DBInstanceIdentifier:`${r}-writer-1`,DBClusterIdentifier:r,DBInstanceClass:String(e.plan||"db.serverless"),Engine:a,PubliclyAccessible:$i(e,"publicExposure")??!1}),{status:"creating",providerId:r}}async execute(e,t,r,a){if(t==="observe")return this.observe(e);if(t==="restart")return await this.client.rebootDBCluster(e),{status:"rebooting"};if(t==="backup"){let u=Od(e,r);return await this.client.createDBClusterSnapshot(e,u),{status:"snapshotting",snapshotId:u}}if(t==="restore"){let u=String(r.targetId),f=String(r.engine)==="postgres"?"aurora-postgresql":"aurora-mysql",h=await this.client.restoreDBClusterFromSnapshot({DBClusterIdentifier:u,SnapshotIdentifier:String(r.backupId),Engine:f,EngineVersion:Jt(r,"engineVersion"),DBSubnetGroupName:Jt(r,"subnetGroup"),VpcSecurityGroupIds:ss(r,"securityGroupIds"),DeletionProtection:!0,ServerlessV2ScalingConfiguration:{MinCapacity:nn(r,"minCapacity")??0.5,MaxCapacity:nn(r,"maxCapacity")??4}});return await this.client.createDBInstance({DBInstanceIdentifier:`${u}-writer-1`,DBClusterIdentifier:u,DBInstanceClass:Jt(r,"plan","db.serverless"),Engine:f,PubliclyAccessible:!1}),{...Kp(h.DBCluster),sourceId:e,restoreTargetId:u}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};let u=Od(e,r);return await this.client.modifyDBCluster({DBClusterIdentifier:e,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBCluster(e,u),{status:"deleting",finalSnapshotId:u}}if(["resize","version","rotate"].includes(t)){let u=await this.client.modifyDBCluster({DBClusterIdentifier:e,ServerlessV2ScalingConfiguration:nn(r,"minCapacity")==null&&nn(r,"maxCapacity")==null?void 0:{MinCapacity:nn(r,"minCapacity")??0.5,MaxCapacity:nn(r,"maxCapacity")??4},EngineVersion:Jt(r,"engineVersion"),MasterUserPassword:t==="rotate"?a:void 0,ApplyImmediately:$i(r,"applyImmediately")??!0});return Kp(u.DBCluster)}throw Error(`Aurora action ${t} requires an engine connection runner.`)}}class Ma{client;constructor(e=new ut){this.client=e}async observe(e){let t=(await this.client.describeCacheClusters(e)).CacheClusters[0];if(!t)throw Error("ElastiCache cluster was not found.");let r=t.CacheNodes?.[0]?.Endpoint;return{providerId:t.CacheClusterId,status:t.CacheClusterStatus,engine:t.Engine,engineVersion:t.EngineVersion,plan:t.CacheNodeType,nodes:t.NumCacheNodes,endpoint:r?.Address??null,port:r?.Port??null}}async apply(e){let t=await this.client.createCacheCluster({cacheClusterId:String(e.id),engine:"redis",cacheNodeType:String(e.plan),numCacheNodes:nn(e,"nodes")??1,engineVersion:Jt(e,"engineVersion"),port:nn(e,"port"),securityGroupIds:ss(e,"securityGroupIds"),subnetGroupName:Jt(e,"subnetGroup"),tags:[{Key:"managed-by",Value:"ts-cloud"}]});return{providerId:t.CacheCluster.CacheClusterId,status:t.CacheCluster.CacheClusterStatus}}async execute(e,t,r){if(t==="observe")return this.observe(e);if(t==="restart"){let a=(await this.client.describeCacheClusters(e)).CacheClusters[0];return await this.client.rebootCacheCluster(e,a?.CacheNodes?.map((u)=>u.CacheNodeId)??["0001"]),{status:"rebooting"}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};return await this.client.deleteCacheCluster(e),{status:"deleting"}}throw Error(`ElastiCache action ${t} is not supported by this cluster mode.`)}}import{mkdir as HR,writeFile as KR}from"node:fs/promises";import{join as JR}from"node:path";async function ln(e,t,r=!1){let a=Bun.spawn(["docker",...e],{stdin:t==null?"ignore":"pipe",stdout:"pipe",stderr:"pipe"}),u=new Response(a.stdout).text(),f=new Response(a.stderr).text();if(t!=null)a.stdin.write(t),a.stdin.end();let[h,b,S]=await Promise.all([a.exited,u,f]);if(h!==0&&!r)throw Error(`Docker command failed (${h}): ${S.trim()||b.trim()}`);return{code:h,stdout:b,stderr:S}}class Uu{async ensureNetwork(e){if((await ln(["network","inspect",e],void 0,!0)).code!==0)await ln(["network","create","--internal",e])}async seedSecret(e,t){await ln(["volume","create",e]),await ln(["run","--rm","-i","-v",`${e}:/run/target`,"alpine:3.21","sh","-c","umask 077; cat > /run/target/credential"],t)}async removeVolume(e){await ln(["volume","rm",e],void 0,!0)}async inspect(e){let t=await ln(["inspect",e],void 0,!0);if(t.code!==0)return;return JSON.parse(t.stdout)[0]}async run(e){await ln(["run",...e])}async exec(e,t,r){return(await ln(["exec","-i",e,...t],r)).stdout}async update(e,t){await ln(["update",...t,e])}async restart(e){await ln(["restart",e])}async remove(e){await ln(["rm","--force",e],void 0,!0)}async logs(e,t){let r=await ln(["logs","--tail",String(Math.min(2000,Math.max(1,t))),e],void 0,!0);return`${r.stdout}${r.stderr}`.slice(-262144)}async stats(e){let t=await ln(["stats","--no-stream","--format","{{json .}}",e],void 0,!0);if(t.code!==0||!t.stdout.trim())return{};let r=JSON.parse(t.stdout.trim());return{cpuPercent:String(r.CPUPerc??""),memoryUsage:String(r.MemUsage??""),memoryPercent:String(r.MemPerc??""),networkIo:String(r.NetIO??""),blockIo:String(r.BlockIO??""),pids:Number(r.PIDs??0)}}}var GR={postgres:{image:"postgres:17-alpine",port:5432,dataPath:"/var/lib/postgresql/data"},mysql:{image:"mysql:8.4",port:3306,dataPath:"/var/lib/mysql"},mariadb:{image:"mariadb:11.7",port:3306,dataPath:"/var/lib/mysql"},redis:{image:"redis:7.4-alpine",port:6379,dataPath:"/data"},mongodb:{image:"mongo:8.0",port:27017,dataPath:"/data/db"}};function hi(e,t="app"){let r=String(e??t);if(!/^[A-Za-z_][A-Za-z0-9_]{0,62}$/.test(r))throw Error("Database identifiers must be letters, numbers, or underscores.");return r}function go(e){if(!/^[a-z0-9][a-z0-9_.-]{1,62}$/i.test(e))throw Error("Runtime placement must be a valid container identifier.");return`tscloud-data-${e.toLowerCase()}`}function QR(e,t){let r=e.desiredState;return e[t]??(r&&typeof r==="object"&&!Array.isArray(r)?r[t]:void 0)}function oa(e){return e.Config?.Labels??{}}class Sr{runtime;backupRoot;constructor(e=new Uu,t=l(process.cwd(),"backups","data")){this.runtime=e;this.backupRoot=t}async observe(e){let t=go(e),r=await this.runtime.inspect(t);if(!r)throw Error(`Data container ${t} was not found.`);let a=oa(r),u=await this.runtime.stats(t),f=r.NetworkSettings?.Ports??{},h=Object.values(f).flat().find(Boolean);return{providerId:t,status:r.State?.Status??"unknown",healthy:r.State?.Health?.Status??null,engine:a["ts-cloud.engine"]??null,engineVersion:a["ts-cloud.engine-version"]??null,username:a["ts-cloud.username"]??null,database:a["ts-cloud.database"]??null,endpoint:h?.HostIp||"127.0.0.1",port:h?.HostPort?Number(h.HostPort):null,image:r.Config?.Image??null,startedAt:r.State?.StartedAt??null,metrics:u}}async apply(e,t){let r=String(e.id),a=go(r),u=String(e.engine);if(u==="libsql")throw Error("libSQL requires an explicitly configured runtime image.");let f=GR[u];if(!f)throw Error(`Unsupported runtime data engine ${u}.`);if(!t)throw Error(`${u} requires a managed credential.`);if(e.publicExposure===!0)throw Error("Container public exposure requires an external reviewed firewall policy; direct publishing is refused.");let h=hi(e.username),b=hi(QR(e,"database")),S=`${a}-secret`,y=`${a}-data`,k=u==="redis"?`appendonly yes
127
+ `}}function VR(e){let t=at(e);if(t.kind==="rate")return e;let r=t.normalized.slice(5,-1).trim().split(/\s+/);if(r.length===6)return t.normalized;let[a,u,f,h,b]=r,S=b==="*"?"?":b.replace(/(^|[,-])0(?=$|[,-])/g,(y,k)=>`${k}1`);return f==="*"&&b!=="*"?`cron(${a} ${u} ? ${h} ${S} *)`:`cron(${a} ${u} ${f} ${h} ? *)`}function Lu(e){let t=vn(e);if(!t.supported)throw Error(t.notes.join(" "));return{Name:`ts-cloud-${e.id}`,ScheduleExpression:VR(e.expression),ScheduleExpressionTimezone:e.timezone,State:e.enabled?"ENABLED":"DISABLED",FlexibleTimeWindow:e.flexibleMinutes?{Mode:"FLEXIBLE",MaximumWindowInMinutes:e.flexibleMinutes}:{Mode:"OFF"},Target:{kind:e.target.kind,functionName:e.target.functionName??null,payloadRefs:e.payloadRefs},RetryPolicy:{MaximumRetryAttempts:e.retryPolicy.maxAttempts,MaximumEventAgeInSeconds:e.timeoutSeconds},DeadLetterRef:e.retryPolicy.deadLetterRef??null}}function US(e,t){if(!t)return{status:"unavailable",observedState:{message:"Provider observation is unavailable."}};let r=String(t.expression??""),a=t.enabled;return{status:r&&r!==e.normalizedExpression||typeof a==="boolean"&&a!==e.enabled?"drifted":"in_sync",observedState:t}}function ah(e){if(e.provider==="server"){let t=As(e);return{path:t.path,content:t.content,enabled:e.enabled}}if(e.provider==="eventbridge")return Lu(e);throw Error(`No reconciliation adapter is configured for ${e.provider} schedules.`)}function Wp(e,t){if(Array.isArray(e))return Array.isArray(t)&&e.length===t.length&&e.every((r,a)=>Wp(r,t[a]));if(e&&typeof e==="object"){if(!t||typeof t!=="object"||Array.isArray(t))return!1;return Object.entries(e).every(([r,a])=>Wp(a,t[r]))}return e===t}class ch{transport;provider="server";constructor(e){this.transport=e}async observe(e){let t=As(e),r=await this.transport.read(t.path);return r==null?void 0:{path:t.path,content:r,enabled:!0}}async apply(e,t){let r=String(t.path??"");if(!e.enabled){await this.transport.removeRootOwned(r);return}await this.transport.writeRootOwned(r,String(t.content??""))}async remove(e){await this.transport.removeRootOwned(As(e).path)}matches(e,t){if(e.enabled===!1)return!1;return e.path===t.path&&e.content===t.content}}class dh{transport;provider="eventbridge";constructor(e){this.transport=e}observe(e){return this.transport.get(`ts-cloud-${e.id}`)}apply(e,t){return this.transport.put(t)}remove(e){return this.transport.remove(`ts-cloud-${e.id}`)}matches(e,t){return Wp(e,t)}}class lh{store;constructor(e){this.store=e}async reconcile(e,t,r={}){if(t.provider!==e.provider)return this.store.reconcile(e.id,"unsupported",{provider:t.provider,message:`Adapter ${t.provider} cannot reconcile ${e.provider}.`});try{let a=ah(e),u=await t.observe(e);if(u&&t.matches(a,u))return this.store.reconcile(e.id,"in_sync",{provider:t.provider,observed:u});if(r.apply===!1)return this.store.reconcile(e.id,u?"drifted":"unavailable",{provider:t.provider,observed:u??null,applyRequired:!0});if(await t.apply(e,a),!e.enabled)return this.store.reconcile(e.id,"in_sync",{provider:t.provider,observed:null,disabled:!0});let f=await t.observe(e);return this.store.reconcile(e.id,f&&t.matches(a,f)?"in_sync":"drifted",{provider:t.provider,observed:f??null,applied:!0})}catch(a){return this.store.reconcile(e.id,"unavailable",{provider:t.provider,error:a instanceof Error?a.message:String(a)})}}async remove(e,t){if(e.origin==="config")throw Error("Config-defined jobs must be removed from configuration, not destructively deleted.");if(t.provider!==e.provider)throw Error(`Adapter ${t.provider} cannot remove ${e.provider}.`);await t.remove(e),this.store.remove(e.id)}}function WR(e){if(e.queues===!0)return[{queue:"default",processes:e.queueConcurrency??1}];if(!Array.isArray(e.queues))return[];return e.queues.map((t)=>{if(typeof t==="string")return{queue:t,processes:e.queueConcurrency??1};let[r,a]=Object.entries(t)[0]??["default",e.queueConcurrency??1];return{queue:r,processes:a}})}function Ra(e,t,r){let a=new Set,u=new Set,f=new Map(r.resources.map((R)=>[R.slug,R])),h=0,b=0;for(let[R,D]of Object.entries(t.sites??{})){let O=f.get(R);if(D.scheduler){let J=`config:site:${R}:scheduler`;a.add(J),e.upsertConfigJob({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,resourceId:O?.id,name:`${R} scheduler`,provider:"server",expression:"* * * * *",timezone:"UTC",flexibleMinutes:0,target:{kind:"dashboard_operation",operationId:`scheduler:run:${R}`},payloadRefs:{},missedRunPolicy:"skip",overlapPolicy:"forbid",retryPolicy:{maxAttempts:3,backoffSeconds:30},timeoutSeconds:300,enabled:!0,origin:"config",sourceKey:J,observedState:{source:"cloud.config.ts"},reconciliationStatus:"pending"}),h++}let M=D,z=Array.isArray(M.queues??M.workers)?M.queues??M.workers:[];for(let[J,Z]of z.entries()){let oe=typeof Z==="string"?{queue:Z}:Z,G=String(oe.queue??oe.name??"default"),te=`config:site:${R}:worker:${J}:${G}`;u.add(te),e.upsertWorker({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,resourceId:O?.id,name:`${R}:${G}`,provider:"systemd",queue:G,processes:Number(oe.processes)||1,timeoutSeconds:Number(oe.timeout)||60,restartPolicy:"always",target:{operationId:`worker:restart:${R}`,site:R},enabled:!0,origin:"config",sourceKey:te,observedState:{source:"cloud.config.ts",currentJob:null,failures:0},reconciliationStatus:"pending"}),b++}}let S=t.infrastructure?.compute?.backups;if(S?.enabled)a.add("config:platform:backup"),e.upsertConfigJob({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,name:"Scheduled backup",provider:"server",expression:String(S.schedule??"0 2 * * *"),timezone:String(S.timezone??"UTC"),flexibleMinutes:0,target:{kind:"dashboard_operation",operationId:"backup:run"},payloadRefs:{},missedRunPolicy:"skip",overlapPolicy:"forbid",retryPolicy:{maxAttempts:3,backoffSeconds:60},timeoutSeconds:3600,enabled:!0,origin:"config",sourceKey:"config:platform:backup",observedState:{source:"cloud.config.ts"},reconciliationStatus:"pending"}),h++;let y=t.environments?.[r.environment.slug]?.app;if(y){if(y.scheduler!=="off"){let R=`config:serverless:${r.environment.slug}:scheduler`;a.add(R),e.upsertConfigJob({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,name:`${r.environment.name} serverless scheduler`,provider:"eventbridge",expression:"rate(1 minute)",timezone:"UTC",flexibleMinutes:0,target:{kind:"serverless_scheduler",action:"schedule:run"},payloadRefs:{},missedRunPolicy:y.scheduler==="sub-minute"?"catch_up":"skip",overlapPolicy:"forbid",retryPolicy:{maxAttempts:3,backoffSeconds:30},timeoutSeconds:y.cliTimeout??900,enabled:!0,origin:"config",sourceKey:R,observedState:{source:"cloud.config.ts",mode:y.scheduler??"on"},reconciliationStatus:"pending"}),h++}for(let{queue:R,processes:D}of WR(y)){let O=`config:serverless:${r.environment.slug}:worker:${R}`;u.add(O),e.upsertWorker({organizationId:r.organization.id,projectId:r.project.id,environmentId:r.environment.id,name:`${r.environment.name}:${R}`,provider:"lambda",queue:R,processes:D,timeoutSeconds:y.queueTimeout??120,restartPolicy:"on_failure",target:{function:"queue",queue:R},enabled:!0,origin:"config",sourceKey:O,observedState:{source:"cloud.config.ts",currentJob:null,failures:0},reconciliationStatus:"pending"}),b++}}let k=0;for(let R of e.list(r.project.id,{environmentId:r.environment.id}).filter((D)=>D.origin==="config"&&D.sourceKey&&!a.has(D.sourceKey)))e.reconcile(R.id,"drifted",{...R.observedState,reason:"Definition is no longer present in configuration; retained for non-destructive review."}),k++;for(let R of e.listWorkers(r.project.id,r.environment.id).filter((D)=>D.origin==="config"&&D.sourceKey&&!u.has(D.sourceKey)))e.reconcileWorker(R.id,"drifted",{...R.observedState,reason:"Definition is no longer present in configuration; retained for non-destructive review."}),k++;return{jobs:h,workers:b,drifted:k}}class Da{store;queue;constructor(e,t={}){this.store=e;this.queue=t.queue??new c(e.controlPlane)}enqueue(e,t){let r=new Date(t.scheduledFor??this.store.now()).toISOString(),a=`${e.id}:${t.trigger==="manual"?crypto.randomUUID():r}`,u=this.store.activeExecution(e.id);if(u&&e.overlapPolicy==="forbid")return this.store.createExecution({jobId:e.id,trigger:t.trigger,scheduledFor:r,idempotencyKey:a,status:"skipped",output:{reason:"overlap_forbidden",activeExecutionId:u.id}});if(u&&e.overlapPolicy==="replace"&&u.operationId)try{this.queue.requestCancellation(u.operationId,t.actorId)}catch{}let f=this.store.createExecution({jobId:e.id,trigger:t.trigger,scheduledFor:r,idempotencyKey:a,status:"queued",output:{semantics:"at_least_once"}});if(f.operationId)return f;let h=this.queue.enqueue({projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:t.actorId,kind:"job.execute",input:{jobId:e.id,executionId:f.id},idempotencyKey:`job-execution:${f.id}`,lockKey:e.overlapPolicy==="allow"?`job-execution:${f.id}`:`job:${e.id}`,maxAttempts:e.retryPolicy.maxAttempts,timeoutSeconds:e.timeoutSeconds,retryClasses:["job_transient"],resumePolicy:"requeue"}).operation;return this.store.attachOperation(f.id,h.id)}tick(e=this.store.now()){let t=[];for(let r of this.store.due(e.toISOString())){let a=r.nextRunAt,u=$t(r.normalizedExpression,r.timezone,e,1)[0];if(r.missedRunPolicy==="catch_up"){let f=a,h=0;while(f<=e.toISOString()&&h<10)t.push(this.enqueue(r,{trigger:f===a?"scheduled":"catch_up",scheduledFor:f})),f=$t(r.normalizedExpression,r.timezone,new Date(f),1)[0],h++}else t.push(this.enqueue(r,{trigger:"scheduled",scheduledFor:a}));this.store.markScheduled(r.id,a,u)}return t}}function $u(e){return{"job.execute":async(r)=>{let a=r.operation.input&&typeof r.operation.input==="object"&&!Array.isArray(r.operation.input)?r.operation.input:{},u=e.store.get(String(a.jobId??"")),f=e.store.getExecution(String(a.executionId??""));if(!u||!f)throw Error("Scheduled job execution is no longer available.");e.store.transitionExecution(f.id,"running",{attempt:r.operation.attempt}),r.checkpoint("execute",`Running ${u.name} on ${u.provider}.`),r.log(`Trigger ${f.trigger}; scheduled for ${f.scheduledFor}; semantics at-least-once.`,{stream:"system"});let h=await e.executor(u,u.target,r);if(h.stdout)r.log(h.stdout,{stream:"stdout"});if(h.stderr)r.log(h.stderr,{stream:"stderr"});if(!h.ok){if(e.store.transitionExecution(f.id,r.operation.attempt>=u.retryPolicy.maxAttempts?"dead":"failed",{attempt:r.operation.attempt,error:h.stderr??"Job execution failed."}),h.retryable)throw new ae(h.stderr??"Scheduled job failed transiently.","job_transient");throw Error(h.stderr??"Scheduled job failed.")}return e.store.transitionExecution(f.id,"succeeded",{attempt:r.operation.attempt,output:h.output??{}}),{jobId:u.id,executionId:f.id,provider:u.provider}}}}var Lr=(e)=>typeof e==="string"&&e?e:void 0,rv=(e)=>Number(e)===1,po=(e)=>{try{return JSON.parse(String(e))}catch{return{}}},Oi=(e,t,r,a)=>{let u=Number(e);return Number.isFinite(u)?Math.min(a,Math.max(r,Math.floor(u))):t};function Ad(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:Lr(e.environment_id),resourceId:Lr(e.resource_id),name:String(e.name),provider:String(e.provider),expression:String(e.expression),normalizedExpression:String(e.normalized_expression),timezone:String(e.timezone),startsAt:Lr(e.starts_at),endsAt:Lr(e.ends_at),flexibleMinutes:Number(e.flexible_minutes),target:po(e.target),payloadRefs:po(e.payload_refs),missedRunPolicy:String(e.missed_run_policy),overlapPolicy:String(e.overlap_policy),retryPolicy:po(e.retry_policy),timeoutSeconds:Number(e.timeout_seconds),enabled:rv(e.enabled),origin:String(e.origin),sourceKey:Lr(e.source_key),ownerActorId:Lr(e.owner_actor_id),observedState:po(e.observed_state),reconciliationStatus:String(e.reconciliation_status),nextRunAt:Lr(e.next_run_at),lastScheduledFor:Lr(e.last_scheduled_for),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Cd(e){return{id:String(e.id),jobId:String(e.job_id),operationId:Lr(e.operation_id),trigger:String(e.trigger),scheduledFor:String(e.scheduled_for),idempotencyKey:String(e.idempotency_key),status:String(e.status),attempt:Number(e.attempt),startedAt:Lr(e.started_at),finishedAt:Lr(e.finished_at),output:po(e.output),error:Lr(e.error),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Hp(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:Lr(e.environment_id),resourceId:Lr(e.resource_id),name:String(e.name),provider:String(e.provider),queue:String(e.queue),processes:Number(e.processes),timeoutSeconds:Number(e.timeout_seconds),restartPolicy:String(e.restart_policy),target:po(e.target),enabled:rv(e.enabled),origin:String(e.origin),sourceKey:Lr(e.source_key),ownerActorId:Lr(e.owner_actor_id),observedState:po(e.observed_state),reconciliationStatus:String(e.reconciliation_status),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Pa{controlPlane;options;constructor(e,t={}){this.controlPlane=e;this.options=t}now(){return this.options.now?.()??new Date}create(e){if(!e.name.trim())throw Error("Scheduled jobs require a name.");let t=Mt(e.expression,e.timezone,this.now(),1),r=crypto.randomUUID(),a=this.now().toISOString(),u=e.startsAt?new Date(e.startsAt).toISOString():void 0,f=e.endsAt?new Date(e.endsAt).toISOString():void 0;if(u&&f&&u>=f)throw Error("Schedule start must be before end.");let h=t.nextRuns.find((b)=>(!u||b>=u)&&(!f||b<=f));return this.controlPlane.database.run("INSERT INTO scheduled_jobs (id,organization_id,project_id,environment_id,resource_id,name,provider,expression,normalized_expression,timezone,starts_at,ends_at,flexible_minutes,target,payload_refs,missed_run_policy,overlap_policy,retry_policy,timeout_seconds,enabled,origin,source_key,owner_actor_id,observed_state,reconciliation_status,next_run_at,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[r,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.name.trim().slice(0,120),e.provider,e.expression,t.normalized,e.timezone,u??null,f??null,Oi(e.flexibleMinutes,0,0,1440),JSON.stringify(e.target),JSON.stringify(e.payloadRefs),e.missedRunPolicy,e.overlapPolicy,JSON.stringify({maxAttempts:Oi(e.retryPolicy.maxAttempts,3,1,20),backoffSeconds:Oi(e.retryPolicy.backoffSeconds,30,0,86400),deadLetterRef:e.retryPolicy.deadLetterRef}),Oi(e.timeoutSeconds,900,1,86400),e.enabled?1:0,e.origin,e.sourceKey??null,e.ownerActorId??null,JSON.stringify(e.observedState),e.reconciliationStatus,h??null,1,a,a]),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM scheduled_jobs WHERE id=?").get(e);return t?Ad(t):void 0}getBySource(e,t,r){let a=this.controlPlane.database.query("SELECT * FROM scheduled_jobs WHERE project_id=? AND environment_id IS ? AND source_key=?").get(e,t??null,r);return a?Ad(a):void 0}list(e,t={}){let r=["project_id=?"],a=[e];if(t.environmentId)r.push("environment_id=?"),a.push(t.environmentId);if(t.resourceIds?.length)r.push(`resource_id IN (${t.resourceIds.map(()=>"?").join(",")})`),a.push(...t.resourceIds);if(t.enabled!=null)r.push("enabled=?"),a.push(t.enabled?1:0);return this.controlPlane.database.query(`SELECT * FROM scheduled_jobs WHERE ${r.join(" AND ")} ORDER BY next_run_at IS NULL,next_run_at,name`).all(...a).map(Ad)}setEnabled(e,t){this.controlPlane.database.run("UPDATE scheduled_jobs SET enabled=?,version=version+1,updated_at=? WHERE id=?",[t?1:0,this.now().toISOString(),e]);let r=this.get(e);if(!r)throw Error("Scheduled job was not found.");return r}updateSchedule(e,t){let r=this.get(e);if(!r)throw Error("Scheduled job was not found.");let a=t.expression??r.expression,u=t.timezone??r.timezone,f=Mt(a,u,this.now(),1),h=this.now().toISOString();return this.controlPlane.database.run("UPDATE scheduled_jobs SET expression=?,normalized_expression=?,timezone=?,missed_run_policy=?,overlap_policy=?,timeout_seconds=?,next_run_at=?,reconciliation_status=?,version=version+1,updated_at=? WHERE id=?",[a,f.normalized,u,t.missedRunPolicy??r.missedRunPolicy,t.overlapPolicy??r.overlapPolicy,Oi(t.timeoutSeconds,r.timeoutSeconds,1,86400),f.nextRuns[0],"pending",h,e]),this.get(e)}remove(e){let t=this.get(e);if(!t)throw Error("Scheduled job was not found.");if(t.origin==="config")throw Error("Config-defined jobs must be removed from configuration, not destructively deleted.");this.controlPlane.database.run("DELETE FROM scheduled_jobs WHERE id=?",[e])}markScheduled(e,t,r){this.controlPlane.database.run("UPDATE scheduled_jobs SET last_scheduled_for=?,next_run_at=?,updated_at=? WHERE id=?",[t,r??null,this.now().toISOString(),e])}reconcile(e,t,r){return this.controlPlane.database.run("UPDATE scheduled_jobs SET reconciliation_status=?,observed_state=?,updated_at=? WHERE id=?",[t,JSON.stringify(r),this.now().toISOString(),e]),this.get(e)}upsertConfigJob(e){let t=this.getBySource(e.projectId,e.environmentId,e.sourceKey);if(!t)return this.create(e);let r=Mt(e.expression,e.timezone,this.now(),1),a=this.now().toISOString();if(t.resourceId===e.resourceId&&t.name===e.name&&t.provider===e.provider&&t.expression===e.expression&&t.normalizedExpression===r.normalized&&t.timezone===e.timezone&&JSON.stringify(t.target)===JSON.stringify(e.target)&&JSON.stringify(t.payloadRefs)===JSON.stringify(e.payloadRefs)&&t.missedRunPolicy===e.missedRunPolicy&&t.overlapPolicy===e.overlapPolicy&&JSON.stringify(t.retryPolicy)===JSON.stringify(e.retryPolicy)&&t.timeoutSeconds===e.timeoutSeconds&&t.enabled===e.enabled)return t;return this.controlPlane.database.run("UPDATE scheduled_jobs SET resource_id=?,name=?,provider=?,expression=?,normalized_expression=?,timezone=?,target=?,payload_refs=?,missed_run_policy=?,overlap_policy=?,retry_policy=?,timeout_seconds=?,enabled=?,observed_state=?,reconciliation_status=?,next_run_at=COALESCE(next_run_at,?),version=version+1,updated_at=? WHERE id=?",[e.resourceId??null,e.name,e.provider,e.expression,r.normalized,e.timezone,JSON.stringify(e.target),JSON.stringify(e.payloadRefs),e.missedRunPolicy,e.overlapPolicy,JSON.stringify(e.retryPolicy),e.timeoutSeconds,e.enabled?1:0,JSON.stringify(e.observedState),e.reconciliationStatus,r.nextRuns[0],a,t.id]),this.get(t.id)}due(e=this.now().toISOString()){return this.controlPlane.database.query("SELECT * FROM scheduled_jobs WHERE enabled=1 AND next_run_at IS NOT NULL AND next_run_at<=? AND (starts_at IS NULL OR starts_at<=?) AND (ends_at IS NULL OR ends_at>=?) ORDER BY next_run_at LIMIT 200").all(e,e,e).map(Ad)}createExecution(e){let t=this.controlPlane.database.query("SELECT * FROM job_executions WHERE idempotency_key=?").get(e.idempotencyKey);if(t)return Cd(t);let r=crypto.randomUUID(),a=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO job_executions (id,job_id,operation_id,trigger,scheduled_for,idempotency_key,status,attempt,output,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?)",[r,e.jobId,e.operationId??null,e.trigger,e.scheduledFor,e.idempotencyKey,e.status,0,JSON.stringify(e.output),a,a]),this.getExecution(r)}getExecution(e){let t=this.controlPlane.database.query("SELECT * FROM job_executions WHERE id=?").get(e);return t?Cd(t):void 0}listExecutions(e,t=100){return this.controlPlane.database.query("SELECT * FROM job_executions WHERE job_id=? ORDER BY scheduled_for DESC,created_at DESC LIMIT ?").all(e,Math.min(1000,Math.max(1,t))).map(Cd)}activeExecution(e){let t=this.controlPlane.database.query("SELECT * FROM job_executions WHERE job_id=? AND status IN ('queued','running') ORDER BY created_at DESC LIMIT 1").get(e);return t?Cd(t):void 0}attachOperation(e,t){return this.controlPlane.database.run("UPDATE job_executions SET operation_id=?,updated_at=? WHERE id=?",[t,this.now().toISOString(),e]),this.getExecution(e)}transitionExecution(e,t,r={}){let a=this.now().toISOString(),u=t==="running"?a:null,f=["succeeded","failed","skipped","dead"].includes(t)?a:null;return this.controlPlane.database.run("UPDATE job_executions SET status=?,attempt=COALESCE(?,attempt),started_at=COALESCE(started_at,?),finished_at=?,output=COALESCE(?,output),error=?,updated_at=? WHERE id=?",[t,r.attempt??null,u,f,r.output?JSON.stringify(r.output):null,r.error?.slice(0,2000)??null,a,e]),this.getExecution(e)}upsertWorker(e){let t=e.sourceKey?this.controlPlane.database.query("SELECT * FROM worker_definitions WHERE project_id=? AND source_key=? AND environment_id IS ?").get(e.projectId,e.sourceKey,e.environmentId??null):void 0,r=t?Hp(t):void 0,a=r?.id??crypto.randomUUID(),u=this.now().toISOString(),f=Oi(e.processes,1,0,1000),h=Oi(e.timeoutSeconds,60,1,86400);if(r&&r.resourceId===e.resourceId&&r.name===e.name.slice(0,120)&&r.provider===e.provider&&r.queue===e.queue.slice(0,200)&&r.processes===f&&r.timeoutSeconds===h&&r.restartPolicy===e.restartPolicy&&JSON.stringify(r.target)===JSON.stringify(e.target)&&r.enabled===e.enabled)return r;return this.controlPlane.database.run("INSERT INTO worker_definitions (id,organization_id,project_id,environment_id,resource_id,name,provider,queue,processes,timeout_seconds,restart_policy,target,enabled,origin,source_key,owner_actor_id,observed_state,reconciliation_status,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET name=excluded.name,resource_id=excluded.resource_id,provider=excluded.provider,queue=excluded.queue,processes=excluded.processes,timeout_seconds=excluded.timeout_seconds,restart_policy=excluded.restart_policy,target=excluded.target,enabled=excluded.enabled,observed_state=excluded.observed_state,reconciliation_status=excluded.reconciliation_status,version=worker_definitions.version+1,updated_at=excluded.updated_at",[a,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.name.slice(0,120),e.provider,e.queue.slice(0,200),f,h,e.restartPolicy,JSON.stringify(e.target),e.enabled?1:0,e.origin,e.sourceKey??null,e.ownerActorId??null,JSON.stringify(e.observedState),e.reconciliationStatus,1,r?.createdAt??u,u]),this.getWorker(a)}getWorker(e){let t=this.controlPlane.database.query("SELECT * FROM worker_definitions WHERE id=?").get(e);return t?Hp(t):void 0}listWorkers(e,t){return this.controlPlane.database.query(`SELECT * FROM worker_definitions WHERE project_id=?${t?" AND environment_id=?":""} ORDER BY name`).all(e,...t?[t]:[]).map(Hp)}setWorkerProcesses(e,t){this.controlPlane.database.run("UPDATE worker_definitions SET processes=?,reconciliation_status='pending',version=version+1,updated_at=? WHERE id=?",[Oi(t,1,0,1000),this.now().toISOString(),e]);let r=this.getWorker(e);if(!r)throw Error("Worker was not found.");return r}reconcileWorker(e,t,r){this.controlPlane.database.run("UPDATE worker_definitions SET reconciliation_status=?,observed_state=?,updated_at=? WHERE id=?",[t,JSON.stringify(r),this.now().toISOString(),e]);let a=this.getWorker(e);if(!a)throw Error("Worker was not found.");return a}}var Fr=(e,t="none",r=!1)=>({supported:!0,downtime:t,destructive:r,explanation:e}),$r=(e)=>({supported:!1,downtime:"none",destructive:!1,explanation:e});function Tn(e,t){let r=["aws_rds","aws_aurora","aws_elasticache"].includes(t),a=["server","container"].includes(t),u=["postgres","mysql","mariadb"].includes(e),f=e==="redis",h={};return h.create=t==="external"?$r("External services can be adopted as read-only inventory."):Fr(r?"Provision through the provider API.":"Provision through the owning runtime driver.","possible"),h.observe=t==="external"?$r("External observation requires a configured provider adapter."):Fr("Provider/runtime health and endpoint metadata are observable."),h.connect=Fr("Connection guidance uses secret references and never returns a password by default."),h.backup=u&&(r||a)?Fr(r?"Create a provider snapshot.":"Create a consistent engine-native dump.","possible"):$r("This cache path is not a durable backup source."),h.restore=r&&u?Fr("Restore creates a reviewed provider target.","required",!0):$r("Restore requires a configured provider restore runner."),h.restart=t==="external"?$r("External restart requires a configured provider adapter."):Fr(r?"Provider restart/failover semantics apply.":"Restart the owning service unit.","required"),h.resize=t==="aws_elasticache"?$r("ElastiCache resizing requires a replication-group migration runner."):r?Fr("Provider plan/storage modification may enter a maintenance window.","possible"):a?Fr("Edit host/container resources and reconcile.","required"):$r("External resize requires a configured provider adapter."),h.version=a?$r("Runtime version upgrades require an explicit image migration runner."):r&&t!=="aws_elasticache"?Fr(u?"Major versions require compatibility preflight and backup.":"Engine upgrades require a maintenance window.","required"):$r("External upgrades require a configured provider adapter."),h.rotate=t==="aws_elasticache"||t==="external"||a&&!u&&!f?$r("Credential rotation is not available for this provider/engine path."):Fr("Rotate through the secret backend, update the engine, then flag dependent releases."),h.expose=a?$r("Direct container publishing is refused; use a reviewed firewall and proxy policy."):t==="aws_rds"?Fr("Exposure is reconciled through security groups; public access defaults off."):$r("Exposure changes require a provider-specific network runner."),h.delete=t==="external"?$r("External deletion requires a configured provider adapter."):Fr(r?"Final snapshot is supported where the provider allows it.":"A final engine backup is required unless explicitly retained.","required",!0),h.logs=a?Fr("Read bounded service logs from the runtime."):$r("Provider log export is not configured for this adapter."),h.slow_queries=a&&u?Fr("Read bounded runtime logs after engine slow-query logging is enabled."):$r("A slow-query log runner is not configured for this provider."),h.users=a&&u?Fr("Logical users can be listed; creation requires a referenced secondary credential."):$r("User management requires an engine connection runner."),h.databases=a&&u?Fr("Logical databases can be listed, created, and confirmation-gated for deletion."):$r("Logical database management requires an engine connection runner."),{actions:h,endpointTypes:r?["internal","external","tunnel"]:["internal","tunnel"],metrics:f?["connections","memory","evictions","hit_rate","latency"]:["connections","cpu","storage","read_latency","write_latency","iops"]}}var is=(e)=>e==null?void 0:String(e),_d=(e)=>Number(e)===1,Pd=(e)=>{try{return JSON.parse(String(e))}catch{return{}}};function nv(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:is(e.environment_id),resourceId:is(e.resource_id),name:String(e.name),engine:String(e.engine),provider:String(e.provider),placement:String(e.placement),engineVersion:is(e.engine_version),plan:String(e.plan),storageGb:e.storage_gb==null?void 0:Number(e.storage_gb),highAvailability:_d(e.high_availability),publicExposure:_d(e.public_exposure),allowedCidrs:Pd(e.allowed_cidrs),desiredState:Pd(e.desired_state),observedState:Pd(e.observed_state),capabilities:Pd(e.capabilities),credentialRef:is(e.credential_ref),status:String(e.status),origin:String(e.origin),managementEnabled:_d(e.management_enabled),ownerActorId:is(e.owner_actor_id),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class ka{controlPlane;now;constructor(e,t=()=>new Date){this.controlPlane=e;this.now=t}create(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Data service names must be 2-63 lowercase letters, numbers, or dashes.");if(e.publicExposure&&(!e.allowedCidrs.length||e.allowedCidrs.includes("0.0.0.0/0")))throw Error("Public exposure requires explicit narrow CIDRs; 0.0.0.0/0 is refused.");let t=crypto.randomUUID(),r=this.now().toISOString(),a=Tn(e.engine,e.provider);return this.controlPlane.database.run("INSERT INTO data_services (id,organization_id,project_id,environment_id,resource_id,name,engine,provider,placement,engine_version,plan,storage_gb,high_availability,public_exposure,allowed_cidrs,desired_state,observed_state,capabilities,credential_ref,status,origin,management_enabled,owner_actor_id,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.name,e.engine,e.provider,e.placement,e.engineVersion??null,e.plan,e.storageGb??null,e.highAvailability?1:0,e.publicExposure?1:0,JSON.stringify(e.allowedCidrs),JSON.stringify(e.desiredState),JSON.stringify(e.observedState),JSON.stringify(a),e.credentialRef??null,e.status,e.origin,e.managementEnabled?1:0,e.ownerActorId??null,1,r,r]),this.get(t)}get(e){let t=this.controlPlane.database.query("SELECT * FROM data_services WHERE id=?").get(e);return t?nv(t):void 0}list(e,t){return this.controlPlane.database.query(`SELECT * FROM data_services WHERE project_id=?${t?" AND environment_id=?":""} ORDER BY name`).all(e,...t?[t]:[]).map(nv)}update(e,t,r){let a=this.get(e);if(!a)throw Error("Data service was not found.");if(a.version!==t)throw Error("Data service changed; refresh before retrying.");let u={...a,...r};if(u.publicExposure&&(!u.allowedCidrs.length||u.allowedCidrs.includes("0.0.0.0/0")))throw Error("Public exposure requires explicit narrow CIDRs; 0.0.0.0/0 is refused.");if(this.controlPlane.database.run("UPDATE data_services SET plan=?,storage_gb=?,engine_version=?,high_availability=?,public_exposure=?,allowed_cidrs=?,desired_state=?,observed_state=?,status=?,management_enabled=?,credential_ref=?,version=version+1,updated_at=? WHERE id=? AND version=?",[u.plan,u.storageGb??null,u.engineVersion??null,u.highAvailability?1:0,u.publicExposure?1:0,JSON.stringify(u.allowedCidrs),JSON.stringify(u.desiredState),JSON.stringify(u.observedState),u.status,u.managementEnabled?1:0,u.credentialRef??null,this.now().toISOString(),e,t]).changes!==1)throw Error("Data service changed; refresh before retrying.");return this.get(e)}credential(e){let t=this.controlPlane.database.query("SELECT * FROM data_service_credentials WHERE service_id=? ORDER BY version DESC LIMIT 1").get(e);return t?{id:String(t.id),serviceId:String(t.service_id),username:String(t.username),secretRef:String(t.secret_ref),version:Number(t.version),createdAt:String(t.created_at),rotatedAt:is(t.rotated_at)}:void 0}saveCredential(e,t,r){let a=this.credential(e),u=a?.id??crypto.randomUUID(),f=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO data_service_credentials (id,service_id,username,secret_ref,version,created_at,rotated_at) VALUES (?,?,?,?,?,?,?) ON CONFLICT(service_id,username) DO UPDATE SET secret_ref=excluded.secret_ref,version=data_service_credentials.version+1,rotated_at=excluded.rotated_at",[u,e,t,r,a?.version??1,a?.createdAt??f,a?f:null]),this.credential(e)}addDependency(e){let t=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO data_service_dependencies (service_id,resource_id,secret_ref,requires_redeploy,created_at) VALUES (?,?,?,?,?) ON CONFLICT(service_id,resource_id) DO UPDATE SET secret_ref=excluded.secret_ref,requires_redeploy=excluded.requires_redeploy",[e.serviceId,e.resourceId,e.secretRef,e.requiresRedeploy?1:0,t]),{...e,createdAt:t}}dependencies(e){return this.controlPlane.database.query("SELECT * FROM data_service_dependencies WHERE service_id=? ORDER BY resource_id").all(e).map((t)=>({serviceId:String(t.service_id),resourceId:String(t.resource_id),secretRef:String(t.secret_ref),requiresRedeploy:_d(t.requires_redeploy),createdAt:String(t.created_at)}))}removeDependency(e,t){return this.controlPlane.database.run("DELETE FROM data_service_dependencies WHERE service_id=? AND resource_id=?",[e,t]).changes===1}remove(e){this.controlPlane.database.run("DELETE FROM data_services WHERE id=?",[e])}}function iv(){let t=crypto.getRandomValues(new Uint8Array(40));return Array.from(t,(r)=>"ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*_-+="[r%69]).join("")}function Mu(e,t){return t.map((r)=>{let a=r.type==="tunnel"?"127.0.0.1":r.host,u=e.engine==="redis"?`redis-cli -h ${a} -p ${r.port}${r.tls?" --tls":""}`:e.engine==="postgres"?`psql "host=${a} port=${r.port} dbname=${r.database??"postgres"} sslmode=${r.tls?"require":"disable"}"`:e.engine==="mongodb"?`mongosh "mongodb://${a}:${r.port}/${r.database??"admin"}${r.tls?"?tls=true":""}"`:e.engine==="libsql"?`turso db shell ${r.tls?"https":"http"}://${a}:${r.port}`:`mysql --host=${a} --port=${r.port} --database=${r.database??"mysql"} --ssl-mode=${r.tls?"REQUIRED":"DISABLED"}`;return{type:r.type,command:u,secretRef:e.credentialRef}})}class ys{store;queue;secrets;constructor(e,t,r){this.store=e;this.queue=t;this.secrets=r}async create(e){let t,r;if(e.provider!=="aws_elasticache"){let a=e.username??"app",u=iv();r=`secret://data-services/${e.projectId}/${e.name}/${a}`,await this.secrets.put(r,u),t={username:a,password:u,secretRef:r}}try{let a=this.store.create({...e,credentialRef:r,status:"planning"});if(t)this.store.saveCredential(a.id,t.username,t.secretRef);let u=this.enqueue(a,"create",{});return{service:a,credential:t,operationId:u}}catch(a){if(r)await this.secrets.remove(r);throw a}}plan(e,t,r={}){let a=e.capabilities.actions[t],u=t==="version"&&String(r.engineVersion??"").split(".")[0]!==String(e.engineVersion??"").split(".")[0];return{service:e,action:t,capability:a,changes:r,preflight:{backupRequired:["delete","restore"].includes(t)||u,compatibilityRequired:u,typedConfirmation:a.destructive?e.name:void 0,retentionChoiceRequired:t==="delete"},warnings:[...a.downtime!=="none"?[`Downtime is ${a.downtime}.`]:[],...e.origin==="adopted"&&!e.managementEnabled?["Adopted resource is read-only until management is explicitly enabled."]:[]]}}enqueue(e,t,r,a){let u=this.plan(e,t,r);if(!u.capability.supported)throw Error(u.capability.explanation);if(e.origin==="adopted"&&!e.managementEnabled&&t!=="observe")throw Error("Adopted resources remain read-only until management is explicitly enabled.");if(u.preflight.typedConfirmation&&r.confirm!==u.preflight.typedConfirmation)throw Error(`Type ${u.preflight.typedConfirmation} to confirm ${t}.`);if(u.preflight.retentionChoiceRequired&&!["final_backup","retain"].includes(String(r.retention??"")))throw Error("Deletion requires retention final_backup or retain.");if(u.preflight.compatibilityRequired&&(r.compatibilityReviewed!==!0||!r.backupId))throw Error("Major version changes require compatibilityReviewed=true and a backupId.");if(t==="restore"){let f=String(r.backupId??""),h=String(r.targetId??"");if(!f||!h)throw Error("Restore requires both backupId and targetId.");if(h===e.placement)throw Error("Restore targetId must differ from the source placement.");if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(h))throw Error("Restore targetId must be 2-63 lowercase letters, numbers, or dashes.")}return this.queue.enqueue({projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:a,kind:"data_service.action",input:{serviceId:e.id,action:t,...r},lockKey:`data-service:${e.id}`,providerKey:e.provider,maxAttempts:3,timeoutSeconds:7200,retryClasses:["provider_transient"],resumePolicy:"requeue"}).operation.id}async rotate(e,t,r){let a=this.store.credential(e.id);if(!a)throw Error("Data service credential metadata was not found.");let u=iv(),f=`${a.secretRef}/v${a.version+1}`;await this.secrets.put(f,u);try{return await t.action(e,"rotate",{username:a.username,secretRef:f},u,r),this.store.saveCredential(e.id,a.username,f),this.store.update(e.id,e.version,{credentialRef:f}),{credential:{username:a.username,password:u,secretRef:f},dependencies:this.store.dependencies(e.id).filter((h)=>h.requiresRedeploy).map((h)=>h.resourceId)}}catch(h){throw await this.secrets.remove(f),h}}}function Fu(e){return{"data_service.action":async(t)=>{let r=t.operation.input,a=e.store.get(String(r.serviceId??"")),u=String(r.action??"");if(!a)throw Error("Data service was not found.");let f=e.resolveAdapter(a);if(!f||f.provider!==a.provider||!f.engines.includes(a.engine))throw Error(`No ${a.provider}/${a.engine} adapter is configured.`);if(u==="rotate"){let b=await new ys(e.store,new c(e.store.controlPlane),e.secrets).rotate(a,f,t);return{serviceId:a.id,action:u,username:b.credential.username,secretRef:b.credential.secretRef,dependencies:b.dependencies}}let h=a.credentialRef?await e.secrets.resolve(a.credentialRef):void 0;try{let b=u==="observe"?await f.observe(a):u==="create"?await f.apply(a,h,t):await f.action(a,u,r,h,t),S=e.store.get(a.id);return e.store.update(a.id,S.version,{observedState:b,status:u==="delete"?r.retention==="retain"?"retained":"deleting":"available"}),{serviceId:a.id,action:u,observed:b}}catch(b){let S=e.store.get(a.id);if(e.store.update(a.id,S.version,{status:"failed",observedState:{...S.observedState,error:b instanceof Error?b.message:String(b)}}),/temporar|timeout|unavailable|throttl/i.test(b instanceof Error?b.message:String(b)))throw new ae(b instanceof Error?b.message:String(b),"provider_transient");throw b}}}}class os{transport;constructor(e){this.transport=e}observe(e){return this.transport.observe(e.placement)}apply(e,t){return this.transport.apply({id:e.placement,name:e.name,engine:e.engine,engineVersion:e.engineVersion??null,plan:e.plan,storageGb:e.storageGb??null,highAvailability:e.highAvailability,publicExposure:e.publicExposure,allowedCidrs:e.allowedCidrs,username:e.desiredState.username??"app",desiredState:e.desiredState},t)}action(e,t,r,a,u){return this.transport.execute(e.placement,t,{engine:e.engine,engineVersion:e.engineVersion??null,plan:e.plan,desiredState:e.desiredState,...r},a,u)}}class Na extends os{provider="aws_rds";engines=["postgres","mysql","mariadb"]}class Ba extends os{provider="aws_aurora";engines=["postgres","mysql"]}class xa extends os{provider="aws_elasticache";engines=["redis"]}class Oa extends os{provider="server";engines=["postgres","mysql","mariadb","redis","mongodb","libsql"]}class _a extends os{provider="container";engines=["postgres","mysql","mariadb","redis","mongodb","libsql"]}var $d=(e,t)=>{let r=e.desiredState;return e[t]??(r&&typeof r==="object"&&!Array.isArray(r)?r[t]:void 0)},Jt=(e,t,r)=>{let a=$d(e,t);return a==null?r:String(a)},nn=(e,t)=>{let r=$d(e,t);return r==null?void 0:Number(r)},$i=(e,t)=>{let r=$d(e,t);return r==null?void 0:r===!0||r==="true"},ss=(e,t)=>{let r=$d(e,t);return Array.isArray(r)?r.map(String):[]},Od=(e,t)=>Jt(t,"snapshotId")??`${e}-final-${new Date().toISOString().replace(/[^0-9]/g,"").slice(0,14)}`;function xd(e){if(!e)throw Error("RDS instance was not found.");return{providerId:e.DBInstanceIdentifier??null,status:e.DBInstanceStatus??"unknown",engine:e.Engine??null,engineVersion:e.EngineVersion??null,plan:e.DBInstanceClass??null,storageGb:e.AllocatedStorage??null,highAvailability:e.MultiAZ??!1,publicExposure:e.PubliclyAccessible??!1,endpoint:e.Endpoint?.Address??null,port:e.Endpoint?.Port??null,username:e.MasterUsername??null,database:e.DBName??null,encrypted:e.StorageEncrypted??!1}}class La{client;constructor(e=new ne){this.client=e}async observe(e){return xd(await this.client.describeDBInstance(e))}async apply(e,t){let r=String(e.id),a=await this.client.createDBInstance({DBInstanceIdentifier:r,DBInstanceClass:String(e.plan),Engine:String(e.engine),MasterUsername:Jt(e,"username","app"),MasterUserPassword:t,DBName:Jt(e,"database"),AllocatedStorage:nn(e,"storageGb"),VpcSecurityGroupIds:ss(e,"securityGroupIds"),DBSubnetGroupName:Jt(e,"subnetGroup"),BackupRetentionPeriod:nn(e,"backupRetentionDays")??7,MultiAZ:$i(e,"highAvailability"),EngineVersion:Jt(e,"engineVersion"),PubliclyAccessible:$i(e,"publicExposure")??!1,StorageType:Jt(e,"storageType","gp3"),StorageEncrypted:!0,KmsKeyId:Jt(e,"kmsKeyId"),DeletionProtection:!0,Tags:[{Key:"managed-by",Value:"ts-cloud"}]});return xd(a.DBInstance)}async execute(e,t,r,a,u){if(t==="observe")return this.observe(e);if(t==="restart")return await this.client.rebootDBInstance({DBInstanceIdentifier:e}),{status:"rebooting"};if(t==="backup"){let f=Od(e,r);return await this.client.createDBSnapshot({DBInstanceIdentifier:e,DBSnapshotIdentifier:f}),{status:"snapshotting",snapshotId:f}}if(t==="restore"){let f=String(r.targetId),h=await this.client.restoreDBInstanceFromDBSnapshot({DBInstanceIdentifier:f,DBSnapshotIdentifier:String(r.backupId),DBInstanceClass:Jt(r,"plan"),DBSubnetGroupName:Jt(r,"subnetGroup"),MultiAZ:$i(r,"highAvailability"),PubliclyAccessible:!1,StorageType:Jt(r,"storageType"),VpcSecurityGroupIds:ss(r,"securityGroupIds"),DeletionProtection:!0,Tags:[{Key:"managed-by",Value:"ts-cloud"}]});return{...xd(h.DBInstance),sourceId:e,restoreTargetId:f}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};let f=Od(e,r);return await this.client.modifyDBInstance({DBInstanceIdentifier:e,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBInstance({DBInstanceIdentifier:e,SkipFinalSnapshot:!1,FinalDBSnapshotIdentifier:f,DeleteAutomatedBackups:!1}),{status:"deleting",finalSnapshotId:f}}if(["resize","version","rotate","expose"].includes(t)){let f=await this.client.modifyDBInstance({DBInstanceIdentifier:e,DBInstanceClass:Jt(r,"plan"),AllocatedStorage:nn(r,"storageGb"),MasterUserPassword:t==="rotate"?a:void 0,EngineVersion:Jt(r,"engineVersion"),MultiAZ:$i(r,"highAvailability"),PubliclyAccessible:$i(r,"publicExposure"),VpcSecurityGroupIds:ss(r,"securityGroupIds"),ApplyImmediately:$i(r,"applyImmediately")??!0});return xd(f.DBInstance)}throw Error(`RDS action ${t} requires an engine connection runner.`)}}function Kp(e){if(!e)throw Error("Aurora cluster was not found.");return{providerId:e.DBClusterIdentifier??null,status:e.Status??"unknown",engine:e.Engine??null,engineVersion:e.EngineVersion??null,endpoint:e.Endpoint??null,readerEndpoint:e.ReaderEndpoint??null,port:e.Port??null,username:e.MasterUsername??null,database:e.DatabaseName??null,encrypted:e.StorageEncrypted??!1,highAvailability:e.MultiAZ??!0}}class $a{client;constructor(e=new ne){this.client=e}async observe(e){let t=await this.client.describeDBClusters({DBClusterIdentifier:e});return Kp(t.DBClusters?.[0])}async apply(e,t){let r=String(e.id),a=String(e.engine)==="postgres"?"aurora-postgresql":"aurora-mysql";return await this.client.createDBCluster({DBClusterIdentifier:r,Engine:a,EngineVersion:Jt(e,"engineVersion"),MasterUsername:Jt(e,"username","app"),MasterUserPassword:t,DatabaseName:Jt(e,"database"),DBSubnetGroupName:Jt(e,"subnetGroup"),VpcSecurityGroupIds:ss(e,"securityGroupIds"),BackupRetentionPeriod:nn(e,"backupRetentionDays")??7,StorageEncrypted:!0,KmsKeyId:Jt(e,"kmsKeyId"),DeletionProtection:!0,ServerlessV2ScalingConfiguration:{MinCapacity:nn(e,"minCapacity")??0.5,MaxCapacity:nn(e,"maxCapacity")??4}}),await this.client.createDBInstance({DBInstanceIdentifier:`${r}-writer-1`,DBClusterIdentifier:r,DBInstanceClass:String(e.plan||"db.serverless"),Engine:a,PubliclyAccessible:$i(e,"publicExposure")??!1}),{status:"creating",providerId:r}}async execute(e,t,r,a){if(t==="observe")return this.observe(e);if(t==="restart")return await this.client.rebootDBCluster(e),{status:"rebooting"};if(t==="backup"){let u=Od(e,r);return await this.client.createDBClusterSnapshot(e,u),{status:"snapshotting",snapshotId:u}}if(t==="restore"){let u=String(r.targetId),f=String(r.engine)==="postgres"?"aurora-postgresql":"aurora-mysql",h=await this.client.restoreDBClusterFromSnapshot({DBClusterIdentifier:u,SnapshotIdentifier:String(r.backupId),Engine:f,EngineVersion:Jt(r,"engineVersion"),DBSubnetGroupName:Jt(r,"subnetGroup"),VpcSecurityGroupIds:ss(r,"securityGroupIds"),DeletionProtection:!0,ServerlessV2ScalingConfiguration:{MinCapacity:nn(r,"minCapacity")??0.5,MaxCapacity:nn(r,"maxCapacity")??4}});return await this.client.createDBInstance({DBInstanceIdentifier:`${u}-writer-1`,DBClusterIdentifier:u,DBInstanceClass:Jt(r,"plan","db.serverless"),Engine:f,PubliclyAccessible:!1}),{...Kp(h.DBCluster),sourceId:e,restoreTargetId:u}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};let u=Od(e,r);return await this.client.modifyDBCluster({DBClusterIdentifier:e,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBCluster(e,u),{status:"deleting",finalSnapshotId:u}}if(["resize","version","rotate"].includes(t)){let u=await this.client.modifyDBCluster({DBClusterIdentifier:e,ServerlessV2ScalingConfiguration:nn(r,"minCapacity")==null&&nn(r,"maxCapacity")==null?void 0:{MinCapacity:nn(r,"minCapacity")??0.5,MaxCapacity:nn(r,"maxCapacity")??4},EngineVersion:Jt(r,"engineVersion"),MasterUserPassword:t==="rotate"?a:void 0,ApplyImmediately:$i(r,"applyImmediately")??!0});return Kp(u.DBCluster)}throw Error(`Aurora action ${t} requires an engine connection runner.`)}}class Ma{client;constructor(e=new ut){this.client=e}async observe(e){let t=(await this.client.describeCacheClusters(e)).CacheClusters[0];if(!t)throw Error("ElastiCache cluster was not found.");let r=t.CacheNodes?.[0]?.Endpoint;return{providerId:t.CacheClusterId,status:t.CacheClusterStatus,engine:t.Engine,engineVersion:t.EngineVersion,plan:t.CacheNodeType,nodes:t.NumCacheNodes,endpoint:r?.Address??null,port:r?.Port??null}}async apply(e){let t=await this.client.createCacheCluster({cacheClusterId:String(e.id),engine:"redis",cacheNodeType:String(e.plan),numCacheNodes:nn(e,"nodes")??1,engineVersion:Jt(e,"engineVersion"),port:nn(e,"port"),securityGroupIds:ss(e,"securityGroupIds"),subnetGroupName:Jt(e,"subnetGroup"),tags:[{Key:"managed-by",Value:"ts-cloud"}]});return{providerId:t.CacheCluster.CacheClusterId,status:t.CacheCluster.CacheClusterStatus}}async execute(e,t,r){if(t==="observe")return this.observe(e);if(t==="restart"){let a=(await this.client.describeCacheClusters(e)).CacheClusters[0];return await this.client.rebootCacheCluster(e,a?.CacheNodes?.map((u)=>u.CacheNodeId)??["0001"]),{status:"rebooting"}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};return await this.client.deleteCacheCluster(e),{status:"deleting"}}throw Error(`ElastiCache action ${t} is not supported by this cluster mode.`)}}import{mkdir as HR,writeFile as KR}from"node:fs/promises";import{join as JR}from"node:path";async function ln(e,t,r=!1){let a=Bun.spawn(["docker",...e],{stdin:t==null?"ignore":"pipe",stdout:"pipe",stderr:"pipe"}),u=new Response(a.stdout).text(),f=new Response(a.stderr).text();if(t!=null)a.stdin.write(t),a.stdin.end();let[h,b,S]=await Promise.all([a.exited,u,f]);if(h!==0&&!r)throw Error(`Docker command failed (${h}): ${S.trim()||b.trim()}`);return{code:h,stdout:b,stderr:S}}class Uu{async ensureNetwork(e){if((await ln(["network","inspect",e],void 0,!0)).code!==0)await ln(["network","create","--internal",e])}async seedSecret(e,t){await ln(["volume","create",e]),await ln(["run","--rm","-i","-v",`${e}:/run/target`,"alpine:3.21","sh","-c","umask 077; cat > /run/target/credential"],t)}async removeVolume(e){await ln(["volume","rm",e],void 0,!0)}async inspect(e){let t=await ln(["inspect",e],void 0,!0);if(t.code!==0)return;return JSON.parse(t.stdout)[0]}async run(e){await ln(["run",...e])}async exec(e,t,r){return(await ln(["exec","-i",e,...t],r)).stdout}async update(e,t){await ln(["update",...t,e])}async restart(e){await ln(["restart",e])}async remove(e){await ln(["rm","--force",e],void 0,!0)}async logs(e,t){let r=await ln(["logs","--tail",String(Math.min(2000,Math.max(1,t))),e],void 0,!0);return`${r.stdout}${r.stderr}`.slice(-262144)}async stats(e){let t=await ln(["stats","--no-stream","--format","{{json .}}",e],void 0,!0);if(t.code!==0||!t.stdout.trim())return{};let r=JSON.parse(t.stdout.trim());return{cpuPercent:String(r.CPUPerc??""),memoryUsage:String(r.MemUsage??""),memoryPercent:String(r.MemPerc??""),networkIo:String(r.NetIO??""),blockIo:String(r.BlockIO??""),pids:Number(r.PIDs??0)}}}var GR={postgres:{image:"postgres:17-alpine",port:5432,dataPath:"/var/lib/postgresql/data"},mysql:{image:"mysql:8.4",port:3306,dataPath:"/var/lib/mysql"},mariadb:{image:"mariadb:11.7",port:3306,dataPath:"/var/lib/mysql"},redis:{image:"redis:7.4-alpine",port:6379,dataPath:"/data"},mongodb:{image:"mongo:8.0",port:27017,dataPath:"/data/db"}};function hi(e,t="app"){let r=String(e??t);if(!/^[A-Za-z_][A-Za-z0-9_]{0,62}$/.test(r))throw Error("Database identifiers must be letters, numbers, or underscores.");return r}function go(e){if(!/^[a-z0-9][a-z0-9_.-]{1,62}$/i.test(e))throw Error("Runtime placement must be a valid container identifier.");return`tscloud-data-${e.toLowerCase()}`}function QR(e,t){let r=e.desiredState;return e[t]??(r&&typeof r==="object"&&!Array.isArray(r)?r[t]:void 0)}function oa(e){return e.Config?.Labels??{}}class Sr{runtime;backupRoot;constructor(e=new Uu,t=l(process.cwd(),"backups","data")){this.runtime=e;this.backupRoot=t}async observe(e){let t=go(e),r=await this.runtime.inspect(t);if(!r)throw Error(`Data container ${t} was not found.`);let a=oa(r),u=await this.runtime.stats(t),f=r.NetworkSettings?.Ports??{},h=Object.values(f).flat().find(Boolean);return{providerId:t,status:r.State?.Status??"unknown",healthy:r.State?.Health?.Status??null,engine:a["ts-cloud.engine"]??null,engineVersion:a["ts-cloud.engine-version"]??null,username:a["ts-cloud.username"]??null,database:a["ts-cloud.database"]??null,endpoint:h?.HostIp||"127.0.0.1",port:h?.HostPort?Number(h.HostPort):null,image:r.Config?.Image??null,startedAt:r.State?.StartedAt??null,metrics:u}}async apply(e,t){let r=String(e.id),a=go(r),u=String(e.engine);if(u==="libsql")throw Error("libSQL requires an explicitly configured runtime image.");let f=GR[u];if(!f)throw Error(`Unsupported runtime data engine ${u}.`);if(!t)throw Error(`${u} requires a managed credential.`);if(e.publicExposure===!0)throw Error("Container public exposure requires an external reviewed firewall policy; direct publishing is refused.");let h=hi(e.username),b=hi(QR(e,"database")),S=`${a}-secret`,y=`${a}-data`,k=u==="redis"?`appendonly yes
128
128
  protected-mode yes
129
129
  requirepass ${t.replaceAll("\\","\\\\").replaceAll(`
130
130
  `,"")}
@@ -138,7 +138,7 @@ requirepass ${t.replaceAll("\\","\\\\").replaceAll(`
138
138
  protected-mode yes
139
139
  requirepass ${a.replaceAll("\\","\\\\").replaceAll(`
140
140
  `,"")}
141
- `:a;if(await this.runtime.seedSecret(`${u}-secret`,k),b==="redis")await this.runtime.restart(u);return{status:b==="redis"?"restarting":"running",username:S}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};let f=await this.backup(e,r);return await this.runtime.remove(u),await this.runtime.removeVolume(`${u}-secret`),await this.runtime.removeVolume(`${u}-data`),{status:"deleted",finalBackupId:f.backupId??null,backupPath:f.path??null}}if(t==="expose")throw Error("Direct container exposure is refused; use a reviewed firewall and proxy policy.");throw Error(`${t} requires a configured engine lifecycle runner.`)}}import{createCipheriv as YR,createDecipheriv as ZR,createHash as ov,randomBytes as XR}from"node:crypto";class Fa{controlPlane;now;key;constructor(e,t,r=()=>new Date){this.controlPlane=e;this.now=r;if(!t)throw Error("Data-service encryption key is required.");this.key=ov("sha256").update(`ts-cloud:data-services:${t}`).digest()}encrypt(e){let t=XR(12),r=YR("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Encrypted data-service secret is unavailable.");try{let f=ZR("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}catch{throw Error("Encrypted data-service secret could not be decrypted.")}}async put(e,t){if(!/^secret:\/\/data-services\/[A-Za-z0-9._/-]+$/.test(e))throw Error("Invalid data-service secret reference.");if(!t)throw Error("Data-service secret cannot be empty.");let r=this.now().toISOString();this.controlPlane.database.run("INSERT INTO data_service_secrets (reference,ciphertext,fingerprint,created_at,updated_at) VALUES (?,?,?,?,?) ON CONFLICT(reference) DO UPDATE SET ciphertext=excluded.ciphertext,fingerprint=excluded.fingerprint,updated_at=excluded.updated_at",[e,this.encrypt(t),ov("sha256").update(t).digest("hex"),r,r])}async resolve(e){let t=this.controlPlane.database.query("SELECT ciphertext FROM data_service_secrets WHERE reference = ?").get(e);if(!t)throw Error("Data-service secret was not found.");return this.decrypt(t.ciphertext)}async remove(e){this.controlPlane.database.run("DELETE FROM data_service_secrets WHERE reference = ?",[e])}}var eA=async(e)=>{let t=Bun.spawn(e,{stdout:"pipe",stderr:"pipe"}),[r,a,u]=await Promise.all([t.exited,new Response(t.stdout).text(),new Response(t.stderr).text()]);return{code:r,stdout:a,stderr:u}};class Qu{async scan(e,t){return pi(e,t)}async exec(e,t){if(e.trustState!=="pinned")throw Error("SSH host key must be pinned before remote execution.");return eA(["ssh","-p",String(e.sshPort),"-o","BatchMode=yes","-o","StrictHostKeyChecking=yes","-o","ConnectTimeout=10",`${e.sshUser}@${e.endpoint}`,t])}}var tA=yt,rA=`set -eu; printf '{'; printf '"os":"%s",' "$(. /etc/os-release 2>/dev/null; printf %s "\${PRETTY_NAME:-Linux}")"; printf '"arch":"%s",' "$(uname -m)"; printf '"cpuCores":%s,' "$(getconf _NPROCESSORS_ONLN)"; printf '"memoryBytes":%s,' "$(awk '/MemTotal/{print $2*1024}' /proc/meminfo)"; printf '"diskBytes":%s,' "$(df -B1 / | awk 'NR==2{print $2}')"; printf '"diskFreeBytes":%s,' "$(df -B1 / | awk 'NR==2{print $4}')"; printf '"dnsOk":'; getent hosts example.com >/dev/null && printf true || printf false; printf ',"timeSkewSeconds":0,"tools":{"curl":"'; command -v curl >/dev/null && printf installed; printf '","tar":"'; command -v tar >/dev/null && printf installed; printf '"},"privilege":"'; sudo -n true >/dev/null 2>&1 && printf sudo || printf user; printf '"}'`;class wn{provider;transport;discoverer;constructor(e,t=new Qu,r){this.provider=e;this.transport=t;this.discoverer=r}discover(e){return this.discoverer?.(e)??Promise.resolve([])}async test(e){try{let t=await this.transport.scan(e.endpoint,e.sshPort);return{reachable:!0,hostKeyAlgorithm:t.algorithm,hostKeyFingerprint:tA(t.key),latencyMs:0}}catch{return{reachable:!1,hostKeyAlgorithm:"unknown",hostKeyFingerprint:"",latencyMs:0}}}async validate(e){let t=await this.transport.exec(e,rA);if(t.code!==0)throw Error(`Fleet validation failed: ${t.stderr.trim()||t.code}`);try{return JSON.parse(t.stdout)}catch{throw Error("Fleet validation returned malformed facts.")}}async bootstrap(e,t){let r=await this.transport.exec(e,`sudo -n ts-cloud-agent bootstrap --version 1 --steps ${t.length}`);if(r.code!==0)throw Error(`Fleet bootstrap failed: ${r.stderr.trim()||r.code}`);return{version:"1"}}capabilities(){return{document:{supported:!0,reason:"fleet-capabilities/v1; sha256:driver-contract"},validate:{supported:!0},bootstrap:{supported:!0},heartbeat:{supported:!0},drain:{supported:!0},archive:{supported:!0},terminate:{supported:!1,reason:"Inventory removal never terminates provider infrastructure."}}}}function Hu(e,t){return{"fleet.bootstrap":async(r)=>{let a=r.operation.input&&typeof r.operation.input==="object"&&!Array.isArray(r.operation.input)?r.operation.input:{},u=e.get(String(a.serverId??""));if(!u)throw Error("Queued fleet server was not found.");let f=t.find((S)=>S.provider===u.provider);if(!f)throw Error(`No ${u.provider} fleet driver is configured.`);let h=Array.isArray(a.steps)?a.steps.map(String):[];if(r.checkpoint("preflight","Rechecking pinned trust and healthy validation."),u.trustState!=="pinned"||!u.validation?.valid)throw Error("Fleet bootstrap requires pinned trust and a healthy validation report.");r.checkpoint("bootstrap","Applying the reviewed idempotent bootstrap plan.");let b=await f.bootstrap(u,h);return e.update(u.id,{bootstrapVersion:b.version,status:"ready"}),r.checkpoint("verify","Bootstrap completed; heartbeat can now establish freshness."),{serverId:u.id,bootstrapVersion:b.version,steps:h.length}}}}var ti=(e)=>e==null?void 0:String(e),mo=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},Jp=(e)=>({id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),resourceId:String(e.resource_id),name:String(e.name),provider:String(e.provider),providerId:ti(e.provider_id),region:ti(e.region),zone:ti(e.zone),endpoint:String(e.endpoint),sshUser:String(e.ssh_user),sshPort:Number(e.ssh_port),credentialRef:String(e.credential_ref),hostKeyAlgorithm:ti(e.host_key_algorithm),hostKeyFingerprint:ti(e.host_key_fingerprint),pendingHostKey:ti(e.pending_host_key),roles:mo(e.roles,[]),labels:mo(e.labels,{}),taints:mo(e.taints,[]),capacity:mo(e.capacity,{}),usage:mo(e.usage,{}),capabilities:mo(e.capabilities,{}),status:String(e.status),trustState:String(e.trust_state),validation:mo(e.validation,void 0),bootstrapVersion:ti(e.bootstrap_version),heartbeatAt:ti(e.heartbeat_at),lastSeenAt:ti(e.last_seen_at),archivedAt:ti(e.archived_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)});class Ua{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}get(e){let t=this.control.database.query("SELECT * FROM fleet_servers WHERE id=?").get(e);return t?Jp(t):void 0}list(e,t=!1){return this.control.database.query("SELECT * FROM fleet_servers WHERE project_id=? ORDER BY name").all(e).map(Jp).filter((r)=>t||r.status!=="archived")}findProvider(e,t,r){let a=this.control.database.query("SELECT * FROM fleet_servers WHERE organization_id=? AND provider=? AND provider_id=? AND archived_at IS NULL").get(e,t,r);return a?Jp(a):void 0}create(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO fleet_servers (id,organization_id,project_id,resource_id,name,provider,provider_id,region,zone,endpoint,ssh_user,ssh_port,credential_ref,host_key_algorithm,host_key_fingerprint,pending_host_key,roles,labels,taints,capacity,usage,capabilities,status,trust_state,validation,bootstrap_version,heartbeat_at,last_seen_at,archived_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.resourceId,e.name,e.provider,e.providerId??null,e.region??null,e.zone??null,e.endpoint,e.sshUser,e.sshPort,e.credentialRef,e.hostKeyAlgorithm??null,e.hostKeyFingerprint??null,e.pendingHostKey??null,JSON.stringify(e.roles),JSON.stringify(e.labels),JSON.stringify(e.taints),JSON.stringify(e.capacity),JSON.stringify(e.usage),JSON.stringify(e.capabilities),e.status,e.trustState,JSON.stringify(e.validation??{}),e.bootstrapVersion??null,e.heartbeatAt??null,e.lastSeenAt??null,e.archivedAt??null,r,r]),this.get(t)}update(e,t){let r=this.get(e);if(!r)throw Error("Server was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE fleet_servers SET name=?,provider_id=?,region=?,zone=?,endpoint=?,ssh_user=?,ssh_port=?,credential_ref=?,host_key_algorithm=?,host_key_fingerprint=?,pending_host_key=?,roles=?,labels=?,taints=?,capacity=?,usage=?,capabilities=?,status=?,trust_state=?,validation=?,bootstrap_version=?,heartbeat_at=?,last_seen_at=?,archived_at=?,version=version+1,updated_at=? WHERE id=?",[a.name,a.providerId??null,a.region??null,a.zone??null,a.endpoint,a.sshUser,a.sshPort,a.credentialRef,a.hostKeyAlgorithm??null,a.hostKeyFingerprint??null,a.pendingHostKey??null,JSON.stringify(a.roles),JSON.stringify(a.labels),JSON.stringify(a.taints),JSON.stringify(a.capacity),JSON.stringify(a.usage),JSON.stringify(a.capabilities),a.status,a.trustState,JSON.stringify(a.validation??{}),a.bootstrapVersion??null,a.heartbeatAt??null,a.lastSeenAt??null,a.archivedAt??null,u,e]),this.get(e)}}var nA=/^(?:[A-Za-z0-9](?:[A-Za-z0-9.-]{0,251}[A-Za-z0-9])?|\[[0-9a-fA-F:]+\])$/;class Qa{store;drivers;now;queue;constructor(e,t,r,a=()=>new Date){this.store=e;this.drivers=t;this.now=a;this.queue=r??new c(e.control)}driver(e){let t=this.drivers.find((r)=>r.provider===e);if(!t)throw Error(`No ${e} fleet driver is configured.`);return t}enroll(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Server name is invalid.");if(!nA.test(e.endpoint)||e.sshUser==="root"||!e.credentialRef.startsWith("secret://"))throw Error("Enrollment requires a valid endpoint, non-root SSH user, and secret credential reference.");let t=e.providerId?this.store.findProvider(e.organizationId,e.provider,e.providerId):void 0;if(t)return this.store.update(t.id,{endpoint:e.endpoint,region:e.region,zone:e.zone});let r=this.store.control.createResource({projectId:e.projectId,kind:"server",slug:e.name,name:e.name,provider:e.provider,providerId:e.providerId}),a=this.driver(e.provider);return this.store.create({...e,resourceId:r.id,sshPort:e.sshPort??22,labels:e.labels??{},taints:[],capacity:{},usage:{},capabilities:a.capabilities(),status:"pending",trustState:"unverified"})}async test(e){let t=this.store.get(e);if(!t)throw Error("Server was not found.");let r=await this.driver(t.provider).test(t);if(!r.reachable)return this.store.update(e,{status:"unreachable"});if(t.hostKeyFingerprint&&t.hostKeyFingerprint!==r.hostKeyFingerprint)return this.store.update(e,{status:"degraded",trustState:"rotation_pending",pendingHostKey:r.hostKeyFingerprint});return this.store.update(e,{hostKeyAlgorithm:r.hostKeyAlgorithm,hostKeyFingerprint:r.hostKeyFingerprint,pendingHostKey:void 0,trustState:"pinned",status:"validating",lastSeenAt:this.now().toISOString()})}reviewHostKey(e,t){let r=this.store.get(e);if(!r||r.pendingHostKey!==t)throw Error("Pending host key does not match.");return this.store.update(e,{hostKeyFingerprint:t,pendingHostKey:void 0,trustState:"pinned",status:"validating"})}async validate(e){let t=this.store.get(e);if(!t||t.trustState!=="pinned")throw Error("Pin the SSH host key before validation.");let r=await this.driver(t.provider).validate(t),a=[];if(!["x64","arm64","x86_64","aarch64"].includes(r.arch??""))a.push({code:"arch.unsupported",severity:"error",message:"Unsupported architecture.",remediation:"Use x86_64 or arm64 Linux."});for(let h of["curl","tar"])if(!r.tools?.[h])a.push({code:`tool.${h}`,severity:"error",message:`${h} is missing.`,remediation:`Install ${h} before bootstrap.`});if(Math.abs(r.timeSkewSeconds??0)>60)a.push({code:"time.skew",severity:"error",message:"Clock skew exceeds 60 seconds.",remediation:"Enable NTP synchronization."});if(!r.dnsOk)a.push({code:"dns.failed",severity:"error",message:"DNS validation failed.",remediation:"Repair resolver configuration."});let u={valid:!a.some((h)=>h.severity==="error"),facts:r,findings:a,validatedAt:this.now().toISOString(),validatorVersion:"1"},f={cpu:r.cpuCores??0,memoryBytes:r.memoryBytes??0,diskBytes:r.diskBytes??0};return this.store.update(e,{validation:u,capacity:f,status:u.valid?"ready":"degraded"})}bootstrap(e,t=!1){let r=this.store.get(e);if(!r?.validation?.valid)throw Error("A healthy validation report is required.");let a=["install runtime dependencies","install ts-cloud agent","configure heartbeat","verify least-privilege access"];if(!t)return{preview:!0,steps:a};let u=this.queue.enqueue({projectId:r.projectId,resourceId:r.resourceId,kind:"fleet.bootstrap",input:{serverId:e,steps:a},lockKey:`server:${e}`,providerKey:r.provider}).operation;return{preview:!1,steps:a,operation:u}}heartbeat(e,t){let r=this.store.get(e);if(!r)throw Error("Server was not found.");let a=this.now().toISOString();return this.store.update(e,{usage:t.usage,capabilities:t.capabilities??r.capabilities,heartbeatAt:a,lastSeenAt:a,status:r.status==="draining"||r.status==="drained"?r.status:"ready"})}drain(e,t=!1){return this.store.update(e,{status:t?"drained":"draining"})}uncordon(e){return this.store.update(e,{status:"ready"})}archive(e,t){let r=this.store.get(e);if(!r||t!==r.name)throw Error("Exact server name confirmation is required.");return this.store.update(e,{status:"archived",archivedAt:this.now().toISOString()})}}var Kn=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},on=(e)=>e==null?void 0:String(e),Gu=()=>({cpu:0,memoryBytes:0,diskBytes:0,gpu:0}),Ir=(e={})=>({...Gu(),...e});function sv(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),name:String(e.name),purpose:String(e.purpose),backend:String(e.backend),region:on(e.region),architecture:on(e.architecture),labels:Kn(e.labels,{}),requiredServerLabels:Kn(e.required_server_labels,{}),toleratedTaints:Kn(e.tolerated_taints,[]),capacity:Ir(Kn(e.capacity,{})),reserved:Kn(e.reserved,{}),maxWorkloads:Number(e.max_workloads),costWeight:Number(e.cost_weight),spreadKey:on(e.spread_key),concurrency:Number(e.concurrency),ephemeralWorkspaces:Number(e.ephemeral_workspaces)===1,allowProductionSecrets:Number(e.allow_production_secrets)===1,status:String(e.status),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function av(e){return{id:String(e.id),projectId:String(e.project_id),environmentId:on(e.environment_id),resourceId:String(e.resource_id),releaseId:on(e.release_id),poolId:String(e.pool_id),serverId:on(e.server_id),purpose:String(e.purpose),requirements:Kn(e.requirements,{}),decision:Kn(e.decision,{}),stateful:Number(e.stateful)===1,autoReschedule:Number(e.auto_reschedule)===1,status:String(e.status),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function iA(e){return{id:String(e.id),projectId:String(e.project_id),resourceId:on(e.resource_id),poolId:String(e.pool_id),placementId:on(e.placement_id),operationId:on(e.operation_id),sourceSha:String(e.source_sha),buildSpec:Kn(e.build_spec,{}),credentialPolicy:Kn(e.credential_policy,{productionSecrets:!1,shortLivedTokenExpiresAt:""}),workspace:on(e.workspace),cacheKey:on(e.cache_key),artifactUri:on(e.artifact_uri),artifactDigest:on(e.artifact_digest),status:String(e.status),cleanupAt:on(e.cleanup_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Ha{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}createPool(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO capacity_pools (id,organization_id,project_id,name,purpose,backend,region,architecture,labels,required_server_labels,tolerated_taints,capacity,reserved,max_workloads,cost_weight,spread_key,concurrency,ephemeral_workspaces,allow_production_secrets,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.name,e.purpose,e.backend,e.region??null,e.architecture??null,JSON.stringify(e.labels),JSON.stringify(e.requiredServerLabels),JSON.stringify(e.toleratedTaints),JSON.stringify(Ir(e.capacity)),"{}",e.maxWorkloads,e.costWeight,e.spreadKey??null,e.concurrency,e.ephemeralWorkspaces?1:0,e.allowProductionSecrets?1:0,e.status,r,r]),this.getPool(t)}getPool(e){let t=this.control.database.query("SELECT * FROM capacity_pools WHERE id=?").get(e);return t?sv(t):void 0}listPools(e){return this.control.database.query("SELECT * FROM capacity_pools WHERE project_id=? ORDER BY name").all(e).map(sv)}updatePool(e,t){let r=this.getPool(e);if(!r)throw Error("Capacity pool was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE capacity_pools SET status=?,reserved=?,capacity=?,concurrency=?,version=version+1,updated_at=? WHERE id=?",[a.status,JSON.stringify(a.reserved),JSON.stringify(a.capacity),a.concurrency,u,e]),this.getPool(e)}addMember(e,t,r={}){let a=this.now().toISOString();this.control.database.run("INSERT INTO capacity_pool_members (pool_id,server_id,capacity_override,status,created_at,updated_at) VALUES (?,?,?,'active',?,?) ON CONFLICT(pool_id,server_id) DO UPDATE SET capacity_override=excluded.capacity_override,status='active',updated_at=excluded.updated_at",[e,t,JSON.stringify(r),a,a])}members(e){return this.control.database.query("SELECT * FROM capacity_pool_members WHERE pool_id=? ORDER BY server_id").all(e).map((t)=>({serverId:String(t.server_id),status:String(t.status),capacityOverride:Kn(t.capacity_override,{})}))}memberStatus(e,t,r){this.control.database.run("UPDATE capacity_pool_members SET status=?,updated_at=? WHERE pool_id=? AND server_id=?",[r,this.now().toISOString(),e,t])}listPlacements(e,t){let r=this.control.database.query("SELECT * FROM workload_placements WHERE project_id=? ORDER BY created_at,id").all(e).map(av);return t?.length?r.filter((a)=>t.includes(a.status)):r}getPlacement(e){let t=this.control.database.query("SELECT * FROM workload_placements WHERE id=?").get(e);return t?av(t):void 0}activeUsage(e,t){let r=this.control.database.query("SELECT l.resources,l.server_id FROM capacity_leases l WHERE l.pool_id=? AND l.state='active' AND l.expires_at>?").all(e,this.now().toISOString()),a=t?r.filter((u)=>String(u.server_id)===t):r;return{resources:a.reduce((u,f)=>{let h=Ir(Kn(f.resources,{}));for(let b of Object.keys(u))u[b]+=h[b];return u},Gu()),count:a.length}}expireLeases(){return this.control.database.run("UPDATE capacity_leases SET state='expired',updated_at=? WHERE state='active' AND expires_at<=?",[this.now().toISOString(),this.now().toISOString()]).changes}reserve(e){return this.control.transaction(()=>{this.expireLeases();let t=this.id(),r=this.id(),a=this.now().toISOString(),u=new Date(this.now().getTime()+(e.requirements.leaseSeconds??300)*1000).toISOString();return this.control.database.run("INSERT INTO workload_placements (id,project_id,environment_id,resource_id,release_id,pool_id,server_id,purpose,requirements,decision,stateful,auto_reschedule,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,'reserved',?,?)",[t,e.projectId,e.environmentId??null,e.resourceId,e.releaseId??null,e.decision.poolId,e.decision.serverId??null,e.requirements.purpose,JSON.stringify(e.requirements),JSON.stringify(e.decision),e.requirements.stateful?1:0,e.requirements.autoReschedule&&!e.requirements.stateful?1:0,a,a]),this.control.database.run("INSERT INTO capacity_leases (id,placement_id,pool_id,server_id,resources,state,expires_at,created_at,updated_at) VALUES (?,?,?,?,?,'active',?,?,?)",[r,t,e.decision.poolId,e.decision.serverId??null,JSON.stringify(Ir(e.requirements.resources)),u,a,a]),this.getPlacement(t)})}transitionPlacement(e,t){if(!this.getPlacement(e))throw Error("Placement was not found.");let a=this.now().toISOString();if(this.control.database.run("UPDATE workload_placements SET status=?,version=version+1,updated_at=? WHERE id=?",[t,a,e]),["released","failed","blocked"].includes(t))this.control.database.run("UPDATE capacity_leases SET state='released',updated_at=? WHERE placement_id=? AND state='active'",[a,e]);return this.getPlacement(e)}createBuild(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO remote_builds (id,project_id,resource_id,pool_id,placement_id,operation_id,source_sha,build_spec,credential_policy,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,'queued',?,?)",[t,e.projectId,e.resourceId??null,e.poolId,e.placementId??null,e.operationId??null,e.sourceSha,JSON.stringify(e.buildSpec),JSON.stringify({productionSecrets:!1,shortLivedTokenExpiresAt:e.tokenExpiresAt}),r,r]),this.getBuild(t)}getBuild(e){let t=this.control.database.query("SELECT * FROM remote_builds WHERE id=?").get(e);return t?iA(t):void 0}updateBuild(e,t){let r=this.getBuild(e);if(!r)throw Error("Remote build was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE remote_builds SET operation_id=?,workspace=?,cache_key=?,artifact_uri=?,artifact_digest=?,status=?,cleanup_at=?,updated_at=? WHERE id=?",[a.operationId??null,a.workspace??null,a.cacheKey??null,a.artifactUri??null,a.artifactDigest??null,a.status,a.cleanupAt??null,u,e]),this.getBuild(e)}}var Nd=["cpu","memoryBytes","diskBytes","gpu"],cv=(e,t={})=>Object.entries(t).every(([r,a])=>e[r]===a),oA=(e,t,r)=>Object.fromEntries(Nd.map((a)=>[a,Math.max(0,e[a]-t[a]-(r[a]??0))])),sA=(e,t)=>Nd.every((r)=>e[r]>=(t[r]??0)),aA=(e,t)=>Nd.reduce((r,a)=>r+(t[a]??0)/(e[a]||1),0);class Ga{store;fleet;constructor(e,t){this.store=e;this.fleet=t}poolCandidates(e,t,r){let a=[];for(let u of this.store.listPools(e)){if(u.id===r)continue;let f=[];if(u.status!=="active")f.push(`pool is ${u.status}`);if(u.purpose!==t.purpose)f.push(`purpose is ${u.purpose}`);if(t.region&&u.region!==t.region)f.push(`region is ${u.region??"unset"}`);if(t.architecture&&u.architecture!==t.architecture)f.push(`architecture is ${u.architecture??"unset"}`);if(!cv(u.labels,t.labels))f.push("pool labels do not match");if(u.backend==="server"){let h=this.store.members(u.id);if(!h.length)a.push(this.decision(u,void 0,t,[...f,"pool has no servers"]));for(let b of h){let S=this.fleet.get(b.serverId),y=[...f];if(!S)y.push("server is missing");else this.serverReasons(u,S,b.status,t,y);a.push(this.decision(u,S,t,y,b.capacityOverride))}}else a.push(this.decision(u,void 0,t,f))}return a.sort((u,f)=>Number(f.eligible)-Number(u.eligible)||u.score.cost-f.score.cost||u.score.spread-f.score.spread||u.score.fit-f.score.fit||u.poolName.localeCompare(f.poolName)||(u.serverId??"").localeCompare(f.serverId??""))}serverReasons(e,t,r,a,u){if(r!=="active")u.push(`member is ${r}`);if(t.status!=="ready")u.push(`server is ${t.status}`);if(!t.roles.includes(a.purpose==="build"?"build":a.purpose))u.push(`server lacks ${a.purpose} role`);if(!cv(t.labels,e.requiredServerLabels))u.push("server labels do not match pool selector");for(let f of t.taints)if(!e.toleratedTaints.includes(f))u.push(`taint ${f} is not tolerated`)}decision(e,t,r,a,u={}){let f=Ir({...t?.capacity,...u}),h=t?Object.fromEntries(Nd.map((y)=>[y,Math.min(e.capacity[y],f[y])])):e.capacity,b=this.store.activeUsage(e.id,t?.id),S=oA(h,b.resources,e.reserved);if(b.count>=e.maxWorkloads)a.push("workload limit reached");if(r.purpose==="build"&&b.count>=e.concurrency)a.push("build concurrency reached");if(!sA(S,r.resources))a.push("insufficient capacity");return{poolId:e.id,poolName:e.name,serverId:t?.id,eligible:a.length===0,reasons:a,available:S,score:{fit:aA(S,r.resources),spread:b.count,cost:e.costWeight}}}explain(e,t){return this.poolCandidates(e,t)}place(e){return this.store.control.transaction(()=>{let t=this.poolCandidates(e.projectId,e.requirements).find((r)=>r.eligible);if(!t)throw Error(`No eligible capacity: ${this.explain(e.projectId,e.requirements).flatMap((r)=>r.reasons).join("; ")}`);return this.store.reserve({...e,decision:t})})}activate(e){return this.store.transitionPlacement(e,"active")}release(e){return this.store.transitionPlacement(e,"released")}drainPool(e){let t=this.store.updatePool(e,{status:"draining"}),r=[],a=[];for(let u of this.store.listPlacements(t.projectId,["reserved","active"]).filter((f)=>f.poolId===e)){if(u.stateful){a.push(this.store.transitionPlacement(u.id,"blocked"));continue}this.store.transitionPlacement(u.id,"moving");let f=this.place({projectId:u.projectId,environmentId:u.environmentId,resourceId:u.resourceId,releaseId:u.releaseId,requirements:u.requirements});r.push(this.activate(f.id)),this.store.transitionPlacement(u.id,"released")}return{pool:t,moved:r,blocked:a}}drainServer(e,t){this.store.memberStatus(e,t,"draining");let r=this.store.getPool(e);if(!r)throw Error("Capacity pool was not found.");let a=[],u=[];for(let f of this.store.listPlacements(r.projectId,["reserved","active"]).filter((h)=>h.poolId===e&&h.serverId===t)){if(f.stateful){u.push(this.store.transitionPlacement(f.id,"blocked"));continue}this.store.transitionPlacement(f.id,"moving");let h=this.poolCandidates(f.projectId,f.requirements).find((S)=>S.eligible);if(!h){u.push(this.store.transitionPlacement(f.id,"blocked"));continue}let b=this.store.reserve({projectId:f.projectId,environmentId:f.environmentId,resourceId:f.resourceId,releaseId:f.releaseId,requirements:f.requirements,decision:h});a.push(this.activate(b.id)),this.store.transitionPlacement(f.id,"released")}return{moved:a,blocked:u}}reconcileFailure(e){let t=this.fleet.get(e);if(!t)throw Error("Server was not found.");let r=[],a=[];for(let u of this.store.listPlacements(t.projectId,["active"]).filter((f)=>f.serverId===e)){if(u.stateful||!u.autoReschedule){a.push(this.store.transitionPlacement(u.id,"blocked"));continue}this.store.transitionPlacement(u.id,"failed");let f=this.place({projectId:u.projectId,environmentId:u.environmentId,resourceId:u.resourceId,releaseId:u.releaseId,requirements:u.requirements});r.push(this.activate(f.id))}return{rescheduled:r,blocked:a}}}class lh{store;placement;now;queue;constructor(e,t,r,a=()=>new Date){this.store=e;this.placement=t;this.now=a;this.queue=r??new c(e.control)}enqueue(e){if(!/^[a-f0-9]{7,64}$/i.test(e.sourceSha))throw Error("A pinned source commit SHA is required.");let t={purpose:"build",resources:{cpu:1,memoryBytes:1073741824,diskBytes:5368709120},leaseSeconds:3600,...e.requirements},r=this.placement.place({projectId:e.projectId,resourceId:e.resourceId,requirements:t}),a=new Date(this.now().getTime()+900000).toISOString(),u=this.store.createBuild({projectId:e.projectId,resourceId:e.resourceId,poolId:r.poolId,placementId:r.id,sourceSha:e.sourceSha,buildSpec:e.buildSpec,tokenExpiresAt:a}),f=this.queue.enqueue({projectId:e.projectId,resourceId:e.resourceId,kind:"build.remote",input:{buildId:u.id},lockKey:`build:${u.id}`,providerKey:`pool:${r.poolId}`,buildSlot:!0,timeoutSeconds:3600,cancellationMode:"cooperative",resumePolicy:"fail"}).operation;return u=this.store.updateBuild(u.id,{operationId:f.id}),u}cancel(e){let t=this.store.getBuild(e);if(!t)throw Error("Remote build was not found.");if(t.operationId)this.queue.requestCancellation(t.operationId);return this.store.updateBuild(e,{status:"cancelled"})}}var cA=/^sha256:[a-f0-9]{64}$/,dA=/^(?:s3|https|oci):\/\//;function US(e,t){return{"build.remote":async(r)=>{let a=r.operation.input&&typeof r.operation.input==="object"&&!Array.isArray(r.operation.input)?r.operation.input:{},u=e.getBuild(String(a.buildId??""));if(!u)throw Error("Queued remote build was not found.");let f=e.getPool(u.poolId);if(!f||f.purpose!=="build"||f.status!=="active")throw Error("The selected build pool is unavailable.");if(!f.ephemeralWorkspaces)throw Error("Remote builds require an ephemeral workspace pool.");if(u.credentialPolicy.productionSecrets||f.allowProductionSecrets)throw Error("Production secrets are forbidden in remote build workers.");if(new Date(u.credentialPolicy.shortLivedTokenExpiresAt)<=new Date)throw Error("The short-lived build credential has expired.");let h=t.find((S)=>S.backend===f.backend);if(!h)throw Error(`No ${f.backend} remote build driver is configured.`);let b=`build://${f.id}/${u.id}`;e.updateBuild(u.id,{status:"running",workspace:b}),r.checkpoint("checkout",`Preparing isolated workspace for ${u.sourceSha}.`);try{r.throwIfCancellationRequested(),r.checkpoint("build","Executing resource-limited build.");let S=await h.run({build:e.getBuild(u.id),pool:f,signal:r.signal,log:(y)=>r.log(y,{stream:"stdout"})});if(r.throwIfCancellationRequested(),!cA.test(S.artifactDigest)||!dA.test(S.artifactUri))throw Error("Builder returned an unverified artifact reference.");return e.updateBuild(u.id,{status:"uploading",cacheKey:S.cacheKey,artifactUri:S.artifactUri,artifactDigest:S.artifactDigest}),r.checkpoint("verify","Verified content-addressed artifact upload."),await h.cleanup({build:e.getBuild(u.id),pool:f}),e.updateBuild(u.id,{status:"succeeded",workspace:void 0,cleanupAt:new Date().toISOString()}),{buildId:u.id,artifactUri:S.artifactUri,artifactDigest:S.artifactDigest,cacheKey:S.cacheKey??null}}catch(S){try{await h.cleanup({build:e.getBuild(u.id),pool:f}),e.updateBuild(u.id,{status:r.cancellationRequested()?"cancelled":"failed",workspace:void 0,cleanupAt:new Date().toISOString()})}catch{e.updateBuild(u.id,{status:"cleanup_required"})}throw S}}}}class Ss{backend;transport;handles=new Map;constructor(e,t){this.backend=e;this.transport=t}async run({build:e,pool:t,signal:r,log:a}){let u=await this.transport.provision({backend:this.backend,pool:t,build:e,tokenExpiresAt:e.credentialPolicy.shortLivedTokenExpiresAt});return this.handles.set(e.id,u.handle),a(`${this.backend} builder provisioned`),await this.transport.execute({handle:u.handle,spec:e.buildSpec,sourceSha:e.sourceSha,signal:r,onLog:a}),this.transport.publish({handle:u.handle,sourceSha:e.sourceSha})}async cleanup({build:e}){let t=this.handles.get(e.id);if(!t)return;await this.transport.destroy({handle:t}),this.handles.delete(e.id)}}var QS=(e)=>new Ss("server",e),HS=(e)=>new Ss("ecs",e),GS=(e)=>new Ss("asg",e);var yi=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},Mn=(e)=>e==null?void 0:String(e),dv=(e)=>({id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:Mn(e.environment_id),name:String(e.name),hostname:String(e.hostname),homeRegion:String(e.home_region),regions:yi(e.regions,[]),trafficPolicy:String(e.traffic_policy),dataPolicy:yi(e.data_policy,{replicate:[],maxLagSeconds:60,retainOnDestroy:!0}),status:String(e.status),activeRegion:String(e.active_region),revision:Mn(e.revision),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Gp=(e)=>({id:String(e.id),topologyId:String(e.topology_id),region:String(e.region),role:String(e.role),provider:String(e.provider),stackId:Mn(e.stack_id),stackRevision:Mn(e.stack_revision),status:String(e.status),health:yi(e.health,{}),lastHealthyAt:Mn(e.last_healthy_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Qp=(e)=>({id:String(e.id),topologyId:String(e.topology_id),kind:String(e.kind),sourceRegion:String(e.source_region),targetRegion:String(e.target_region),config:yi(e.config,{}),status:String(e.status),checkpoint:Mn(e.checkpoint),lagSeconds:e.lag_seconds==null?void 0:Number(e.lag_seconds),lastVerifiedAt:Mn(e.last_verified_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Yp=(e)=>({id:String(e.id),topologyId:String(e.topology_id),hostname:String(e.hostname),dnsProvider:String(e.dns_provider),cdnEnabled:Number(e.cdn_enabled)===1,wafEnabled:Number(e.waf_enabled)===1,weights:yi(e.weights,{}),desiredWeights:yi(e.desired_weights,{}),status:String(e.status),providerState:yi(e.provider_state,{}),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),lv=(e)=>({id:String(e.id),topologyId:String(e.topology_id),operationId:Mn(e.operation_id),kind:String(e.kind),requestedRegion:Mn(e.requested_region),revision:Mn(e.revision),plan:yi(e.plan,[]),currentStep:Mn(e.current_step),completedSteps:yi(e.completed_steps,[]),status:String(e.status),error:Mn(e.error),createdAt:String(e.created_at),updatedAt:String(e.updated_at)});class Va{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}create(e){return this.control.transaction(()=>{if(e.regions.length<2||new Set(e.regions.map((f)=>f.region)).size!==e.regions.length||e.regions.filter((f)=>f.role==="primary").length!==1)throw Error("A topology requires unique regions and exactly one primary.");let t=e.regions.find((f)=>f.role==="primary"),r=this.id(),a=this.now().toISOString();this.control.database.run("INSERT INTO regional_topologies (id,organization_id,project_id,environment_id,name,hostname,home_region,regions,traffic_policy,data_policy,status,active_region,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,'draft',?,?,?)",[r,e.organizationId,e.projectId,e.environmentId??null,e.name,e.hostname,t.region,JSON.stringify(e.regions),e.trafficPolicy,JSON.stringify(e.dataPolicy),t.region,a,a]);for(let f of e.regions)this.control.database.run("INSERT INTO regional_targets (id,topology_id,region,role,provider,status,created_at,updated_at) VALUES (?,?,?,?,?,'pending',?,?)",[this.id(),r,f.region,f.role,f.provider,a,a]);for(let f of e.dataPolicy.replicate)for(let h of e.regions)for(let b of e.regions.filter((S)=>S.region!==h.region))this.control.database.run("INSERT INTO regional_replication_channels (id,topology_id,kind,source_region,target_region,config,status,created_at,updated_at) VALUES (?,?,?,?,?,?,'pending',?,?)",[this.id(),r,f,h.region,b.region,"{}",a,a]);let u=Object.fromEntries(e.regions.map((f)=>[f.region,f.region===t.region?100:0]));return this.control.database.run("INSERT INTO regional_traffic_routes (id,topology_id,hostname,dns_provider,cdn_enabled,waf_enabled,weights,desired_weights,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?, 'pending',?,?)",[this.id(),r,e.hostname,e.dnsProvider??"route53",e.cdnEnabled?1:0,e.wafEnabled?1:0,JSON.stringify(u),JSON.stringify(u),a,a]),this.get(r)})}get(e){let t=this.control.database.query("SELECT * FROM regional_topologies WHERE id=?").get(e);return t?dv(t):void 0}list(e){return this.control.database.query("SELECT * FROM regional_topologies WHERE project_id=? ORDER BY name").all(e).map(dv)}targets(e){return this.control.database.query("SELECT * FROM regional_targets WHERE topology_id=? ORDER BY role,region").all(e).map(Gp)}channels(e){return this.control.database.query("SELECT * FROM regional_replication_channels WHERE topology_id=? ORDER BY kind,target_region").all(e).map(Qp)}route(e){let t=this.control.database.query("SELECT * FROM regional_traffic_routes WHERE topology_id=?").get(e);return t?Yp(t):void 0}updateTopology(e,t){let r=this.get(e);if(!r)throw Error("Regional topology was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE regional_topologies SET status=?,active_region=?,revision=?,regions=?,version=version+1,updated_at=? WHERE id=?",[a.status,a.activeRegion,a.revision??null,JSON.stringify(a.regions),u,e]),this.get(e)}updateTarget(e,t){let r=this.control.database.query("SELECT * FROM regional_targets WHERE id=?").get(e);if(!r)throw Error("Regional target was not found.");let a=Gp(r),u={...a,...t},f=this.now().toISOString();return this.control.database.run("UPDATE regional_targets SET role=?,stack_id=?,stack_revision=?,status=?,health=?,last_healthy_at=?,version=version+1,updated_at=? WHERE id=?",[u.role,u.stackId??null,u.stackRevision??null,u.status,JSON.stringify(u.health),u.lastHealthyAt??null,f,e]),Gp(this.control.database.query("SELECT * FROM regional_targets WHERE id=?").get(e))}updateChannel(e,t){let r=this.control.database.query("SELECT * FROM regional_replication_channels WHERE id=?").get(e);if(!r)throw Error("Replication channel was not found.");let a=Qp(r),u={...a,...t},f=this.now().toISOString();return this.control.database.run("UPDATE regional_replication_channels SET status=?,checkpoint=?,lag_seconds=?,last_verified_at=?,version=version+1,updated_at=? WHERE id=?",[u.status,u.checkpoint??null,u.lagSeconds??null,u.lastVerifiedAt??null,f,e]),Qp(this.control.database.query("SELECT * FROM regional_replication_channels WHERE id=?").get(e))}updateRoute(e,t){let r=this.control.database.query("SELECT * FROM regional_traffic_routes WHERE id=?").get(e);if(!r)throw Error("Traffic route was not found.");let a=Yp(r),u={...a,...t},f=this.now().toISOString();return this.control.database.run("UPDATE regional_traffic_routes SET weights=?,desired_weights=?,status=?,provider_state=?,version=version+1,updated_at=? WHERE id=?",[JSON.stringify(u.weights),JSON.stringify(u.desiredWeights),u.status,JSON.stringify(u.providerState),f,e]),Yp(this.control.database.query("SELECT * FROM regional_traffic_routes WHERE id=?").get(e))}createExecution(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO regional_executions (id,topology_id,operation_id,kind,requested_region,revision,plan,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,'queued',?,?)",[t,e.topologyId,e.operationId??null,e.kind,e.requestedRegion??null,e.revision??null,JSON.stringify(e.plan),r,r]),this.execution(t)}execution(e){let t=this.control.database.query("SELECT * FROM regional_executions WHERE id=?").get(e);return t?lv(t):void 0}executions(e){return this.control.database.query("SELECT * FROM regional_executions WHERE topology_id=? ORDER BY created_at DESC").all(e).map(lv)}updateExecution(e,t){let r=this.execution(e);if(!r)throw Error("Regional execution was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE regional_executions SET operation_id=?,current_step=?,completed_steps=?,status=?,error=?,updated_at=? WHERE id=?",[a.operationId??null,a.currentStep??null,JSON.stringify(a.completedSteps),a.status,a.error??null,u,e]),this.execution(e)}}class qa{store;queue;constructor(e,t){this.store=e;this.queue=t??new c(e.control)}create(e){return this.store.create(e)}plan(e,t,r){if(!this.store.get(e))throw Error("Regional topology was not found.");let u=this.store.targets(e),f=this.store.channels(e);if(t==="rollout")return[...u.filter((h)=>h.role==="secondary").map((h)=>`apply:${h.region}`),...u.filter((h)=>h.role==="primary").map((h)=>`apply:${h.region}`),...f.map((h)=>`replicate:${h.kind}:${h.targetRegion}`),"traffic:activate"];if(t==="failover"||t==="failback")return[`health:${r}`,`replication:${r}`,`traffic:${r}`,`roles:${r}`];if(t==="destroy")return["traffic:drain",...u.filter((h)=>h.role==="secondary").map((h)=>`delete:${h.region}`),...u.filter((h)=>h.role==="primary").map((h)=>`delete:${h.region}`),"complete"];return["observe","repair"]}enqueue(e){let t=this.store.get(e.topologyId);if(!t)throw Error("Regional topology was not found.");if(["failover","failback"].includes(e.kind)&&(!e.targetRegion||!t.regions.some((f)=>f.region===e.targetRegion)))throw Error("A topology target region is required.");if(e.kind==="failover"&&e.targetRegion===t.activeRegion)throw Error("Target region is already active.");if((e.kind==="destroy"||e.deleteData)&&e.confirmation!==t.name)throw Error("Exact topology name confirmation is required.");if(e.deleteData&&t.dataPolicy.retainOnDestroy)throw Error("Topology policy requires regional data retention.");if(e.kind==="rollout"&&!/^[A-Za-z0-9._:@/-]{7,200}$/.test(e.revision??""))throw Error("An immutable revision is required.");let r=this.plan(t.id,e.kind,e.targetRegion),a=this.store.createExecution({topologyId:t.id,kind:e.kind,requestedRegion:e.targetRegion,revision:e.revision,plan:r}),u=this.queue.enqueue({projectId:t.projectId,environmentId:t.environmentId,kind:`region.${e.kind}`,input:{executionId:a.id,manifest:e.manifest??{},deleteData:e.deleteData===!0},lockKey:`regional-topology:${t.id}`,providerKey:"multi-region",timeoutSeconds:7200,cancellationMode:"provider_non_cancellable",resumePolicy:"requeue",maxAttempts:3}).operation;return this.store.updateExecution(a.id,{operationId:u.id}),{execution:this.store.execution(a.id),operation:u}}}var lA=(e)=>e&&typeof e==="object"&&!Array.isArray(e)?e:{};function Vu(e,t){let r=(y)=>{let k=t.find((R)=>R.provider===y.provider);if(!k)throw Error(`No ${y.provider} regional driver is configured.`);return k},a=(y,k,R)=>{y.throwIfCancellationRequested(),y.checkpoint(R,R),e.updateExecution(k.id,{status:"running",currentStep:R,completedSteps:[...e.execution(k.id).completedSteps,R]})},u=async(y,k)=>{let R=e.route(y.id);if(!R)throw Error("Regional traffic route was not found.");let D=e.targets(y.id).find((M)=>M.region===y.activeRegion)??e.targets(y.id)[0];if(!D)throw Error("Regional traffic target was not found.");e.updateRoute(R.id,{status:"applying",desiredWeights:k});let O=await r(D).applyTraffic({route:e.route(y.id),topology:y,weights:k});e.updateRoute(R.id,{status:Object.values(k).every((M)=>M===0)?"drained":"in_sync",weights:k,providerState:O.providerState})},f=async(y,k,R,D)=>{e.updateTopology(R.id,{status:"provisioning"});let O=k.revision,M=D.manifest??{},z=e.targets(R.id).sort((Z,oe)=>Number(Z.role==="primary")-Number(oe.role==="primary"));for(let Z of z){a(y,k,`apply:${Z.region}`),e.updateTarget(Z.id,{status:"provisioning"});let oe=await r(Z).applyStack({target:Z,revision:O,manifest:M,signal:y.signal}),G=await r(Z).health({target:e.updateTarget(Z.id,{stackId:oe.stackId,stackRevision:O})});if(!G.healthy)throw Error(`Regional health gate failed in ${Z.region}.`);e.updateTarget(Z.id,{status:"ready",health:G.evidence,lastHealthyAt:new Date().toISOString()})}for(let Z of e.channels(R.id)){a(y,k,`replicate:${Z.kind}:${Z.targetRegion}`),e.updateChannel(Z.id,{status:"configuring"});let oe=z.find((he)=>he.region===Z.sourceRegion),G=await r(oe).configureReplication({channel:Z,topology:R}),te=await r(oe).verifyReplication({channel:e.updateChannel(Z.id,{checkpoint:G.checkpoint,lagSeconds:G.lagSeconds}),topology:R});if(!te.healthy||te.lagSeconds>R.dataPolicy.maxLagSeconds)throw Error(`${Z.kind} replication to ${Z.targetRegion} exceeds the RPO.`);e.updateChannel(Z.id,{status:"in_sync",checkpoint:te.checkpoint,lagSeconds:te.lagSeconds,lastVerifiedAt:new Date().toISOString()})}a(y,k,"traffic:activate");let J=Object.fromEntries(R.regions.map((Z)=>[Z.region,Z.region===R.activeRegion?100:0]));return await u(R,J),e.updateTopology(R.id,{status:"ready",revision:O}),{revision:O,activeRegion:R.activeRegion}},h=async(y,k,R)=>{let D=k.requestedRegion,O=e.targets(R.id).find((J)=>J.region===D);if(!O)throw Error("Requested regional target was not found.");e.updateTopology(R.id,{status:k.kind==="failover"?"failing_over":"failing_back"}),a(y,k,`health:${D}`);let M=await r(O).health({target:O});if(!M.healthy)throw Error(`Target region ${D} is unhealthy.`);e.updateTarget(O.id,{status:"ready",health:M.evidence,lastHealthyAt:new Date().toISOString()}),a(y,k,`replication:${D}`);for(let J of e.channels(R.id).filter((Z)=>Z.targetRegion===D)){let Z=await r(O).verifyReplication({channel:J,topology:R});if(!Z.healthy||Z.lagSeconds>R.dataPolicy.maxLagSeconds)throw Error(`${J.kind} replication is outside the failover RPO.`);e.updateChannel(J.id,{status:"in_sync",checkpoint:Z.checkpoint,lagSeconds:Z.lagSeconds,lastVerifiedAt:new Date().toISOString()})}a(y,k,`traffic:${D}`),await u(R,Object.fromEntries(R.regions.map((J)=>[J.region,J.region===D?100:0]))),a(y,k,`roles:${D}`);let z=R.regions.map((J)=>({...J,role:J.region===D?"primary":"secondary"}));for(let J of e.targets(R.id))e.updateTarget(J.id,{role:J.region===D?"primary":"secondary"});return e.updateTopology(R.id,{status:k.kind==="failover"?"failed_over":"ready",activeRegion:D,regions:z}),{activeRegion:D}},b=async(y,k,R,D)=>{e.updateTopology(R.id,{status:"destroying"}),a(y,k,"traffic:drain"),await u(R,Object.fromEntries(R.regions.map((M)=>[M.region,0])));let O=D.deleteData!==!0;for(let M of e.targets(R.id).sort((z,J)=>Number(z.role==="primary")-Number(J.role==="primary")))a(y,k,`delete:${M.region}`),e.updateTarget(M.id,{status:"deleting"}),await r(M).deleteStack({target:M,retainData:O,signal:y.signal}),e.updateTarget(M.id,{status:"deleted"});return a(y,k,"complete"),e.updateTopology(R.id,{status:"destroyed"}),{destroyed:!0,dataRetained:O}},S=async(y)=>{let k=lA(y.operation.input),R=e.execution(String(k.executionId??""));if(!R)throw Error("Regional execution was not found.");let D=e.get(R.topologyId);if(!D)throw Error("Regional topology was not found.");try{let O;if(R.kind==="rollout")O=await f(y,R,D,k);else if(R.kind==="failover"||R.kind==="failback")O=await h(y,R,D);else if(R.kind==="destroy")O=await b(y,R,D,k);else throw Error("Regional reconciliation is not configured.");return e.updateExecution(R.id,{status:"succeeded",currentStep:void 0}),{executionId:R.id,...O}}catch(O){if(e.updateExecution(R.id,{status:y.cancellationRequested()?"cancelled":"failed",error:O instanceof Error?O.message:String(O)}),e.get(D.id)?.status!=="destroyed")e.updateTopology(D.id,{status:"failed"});throw O}};return{"region.rollout":S,"region.failover":S,"region.failback":S,"region.destroy":S,"region.reconcile":S}}class uh{transport;provider="aws";constructor(e){this.transport=e}async applyStack({target:e,revision:t,manifest:r}){return this.transport.applyCloudFormation({region:e.region,stackId:e.stackId,revision:t,manifest:r})}async deleteStack({target:e,retainData:t}){if(!e.stackId)return;await this.transport.deleteCloudFormation({region:e.region,stackId:e.stackId,retainData:t})}async health({target:e}){if(!e.stackId)return{healthy:!1,evidence:{reason:"stack is not provisioned"}};return this.transport.stackHealth({region:e.region,stackId:e.stackId})}async configureReplication({channel:e}){let t={sourceRegion:e.sourceRegion,targetRegion:e.targetRegion,config:e.config};if(e.kind==="s3")return this.transport.configureS3Replication(t);if(e.kind==="dynamodb")return this.transport.configureDynamoGlobalTable(t);return this.transport.replicateSecrets(t)}async verifyReplication({channel:e}){return this.transport.verifyReplication({kind:e.kind,sourceRegion:e.sourceRegion,targetRegion:e.targetRegion,checkpoint:e.checkpoint})}async applyTraffic({route:e,weights:t}){return this.transport.applyEdge({hostname:e.hostname,weights:t,route53:e.dnsProvider==="route53",cloudFront:e.cdnEnabled,waf:e.wafEnabled})}}class ja{provider;reason;constructor(e,t="Configure a regional provider transport before executing this operation."){this.provider=e;this.reason=t}fail(){throw Error(this.reason)}async applyStack(){return this.fail()}async deleteStack(){this.fail()}async health(){return this.fail()}async configureReplication(){return this.fail()}async verifyReplication(){return this.fail()}async applyTraffic(){return this.fail()}}import{createHash as Zp,createPublicKey as gv,verify as uA}from"node:crypto";function Rn(e){if(e===null||typeof e!=="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(Rn).join(",")}]`;return`{${Object.keys(e).sort().map((t)=>`${JSON.stringify(t)}:${Rn(e[t])}`).join(",")}}`}var qu=(e)=>Zp("sha256").update(Rn(e)).digest("hex"),Is=(e)=>Zp("sha256").update(Rn(e)).digest("hex"),ju=(e)=>Zp("sha256").update(gv(e).export({type:"spki",format:"der"})).digest("hex");function zu(e,t,r){try{return uA(null,Buffer.from(Rn(e)),gv(r),Buffer.from(t,"base64"))}catch{return!1}}var uv=(e)=>e.replace(/^v/,"").split(/[.-]/).slice(0,3).map((t)=>Number(t)||0),pv=(e,t)=>{let r=uv(e),a=uv(t);for(let u=0;u<3;u++){let f=(r[u]??0)-(a[u]??0);if(f)return f}return 0};function Ku(e,t){let r=[];if(t.schemaVersion<e.minimumSchema)r.push(`schema ${t.schemaVersion} is below ${e.minimumSchema}`);if(t.schemaVersion>e.maximumSchema)r.push(`schema ${t.schemaVersion} is above ${e.maximumSchema}`);if(e.minimumVersion&&pv(t.currentVersion,e.minimumVersion)<0)r.push(`platform ${t.currentVersion} is below ${e.minimumVersion}`);if(pv(e.version,t.currentVersion)<=0)r.push(`version ${e.version} is not newer than ${t.currentVersion}`);if(!e.artifacts.some((a)=>a.platform===t.platform&&a.architecture===t.architecture))r.push(`no artifact for ${t.platform}/${t.architecture}`);return{compatible:r.length===0,reasons:r}}var vi=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},Nr=(e)=>e==null?void 0:String(e),pA=(e)=>({id:String(e.id),organizationId:String(e.organization_id),name:String(e.name),algorithm:"ed25519",publicKeyPem:String(e.public_key_pem),fingerprint:String(e.fingerprint),revokedAt:Nr(e.revoked_at),createdAt:String(e.created_at)}),mv=(e)=>({id:String(e.id),organizationId:String(e.organization_id),version:String(e.version),channel:String(e.channel),publishedAt:String(e.published_at),keyId:String(e.key_id),digest:String(e.digest),document:vi(e.document,{}),signature:String(e.signature),verificationStatus:String(e.verification_status),compatibility:vi(e.compatibility,{compatible:!1,reasons:[]}),createdAt:String(e.created_at)}),fv=(e)=>({id:String(e.id),projectId:String(e.project_id),name:String(e.name),schedule:String(e.schedule),timezone:String(e.timezone),durationMinutes:Number(e.duration_minutes),allowedOperations:vi(e.allowed_operations,[]),requireApproval:Number(e.require_approval)===1,enabled:Number(e.enabled)===1,createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),hv=(e)=>({id:String(e.id),projectId:String(e.project_id),manifestId:String(e.manifest_id),windowId:Nr(e.window_id),fromVersion:String(e.from_version),strategy:String(e.strategy),batchSize:Number(e.batch_size),healthGate:vi(e.health_gate,{}),status:String(e.status),currentStage:Nr(e.current_stage),backupId:Nr(e.backup_id),approvedBy:Nr(e.approved_by),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Xp=(e)=>({id:String(e.id),campaignId:String(e.campaign_id),serverId:Nr(e.server_id),target:String(e.target),cohort:Number(e.cohort),previousVersion:String(e.previous_version),status:String(e.status),evidence:vi(e.evidence,{}),error:Nr(e.error),startedAt:Nr(e.started_at),finishedAt:Nr(e.finished_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),yv=(e)=>({id:String(e.id),projectId:String(e.project_id),kind:String(e.kind),criteria:vi(e.criteria,{}),candidates:vi(e.candidates,[]),candidateDigest:String(e.candidate_digest),estimatedBytes:Number(e.estimated_bytes),status:String(e.status),confirmation:Nr(e.confirmation),expiresAt:String(e.expires_at),result:vi(e.result,{}),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),vv=(e)=>({id:String(e.id),projectId:String(e.project_id),backupPolicyId:Nr(e.backup_policy_id),recoveryPointId:Nr(e.recovery_point_id),topologyId:Nr(e.topology_id),scenario:String(e.scenario),isolatedTarget:String(e.isolated_target),expectedRpoMinutes:Number(e.expected_rpo_minutes),expectedRtoMinutes:Number(e.expected_rto_minutes),status:String(e.status),operationId:Nr(e.operation_id),evidence:vi(e.evidence,{}),measuredRpoMinutes:e.measured_rpo_minutes==null?void 0:Number(e.measured_rpo_minutes),measuredRtoMinutes:e.measured_rto_minutes==null?void 0:Number(e.measured_rto_minutes),cleanupVerified:Number(e.cleanup_verified)===1,error:Nr(e.error),startedAt:Nr(e.started_at),finishedAt:Nr(e.finished_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)});class za{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}addTrustedKey(e){let t=this.id(),r=this.now().toISOString(),a=ju(e.publicKeyPem);return this.control.database.run("INSERT INTO platform_trusted_keys (id,organization_id,name,algorithm,public_key_pem,fingerprint,created_at) VALUES (?,?,?,'ed25519',?,?,?)",[t,e.organizationId,e.name,e.publicKeyPem,a,r]),this.key(t)}key(e){let t=this.control.database.query("SELECT * FROM platform_trusted_keys WHERE id=?").get(e);return t?pA(t):void 0}revokeKey(e){return this.control.database.run("UPDATE platform_trusted_keys SET revoked_at=? WHERE id=?",[this.now().toISOString(),e]),this.key(e)}importManifest(e){let t=this.key(e.keyId);if(!t||t.organizationId!==e.organizationId)throw Error("Trusted update key was not found.");if(t.revokedAt)throw Error("Update signing key is revoked.");if(!zu(e.document,e.signature,t.publicKeyPem))throw Error("Update manifest signature is invalid.");let r=Ku(e.document,e.current),a=qu(e.document),u=this.id(),f=this.now().toISOString();return this.control.database.run("INSERT INTO platform_update_manifests (id,organization_id,version,channel,published_at,key_id,digest,document,signature,verification_status,compatibility,created_at) VALUES (?,?,?,?,?,?,?,?,?,'verified',?,?)",[u,e.organizationId,e.document.version,e.document.channel,new Date(e.document.publishedAt).toISOString(),e.keyId,a,JSON.stringify(e.document),e.signature,JSON.stringify(r),f]),this.manifest(u)}manifest(e){let t=this.control.database.query("SELECT * FROM platform_update_manifests WHERE id=?").get(e);return t?mv(t):void 0}manifests(e){return this.control.database.query("SELECT * FROM platform_update_manifests WHERE organization_id=? ORDER BY published_at DESC").all(e).map(mv)}createWindow(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO maintenance_windows (id,project_id,name,schedule,timezone,duration_minutes,allowed_operations,require_approval,enabled,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,1,?,?)",[t,e.projectId,e.name,e.schedule,e.timezone,e.durationMinutes,JSON.stringify(e.allowedOperations),e.requireApproval===!1?0:1,r,r]),this.window(t)}window(e){let t=this.control.database.query("SELECT * FROM maintenance_windows WHERE id=?").get(e);return t?fv(t):void 0}windows(e){return this.control.database.query("SELECT * FROM maintenance_windows WHERE project_id=? ORDER BY name").all(e).map(fv)}createCampaign(e){return this.control.transaction(()=>{let t=this.manifest(e.manifestId);if(!t?.compatibility.compatible||t.verificationStatus!=="verified")throw Error("A verified compatible update manifest is required.");if(!e.backupId)throw Error("A verified pre-upgrade backup is required.");let r=this.id(),a=this.now().toISOString();return this.control.database.run("INSERT INTO platform_upgrade_campaigns (id,project_id,manifest_id,window_id,from_version,strategy,batch_size,health_gate,status,backup_id,approved_by,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?, 'planned',?,?,?,?)",[r,e.projectId,e.manifestId,e.windowId??null,e.fromVersion,e.strategy,e.batchSize,JSON.stringify(e.healthGate),e.backupId,e.approvedBy??null,a,a]),e.targets.forEach((u,f)=>this.control.database.run("INSERT INTO platform_upgrade_targets (id,campaign_id,server_id,target,cohort,previous_version,status,created_at,updated_at) VALUES (?,?,?,?,?,?,'pending',?,?)",[this.id(),r,u.serverId??null,u.target,e.strategy==="canary"?f===0?0:1+Math.floor((f-1)/e.batchSize):Math.floor(f/e.batchSize),u.previousVersion,a,a])),this.campaign(r)})}campaign(e){let t=this.control.database.query("SELECT * FROM platform_upgrade_campaigns WHERE id=?").get(e);return t?hv(t):void 0}campaigns(e){return this.control.database.query("SELECT * FROM platform_upgrade_campaigns WHERE project_id=? ORDER BY created_at DESC").all(e).map(hv)}targets(e){return this.control.database.query("SELECT * FROM platform_upgrade_targets WHERE campaign_id=? ORDER BY cohort,target").all(e).map(Xp)}updateCampaign(e,t){let r=this.campaign(e);if(!r)throw Error("Upgrade campaign was not found.");let a={...r,...t};return this.control.database.run("UPDATE platform_upgrade_campaigns SET status=?,current_stage=?,updated_at=? WHERE id=?",[a.status,a.currentStage??null,this.now().toISOString(),e]),this.campaign(e)}updateTarget(e,t){let r=this.control.database.query("SELECT * FROM platform_upgrade_targets WHERE id=?").get(e);if(!r)throw Error("Upgrade target was not found.");let a={...Xp(r),...t};return this.control.database.run("UPDATE platform_upgrade_targets SET status=?,evidence=?,error=?,started_at=?,finished_at=?,updated_at=? WHERE id=?",[a.status,JSON.stringify(a.evidence),a.error??null,a.startedAt??null,a.finishedAt??null,this.now().toISOString(),e]),Xp(this.control.database.query("SELECT * FROM platform_upgrade_targets WHERE id=?").get(e))}createCleanup(e){let t=[...e.candidates].sort((h,b)=>h.id.localeCompare(b.id)),r=Is(t),a=this.id(),u=this.now().toISOString(),f=new Date(this.now().getTime()+(e.ttlMinutes??60)*60000).toISOString();return this.control.database.run("INSERT INTO cleanup_plans (id,project_id,kind,criteria,candidates,candidate_digest,estimated_bytes,status,expires_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,'preview',?,?,?)",[a,e.projectId,e.kind,JSON.stringify(e.criteria),JSON.stringify(t),r,t.reduce((h,b)=>h+b.bytes,0),f,u,u]),this.cleanup(a)}cleanup(e){let t=this.control.database.query("SELECT * FROM cleanup_plans WHERE id=?").get(e);return t?yv(t):void 0}cleanups(e){return this.control.database.query("SELECT * FROM cleanup_plans WHERE project_id=? ORDER BY created_at DESC").all(e).map(yv)}updateCleanup(e,t){let r=this.cleanup(e);if(!r)throw Error("Cleanup plan was not found.");let a={...r,...t};return this.control.database.run("UPDATE cleanup_plans SET status=?,confirmation=?,result=?,updated_at=? WHERE id=?",[a.status,a.confirmation??null,JSON.stringify(a.result),this.now().toISOString(),e]),this.cleanup(e)}createDrill(e){if(!/^isolated:\/\//.test(e.isolatedTarget))throw Error("DR drills require an isolated target.");let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO disaster_recovery_drills (id,project_id,backup_policy_id,recovery_point_id,topology_id,scenario,isolated_target,expected_rpo_minutes,expected_rto_minutes,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,'planned',?,?)",[t,e.projectId,e.backupPolicyId??null,e.recoveryPointId??null,e.topologyId??null,e.scenario,e.isolatedTarget,e.expectedRpoMinutes,e.expectedRtoMinutes,r,r]),this.drill(t)}drill(e){let t=this.control.database.query("SELECT * FROM disaster_recovery_drills WHERE id=?").get(e);return t?vv(t):void 0}drills(e){return this.control.database.query("SELECT * FROM disaster_recovery_drills WHERE project_id=? ORDER BY created_at DESC").all(e).map(vv)}updateDrill(e,t){let r=this.drill(e);if(!r)throw Error("DR drill was not found.");let a={...r,...t};return this.control.database.run("UPDATE disaster_recovery_drills SET status=?,operation_id=?,evidence=?,measured_rpo_minutes=?,measured_rto_minutes=?,cleanup_verified=?,error=?,started_at=?,finished_at=?,updated_at=? WHERE id=?",[a.status,a.operationId??null,JSON.stringify(a.evidence),a.measuredRpoMinutes??null,a.measuredRtoMinutes??null,a.cleanupVerified?1:0,a.error??null,a.startedAt??null,a.finishedAt??null,this.now().toISOString(),e]),this.drill(e)}}function gh(e,t=new Date){if(!e.enabled)return!1;let r=new Date(e.schedule);if(!Number.isNaN(r.getTime()))return t>=r&&t.getTime()<=r.getTime()+e.durationMinutes*60000;let a=/^(\d{2}):(\d{2})$/.exec(e.schedule);if(!a)return!1;let u=new Intl.DateTimeFormat("en-US",{timeZone:e.timezone,hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(t),f=Number(u.find((b)=>b.type==="hour")?.value)*60+Number(u.find((b)=>b.type==="minute")?.value),h=Number(a[1])*60+Number(a[2]);return f>=h&&f<h+e.durationMinutes}class Ka{store;now;queue;constructor(e,t,r=()=>new Date){this.store=e;this.now=r;this.queue=t??new c(e.control)}enqueueCampaign(e,t={}){let r=this.store.campaign(e);if(!r)throw Error("Upgrade campaign was not found.");let a=r.windowId?this.store.window(r.windowId):void 0;if(a&&!a.allowedOperations.includes("platform.upgrade"))throw Error("Maintenance window does not permit platform upgrades.");if(a&&!t.overrideWindow&&!gh(a,this.now()))throw Error("Upgrade is outside its maintenance window.");if(a?.requireApproval&&!t.approvedBy&&!r.approvedBy)throw Error("Maintenance approval is required.");let u=this.queue.enqueue({projectId:r.projectId,actorId:t.approvedBy,kind:"maintenance.upgrade",input:{campaignId:e},lockKey:"platform-upgrade",providerKey:"platform",timeoutSeconds:7200,cancellationMode:"cooperative",resumePolicy:"fail"}).operation;return{campaign:this.store.updateCampaign(e,{status:"queued"}),operation:u}}async previewCleanup(e,t){let r=t.find((a)=>a.kind===e.kind);if(!r)throw Error(`No ${e.kind} cleanup driver is configured.`);return this.store.createCleanup({...e,candidates:await r.discover(e.criteria)})}enqueueCleanup(e,t){let r=this.store.cleanup(e);if(!r||r.status!=="preview")throw Error("A current cleanup preview is required.");if(new Date(r.expiresAt)<=this.now())throw Error("Cleanup preview expired; generate it again.");let a=`DELETE ${r.candidates.length} ${r.kind}`;if(t!==a)throw Error(`Exact confirmation ${a} is required.`);let u=this.queue.enqueue({projectId:r.projectId,kind:"maintenance.cleanup",input:{planId:e},lockKey:`cleanup:${r.kind}`,providerKey:"cleanup",timeoutSeconds:3600,cancellationMode:"cooperative"}).operation;return{plan:this.store.updateCleanup(e,{status:"approved",confirmation:t}),operation:u}}enqueueDrill(e){let t=this.store.drill(e);if(!t||t.status!=="planned")throw Error("A planned DR drill is required.");let r=this.queue.enqueue({projectId:t.projectId,kind:"maintenance.drill",input:{drillId:e},lockKey:`drill:${t.scenario}:${t.id}`,providerKey:"recovery",timeoutSeconds:7200,cancellationMode:"cooperative"}).operation;return{drill:this.store.updateDrill(e,{status:"queued",operationId:r.id}),operation:r}}}var vg=(e)=>e&&typeof e==="object"&&!Array.isArray(e)?e:{};function Wu(e){return{"maintenance.upgrade":async(u)=>{let f=e.store.campaign(String(vg(u.operation.input).campaignId??""));if(!f||!e.platform)throw Error("Upgrade campaign or platform maintenance driver is unavailable.");let h=e.store.manifest(f.manifestId);if(!h?.compatibility.compatible||h.verificationStatus!=="verified")throw Error("Update manifest is no longer verified and compatible.");let b=h.document.artifacts.find((y)=>y.platform===process.platform&&y.architecture===process.arch)??h.document.artifacts[0];if(!b)throw Error("No update artifact matches this platform.");e.store.updateCampaign(f.id,{status:"running",currentStage:"preflight"});let S=[];try{for(let y of[...new Set(e.store.targets(f.id).map((k)=>k.cohort))].sort((k,R)=>k-R)){e.store.updateCampaign(f.id,{currentStage:`cohort:${y}`});for(let k of e.store.targets(f.id).filter((R)=>R.cohort===y)){u.throwIfCancellationRequested(),u.checkpoint(`download:${k.target}`,"Downloading signed platform artifact."),e.store.updateTarget(k.id,{status:"downloading",startedAt:new Date().toISOString()});let R=await e.platform.download({target:k,artifact:b,signal:u.signal});if(R.sha256!==b.sha256)throw Error(`Artifact checksum mismatch for ${k.target}.`);u.checkpoint(`install:${k.target}`,"Installing verified artifact."),e.store.updateTarget(k.id,{status:"installing"}),await e.platform.install({target:k,path:R.path,version:h.version,signal:u.signal}),S.push(k);let D=await e.platform.health({target:k,gate:f.healthGate});if(!D.healthy)throw Error(`Upgrade health gate failed for ${k.target}.`);e.store.updateTarget(k.id,{status:"healthy",evidence:D.evidence,finishedAt:new Date().toISOString()})}}return e.store.updateCampaign(f.id,{status:"succeeded",currentStage:void 0}),{campaignId:f.id,version:h.version,targets:S.length}}catch(y){e.store.updateCampaign(f.id,{status:"rolling_back",currentStage:"rollback"});for(let k of S.reverse())e.store.updateTarget(k.id,{status:"rolling_back"}),await e.platform.rollback({target:k,version:k.previousVersion,signal:u.signal}),e.store.updateTarget(k.id,{status:"rolled_back",finishedAt:new Date().toISOString()});throw e.store.updateCampaign(f.id,{status:"rolled_back",currentStage:void 0}),y}},"maintenance.cleanup":async(u)=>{let f=e.store.cleanup(String(vg(u.operation.input).planId??""));if(!f||f.status!=="approved")throw Error("Approved cleanup plan was not found.");if(Is([...f.candidates].sort((k,R)=>k.id.localeCompare(R.id)))!==f.candidateDigest)throw Error("Cleanup candidate set changed after preview.");let h=e.cleanup?.find((k)=>k.kind===f.kind);if(!h)throw Error(`No ${f.kind} cleanup driver is configured.`);e.store.updateCleanup(f.id,{status:"running"});let b=[],S=[];for(let k of f.candidates){u.throwIfCancellationRequested();try{await h.remove(k),b.push(k.id)}catch(R){S.push({id:k.id,error:R instanceof Error?R.message:String(R)})}}let y=S.length?b.length?"partial":"failed":"succeeded";if(e.store.updateCleanup(f.id,{status:y,result:{removed:b,failed:S,reclaimedBytes:f.candidates.filter((k)=>b.includes(k.id)).reduce((k,R)=>k+R.bytes,0)}}),S.length)throw Error(`Cleanup failed for ${S.length} candidate(s).`);return{planId:f.id,removed:b.length,reclaimedBytes:f.estimatedBytes}},"maintenance.drill":async(u)=>{let f=e.store.drill(String(vg(u.operation.input).drillId??""));if(!f)throw Error("DR drill was not found.");let h=e.recovery?.find((R)=>R.scenario===f.scenario);if(!h)throw Error(`No ${f.scenario} recovery driver is configured.`);let b=new Date;e.store.updateDrill(f.id,{status:"restoring",startedAt:b.toISOString()});let S=f.isolatedTarget,y={},k={};try{u.checkpoint("restore","Restoring into isolated drill target.");let R=await h.restore({drill:f,signal:u.signal});if(!R.target.startsWith("isolated://"))throw Error("Recovery driver attempted a non-isolated target.");S=R.target,y=R.evidence;let D=(b.getTime()-new Date(R.recoveryPointAt).getTime())/60000;e.store.updateDrill(f.id,{status:"verifying",measuredRpoMinutes:D,evidence:{restore:y}}),u.checkpoint("verify","Running recovery health checks without production traffic.");let O=await h.verify({drill:f,target:S});k=O.evidence;let M=(Date.now()-b.getTime())/60000;if(!O.healthy||D>f.expectedRpoMinutes||M>f.expectedRtoMinutes)throw Error("DR drill failed its health, RPO, or RTO objective.");e.store.updateDrill(f.id,{measuredRpoMinutes:D,measuredRtoMinutes:M,evidence:{restore:y,verify:k}})}catch(R){throw e.store.updateDrill(f.id,{status:"failed",error:R instanceof Error?R.message:String(R),evidence:{restore:y,verify:k}}),R}finally{e.store.updateDrill(f.id,{status:"cleaning"});try{await h.cleanup({drill:f,target:S});let R=e.store.drill(f.id);e.store.updateDrill(f.id,{status:R.error?"failed":"passed",cleanupVerified:!0,finishedAt:new Date().toISOString()})}catch(R){e.store.updateDrill(f.id,{status:"cleanup_required",cleanupVerified:!1,error:R instanceof Error?R.message:String(R),finishedAt:new Date().toISOString()})}}return{drillId:f.id,status:e.store.drill(f.id).status}}}}class ph{transport;constructor(e){this.transport=e}download(e){return this.transport.download({target:e.target.target,url:e.artifact.url,signal:e.signal})}install(e){return this.transport.install({target:e.target.target,path:e.path,version:e.version,signal:e.signal})}health(e){return this.transport.health({target:e.target.target,gate:e.gate})}rollback(e){return this.transport.rollback({target:e.target.target,version:e.version,signal:e.signal})}}var bv={releases:{select:"SELECT id,created_at,0 bytes FROM releases WHERE project_id=? AND pinned=0 AND status IN ('failed','rolled_back','superseded') AND created_at<?",remove:"DELETE FROM releases WHERE id=?"},artifacts:{select:"SELECT a.id,a.created_at,a.size bytes FROM release_artifacts a WHERE a.organization_id=? AND NOT EXISTS(SELECT 1 FROM releases r WHERE r.artifact_id=a.id) AND a.created_at<?",remove:"DELETE FROM release_artifacts WHERE id=?"},operations:{select:"SELECT id,created_at,0 bytes FROM operations WHERE project_id=? AND state IN ('succeeded','failed','cancelled','timed_out') AND updated_at<?",remove:"DELETE FROM operations WHERE id=?"},logs:{select:"SELECT l.id,l.created_at,length(l.message) bytes FROM operation_logs l JOIN operations o ON o.id=l.operation_id WHERE o.project_id=? AND o.state IN ('succeeded','failed','cancelled','timed_out') AND l.created_at<?",remove:"DELETE FROM operation_logs WHERE id=?"},previews:{select:"SELECT id,created_at,0 bytes FROM preview_instances WHERE project_id=? AND status IN ('destroyed','failed') AND updated_at<?",remove:"DELETE FROM preview_instances WHERE id=?"},snapshots:{select:"SELECT id,created_at,size_bytes bytes FROM recovery_points WHERE project_id=? AND pinned=0 AND held=0 AND status IN ('failed','deleted') AND created_at<?",remove:"DELETE FROM recovery_points WHERE id=?"},orphaned_resources:{select:"SELECT id,created_at,COALESCE(capacity_bytes,0) bytes FROM persistent_volumes WHERE project_id=? AND status='orphaned' AND orphaned_at<?",remove:"UPDATE persistent_volumes SET status='deleted',deleted_at=datetime('now'),updated_at=datetime('now') WHERE id=? AND status='orphaned'"}};class Wa{kind;control;projectId;organizationId;constructor(e,t,r,a){this.kind=e;this.control=t;this.projectId=r;this.organizationId=a}async discover(e){let t=Math.max(1,Math.min(3650,Number(e.olderThanDays??30))),r=new Date(Date.now()-t*86400000).toISOString(),a=bv[this.kind],u=this.kind==="artifacts"?this.organizationId:this.projectId;return this.control.database.query(a.select).all(u,r).map((h)=>({id:String(h.id),kind:this.kind,label:`${this.kind}:${String(h.id)}`,bytes:Number(h.bytes??0),metadata:{createdAt:String(h.created_at)}}))}async remove(e){if(this.control.database.run(bv[this.kind].remove,[e.id]).changes!==1)throw Error(`${e.label} changed or is no longer removable.`)}}class mh{scenario;transport;constructor(e,t){this.scenario=e;this.transport=t}restore(e){return this.transport.restore({scenario:this.scenario,...e})}verify(e){return this.transport.verify({scenario:this.scenario,...e})}cleanup(e){return this.transport.cleanup({scenario:this.scenario,...e})}}function Dn(e){let t=jd(e.name),r=wg(e.configText);if(mA(e.configText,r.start,r.end,t))throw Error(`Site '${t}' already exists in cloud.config.ts`);let a=fh({...e,name:t}),u=e.configText.slice(0,r.end).trimEnd(),f=e.configText.slice(r.end),h=u.endsWith("{")?`
141
+ `:a;if(await this.runtime.seedSecret(`${u}-secret`,k),b==="redis")await this.runtime.restart(u);return{status:b==="redis"?"restarting":"running",username:S}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};let f=await this.backup(e,r);return await this.runtime.remove(u),await this.runtime.removeVolume(`${u}-secret`),await this.runtime.removeVolume(`${u}-data`),{status:"deleted",finalBackupId:f.backupId??null,backupPath:f.path??null}}if(t==="expose")throw Error("Direct container exposure is refused; use a reviewed firewall and proxy policy.");throw Error(`${t} requires a configured engine lifecycle runner.`)}}import{createCipheriv as YR,createDecipheriv as ZR,createHash as ov,randomBytes as XR}from"node:crypto";class Fa{controlPlane;now;key;constructor(e,t,r=()=>new Date){this.controlPlane=e;this.now=r;if(!t)throw Error("Data-service encryption key is required.");this.key=ov("sha256").update(`ts-cloud:data-services:${t}`).digest()}encrypt(e){let t=XR(12),r=YR("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){let[t,r,a,u]=e.split(".");if(t!=="v1"||!r||!a||!u)throw Error("Encrypted data-service secret is unavailable.");try{let f=ZR("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return f.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([f.update(Buffer.from(u,"base64url")),f.final()]).toString("utf8")}catch{throw Error("Encrypted data-service secret could not be decrypted.")}}async put(e,t){if(!/^secret:\/\/data-services\/[A-Za-z0-9._/-]+$/.test(e))throw Error("Invalid data-service secret reference.");if(!t)throw Error("Data-service secret cannot be empty.");let r=this.now().toISOString();this.controlPlane.database.run("INSERT INTO data_service_secrets (reference,ciphertext,fingerprint,created_at,updated_at) VALUES (?,?,?,?,?) ON CONFLICT(reference) DO UPDATE SET ciphertext=excluded.ciphertext,fingerprint=excluded.fingerprint,updated_at=excluded.updated_at",[e,this.encrypt(t),ov("sha256").update(t).digest("hex"),r,r])}async resolve(e){let t=this.controlPlane.database.query("SELECT ciphertext FROM data_service_secrets WHERE reference = ?").get(e);if(!t)throw Error("Data-service secret was not found.");return this.decrypt(t.ciphertext)}async remove(e){this.controlPlane.database.run("DELETE FROM data_service_secrets WHERE reference = ?",[e])}}var eA=async(e)=>{let t=Bun.spawn(e,{stdout:"pipe",stderr:"pipe"}),[r,a,u]=await Promise.all([t.exited,new Response(t.stdout).text(),new Response(t.stderr).text()]);return{code:r,stdout:a,stderr:u}};class Qu{async scan(e,t){return pi(e,t)}async exec(e,t){if(e.trustState!=="pinned")throw Error("SSH host key must be pinned before remote execution.");return eA(["ssh","-p",String(e.sshPort),"-o","BatchMode=yes","-o","StrictHostKeyChecking=yes","-o","ConnectTimeout=10",`${e.sshUser}@${e.endpoint}`,t])}}var tA=yt,rA=`set -eu; printf '{'; printf '"os":"%s",' "$(. /etc/os-release 2>/dev/null; printf %s "\${PRETTY_NAME:-Linux}")"; printf '"arch":"%s",' "$(uname -m)"; printf '"cpuCores":%s,' "$(getconf _NPROCESSORS_ONLN)"; printf '"memoryBytes":%s,' "$(awk '/MemTotal/{print $2*1024}' /proc/meminfo)"; printf '"diskBytes":%s,' "$(df -B1 / | awk 'NR==2{print $2}')"; printf '"diskFreeBytes":%s,' "$(df -B1 / | awk 'NR==2{print $4}')"; printf '"dnsOk":'; getent hosts example.com >/dev/null && printf true || printf false; printf ',"timeSkewSeconds":0,"tools":{"curl":"'; command -v curl >/dev/null && printf installed; printf '","tar":"'; command -v tar >/dev/null && printf installed; printf '"},"privilege":"'; sudo -n true >/dev/null 2>&1 && printf sudo || printf user; printf '"}'`;class wn{provider;transport;discoverer;constructor(e,t=new Qu,r){this.provider=e;this.transport=t;this.discoverer=r}discover(e){return this.discoverer?.(e)??Promise.resolve([])}async test(e){try{let t=await this.transport.scan(e.endpoint,e.sshPort);return{reachable:!0,hostKeyAlgorithm:t.algorithm,hostKeyFingerprint:tA(t.key),latencyMs:0}}catch{return{reachable:!1,hostKeyAlgorithm:"unknown",hostKeyFingerprint:"",latencyMs:0}}}async validate(e){let t=await this.transport.exec(e,rA);if(t.code!==0)throw Error(`Fleet validation failed: ${t.stderr.trim()||t.code}`);try{return JSON.parse(t.stdout)}catch{throw Error("Fleet validation returned malformed facts.")}}async bootstrap(e,t){let r=await this.transport.exec(e,`sudo -n ts-cloud-agent bootstrap --version 1 --steps ${t.length}`);if(r.code!==0)throw Error(`Fleet bootstrap failed: ${r.stderr.trim()||r.code}`);return{version:"1"}}capabilities(){return{document:{supported:!0,reason:"fleet-capabilities/v1; sha256:driver-contract"},validate:{supported:!0},bootstrap:{supported:!0},heartbeat:{supported:!0},drain:{supported:!0},archive:{supported:!0},terminate:{supported:!1,reason:"Inventory removal never terminates provider infrastructure."}}}}function Hu(e,t){return{"fleet.bootstrap":async(r)=>{let a=r.operation.input&&typeof r.operation.input==="object"&&!Array.isArray(r.operation.input)?r.operation.input:{},u=e.get(String(a.serverId??""));if(!u)throw Error("Queued fleet server was not found.");let f=t.find((S)=>S.provider===u.provider);if(!f)throw Error(`No ${u.provider} fleet driver is configured.`);let h=Array.isArray(a.steps)?a.steps.map(String):[];if(r.checkpoint("preflight","Rechecking pinned trust and healthy validation."),u.trustState!=="pinned"||!u.validation?.valid)throw Error("Fleet bootstrap requires pinned trust and a healthy validation report.");r.checkpoint("bootstrap","Applying the reviewed idempotent bootstrap plan.");let b=await f.bootstrap(u,h);return e.update(u.id,{bootstrapVersion:b.version,status:"ready"}),r.checkpoint("verify","Bootstrap completed; heartbeat can now establish freshness."),{serverId:u.id,bootstrapVersion:b.version,steps:h.length}}}}var ti=(e)=>e==null?void 0:String(e),mo=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},Jp=(e)=>({id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),resourceId:String(e.resource_id),name:String(e.name),provider:String(e.provider),providerId:ti(e.provider_id),region:ti(e.region),zone:ti(e.zone),endpoint:String(e.endpoint),sshUser:String(e.ssh_user),sshPort:Number(e.ssh_port),credentialRef:String(e.credential_ref),hostKeyAlgorithm:ti(e.host_key_algorithm),hostKeyFingerprint:ti(e.host_key_fingerprint),pendingHostKey:ti(e.pending_host_key),roles:mo(e.roles,[]),labels:mo(e.labels,{}),taints:mo(e.taints,[]),capacity:mo(e.capacity,{}),usage:mo(e.usage,{}),capabilities:mo(e.capabilities,{}),status:String(e.status),trustState:String(e.trust_state),validation:mo(e.validation,void 0),bootstrapVersion:ti(e.bootstrap_version),heartbeatAt:ti(e.heartbeat_at),lastSeenAt:ti(e.last_seen_at),archivedAt:ti(e.archived_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)});class Ua{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}get(e){let t=this.control.database.query("SELECT * FROM fleet_servers WHERE id=?").get(e);return t?Jp(t):void 0}list(e,t=!1){return this.control.database.query("SELECT * FROM fleet_servers WHERE project_id=? ORDER BY name").all(e).map(Jp).filter((r)=>t||r.status!=="archived")}findProvider(e,t,r){let a=this.control.database.query("SELECT * FROM fleet_servers WHERE organization_id=? AND provider=? AND provider_id=? AND archived_at IS NULL").get(e,t,r);return a?Jp(a):void 0}create(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO fleet_servers (id,organization_id,project_id,resource_id,name,provider,provider_id,region,zone,endpoint,ssh_user,ssh_port,credential_ref,host_key_algorithm,host_key_fingerprint,pending_host_key,roles,labels,taints,capacity,usage,capabilities,status,trust_state,validation,bootstrap_version,heartbeat_at,last_seen_at,archived_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.resourceId,e.name,e.provider,e.providerId??null,e.region??null,e.zone??null,e.endpoint,e.sshUser,e.sshPort,e.credentialRef,e.hostKeyAlgorithm??null,e.hostKeyFingerprint??null,e.pendingHostKey??null,JSON.stringify(e.roles),JSON.stringify(e.labels),JSON.stringify(e.taints),JSON.stringify(e.capacity),JSON.stringify(e.usage),JSON.stringify(e.capabilities),e.status,e.trustState,JSON.stringify(e.validation??{}),e.bootstrapVersion??null,e.heartbeatAt??null,e.lastSeenAt??null,e.archivedAt??null,r,r]),this.get(t)}update(e,t){let r=this.get(e);if(!r)throw Error("Server was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE fleet_servers SET name=?,provider_id=?,region=?,zone=?,endpoint=?,ssh_user=?,ssh_port=?,credential_ref=?,host_key_algorithm=?,host_key_fingerprint=?,pending_host_key=?,roles=?,labels=?,taints=?,capacity=?,usage=?,capabilities=?,status=?,trust_state=?,validation=?,bootstrap_version=?,heartbeat_at=?,last_seen_at=?,archived_at=?,version=version+1,updated_at=? WHERE id=?",[a.name,a.providerId??null,a.region??null,a.zone??null,a.endpoint,a.sshUser,a.sshPort,a.credentialRef,a.hostKeyAlgorithm??null,a.hostKeyFingerprint??null,a.pendingHostKey??null,JSON.stringify(a.roles),JSON.stringify(a.labels),JSON.stringify(a.taints),JSON.stringify(a.capacity),JSON.stringify(a.usage),JSON.stringify(a.capabilities),a.status,a.trustState,JSON.stringify(a.validation??{}),a.bootstrapVersion??null,a.heartbeatAt??null,a.lastSeenAt??null,a.archivedAt??null,u,e]),this.get(e)}}var nA=/^(?:[A-Za-z0-9](?:[A-Za-z0-9.-]{0,251}[A-Za-z0-9])?|\[[0-9a-fA-F:]+\])$/;class Qa{store;drivers;now;queue;constructor(e,t,r,a=()=>new Date){this.store=e;this.drivers=t;this.now=a;this.queue=r??new c(e.control)}driver(e){let t=this.drivers.find((r)=>r.provider===e);if(!t)throw Error(`No ${e} fleet driver is configured.`);return t}enroll(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Server name is invalid.");if(!nA.test(e.endpoint)||e.sshUser==="root"||!e.credentialRef.startsWith("secret://"))throw Error("Enrollment requires a valid endpoint, non-root SSH user, and secret credential reference.");let t=e.providerId?this.store.findProvider(e.organizationId,e.provider,e.providerId):void 0;if(t)return this.store.update(t.id,{endpoint:e.endpoint,region:e.region,zone:e.zone});let r=this.store.control.createResource({projectId:e.projectId,kind:"server",slug:e.name,name:e.name,provider:e.provider,providerId:e.providerId}),a=this.driver(e.provider);return this.store.create({...e,resourceId:r.id,sshPort:e.sshPort??22,labels:e.labels??{},taints:[],capacity:{},usage:{},capabilities:a.capabilities(),status:"pending",trustState:"unverified"})}async test(e){let t=this.store.get(e);if(!t)throw Error("Server was not found.");let r=await this.driver(t.provider).test(t);if(!r.reachable)return this.store.update(e,{status:"unreachable"});if(t.hostKeyFingerprint&&t.hostKeyFingerprint!==r.hostKeyFingerprint)return this.store.update(e,{status:"degraded",trustState:"rotation_pending",pendingHostKey:r.hostKeyFingerprint});return this.store.update(e,{hostKeyAlgorithm:r.hostKeyAlgorithm,hostKeyFingerprint:r.hostKeyFingerprint,pendingHostKey:void 0,trustState:"pinned",status:"validating",lastSeenAt:this.now().toISOString()})}reviewHostKey(e,t){let r=this.store.get(e);if(!r||r.pendingHostKey!==t)throw Error("Pending host key does not match.");return this.store.update(e,{hostKeyFingerprint:t,pendingHostKey:void 0,trustState:"pinned",status:"validating"})}async validate(e){let t=this.store.get(e);if(!t||t.trustState!=="pinned")throw Error("Pin the SSH host key before validation.");let r=await this.driver(t.provider).validate(t),a=[];if(!["x64","arm64","x86_64","aarch64"].includes(r.arch??""))a.push({code:"arch.unsupported",severity:"error",message:"Unsupported architecture.",remediation:"Use x86_64 or arm64 Linux."});for(let h of["curl","tar"])if(!r.tools?.[h])a.push({code:`tool.${h}`,severity:"error",message:`${h} is missing.`,remediation:`Install ${h} before bootstrap.`});if(Math.abs(r.timeSkewSeconds??0)>60)a.push({code:"time.skew",severity:"error",message:"Clock skew exceeds 60 seconds.",remediation:"Enable NTP synchronization."});if(!r.dnsOk)a.push({code:"dns.failed",severity:"error",message:"DNS validation failed.",remediation:"Repair resolver configuration."});let u={valid:!a.some((h)=>h.severity==="error"),facts:r,findings:a,validatedAt:this.now().toISOString(),validatorVersion:"1"},f={cpu:r.cpuCores??0,memoryBytes:r.memoryBytes??0,diskBytes:r.diskBytes??0};return this.store.update(e,{validation:u,capacity:f,status:u.valid?"ready":"degraded"})}bootstrap(e,t=!1){let r=this.store.get(e);if(!r?.validation?.valid)throw Error("A healthy validation report is required.");let a=["install runtime dependencies","install ts-cloud agent","configure heartbeat","verify least-privilege access"];if(!t)return{preview:!0,steps:a};let u=this.queue.enqueue({projectId:r.projectId,resourceId:r.resourceId,kind:"fleet.bootstrap",input:{serverId:e,steps:a},lockKey:`server:${e}`,providerKey:r.provider}).operation;return{preview:!1,steps:a,operation:u}}heartbeat(e,t){let r=this.store.get(e);if(!r)throw Error("Server was not found.");let a=this.now().toISOString();return this.store.update(e,{usage:t.usage,capabilities:t.capabilities??r.capabilities,heartbeatAt:a,lastSeenAt:a,status:r.status==="draining"||r.status==="drained"?r.status:"ready"})}drain(e,t=!1){return this.store.update(e,{status:t?"drained":"draining"})}uncordon(e){return this.store.update(e,{status:"ready"})}archive(e,t){let r=this.store.get(e);if(!r||t!==r.name)throw Error("Exact server name confirmation is required.");return this.store.update(e,{status:"archived",archivedAt:this.now().toISOString()})}}var Kn=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},on=(e)=>e==null?void 0:String(e),Gu=()=>({cpu:0,memoryBytes:0,diskBytes:0,gpu:0}),Ir=(e={})=>({...Gu(),...e});function sv(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),name:String(e.name),purpose:String(e.purpose),backend:String(e.backend),region:on(e.region),architecture:on(e.architecture),labels:Kn(e.labels,{}),requiredServerLabels:Kn(e.required_server_labels,{}),toleratedTaints:Kn(e.tolerated_taints,[]),capacity:Ir(Kn(e.capacity,{})),reserved:Kn(e.reserved,{}),maxWorkloads:Number(e.max_workloads),costWeight:Number(e.cost_weight),spreadKey:on(e.spread_key),concurrency:Number(e.concurrency),ephemeralWorkspaces:Number(e.ephemeral_workspaces)===1,allowProductionSecrets:Number(e.allow_production_secrets)===1,status:String(e.status),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function av(e){return{id:String(e.id),projectId:String(e.project_id),environmentId:on(e.environment_id),resourceId:String(e.resource_id),releaseId:on(e.release_id),poolId:String(e.pool_id),serverId:on(e.server_id),purpose:String(e.purpose),requirements:Kn(e.requirements,{}),decision:Kn(e.decision,{}),stateful:Number(e.stateful)===1,autoReschedule:Number(e.auto_reschedule)===1,status:String(e.status),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function iA(e){return{id:String(e.id),projectId:String(e.project_id),resourceId:on(e.resource_id),poolId:String(e.pool_id),placementId:on(e.placement_id),operationId:on(e.operation_id),sourceSha:String(e.source_sha),buildSpec:Kn(e.build_spec,{}),credentialPolicy:Kn(e.credential_policy,{productionSecrets:!1,shortLivedTokenExpiresAt:""}),workspace:on(e.workspace),cacheKey:on(e.cache_key),artifactUri:on(e.artifact_uri),artifactDigest:on(e.artifact_digest),status:String(e.status),cleanupAt:on(e.cleanup_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Ha{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}createPool(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO capacity_pools (id,organization_id,project_id,name,purpose,backend,region,architecture,labels,required_server_labels,tolerated_taints,capacity,reserved,max_workloads,cost_weight,spread_key,concurrency,ephemeral_workspaces,allow_production_secrets,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.name,e.purpose,e.backend,e.region??null,e.architecture??null,JSON.stringify(e.labels),JSON.stringify(e.requiredServerLabels),JSON.stringify(e.toleratedTaints),JSON.stringify(Ir(e.capacity)),"{}",e.maxWorkloads,e.costWeight,e.spreadKey??null,e.concurrency,e.ephemeralWorkspaces?1:0,e.allowProductionSecrets?1:0,e.status,r,r]),this.getPool(t)}getPool(e){let t=this.control.database.query("SELECT * FROM capacity_pools WHERE id=?").get(e);return t?sv(t):void 0}listPools(e){return this.control.database.query("SELECT * FROM capacity_pools WHERE project_id=? ORDER BY name").all(e).map(sv)}updatePool(e,t){let r=this.getPool(e);if(!r)throw Error("Capacity pool was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE capacity_pools SET status=?,reserved=?,capacity=?,concurrency=?,version=version+1,updated_at=? WHERE id=?",[a.status,JSON.stringify(a.reserved),JSON.stringify(a.capacity),a.concurrency,u,e]),this.getPool(e)}addMember(e,t,r={}){let a=this.now().toISOString();this.control.database.run("INSERT INTO capacity_pool_members (pool_id,server_id,capacity_override,status,created_at,updated_at) VALUES (?,?,?,'active',?,?) ON CONFLICT(pool_id,server_id) DO UPDATE SET capacity_override=excluded.capacity_override,status='active',updated_at=excluded.updated_at",[e,t,JSON.stringify(r),a,a])}members(e){return this.control.database.query("SELECT * FROM capacity_pool_members WHERE pool_id=? ORDER BY server_id").all(e).map((t)=>({serverId:String(t.server_id),status:String(t.status),capacityOverride:Kn(t.capacity_override,{})}))}memberStatus(e,t,r){this.control.database.run("UPDATE capacity_pool_members SET status=?,updated_at=? WHERE pool_id=? AND server_id=?",[r,this.now().toISOString(),e,t])}listPlacements(e,t){let r=this.control.database.query("SELECT * FROM workload_placements WHERE project_id=? ORDER BY created_at,id").all(e).map(av);return t?.length?r.filter((a)=>t.includes(a.status)):r}getPlacement(e){let t=this.control.database.query("SELECT * FROM workload_placements WHERE id=?").get(e);return t?av(t):void 0}activeUsage(e,t){let r=this.control.database.query("SELECT l.resources,l.server_id FROM capacity_leases l WHERE l.pool_id=? AND l.state='active' AND l.expires_at>?").all(e,this.now().toISOString()),a=t?r.filter((u)=>String(u.server_id)===t):r;return{resources:a.reduce((u,f)=>{let h=Ir(Kn(f.resources,{}));for(let b of Object.keys(u))u[b]+=h[b];return u},Gu()),count:a.length}}expireLeases(){return this.control.database.run("UPDATE capacity_leases SET state='expired',updated_at=? WHERE state='active' AND expires_at<=?",[this.now().toISOString(),this.now().toISOString()]).changes}reserve(e){return this.control.transaction(()=>{this.expireLeases();let t=this.id(),r=this.id(),a=this.now().toISOString(),u=new Date(this.now().getTime()+(e.requirements.leaseSeconds??300)*1000).toISOString();return this.control.database.run("INSERT INTO workload_placements (id,project_id,environment_id,resource_id,release_id,pool_id,server_id,purpose,requirements,decision,stateful,auto_reschedule,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,'reserved',?,?)",[t,e.projectId,e.environmentId??null,e.resourceId,e.releaseId??null,e.decision.poolId,e.decision.serverId??null,e.requirements.purpose,JSON.stringify(e.requirements),JSON.stringify(e.decision),e.requirements.stateful?1:0,e.requirements.autoReschedule&&!e.requirements.stateful?1:0,a,a]),this.control.database.run("INSERT INTO capacity_leases (id,placement_id,pool_id,server_id,resources,state,expires_at,created_at,updated_at) VALUES (?,?,?,?,?,'active',?,?,?)",[r,t,e.decision.poolId,e.decision.serverId??null,JSON.stringify(Ir(e.requirements.resources)),u,a,a]),this.getPlacement(t)})}transitionPlacement(e,t){if(!this.getPlacement(e))throw Error("Placement was not found.");let a=this.now().toISOString();if(this.control.database.run("UPDATE workload_placements SET status=?,version=version+1,updated_at=? WHERE id=?",[t,a,e]),["released","failed","blocked"].includes(t))this.control.database.run("UPDATE capacity_leases SET state='released',updated_at=? WHERE placement_id=? AND state='active'",[a,e]);return this.getPlacement(e)}createBuild(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO remote_builds (id,project_id,resource_id,pool_id,placement_id,operation_id,source_sha,build_spec,credential_policy,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,'queued',?,?)",[t,e.projectId,e.resourceId??null,e.poolId,e.placementId??null,e.operationId??null,e.sourceSha,JSON.stringify(e.buildSpec),JSON.stringify({productionSecrets:!1,shortLivedTokenExpiresAt:e.tokenExpiresAt}),r,r]),this.getBuild(t)}getBuild(e){let t=this.control.database.query("SELECT * FROM remote_builds WHERE id=?").get(e);return t?iA(t):void 0}updateBuild(e,t){let r=this.getBuild(e);if(!r)throw Error("Remote build was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE remote_builds SET operation_id=?,workspace=?,cache_key=?,artifact_uri=?,artifact_digest=?,status=?,cleanup_at=?,updated_at=? WHERE id=?",[a.operationId??null,a.workspace??null,a.cacheKey??null,a.artifactUri??null,a.artifactDigest??null,a.status,a.cleanupAt??null,u,e]),this.getBuild(e)}}var Nd=["cpu","memoryBytes","diskBytes","gpu"],cv=(e,t={})=>Object.entries(t).every(([r,a])=>e[r]===a),oA=(e,t,r)=>Object.fromEntries(Nd.map((a)=>[a,Math.max(0,e[a]-t[a]-(r[a]??0))])),sA=(e,t)=>Nd.every((r)=>e[r]>=(t[r]??0)),aA=(e,t)=>Nd.reduce((r,a)=>r+(t[a]??0)/(e[a]||1),0);class Ga{store;fleet;constructor(e,t){this.store=e;this.fleet=t}poolCandidates(e,t,r){let a=[];for(let u of this.store.listPools(e)){if(u.id===r)continue;let f=[];if(u.status!=="active")f.push(`pool is ${u.status}`);if(u.purpose!==t.purpose)f.push(`purpose is ${u.purpose}`);if(t.region&&u.region!==t.region)f.push(`region is ${u.region??"unset"}`);if(t.architecture&&u.architecture!==t.architecture)f.push(`architecture is ${u.architecture??"unset"}`);if(!cv(u.labels,t.labels))f.push("pool labels do not match");if(u.backend==="server"){let h=this.store.members(u.id);if(!h.length)a.push(this.decision(u,void 0,t,[...f,"pool has no servers"]));for(let b of h){let S=this.fleet.get(b.serverId),y=[...f];if(!S)y.push("server is missing");else this.serverReasons(u,S,b.status,t,y);a.push(this.decision(u,S,t,y,b.capacityOverride))}}else a.push(this.decision(u,void 0,t,f))}return a.sort((u,f)=>Number(f.eligible)-Number(u.eligible)||u.score.cost-f.score.cost||u.score.spread-f.score.spread||u.score.fit-f.score.fit||u.poolName.localeCompare(f.poolName)||(u.serverId??"").localeCompare(f.serverId??""))}serverReasons(e,t,r,a,u){if(r!=="active")u.push(`member is ${r}`);if(t.status!=="ready")u.push(`server is ${t.status}`);if(!t.roles.includes(a.purpose==="build"?"build":a.purpose))u.push(`server lacks ${a.purpose} role`);if(!cv(t.labels,e.requiredServerLabels))u.push("server labels do not match pool selector");for(let f of t.taints)if(!e.toleratedTaints.includes(f))u.push(`taint ${f} is not tolerated`)}decision(e,t,r,a,u={}){let f=Ir({...t?.capacity,...u}),h=t?Object.fromEntries(Nd.map((y)=>[y,Math.min(e.capacity[y],f[y])])):e.capacity,b=this.store.activeUsage(e.id,t?.id),S=oA(h,b.resources,e.reserved);if(b.count>=e.maxWorkloads)a.push("workload limit reached");if(r.purpose==="build"&&b.count>=e.concurrency)a.push("build concurrency reached");if(!sA(S,r.resources))a.push("insufficient capacity");return{poolId:e.id,poolName:e.name,serverId:t?.id,eligible:a.length===0,reasons:a,available:S,score:{fit:aA(S,r.resources),spread:b.count,cost:e.costWeight}}}explain(e,t){return this.poolCandidates(e,t)}place(e){return this.store.control.transaction(()=>{let t=this.poolCandidates(e.projectId,e.requirements).find((r)=>r.eligible);if(!t)throw Error(`No eligible capacity: ${this.explain(e.projectId,e.requirements).flatMap((r)=>r.reasons).join("; ")}`);return this.store.reserve({...e,decision:t})})}activate(e){return this.store.transitionPlacement(e,"active")}release(e){return this.store.transitionPlacement(e,"released")}drainPool(e){let t=this.store.updatePool(e,{status:"draining"}),r=[],a=[];for(let u of this.store.listPlacements(t.projectId,["reserved","active"]).filter((f)=>f.poolId===e)){if(u.stateful){a.push(this.store.transitionPlacement(u.id,"blocked"));continue}this.store.transitionPlacement(u.id,"moving");let f=this.place({projectId:u.projectId,environmentId:u.environmentId,resourceId:u.resourceId,releaseId:u.releaseId,requirements:u.requirements});r.push(this.activate(f.id)),this.store.transitionPlacement(u.id,"released")}return{pool:t,moved:r,blocked:a}}drainServer(e,t){this.store.memberStatus(e,t,"draining");let r=this.store.getPool(e);if(!r)throw Error("Capacity pool was not found.");let a=[],u=[];for(let f of this.store.listPlacements(r.projectId,["reserved","active"]).filter((h)=>h.poolId===e&&h.serverId===t)){if(f.stateful){u.push(this.store.transitionPlacement(f.id,"blocked"));continue}this.store.transitionPlacement(f.id,"moving");let h=this.poolCandidates(f.projectId,f.requirements).find((S)=>S.eligible);if(!h){u.push(this.store.transitionPlacement(f.id,"blocked"));continue}let b=this.store.reserve({projectId:f.projectId,environmentId:f.environmentId,resourceId:f.resourceId,releaseId:f.releaseId,requirements:f.requirements,decision:h});a.push(this.activate(b.id)),this.store.transitionPlacement(f.id,"released")}return{moved:a,blocked:u}}reconcileFailure(e){let t=this.fleet.get(e);if(!t)throw Error("Server was not found.");let r=[],a=[];for(let u of this.store.listPlacements(t.projectId,["active"]).filter((f)=>f.serverId===e)){if(u.stateful||!u.autoReschedule){a.push(this.store.transitionPlacement(u.id,"blocked"));continue}this.store.transitionPlacement(u.id,"failed");let f=this.place({projectId:u.projectId,environmentId:u.environmentId,resourceId:u.resourceId,releaseId:u.releaseId,requirements:u.requirements});r.push(this.activate(f.id))}return{rescheduled:r,blocked:a}}}class uh{store;placement;now;queue;constructor(e,t,r,a=()=>new Date){this.store=e;this.placement=t;this.now=a;this.queue=r??new c(e.control)}enqueue(e){if(!/^[a-f0-9]{7,64}$/i.test(e.sourceSha))throw Error("A pinned source commit SHA is required.");let t={purpose:"build",resources:{cpu:1,memoryBytes:1073741824,diskBytes:5368709120},leaseSeconds:3600,...e.requirements},r=this.placement.place({projectId:e.projectId,resourceId:e.resourceId,requirements:t}),a=new Date(this.now().getTime()+900000).toISOString(),u=this.store.createBuild({projectId:e.projectId,resourceId:e.resourceId,poolId:r.poolId,placementId:r.id,sourceSha:e.sourceSha,buildSpec:e.buildSpec,tokenExpiresAt:a}),f=this.queue.enqueue({projectId:e.projectId,resourceId:e.resourceId,kind:"build.remote",input:{buildId:u.id},lockKey:`build:${u.id}`,providerKey:`pool:${r.poolId}`,buildSlot:!0,timeoutSeconds:3600,cancellationMode:"cooperative",resumePolicy:"fail"}).operation;return u=this.store.updateBuild(u.id,{operationId:f.id}),u}cancel(e){let t=this.store.getBuild(e);if(!t)throw Error("Remote build was not found.");if(t.operationId)this.queue.requestCancellation(t.operationId);return this.store.updateBuild(e,{status:"cancelled"})}}var cA=/^sha256:[a-f0-9]{64}$/,dA=/^(?:s3|https|oci):\/\//;function QS(e,t){return{"build.remote":async(r)=>{let a=r.operation.input&&typeof r.operation.input==="object"&&!Array.isArray(r.operation.input)?r.operation.input:{},u=e.getBuild(String(a.buildId??""));if(!u)throw Error("Queued remote build was not found.");let f=e.getPool(u.poolId);if(!f||f.purpose!=="build"||f.status!=="active")throw Error("The selected build pool is unavailable.");if(!f.ephemeralWorkspaces)throw Error("Remote builds require an ephemeral workspace pool.");if(u.credentialPolicy.productionSecrets||f.allowProductionSecrets)throw Error("Production secrets are forbidden in remote build workers.");if(new Date(u.credentialPolicy.shortLivedTokenExpiresAt)<=new Date)throw Error("The short-lived build credential has expired.");let h=t.find((S)=>S.backend===f.backend);if(!h)throw Error(`No ${f.backend} remote build driver is configured.`);let b=`build://${f.id}/${u.id}`;e.updateBuild(u.id,{status:"running",workspace:b}),r.checkpoint("checkout",`Preparing isolated workspace for ${u.sourceSha}.`);try{r.throwIfCancellationRequested(),r.checkpoint("build","Executing resource-limited build.");let S=await h.run({build:e.getBuild(u.id),pool:f,signal:r.signal,log:(y)=>r.log(y,{stream:"stdout"})});if(r.throwIfCancellationRequested(),!cA.test(S.artifactDigest)||!dA.test(S.artifactUri))throw Error("Builder returned an unverified artifact reference.");return e.updateBuild(u.id,{status:"uploading",cacheKey:S.cacheKey,artifactUri:S.artifactUri,artifactDigest:S.artifactDigest}),r.checkpoint("verify","Verified content-addressed artifact upload."),await h.cleanup({build:e.getBuild(u.id),pool:f}),e.updateBuild(u.id,{status:"succeeded",workspace:void 0,cleanupAt:new Date().toISOString()}),{buildId:u.id,artifactUri:S.artifactUri,artifactDigest:S.artifactDigest,cacheKey:S.cacheKey??null}}catch(S){try{await h.cleanup({build:e.getBuild(u.id),pool:f}),e.updateBuild(u.id,{status:r.cancellationRequested()?"cancelled":"failed",workspace:void 0,cleanupAt:new Date().toISOString()})}catch{e.updateBuild(u.id,{status:"cleanup_required"})}throw S}}}}class Ss{backend;transport;handles=new Map;constructor(e,t){this.backend=e;this.transport=t}async run({build:e,pool:t,signal:r,log:a}){let u=await this.transport.provision({backend:this.backend,pool:t,build:e,tokenExpiresAt:e.credentialPolicy.shortLivedTokenExpiresAt});return this.handles.set(e.id,u.handle),a(`${this.backend} builder provisioned`),await this.transport.execute({handle:u.handle,spec:e.buildSpec,sourceSha:e.sourceSha,signal:r,onLog:a}),this.transport.publish({handle:u.handle,sourceSha:e.sourceSha})}async cleanup({build:e}){let t=this.handles.get(e.id);if(!t)return;await this.transport.destroy({handle:t}),this.handles.delete(e.id)}}var HS=(e)=>new Ss("server",e),GS=(e)=>new Ss("ecs",e),VS=(e)=>new Ss("asg",e);var yi=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},Mn=(e)=>e==null?void 0:String(e),dv=(e)=>({id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:Mn(e.environment_id),name:String(e.name),hostname:String(e.hostname),homeRegion:String(e.home_region),regions:yi(e.regions,[]),trafficPolicy:String(e.traffic_policy),dataPolicy:yi(e.data_policy,{replicate:[],maxLagSeconds:60,retainOnDestroy:!0}),status:String(e.status),activeRegion:String(e.active_region),revision:Mn(e.revision),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Gp=(e)=>({id:String(e.id),topologyId:String(e.topology_id),region:String(e.region),role:String(e.role),provider:String(e.provider),stackId:Mn(e.stack_id),stackRevision:Mn(e.stack_revision),status:String(e.status),health:yi(e.health,{}),lastHealthyAt:Mn(e.last_healthy_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Qp=(e)=>({id:String(e.id),topologyId:String(e.topology_id),kind:String(e.kind),sourceRegion:String(e.source_region),targetRegion:String(e.target_region),config:yi(e.config,{}),status:String(e.status),checkpoint:Mn(e.checkpoint),lagSeconds:e.lag_seconds==null?void 0:Number(e.lag_seconds),lastVerifiedAt:Mn(e.last_verified_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Yp=(e)=>({id:String(e.id),topologyId:String(e.topology_id),hostname:String(e.hostname),dnsProvider:String(e.dns_provider),cdnEnabled:Number(e.cdn_enabled)===1,wafEnabled:Number(e.waf_enabled)===1,weights:yi(e.weights,{}),desiredWeights:yi(e.desired_weights,{}),status:String(e.status),providerState:yi(e.provider_state,{}),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),lv=(e)=>({id:String(e.id),topologyId:String(e.topology_id),operationId:Mn(e.operation_id),kind:String(e.kind),requestedRegion:Mn(e.requested_region),revision:Mn(e.revision),plan:yi(e.plan,[]),currentStep:Mn(e.current_step),completedSteps:yi(e.completed_steps,[]),status:String(e.status),error:Mn(e.error),createdAt:String(e.created_at),updatedAt:String(e.updated_at)});class Va{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}create(e){return this.control.transaction(()=>{if(e.regions.length<2||new Set(e.regions.map((f)=>f.region)).size!==e.regions.length||e.regions.filter((f)=>f.role==="primary").length!==1)throw Error("A topology requires unique regions and exactly one primary.");let t=e.regions.find((f)=>f.role==="primary"),r=this.id(),a=this.now().toISOString();this.control.database.run("INSERT INTO regional_topologies (id,organization_id,project_id,environment_id,name,hostname,home_region,regions,traffic_policy,data_policy,status,active_region,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,'draft',?,?,?)",[r,e.organizationId,e.projectId,e.environmentId??null,e.name,e.hostname,t.region,JSON.stringify(e.regions),e.trafficPolicy,JSON.stringify(e.dataPolicy),t.region,a,a]);for(let f of e.regions)this.control.database.run("INSERT INTO regional_targets (id,topology_id,region,role,provider,status,created_at,updated_at) VALUES (?,?,?,?,?,'pending',?,?)",[this.id(),r,f.region,f.role,f.provider,a,a]);for(let f of e.dataPolicy.replicate)for(let h of e.regions)for(let b of e.regions.filter((S)=>S.region!==h.region))this.control.database.run("INSERT INTO regional_replication_channels (id,topology_id,kind,source_region,target_region,config,status,created_at,updated_at) VALUES (?,?,?,?,?,?,'pending',?,?)",[this.id(),r,f,h.region,b.region,"{}",a,a]);let u=Object.fromEntries(e.regions.map((f)=>[f.region,f.region===t.region?100:0]));return this.control.database.run("INSERT INTO regional_traffic_routes (id,topology_id,hostname,dns_provider,cdn_enabled,waf_enabled,weights,desired_weights,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?, 'pending',?,?)",[this.id(),r,e.hostname,e.dnsProvider??"route53",e.cdnEnabled?1:0,e.wafEnabled?1:0,JSON.stringify(u),JSON.stringify(u),a,a]),this.get(r)})}get(e){let t=this.control.database.query("SELECT * FROM regional_topologies WHERE id=?").get(e);return t?dv(t):void 0}list(e){return this.control.database.query("SELECT * FROM regional_topologies WHERE project_id=? ORDER BY name").all(e).map(dv)}targets(e){return this.control.database.query("SELECT * FROM regional_targets WHERE topology_id=? ORDER BY role,region").all(e).map(Gp)}channels(e){return this.control.database.query("SELECT * FROM regional_replication_channels WHERE topology_id=? ORDER BY kind,target_region").all(e).map(Qp)}route(e){let t=this.control.database.query("SELECT * FROM regional_traffic_routes WHERE topology_id=?").get(e);return t?Yp(t):void 0}updateTopology(e,t){let r=this.get(e);if(!r)throw Error("Regional topology was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE regional_topologies SET status=?,active_region=?,revision=?,regions=?,version=version+1,updated_at=? WHERE id=?",[a.status,a.activeRegion,a.revision??null,JSON.stringify(a.regions),u,e]),this.get(e)}updateTarget(e,t){let r=this.control.database.query("SELECT * FROM regional_targets WHERE id=?").get(e);if(!r)throw Error("Regional target was not found.");let a=Gp(r),u={...a,...t},f=this.now().toISOString();return this.control.database.run("UPDATE regional_targets SET role=?,stack_id=?,stack_revision=?,status=?,health=?,last_healthy_at=?,version=version+1,updated_at=? WHERE id=?",[u.role,u.stackId??null,u.stackRevision??null,u.status,JSON.stringify(u.health),u.lastHealthyAt??null,f,e]),Gp(this.control.database.query("SELECT * FROM regional_targets WHERE id=?").get(e))}updateChannel(e,t){let r=this.control.database.query("SELECT * FROM regional_replication_channels WHERE id=?").get(e);if(!r)throw Error("Replication channel was not found.");let a=Qp(r),u={...a,...t},f=this.now().toISOString();return this.control.database.run("UPDATE regional_replication_channels SET status=?,checkpoint=?,lag_seconds=?,last_verified_at=?,version=version+1,updated_at=? WHERE id=?",[u.status,u.checkpoint??null,u.lagSeconds??null,u.lastVerifiedAt??null,f,e]),Qp(this.control.database.query("SELECT * FROM regional_replication_channels WHERE id=?").get(e))}updateRoute(e,t){let r=this.control.database.query("SELECT * FROM regional_traffic_routes WHERE id=?").get(e);if(!r)throw Error("Traffic route was not found.");let a=Yp(r),u={...a,...t},f=this.now().toISOString();return this.control.database.run("UPDATE regional_traffic_routes SET weights=?,desired_weights=?,status=?,provider_state=?,version=version+1,updated_at=? WHERE id=?",[JSON.stringify(u.weights),JSON.stringify(u.desiredWeights),u.status,JSON.stringify(u.providerState),f,e]),Yp(this.control.database.query("SELECT * FROM regional_traffic_routes WHERE id=?").get(e))}createExecution(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO regional_executions (id,topology_id,operation_id,kind,requested_region,revision,plan,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,'queued',?,?)",[t,e.topologyId,e.operationId??null,e.kind,e.requestedRegion??null,e.revision??null,JSON.stringify(e.plan),r,r]),this.execution(t)}execution(e){let t=this.control.database.query("SELECT * FROM regional_executions WHERE id=?").get(e);return t?lv(t):void 0}executions(e){return this.control.database.query("SELECT * FROM regional_executions WHERE topology_id=? ORDER BY created_at DESC").all(e).map(lv)}updateExecution(e,t){let r=this.execution(e);if(!r)throw Error("Regional execution was not found.");let a={...r,...t},u=this.now().toISOString();return this.control.database.run("UPDATE regional_executions SET operation_id=?,current_step=?,completed_steps=?,status=?,error=?,updated_at=? WHERE id=?",[a.operationId??null,a.currentStep??null,JSON.stringify(a.completedSteps),a.status,a.error??null,u,e]),this.execution(e)}}class qa{store;queue;constructor(e,t){this.store=e;this.queue=t??new c(e.control)}create(e){return this.store.create(e)}plan(e,t,r){if(!this.store.get(e))throw Error("Regional topology was not found.");let u=this.store.targets(e),f=this.store.channels(e);if(t==="rollout")return[...u.filter((h)=>h.role==="secondary").map((h)=>`apply:${h.region}`),...u.filter((h)=>h.role==="primary").map((h)=>`apply:${h.region}`),...f.map((h)=>`replicate:${h.kind}:${h.targetRegion}`),"traffic:activate"];if(t==="failover"||t==="failback")return[`health:${r}`,`replication:${r}`,`traffic:${r}`,`roles:${r}`];if(t==="destroy")return["traffic:drain",...u.filter((h)=>h.role==="secondary").map((h)=>`delete:${h.region}`),...u.filter((h)=>h.role==="primary").map((h)=>`delete:${h.region}`),"complete"];return["observe","repair"]}enqueue(e){let t=this.store.get(e.topologyId);if(!t)throw Error("Regional topology was not found.");if(["failover","failback"].includes(e.kind)&&(!e.targetRegion||!t.regions.some((f)=>f.region===e.targetRegion)))throw Error("A topology target region is required.");if(e.kind==="failover"&&e.targetRegion===t.activeRegion)throw Error("Target region is already active.");if((e.kind==="destroy"||e.deleteData)&&e.confirmation!==t.name)throw Error("Exact topology name confirmation is required.");if(e.deleteData&&t.dataPolicy.retainOnDestroy)throw Error("Topology policy requires regional data retention.");if(e.kind==="rollout"&&!/^[A-Za-z0-9._:@/-]{7,200}$/.test(e.revision??""))throw Error("An immutable revision is required.");let r=this.plan(t.id,e.kind,e.targetRegion),a=this.store.createExecution({topologyId:t.id,kind:e.kind,requestedRegion:e.targetRegion,revision:e.revision,plan:r}),u=this.queue.enqueue({projectId:t.projectId,environmentId:t.environmentId,kind:`region.${e.kind}`,input:{executionId:a.id,manifest:e.manifest??{},deleteData:e.deleteData===!0},lockKey:`regional-topology:${t.id}`,providerKey:"multi-region",timeoutSeconds:7200,cancellationMode:"provider_non_cancellable",resumePolicy:"requeue",maxAttempts:3}).operation;return this.store.updateExecution(a.id,{operationId:u.id}),{execution:this.store.execution(a.id),operation:u}}}var lA=(e)=>e&&typeof e==="object"&&!Array.isArray(e)?e:{};function Vu(e,t){let r=(y)=>{let k=t.find((R)=>R.provider===y.provider);if(!k)throw Error(`No ${y.provider} regional driver is configured.`);return k},a=(y,k,R)=>{y.throwIfCancellationRequested(),y.checkpoint(R,R),e.updateExecution(k.id,{status:"running",currentStep:R,completedSteps:[...e.execution(k.id).completedSteps,R]})},u=async(y,k)=>{let R=e.route(y.id);if(!R)throw Error("Regional traffic route was not found.");let D=e.targets(y.id).find((M)=>M.region===y.activeRegion)??e.targets(y.id)[0];if(!D)throw Error("Regional traffic target was not found.");e.updateRoute(R.id,{status:"applying",desiredWeights:k});let O=await r(D).applyTraffic({route:e.route(y.id),topology:y,weights:k});e.updateRoute(R.id,{status:Object.values(k).every((M)=>M===0)?"drained":"in_sync",weights:k,providerState:O.providerState})},f=async(y,k,R,D)=>{e.updateTopology(R.id,{status:"provisioning"});let O=k.revision,M=D.manifest??{},z=e.targets(R.id).sort((Z,oe)=>Number(Z.role==="primary")-Number(oe.role==="primary"));for(let Z of z){a(y,k,`apply:${Z.region}`),e.updateTarget(Z.id,{status:"provisioning"});let oe=await r(Z).applyStack({target:Z,revision:O,manifest:M,signal:y.signal}),G=await r(Z).health({target:e.updateTarget(Z.id,{stackId:oe.stackId,stackRevision:O})});if(!G.healthy)throw Error(`Regional health gate failed in ${Z.region}.`);e.updateTarget(Z.id,{status:"ready",health:G.evidence,lastHealthyAt:new Date().toISOString()})}for(let Z of e.channels(R.id)){a(y,k,`replicate:${Z.kind}:${Z.targetRegion}`),e.updateChannel(Z.id,{status:"configuring"});let oe=z.find((he)=>he.region===Z.sourceRegion),G=await r(oe).configureReplication({channel:Z,topology:R}),te=await r(oe).verifyReplication({channel:e.updateChannel(Z.id,{checkpoint:G.checkpoint,lagSeconds:G.lagSeconds}),topology:R});if(!te.healthy||te.lagSeconds>R.dataPolicy.maxLagSeconds)throw Error(`${Z.kind} replication to ${Z.targetRegion} exceeds the RPO.`);e.updateChannel(Z.id,{status:"in_sync",checkpoint:te.checkpoint,lagSeconds:te.lagSeconds,lastVerifiedAt:new Date().toISOString()})}a(y,k,"traffic:activate");let J=Object.fromEntries(R.regions.map((Z)=>[Z.region,Z.region===R.activeRegion?100:0]));return await u(R,J),e.updateTopology(R.id,{status:"ready",revision:O}),{revision:O,activeRegion:R.activeRegion}},h=async(y,k,R)=>{let D=k.requestedRegion,O=e.targets(R.id).find((J)=>J.region===D);if(!O)throw Error("Requested regional target was not found.");e.updateTopology(R.id,{status:k.kind==="failover"?"failing_over":"failing_back"}),a(y,k,`health:${D}`);let M=await r(O).health({target:O});if(!M.healthy)throw Error(`Target region ${D} is unhealthy.`);e.updateTarget(O.id,{status:"ready",health:M.evidence,lastHealthyAt:new Date().toISOString()}),a(y,k,`replication:${D}`);for(let J of e.channels(R.id).filter((Z)=>Z.targetRegion===D)){let Z=await r(O).verifyReplication({channel:J,topology:R});if(!Z.healthy||Z.lagSeconds>R.dataPolicy.maxLagSeconds)throw Error(`${J.kind} replication is outside the failover RPO.`);e.updateChannel(J.id,{status:"in_sync",checkpoint:Z.checkpoint,lagSeconds:Z.lagSeconds,lastVerifiedAt:new Date().toISOString()})}a(y,k,`traffic:${D}`),await u(R,Object.fromEntries(R.regions.map((J)=>[J.region,J.region===D?100:0]))),a(y,k,`roles:${D}`);let z=R.regions.map((J)=>({...J,role:J.region===D?"primary":"secondary"}));for(let J of e.targets(R.id))e.updateTarget(J.id,{role:J.region===D?"primary":"secondary"});return e.updateTopology(R.id,{status:k.kind==="failover"?"failed_over":"ready",activeRegion:D,regions:z}),{activeRegion:D}},b=async(y,k,R,D)=>{e.updateTopology(R.id,{status:"destroying"}),a(y,k,"traffic:drain"),await u(R,Object.fromEntries(R.regions.map((M)=>[M.region,0])));let O=D.deleteData!==!0;for(let M of e.targets(R.id).sort((z,J)=>Number(z.role==="primary")-Number(J.role==="primary")))a(y,k,`delete:${M.region}`),e.updateTarget(M.id,{status:"deleting"}),await r(M).deleteStack({target:M,retainData:O,signal:y.signal}),e.updateTarget(M.id,{status:"deleted"});return a(y,k,"complete"),e.updateTopology(R.id,{status:"destroyed"}),{destroyed:!0,dataRetained:O}},S=async(y)=>{let k=lA(y.operation.input),R=e.execution(String(k.executionId??""));if(!R)throw Error("Regional execution was not found.");let D=e.get(R.topologyId);if(!D)throw Error("Regional topology was not found.");try{let O;if(R.kind==="rollout")O=await f(y,R,D,k);else if(R.kind==="failover"||R.kind==="failback")O=await h(y,R,D);else if(R.kind==="destroy")O=await b(y,R,D,k);else throw Error("Regional reconciliation is not configured.");return e.updateExecution(R.id,{status:"succeeded",currentStep:void 0}),{executionId:R.id,...O}}catch(O){if(e.updateExecution(R.id,{status:y.cancellationRequested()?"cancelled":"failed",error:O instanceof Error?O.message:String(O)}),e.get(D.id)?.status!=="destroyed")e.updateTopology(D.id,{status:"failed"});throw O}};return{"region.rollout":S,"region.failover":S,"region.failback":S,"region.destroy":S,"region.reconcile":S}}class gh{transport;provider="aws";constructor(e){this.transport=e}async applyStack({target:e,revision:t,manifest:r}){return this.transport.applyCloudFormation({region:e.region,stackId:e.stackId,revision:t,manifest:r})}async deleteStack({target:e,retainData:t}){if(!e.stackId)return;await this.transport.deleteCloudFormation({region:e.region,stackId:e.stackId,retainData:t})}async health({target:e}){if(!e.stackId)return{healthy:!1,evidence:{reason:"stack is not provisioned"}};return this.transport.stackHealth({region:e.region,stackId:e.stackId})}async configureReplication({channel:e}){let t={sourceRegion:e.sourceRegion,targetRegion:e.targetRegion,config:e.config};if(e.kind==="s3")return this.transport.configureS3Replication(t);if(e.kind==="dynamodb")return this.transport.configureDynamoGlobalTable(t);return this.transport.replicateSecrets(t)}async verifyReplication({channel:e}){return this.transport.verifyReplication({kind:e.kind,sourceRegion:e.sourceRegion,targetRegion:e.targetRegion,checkpoint:e.checkpoint})}async applyTraffic({route:e,weights:t}){return this.transport.applyEdge({hostname:e.hostname,weights:t,route53:e.dnsProvider==="route53",cloudFront:e.cdnEnabled,waf:e.wafEnabled})}}class ja{provider;reason;constructor(e,t="Configure a regional provider transport before executing this operation."){this.provider=e;this.reason=t}fail(){throw Error(this.reason)}async applyStack(){return this.fail()}async deleteStack(){this.fail()}async health(){return this.fail()}async configureReplication(){return this.fail()}async verifyReplication(){return this.fail()}async applyTraffic(){return this.fail()}}import{createHash as Zp,createPublicKey as gv,verify as uA}from"node:crypto";function Rn(e){if(e===null||typeof e!=="object")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(Rn).join(",")}]`;return`{${Object.keys(e).sort().map((t)=>`${JSON.stringify(t)}:${Rn(e[t])}`).join(",")}}`}var qu=(e)=>Zp("sha256").update(Rn(e)).digest("hex"),Is=(e)=>Zp("sha256").update(Rn(e)).digest("hex"),ju=(e)=>Zp("sha256").update(gv(e).export({type:"spki",format:"der"})).digest("hex");function zu(e,t,r){try{return uA(null,Buffer.from(Rn(e)),gv(r),Buffer.from(t,"base64"))}catch{return!1}}var uv=(e)=>e.replace(/^v/,"").split(/[.-]/).slice(0,3).map((t)=>Number(t)||0),pv=(e,t)=>{let r=uv(e),a=uv(t);for(let u=0;u<3;u++){let f=(r[u]??0)-(a[u]??0);if(f)return f}return 0};function Ku(e,t){let r=[];if(t.schemaVersion<e.minimumSchema)r.push(`schema ${t.schemaVersion} is below ${e.minimumSchema}`);if(t.schemaVersion>e.maximumSchema)r.push(`schema ${t.schemaVersion} is above ${e.maximumSchema}`);if(e.minimumVersion&&pv(t.currentVersion,e.minimumVersion)<0)r.push(`platform ${t.currentVersion} is below ${e.minimumVersion}`);if(pv(e.version,t.currentVersion)<=0)r.push(`version ${e.version} is not newer than ${t.currentVersion}`);if(!e.artifacts.some((a)=>a.platform===t.platform&&a.architecture===t.architecture))r.push(`no artifact for ${t.platform}/${t.architecture}`);return{compatible:r.length===0,reasons:r}}var vi=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},Nr=(e)=>e==null?void 0:String(e),pA=(e)=>({id:String(e.id),organizationId:String(e.organization_id),name:String(e.name),algorithm:"ed25519",publicKeyPem:String(e.public_key_pem),fingerprint:String(e.fingerprint),revokedAt:Nr(e.revoked_at),createdAt:String(e.created_at)}),mv=(e)=>({id:String(e.id),organizationId:String(e.organization_id),version:String(e.version),channel:String(e.channel),publishedAt:String(e.published_at),keyId:String(e.key_id),digest:String(e.digest),document:vi(e.document,{}),signature:String(e.signature),verificationStatus:String(e.verification_status),compatibility:vi(e.compatibility,{compatible:!1,reasons:[]}),createdAt:String(e.created_at)}),fv=(e)=>({id:String(e.id),projectId:String(e.project_id),name:String(e.name),schedule:String(e.schedule),timezone:String(e.timezone),durationMinutes:Number(e.duration_minutes),allowedOperations:vi(e.allowed_operations,[]),requireApproval:Number(e.require_approval)===1,enabled:Number(e.enabled)===1,createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),hv=(e)=>({id:String(e.id),projectId:String(e.project_id),manifestId:String(e.manifest_id),windowId:Nr(e.window_id),fromVersion:String(e.from_version),strategy:String(e.strategy),batchSize:Number(e.batch_size),healthGate:vi(e.health_gate,{}),status:String(e.status),currentStage:Nr(e.current_stage),backupId:Nr(e.backup_id),approvedBy:Nr(e.approved_by),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),Xp=(e)=>({id:String(e.id),campaignId:String(e.campaign_id),serverId:Nr(e.server_id),target:String(e.target),cohort:Number(e.cohort),previousVersion:String(e.previous_version),status:String(e.status),evidence:vi(e.evidence,{}),error:Nr(e.error),startedAt:Nr(e.started_at),finishedAt:Nr(e.finished_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),yv=(e)=>({id:String(e.id),projectId:String(e.project_id),kind:String(e.kind),criteria:vi(e.criteria,{}),candidates:vi(e.candidates,[]),candidateDigest:String(e.candidate_digest),estimatedBytes:Number(e.estimated_bytes),status:String(e.status),confirmation:Nr(e.confirmation),expiresAt:String(e.expires_at),result:vi(e.result,{}),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}),vv=(e)=>({id:String(e.id),projectId:String(e.project_id),backupPolicyId:Nr(e.backup_policy_id),recoveryPointId:Nr(e.recovery_point_id),topologyId:Nr(e.topology_id),scenario:String(e.scenario),isolatedTarget:String(e.isolated_target),expectedRpoMinutes:Number(e.expected_rpo_minutes),expectedRtoMinutes:Number(e.expected_rto_minutes),status:String(e.status),operationId:Nr(e.operation_id),evidence:vi(e.evidence,{}),measuredRpoMinutes:e.measured_rpo_minutes==null?void 0:Number(e.measured_rpo_minutes),measuredRtoMinutes:e.measured_rto_minutes==null?void 0:Number(e.measured_rto_minutes),cleanupVerified:Number(e.cleanup_verified)===1,error:Nr(e.error),startedAt:Nr(e.started_at),finishedAt:Nr(e.finished_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)});class za{control;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.control=e;this.now=t;this.id=r}addTrustedKey(e){let t=this.id(),r=this.now().toISOString(),a=ju(e.publicKeyPem);return this.control.database.run("INSERT INTO platform_trusted_keys (id,organization_id,name,algorithm,public_key_pem,fingerprint,created_at) VALUES (?,?,?,'ed25519',?,?,?)",[t,e.organizationId,e.name,e.publicKeyPem,a,r]),this.key(t)}key(e){let t=this.control.database.query("SELECT * FROM platform_trusted_keys WHERE id=?").get(e);return t?pA(t):void 0}revokeKey(e){return this.control.database.run("UPDATE platform_trusted_keys SET revoked_at=? WHERE id=?",[this.now().toISOString(),e]),this.key(e)}importManifest(e){let t=this.key(e.keyId);if(!t||t.organizationId!==e.organizationId)throw Error("Trusted update key was not found.");if(t.revokedAt)throw Error("Update signing key is revoked.");if(!zu(e.document,e.signature,t.publicKeyPem))throw Error("Update manifest signature is invalid.");let r=Ku(e.document,e.current),a=qu(e.document),u=this.id(),f=this.now().toISOString();return this.control.database.run("INSERT INTO platform_update_manifests (id,organization_id,version,channel,published_at,key_id,digest,document,signature,verification_status,compatibility,created_at) VALUES (?,?,?,?,?,?,?,?,?,'verified',?,?)",[u,e.organizationId,e.document.version,e.document.channel,new Date(e.document.publishedAt).toISOString(),e.keyId,a,JSON.stringify(e.document),e.signature,JSON.stringify(r),f]),this.manifest(u)}manifest(e){let t=this.control.database.query("SELECT * FROM platform_update_manifests WHERE id=?").get(e);return t?mv(t):void 0}manifests(e){return this.control.database.query("SELECT * FROM platform_update_manifests WHERE organization_id=? ORDER BY published_at DESC").all(e).map(mv)}createWindow(e){let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO maintenance_windows (id,project_id,name,schedule,timezone,duration_minutes,allowed_operations,require_approval,enabled,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,1,?,?)",[t,e.projectId,e.name,e.schedule,e.timezone,e.durationMinutes,JSON.stringify(e.allowedOperations),e.requireApproval===!1?0:1,r,r]),this.window(t)}window(e){let t=this.control.database.query("SELECT * FROM maintenance_windows WHERE id=?").get(e);return t?fv(t):void 0}windows(e){return this.control.database.query("SELECT * FROM maintenance_windows WHERE project_id=? ORDER BY name").all(e).map(fv)}createCampaign(e){return this.control.transaction(()=>{let t=this.manifest(e.manifestId);if(!t?.compatibility.compatible||t.verificationStatus!=="verified")throw Error("A verified compatible update manifest is required.");if(!e.backupId)throw Error("A verified pre-upgrade backup is required.");let r=this.id(),a=this.now().toISOString();return this.control.database.run("INSERT INTO platform_upgrade_campaigns (id,project_id,manifest_id,window_id,from_version,strategy,batch_size,health_gate,status,backup_id,approved_by,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?, 'planned',?,?,?,?)",[r,e.projectId,e.manifestId,e.windowId??null,e.fromVersion,e.strategy,e.batchSize,JSON.stringify(e.healthGate),e.backupId,e.approvedBy??null,a,a]),e.targets.forEach((u,f)=>this.control.database.run("INSERT INTO platform_upgrade_targets (id,campaign_id,server_id,target,cohort,previous_version,status,created_at,updated_at) VALUES (?,?,?,?,?,?,'pending',?,?)",[this.id(),r,u.serverId??null,u.target,e.strategy==="canary"?f===0?0:1+Math.floor((f-1)/e.batchSize):Math.floor(f/e.batchSize),u.previousVersion,a,a])),this.campaign(r)})}campaign(e){let t=this.control.database.query("SELECT * FROM platform_upgrade_campaigns WHERE id=?").get(e);return t?hv(t):void 0}campaigns(e){return this.control.database.query("SELECT * FROM platform_upgrade_campaigns WHERE project_id=? ORDER BY created_at DESC").all(e).map(hv)}targets(e){return this.control.database.query("SELECT * FROM platform_upgrade_targets WHERE campaign_id=? ORDER BY cohort,target").all(e).map(Xp)}updateCampaign(e,t){let r=this.campaign(e);if(!r)throw Error("Upgrade campaign was not found.");let a={...r,...t};return this.control.database.run("UPDATE platform_upgrade_campaigns SET status=?,current_stage=?,updated_at=? WHERE id=?",[a.status,a.currentStage??null,this.now().toISOString(),e]),this.campaign(e)}updateTarget(e,t){let r=this.control.database.query("SELECT * FROM platform_upgrade_targets WHERE id=?").get(e);if(!r)throw Error("Upgrade target was not found.");let a={...Xp(r),...t};return this.control.database.run("UPDATE platform_upgrade_targets SET status=?,evidence=?,error=?,started_at=?,finished_at=?,updated_at=? WHERE id=?",[a.status,JSON.stringify(a.evidence),a.error??null,a.startedAt??null,a.finishedAt??null,this.now().toISOString(),e]),Xp(this.control.database.query("SELECT * FROM platform_upgrade_targets WHERE id=?").get(e))}createCleanup(e){let t=[...e.candidates].sort((h,b)=>h.id.localeCompare(b.id)),r=Is(t),a=this.id(),u=this.now().toISOString(),f=new Date(this.now().getTime()+(e.ttlMinutes??60)*60000).toISOString();return this.control.database.run("INSERT INTO cleanup_plans (id,project_id,kind,criteria,candidates,candidate_digest,estimated_bytes,status,expires_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,'preview',?,?,?)",[a,e.projectId,e.kind,JSON.stringify(e.criteria),JSON.stringify(t),r,t.reduce((h,b)=>h+b.bytes,0),f,u,u]),this.cleanup(a)}cleanup(e){let t=this.control.database.query("SELECT * FROM cleanup_plans WHERE id=?").get(e);return t?yv(t):void 0}cleanups(e){return this.control.database.query("SELECT * FROM cleanup_plans WHERE project_id=? ORDER BY created_at DESC").all(e).map(yv)}updateCleanup(e,t){let r=this.cleanup(e);if(!r)throw Error("Cleanup plan was not found.");let a={...r,...t};return this.control.database.run("UPDATE cleanup_plans SET status=?,confirmation=?,result=?,updated_at=? WHERE id=?",[a.status,a.confirmation??null,JSON.stringify(a.result),this.now().toISOString(),e]),this.cleanup(e)}createDrill(e){if(!/^isolated:\/\//.test(e.isolatedTarget))throw Error("DR drills require an isolated target.");let t=this.id(),r=this.now().toISOString();return this.control.database.run("INSERT INTO disaster_recovery_drills (id,project_id,backup_policy_id,recovery_point_id,topology_id,scenario,isolated_target,expected_rpo_minutes,expected_rto_minutes,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,'planned',?,?)",[t,e.projectId,e.backupPolicyId??null,e.recoveryPointId??null,e.topologyId??null,e.scenario,e.isolatedTarget,e.expectedRpoMinutes,e.expectedRtoMinutes,r,r]),this.drill(t)}drill(e){let t=this.control.database.query("SELECT * FROM disaster_recovery_drills WHERE id=?").get(e);return t?vv(t):void 0}drills(e){return this.control.database.query("SELECT * FROM disaster_recovery_drills WHERE project_id=? ORDER BY created_at DESC").all(e).map(vv)}updateDrill(e,t){let r=this.drill(e);if(!r)throw Error("DR drill was not found.");let a={...r,...t};return this.control.database.run("UPDATE disaster_recovery_drills SET status=?,operation_id=?,evidence=?,measured_rpo_minutes=?,measured_rto_minutes=?,cleanup_verified=?,error=?,started_at=?,finished_at=?,updated_at=? WHERE id=?",[a.status,a.operationId??null,JSON.stringify(a.evidence),a.measuredRpoMinutes??null,a.measuredRtoMinutes??null,a.cleanupVerified?1:0,a.error??null,a.startedAt??null,a.finishedAt??null,this.now().toISOString(),e]),this.drill(e)}}function ph(e,t=new Date){if(!e.enabled)return!1;let r=new Date(e.schedule);if(!Number.isNaN(r.getTime()))return t>=r&&t.getTime()<=r.getTime()+e.durationMinutes*60000;let a=/^(\d{2}):(\d{2})$/.exec(e.schedule);if(!a)return!1;let u=new Intl.DateTimeFormat("en-US",{timeZone:e.timezone,hour:"2-digit",minute:"2-digit",hourCycle:"h23"}).formatToParts(t),f=Number(u.find((b)=>b.type==="hour")?.value)*60+Number(u.find((b)=>b.type==="minute")?.value),h=Number(a[1])*60+Number(a[2]);return f>=h&&f<h+e.durationMinutes}class Ka{store;now;queue;constructor(e,t,r=()=>new Date){this.store=e;this.now=r;this.queue=t??new c(e.control)}enqueueCampaign(e,t={}){let r=this.store.campaign(e);if(!r)throw Error("Upgrade campaign was not found.");let a=r.windowId?this.store.window(r.windowId):void 0;if(a&&!a.allowedOperations.includes("platform.upgrade"))throw Error("Maintenance window does not permit platform upgrades.");if(a&&!t.overrideWindow&&!ph(a,this.now()))throw Error("Upgrade is outside its maintenance window.");if(a?.requireApproval&&!t.approvedBy&&!r.approvedBy)throw Error("Maintenance approval is required.");let u=this.queue.enqueue({projectId:r.projectId,actorId:t.approvedBy,kind:"maintenance.upgrade",input:{campaignId:e},lockKey:"platform-upgrade",providerKey:"platform",timeoutSeconds:7200,cancellationMode:"cooperative",resumePolicy:"fail"}).operation;return{campaign:this.store.updateCampaign(e,{status:"queued"}),operation:u}}async previewCleanup(e,t){let r=t.find((a)=>a.kind===e.kind);if(!r)throw Error(`No ${e.kind} cleanup driver is configured.`);return this.store.createCleanup({...e,candidates:await r.discover(e.criteria)})}enqueueCleanup(e,t){let r=this.store.cleanup(e);if(!r||r.status!=="preview")throw Error("A current cleanup preview is required.");if(new Date(r.expiresAt)<=this.now())throw Error("Cleanup preview expired; generate it again.");let a=`DELETE ${r.candidates.length} ${r.kind}`;if(t!==a)throw Error(`Exact confirmation ${a} is required.`);let u=this.queue.enqueue({projectId:r.projectId,kind:"maintenance.cleanup",input:{planId:e},lockKey:`cleanup:${r.kind}`,providerKey:"cleanup",timeoutSeconds:3600,cancellationMode:"cooperative"}).operation;return{plan:this.store.updateCleanup(e,{status:"approved",confirmation:t}),operation:u}}enqueueDrill(e){let t=this.store.drill(e);if(!t||t.status!=="planned")throw Error("A planned DR drill is required.");let r=this.queue.enqueue({projectId:t.projectId,kind:"maintenance.drill",input:{drillId:e},lockKey:`drill:${t.scenario}:${t.id}`,providerKey:"recovery",timeoutSeconds:7200,cancellationMode:"cooperative"}).operation;return{drill:this.store.updateDrill(e,{status:"queued",operationId:r.id}),operation:r}}}var vg=(e)=>e&&typeof e==="object"&&!Array.isArray(e)?e:{};function Wu(e){return{"maintenance.upgrade":async(u)=>{let f=e.store.campaign(String(vg(u.operation.input).campaignId??""));if(!f||!e.platform)throw Error("Upgrade campaign or platform maintenance driver is unavailable.");let h=e.store.manifest(f.manifestId);if(!h?.compatibility.compatible||h.verificationStatus!=="verified")throw Error("Update manifest is no longer verified and compatible.");let b=h.document.artifacts.find((y)=>y.platform===process.platform&&y.architecture===process.arch)??h.document.artifacts[0];if(!b)throw Error("No update artifact matches this platform.");e.store.updateCampaign(f.id,{status:"running",currentStage:"preflight"});let S=[];try{for(let y of[...new Set(e.store.targets(f.id).map((k)=>k.cohort))].sort((k,R)=>k-R)){e.store.updateCampaign(f.id,{currentStage:`cohort:${y}`});for(let k of e.store.targets(f.id).filter((R)=>R.cohort===y)){u.throwIfCancellationRequested(),u.checkpoint(`download:${k.target}`,"Downloading signed platform artifact."),e.store.updateTarget(k.id,{status:"downloading",startedAt:new Date().toISOString()});let R=await e.platform.download({target:k,artifact:b,signal:u.signal});if(R.sha256!==b.sha256)throw Error(`Artifact checksum mismatch for ${k.target}.`);u.checkpoint(`install:${k.target}`,"Installing verified artifact."),e.store.updateTarget(k.id,{status:"installing"}),await e.platform.install({target:k,path:R.path,version:h.version,signal:u.signal}),S.push(k);let D=await e.platform.health({target:k,gate:f.healthGate});if(!D.healthy)throw Error(`Upgrade health gate failed for ${k.target}.`);e.store.updateTarget(k.id,{status:"healthy",evidence:D.evidence,finishedAt:new Date().toISOString()})}}return e.store.updateCampaign(f.id,{status:"succeeded",currentStage:void 0}),{campaignId:f.id,version:h.version,targets:S.length}}catch(y){e.store.updateCampaign(f.id,{status:"rolling_back",currentStage:"rollback"});for(let k of S.reverse())e.store.updateTarget(k.id,{status:"rolling_back"}),await e.platform.rollback({target:k,version:k.previousVersion,signal:u.signal}),e.store.updateTarget(k.id,{status:"rolled_back",finishedAt:new Date().toISOString()});throw e.store.updateCampaign(f.id,{status:"rolled_back",currentStage:void 0}),y}},"maintenance.cleanup":async(u)=>{let f=e.store.cleanup(String(vg(u.operation.input).planId??""));if(!f||f.status!=="approved")throw Error("Approved cleanup plan was not found.");if(Is([...f.candidates].sort((k,R)=>k.id.localeCompare(R.id)))!==f.candidateDigest)throw Error("Cleanup candidate set changed after preview.");let h=e.cleanup?.find((k)=>k.kind===f.kind);if(!h)throw Error(`No ${f.kind} cleanup driver is configured.`);e.store.updateCleanup(f.id,{status:"running"});let b=[],S=[];for(let k of f.candidates){u.throwIfCancellationRequested();try{await h.remove(k),b.push(k.id)}catch(R){S.push({id:k.id,error:R instanceof Error?R.message:String(R)})}}let y=S.length?b.length?"partial":"failed":"succeeded";if(e.store.updateCleanup(f.id,{status:y,result:{removed:b,failed:S,reclaimedBytes:f.candidates.filter((k)=>b.includes(k.id)).reduce((k,R)=>k+R.bytes,0)}}),S.length)throw Error(`Cleanup failed for ${S.length} candidate(s).`);return{planId:f.id,removed:b.length,reclaimedBytes:f.estimatedBytes}},"maintenance.drill":async(u)=>{let f=e.store.drill(String(vg(u.operation.input).drillId??""));if(!f)throw Error("DR drill was not found.");let h=e.recovery?.find((R)=>R.scenario===f.scenario);if(!h)throw Error(`No ${f.scenario} recovery driver is configured.`);let b=new Date;e.store.updateDrill(f.id,{status:"restoring",startedAt:b.toISOString()});let S=f.isolatedTarget,y={},k={};try{u.checkpoint("restore","Restoring into isolated drill target.");let R=await h.restore({drill:f,signal:u.signal});if(!R.target.startsWith("isolated://"))throw Error("Recovery driver attempted a non-isolated target.");S=R.target,y=R.evidence;let D=(b.getTime()-new Date(R.recoveryPointAt).getTime())/60000;e.store.updateDrill(f.id,{status:"verifying",measuredRpoMinutes:D,evidence:{restore:y}}),u.checkpoint("verify","Running recovery health checks without production traffic.");let O=await h.verify({drill:f,target:S});k=O.evidence;let M=(Date.now()-b.getTime())/60000;if(!O.healthy||D>f.expectedRpoMinutes||M>f.expectedRtoMinutes)throw Error("DR drill failed its health, RPO, or RTO objective.");e.store.updateDrill(f.id,{measuredRpoMinutes:D,measuredRtoMinutes:M,evidence:{restore:y,verify:k}})}catch(R){throw e.store.updateDrill(f.id,{status:"failed",error:R instanceof Error?R.message:String(R),evidence:{restore:y,verify:k}}),R}finally{e.store.updateDrill(f.id,{status:"cleaning"});try{await h.cleanup({drill:f,target:S});let R=e.store.drill(f.id);e.store.updateDrill(f.id,{status:R.error?"failed":"passed",cleanupVerified:!0,finishedAt:new Date().toISOString()})}catch(R){e.store.updateDrill(f.id,{status:"cleanup_required",cleanupVerified:!1,error:R instanceof Error?R.message:String(R),finishedAt:new Date().toISOString()})}}return{drillId:f.id,status:e.store.drill(f.id).status}}}}class mh{transport;constructor(e){this.transport=e}download(e){return this.transport.download({target:e.target.target,url:e.artifact.url,signal:e.signal})}install(e){return this.transport.install({target:e.target.target,path:e.path,version:e.version,signal:e.signal})}health(e){return this.transport.health({target:e.target.target,gate:e.gate})}rollback(e){return this.transport.rollback({target:e.target.target,version:e.version,signal:e.signal})}}var bv={releases:{select:"SELECT id,created_at,0 bytes FROM releases WHERE project_id=? AND pinned=0 AND status IN ('failed','rolled_back','superseded') AND created_at<?",remove:"DELETE FROM releases WHERE id=?"},artifacts:{select:"SELECT a.id,a.created_at,a.size bytes FROM release_artifacts a WHERE a.organization_id=? AND NOT EXISTS(SELECT 1 FROM releases r WHERE r.artifact_id=a.id) AND a.created_at<?",remove:"DELETE FROM release_artifacts WHERE id=?"},operations:{select:"SELECT id,created_at,0 bytes FROM operations WHERE project_id=? AND state IN ('succeeded','failed','cancelled','timed_out') AND updated_at<?",remove:"DELETE FROM operations WHERE id=?"},logs:{select:"SELECT l.id,l.created_at,length(l.message) bytes FROM operation_logs l JOIN operations o ON o.id=l.operation_id WHERE o.project_id=? AND o.state IN ('succeeded','failed','cancelled','timed_out') AND l.created_at<?",remove:"DELETE FROM operation_logs WHERE id=?"},previews:{select:"SELECT id,created_at,0 bytes FROM preview_instances WHERE project_id=? AND status IN ('destroyed','failed') AND updated_at<?",remove:"DELETE FROM preview_instances WHERE id=?"},snapshots:{select:"SELECT id,created_at,size_bytes bytes FROM recovery_points WHERE project_id=? AND pinned=0 AND held=0 AND status IN ('failed','deleted') AND created_at<?",remove:"DELETE FROM recovery_points WHERE id=?"},orphaned_resources:{select:"SELECT id,created_at,COALESCE(capacity_bytes,0) bytes FROM persistent_volumes WHERE project_id=? AND status='orphaned' AND orphaned_at<?",remove:"UPDATE persistent_volumes SET status='deleted',deleted_at=datetime('now'),updated_at=datetime('now') WHERE id=? AND status='orphaned'"}};class Wa{kind;control;projectId;organizationId;constructor(e,t,r,a){this.kind=e;this.control=t;this.projectId=r;this.organizationId=a}async discover(e){let t=Math.max(1,Math.min(3650,Number(e.olderThanDays??30))),r=new Date(Date.now()-t*86400000).toISOString(),a=bv[this.kind],u=this.kind==="artifacts"?this.organizationId:this.projectId;return this.control.database.query(a.select).all(u,r).map((h)=>({id:String(h.id),kind:this.kind,label:`${this.kind}:${String(h.id)}`,bytes:Number(h.bytes??0),metadata:{createdAt:String(h.created_at)}}))}async remove(e){if(this.control.database.run(bv[this.kind].remove,[e.id]).changes!==1)throw Error(`${e.label} changed or is no longer removable.`)}}class fh{scenario;transport;constructor(e,t){this.scenario=e;this.transport=t}restore(e){return this.transport.restore({scenario:this.scenario,...e})}verify(e){return this.transport.verify({scenario:this.scenario,...e})}cleanup(e){return this.transport.cleanup({scenario:this.scenario,...e})}}function Dn(e){let t=jd(e.name),r=wg(e.configText);if(mA(e.configText,r.start,r.end,t))throw Error(`Site '${t}' already exists in cloud.config.ts`);let a=hh({...e,name:t}),u=e.configText.slice(0,r.end).trimEnd(),f=e.configText.slice(r.end),h=u.endsWith("{")?`
142
142
  `:u.endsWith(",")?`
143
143
 
144
144
  `:`,
@@ -155,7 +155,7 @@ ${t.map(([r,a])=>` ${r}: '${Bi(String(a))}',`).join(`
155
155
  }`}function Ja(e){return/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i.test(e.trim())}function eg(e){let t=[...new Set(e.map((r)=>r.trim().toLowerCase()).filter(Boolean))];for(let r of t)if(!Ja(r))throw Error(`Alias '${r}' is not a valid hostname.`);if(t.length===0)return"[]";return`[${t.map((r)=>`'${Bi(r)}'`).join(", ")}]`}function tg(e){let t=Object.entries(e).map(([r,a])=>[r.trim(),String(a).trim()]).filter(([r,a])=>r&&a);if(t.length===0)return"{}";return`{
156
156
  ${t.map(([r,a])=>` '${Bi(r)}': '${Bi(a)}',`).join(`
157
157
  `)}
158
- }`}function gA(e,t,r){let a=t;while(a<r&&/\s/.test(e[a]))a++;let u=0,f,h=!1;for(;a<r;a++){let b=e[a];if(f){if(h){h=!1;continue}if(b==="\\"){h=!0;continue}if(b===f)f=void 0;continue}if(b==='"'||b==="'"||b==="`"){f=b;continue}if(b==="{"||b==="["||b==="("){u++;continue}if(b==="}"||b==="]"||b===")"){if(u===0)return a;u--;continue}if(b===","&&u===0)return a}return r}function Sv(e,t,r,a){let u=e.slice(t+1,r),f=new RegExp(`(^|[\\s,{])(${kg(a)})\\s*:\\s*\\{`,"m").exec(u);if(!f)return null;let h=t+1+f.index+f[1].length,b=e.indexOf("{",h);return{nameStart:h,end:wv(e,b)}}function fh(e){let r=[` ${jd(e.name)}: {`];if(Ni(r,"deploy",e.deploy),Ni(r,"root",e.root),Ni(r,"path",e.path),Ni(r,"domain",e.domain),Ni(r,"type",e.type),Ni(r,"build",e.build),Ni(r,"start",e.start),e.port!==void 0)r.push(` port: ${e.port},`);if(Ni(r,"pathRewriteStyle",e.pathRewriteStyle),e.ssl!==void 0)if(e.ssl===!1)r.push(" ssl: false,");else if(e.ssl===!0)r.push(" ssl: true,");else r.push(` ssl: { provider: '${Bi(e.ssl.provider||"letsencrypt")}' },`);if(e.env&&Object.keys(e.env).length>0){r.push(" env: {");for(let[a,u]of Object.entries(e.env)){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(a))continue;r.push(` ${a}: '${Bi(String(u))}',`)}r.push(" },")}return r.push(" },"),r.join(`
158
+ }`}function gA(e,t,r){let a=t;while(a<r&&/\s/.test(e[a]))a++;let u=0,f,h=!1;for(;a<r;a++){let b=e[a];if(f){if(h){h=!1;continue}if(b==="\\"){h=!0;continue}if(b===f)f=void 0;continue}if(b==='"'||b==="'"||b==="`"){f=b;continue}if(b==="{"||b==="["||b==="("){u++;continue}if(b==="}"||b==="]"||b===")"){if(u===0)return a;u--;continue}if(b===","&&u===0)return a}return r}function Sv(e,t,r,a){let u=e.slice(t+1,r),f=new RegExp(`(^|[\\s,{])(${kg(a)})\\s*:\\s*\\{`,"m").exec(u);if(!f)return null;let h=t+1+f.index+f[1].length,b=e.indexOf("{",h);return{nameStart:h,end:wv(e,b)}}function hh(e){let r=[` ${jd(e.name)}: {`];if(Ni(r,"deploy",e.deploy),Ni(r,"root",e.root),Ni(r,"path",e.path),Ni(r,"domain",e.domain),Ni(r,"type",e.type),Ni(r,"build",e.build),Ni(r,"start",e.start),e.port!==void 0)r.push(` port: ${e.port},`);if(Ni(r,"pathRewriteStyle",e.pathRewriteStyle),e.ssl!==void 0)if(e.ssl===!1)r.push(" ssl: false,");else if(e.ssl===!0)r.push(" ssl: true,");else r.push(` ssl: { provider: '${Bi(e.ssl.provider||"letsencrypt")}' },`);if(e.env&&Object.keys(e.env).length>0){r.push(" env: {");for(let[a,u]of Object.entries(e.env)){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(a))continue;r.push(` ${a}: '${Bi(String(u))}',`)}r.push(" },")}return r.push(" },"),r.join(`
159
159
  `)}function Bi(e){return e.replace(/\\/g,"\\\\").replaceAll(String.fromCharCode(39),"\\'").replace(/\r/g,"\\r").replace(/\n/g,"\\n")}function jd(e){let t=e.trim();if(!/^[A-Za-z_$][\w$]*$/.test(t))throw Error(`Invalid site name '${e}'. Use a valid JavaScript object key, e.g. docs or marketingSite.`);return t}function Ni(e,t,r){if(r===void 0||r==="")return;let a=r.replace(/\\/g,"\\\\").replaceAll(String.fromCharCode(39),"\\'");e.push(` ${t}: '${a}',`)}function wg(e){let t=/\bsites\s*:\s*{/g.exec(e);if(!t)throw Error("Could not find a top-level sites: { ... } block in cloud.config.ts");let r=e.indexOf("{",t.index),a=wv(e,r);return{start:r,end:a}}function mA(e,t,r,a){let u=e.slice(t+1,r);return new RegExp(`(^|[\\s,{])${kg(a)}\\s*:`,"m").test(u)}function kg(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wv(e,t){let r=0,a,u=!1,f=!1,h=!1;for(let b=t;b<e.length;b++){let S=e[b],y=e[b+1];if(f){if(S===`
160
160
  `)f=!1;continue}if(h){if(S==="*"&&y==="/")h=!1,b++;continue}if(a){if(u){u=!1;continue}if(S==="\\"){u=!0;continue}if(S===a)a=void 0;continue}if(S==="/"&&y==="/"){f=!0,b++;continue}if(S==="/"&&y==="*"){h=!0,b++;continue}if(S==='"'||S==="'"||S==="`"){a=S;continue}if(S==="{")r++;if(S==="}"){if(r--,r===0)return b}}throw Error("Could not find the closing brace for sites: { ... } in cloud.config.ts")}function rg(e){let{configText:t,owner:r}=e,a=[...t.matchAll(/\n( {2})cloud: \{\n([\s\S]*?)\n\1\},\n/g)],[u]=a;if(!u)throw Error("No `cloud: { ... }` block found in the cloud config");if(a.length>1)throw Error(`Found ${a.length} \`cloud: { ... }\` blocks in the cloud config, so which one to edit is ambiguous`);let[f,h,b]=u;if(h===void 0||b===void 0)throw Error("The `cloud: { ... }` block did not parse into an indent and a body");if(b.includes("{"))throw Error("The `cloud: { ... }` block holds a nested object, which this edit does not attempt to rewrite");let S=b.match(/^\s*attachTo:\s*(['"])([^'"]*)\1\s*,?\s*$/m);if(S){let[k,R="'",D=""]=S;if(D===r)return t;return t.replace(f,f.replace(k,k.replace(`${R}${D}${R}`,`'${r}'`)))}let y=`${h} `;return t.replace(f,f.replace(`
161
161
  ${h}},
@@ -163,7 +163,7 @@ ${h}},
163
163
  ${y}// Deploy onto the box '${r}' owns rather than provisioning one.
164
164
  ${y}attachTo: '${r}',
165
165
  ${h}},
166
- `))}import{createHash as fA}from"node:crypto";function hA(e){return fA("sha256").update(fo(e)).digest("hex")}function fo(e){if(Array.isArray(e))return`[${e.map((t)=>fo(t)).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).filter(([,t])=>t!==void 0&&typeof t!=="function").sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${fo(r)}`).join(",")}}`;return JSON.stringify(e)??"null"}function v(e,t){let r=`dashboard:${t.username.toLowerCase()}`;return e.getActorByExternalId("user",r)??e.createActor({kind:"user",externalId:r,displayName:t.name??t.username,metadata:{source:"dashboard",role:t.role}})}function ng(e,t){let r=new Li({cwd:e}),a=hA(t),u=r.getProjectBySlug(t.project.slug),f=t.project.slug.length>=3?t.project.slug:`${t.project.slug}-org`,h=(u?.organizationId?r.getOrganization(u.organizationId):void 0)??r.getOrganizationBySlug(f)??r.createOrganization({id:u?.organizationId,slug:f,name:t.project.name}),b=u?u.name!==t.project.name||u.desiredConfigHash!==a||u.organizationId!==h.id?r.updateProject(u.id,u.version,{name:t.project.name,organizationId:h.id,desiredConfigHash:a}):u:r.createProject({organizationId:h.id,slug:t.project.slug,name:t.project.name,desiredConfigHash:a}),S=new Map;for(let[D,O]of Object.entries(t.environments??{})){let z=r.getEnvironmentBySlug(b.id,D)??r.createEnvironment({projectId:b.id,slug:D,name:D.replace(/(^|[-_])(\w)/g,(te,he,ye)=>ye.toUpperCase()),kind:String(O?.type??D),region:O?.region??t.project.region,desiredState:s(O)});S.set(D,z);let J=new Map(r.listResources(b.id,z.id).map((te)=>[`${te.kind}:${te.slug}`,te])),Z=(te,he,ye,ie)=>{let xe=`${te}:${he}`,ee=J.get(xe),De=s(ie);if(ee){if(ee.name!==ye||fo(ee.desiredState)!==fo(De))J.set(xe,r.updateResource(ee.id,ee.version,{name:ye,desiredState:De}));return}let Ge=r.createResource({projectId:b.id,environmentId:z.id,kind:te,slug:he,name:ye,provider:t.cloud?.provider,desiredState:De,metadata:{source:"cloud-config"}});J.set(xe,Ge)};for(let[te,he]of Object.entries(t.sites??{}))Z("application",te,te,he);let oe=O?.app;if(oe)for(let te of["http","queue","cli"])Z("function",te,`${te.toUpperCase()} function`,{...s(oe),function:te});let G=t.infrastructure;for(let[te,he]of Object.entries(G?.functions??{}))Z("function",te,te,he);if(G?.compute)Z("server",`${b.slug}-server`,b.name,{...s(G.compute),label:b.name});for(let[te,he]of Object.entries(G?.databases??{}))Z("database",te,te,he);if(G?.appDatabase)Z("database","application-database","Application database",G.appDatabase);else if(G?.database)Z("database","application-database","Application database",{engine:G.database})}let y=new c(r).recoverExpired(),k=r.reconcileOrphanedOperations({policy:"fail"}),R={requeued:y.requeued+k.requeued,failed:y.failed+y.cancelled+k.failed};return{store:r,organization:h,project:b,environments:S,reconciliation:R}}var yA=["project:read","config:read","deployments:read","deployments:create","runtime:read","runtime:logs"];function Cs(e,t){let{store:r,organization:a,project:u}=e,f=new Set;for(let h of t){let b=v(r,h);f.add(b.id);let S=r.getMembershipForActor(a.id,b.id);if(S&&S.source!=="legacy")continue;let y=r.listResources(u.id).filter((M)=>M.kind==="application"&&Object.hasOwn(h.sites,M.slug)),k=h.role==="admin"?"owner":"viewer",R=h.role==="admin"||y.length===0?{type:"organization"}:{type:"resource",id:y[0].id},D=S?S.roleTemplate!==k||fo(S.scope)!==fo(R)?r.updateMembership({id:S.id,roleTemplate:k,scope:R,actorId:b.id}):S:r.createMembership({organizationId:a.id,actorId:b.id,roleTemplate:k,scope:R,source:"legacy"}),O=new Set;if(h.role==="member"&&y.length===0)for(let M of rr("viewer"))O.add(`deny|${M}|organization|`);for(let M of y){let z=h.sites[M.slug];for(let J of yA)O.add(`allow|${J}|resource|${M.id}`);if(z==="owner")O.add(`allow|config:write|resource|${M.id}`)}for(let M of r.listGrants(D.id).filter((z)=>z.source==="legacy")){let z=`${M.effect}|${M.capability}|${M.scope.type}|${M.scope.id??""}`;if(!O.has(z))r.removeGrant(M.id,b.id)}for(let M of O){let[z,J,Z,oe]=M.split("|");r.upsertGrant({organizationId:a.id,membershipId:D.id,effect:z,capability:J,scope:Z==="organization"?{type:"organization"}:{type:Z,id:oe},source:"legacy"})}}for(let h of r.listMemberships(a.id))if(h.source==="legacy"&&!f.has(h.actorId))r.revokeMembership(h.id)}async function Me(e){let{controlPlane:t,environment:r,actor:a}=e,u=v(t.store,a),f=t.environments.get(r),h=e.resourceSlug&&f?t.store.listResources(t.project.id,f.id).find((k)=>k.slug===e.resourceSlug):void 0,b=new c(t.store,{workerId:`dashboard:${process.pid}`}),S=b.enqueue({projectId:t.project.id,environmentId:f?.id,resourceId:h?.id,actorId:u.id,kind:e.kind,input:e.input??{},lockKey:h?`resource:${h.id}`:f?`environment:${f.id}`:`project:${t.project.id}`,providerKey:h?.provider??"dashboard",buildSlot:e.kind.includes("deploy"),maxAttempts:1,timeoutSeconds:3600,resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;if(!b.claim(S.id)?.operation)throw Error(`Could not claim control-plane operation ${S.id}`);try{let k=await e.execute(),R=typeof k.stdout==="string"?String(k.stdout):"",D=typeof k.stderr==="string"?String(k.stderr):"";if(R)b.appendLog(S.id,R,{stream:"stdout"});if(D)b.appendLog(S.id,D,{stream:"stderr"});let O=k.ok?b.complete(S.id,kv(k)):b.fail(S.id,vA(k),kv(k));return{result:k,operation:O}}catch(k){throw b.fail(S.id,k instanceof Error?k.message:String(k),{ok:!1,threw:!0}),k}}function vA(e){let t=e;return String(t.error??t.stderr??"Operation failed")}function kv(e){let t=e,r=typeof t.stdout==="string"?t.stdout:"",a=typeof t.stderr==="string"?t.stderr:"",u={ok:e.ok,stdoutBytes:Buffer.byteLength(r),stderrBytes:Buffer.byteLength(a)};if(typeof t.operation==="string")u.operation=t.operation;if(typeof t.error==="string")u.error=t.error;return s(u)}var ig=[{id:"server.overview",path:"/",label:"Dashboard",group:"overview",modes:["server"],adminOnly:!0,legacyPaths:["/server"]},{id:"server.activity",path:"/server/activity",label:"Activity",group:"overview",modes:["server"],adminOnly:!0,legacyPaths:["/activity"]},{id:"services.list",path:"/server/sites",label:"Services",group:"applications",modes:["server"],adminOnly:!1,legacyPaths:["/sites","/services"]},{id:"deployments.list",path:"/server/deployments",label:"Deployments",group:"applications",modes:["server"],adminOnly:!1,legacyPaths:["/deployments"]},{id:"logs.list",path:"/server/logs",label:"Logs",group:"applications",modes:["server"],adminOnly:!1,legacyPaths:["/logs"]},{id:"sources.integrations",path:"/integrations",label:"Git integrations",group:"applications",modes:["server","serverless"],adminOnly:!1},{id:"applications.create",path:"/applications/new",label:"Create application",group:"applications",modes:["server","serverless"],adminOnly:!1},{id:"applications.compose",path:"/applications/compose",label:"Compose applications",group:"applications",modes:["server"],adminOnly:!1},{id:"operations.queue",path:"/operations/queue",label:"Deployment queue",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"operations.previews",path:"/operations/previews",label:"Preview environments",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"operations.releases",path:"/operations/releases",label:"Releases & promotion",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"runtime.workloads",path:"/operations/workloads",label:"Workloads",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"observability.overview",path:"/operations/observability",label:"Observability",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"alerts.overview",path:"/operations/alerts",label:"Alerts & health",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"spend.overview",path:"/operations/spend",label:"Spend & budgets",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"automation.jobs",path:"/operations/jobs",label:"Workers & schedules",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/server/workers","/serverless/scheduler"]},{id:"configuration.entries",path:"/operations/configuration",label:"Environment & secrets",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/serverless/secrets"]},{id:"metrics.overview",path:"/server/metrics",label:"Metrics",group:"operations",modes:["server"],adminOnly:!0},{id:"runtime.services",path:"/server/services",label:"Runtime services",group:"operations",modes:["server"],adminOnly:!0},{id:"backups.list",path:"/data/backups",label:"Backups & recovery",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/server/backups"]},{id:"volumes.list",path:"/data/volumes",label:"Persistent volumes",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:[]},{id:"fleet.list",path:"/server/fleet",label:"Fleet inventory",group:"operations",modes:["server"],adminOnly:!1,legacyPaths:[]},{id:"operations.run",path:"/server/actions",label:"Run operations",group:"operations",modes:["server"],adminOnly:!0},{id:"infrastructure.topology",path:"/infrastructure/topology",label:"Infrastructure map",group:"infrastructure",modes:["server","serverless"],adminOnly:!0,legacyPaths:["/topology"]},{id:"data.services",path:"/data/services",label:"Data services",group:"infrastructure",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/database","/databases","/server/database","/serverless/data"]},{id:"network.firewall",path:"/server/firewall",label:"Network & firewall",group:"infrastructure",modes:["server"],adminOnly:!0},{id:"security.posture",path:"/security",label:"Security posture",group:"infrastructure",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/server/security"]},{id:"access.ssh",path:"/server/ssh-keys",label:"SSH keys",group:"infrastructure",modes:["server"],adminOnly:!0},{id:"runtime.terminal",path:"/server/terminal",label:"Terminal",group:"infrastructure",modes:["server"],adminOnly:!0},{id:"organization.people",path:"/server/team",label:"People & access",group:"organization",modes:["server","serverless"],adminOnly:!0,legacyPaths:["/team"]},{id:"organization.automation",path:"/account/automation",label:"API & automation",group:"organization",modes:["server","serverless"],adminOnly:!0},{id:"serverless.overview",path:"/serverless",label:"Dashboard",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.deployments",path:"/serverless/deployments",label:"Deployments",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.logs",path:"/serverless/logs",label:"Logs",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.metrics",path:"/serverless/metrics",label:"Metrics",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.traces",path:"/serverless/traces",label:"Traces",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.functions",path:"/serverless/functions",label:"Functions",group:"compute-data",modes:["serverless"],adminOnly:!0},{id:"serverless.queues",path:"/serverless/queues",label:"Queues",group:"compute-data",modes:["serverless"],adminOnly:!0},{id:"serverless.assets",path:"/serverless/assets",label:"Assets",group:"compute-data",modes:["serverless"],adminOnly:!0},{id:"serverless.network",path:"/serverless/firewall",label:"Network",group:"settings",modes:["serverless"],adminOnly:!0},{id:"serverless.alerts",path:"/serverless/alarms",label:"Alerts",group:"settings",modes:["serverless"],adminOnly:!0},{id:"serverless.cost",path:"/serverless/cost",label:"Costs",group:"settings",modes:["serverless"],adminOnly:!0}],bA=new Map(ig.flatMap((e)=>(e.legacyPaths??[]).map((t)=>[t,e.path])));function sg(e){return bA.get(e)}function VS(e,t){return ig.filter((r)=>r.modes.includes(e)&&(!t||!r.adminOnly))}var Bd=()=>{};async function og(e,t=Bd){for(let r of e){let a=new o(r.replicaRegion),u;try{u=await a.headBucket(r.replicaBucket)}catch(f){if(f?.statusCode===301)throw Error(`Failover replica bucket ${r.replicaBucket} already exists outside ${r.replicaRegion}. Pick another failover.bucket or region for infrastructure.storage.${r.name}.`);if(f?.statusCode===403)throw Error(`Failover replica bucket ${r.replicaBucket} exists but this account cannot reach it (S3 names are global, so another account may own it). Set infrastructure.storage.${r.name}.failover.bucket to a name you own.`);throw f}if(u.exists&&u.region&&u.region!==r.replicaRegion)throw Error(`Failover replica bucket ${r.replicaBucket} is in ${u.region}, not ${r.replicaRegion}.`);if(!u.exists)t(`Creating failover replica bucket ${r.replicaBucket} in ${r.replicaRegion}`),await a.createBucket(r.replicaBucket);if(await a.putPublicAccessBlock(r.replicaBucket,{BlockPublicAcls:!0,IgnorePublicAcls:!0,BlockPublicPolicy:!0,RestrictPublicBuckets:!0}),await a.putBucketEncryption(r.replicaBucket,"AES256"),r.replicate){if((await a.getBucketVersioning(r.replicaBucket)).Status!=="Enabled")t(`Enabling versioning on ${r.replicaBucket} (S3 replication requires it)`),await a.putBucketVersioning(r.replicaBucket,"Enabled")}}}async function ag(e,t,r=Bd){for(let a of e){let u=t[a.distributionArnOutput];if(!u)throw Error(`Stack output ${a.distributionArnOutput} is missing, so the failover replica ${a.replicaBucket} cannot be scoped to its distribution.`);let f=new o(a.replicaRegion),S={Version:"2012-10-17",Statement:[...((await f.getBucketPolicy(a.replicaBucket))?.Statement??[]).filter((y)=>y?.Sid!==Go),gl({replicaBucket:a.replicaBucket,distributionArn:u})]};r(`Granting ${u} read access to ${a.replicaBucket}`),await f.putBucketPolicy(a.replicaBucket,S)}}async function cg(e,t=Bd){let r={};for(let a of e){let u=new o(a.primaryRegion),f=new o(a.replicaRegion),[h,b]=await Promise.all([u.listAllObjects({bucket:a.primaryBucket}),f.listAllObjects({bucket:a.replicaBucket})]),S=new Map(b.map((k)=>[k.Key,k.Size])),y=h.filter((k)=>S.get(k.Key)!==k.Size);for(let k of y)await f.copyObject({sourceBucket:a.primaryBucket,sourceKey:k.Key,destinationBucket:a.replicaBucket,destinationKey:k.Key});if(y.length>0)t(`Copied ${y.length} object(s) from ${a.primaryBucket} to ${a.replicaBucket}`);r[a.replicaBucket]=y.length}return r}async function dg(e,t=Bd){for(let r of e){let a=new o(r.replicaRegion);if(!(await a.headBucket(r.replicaBucket)).exists)continue;await a.emptyBucket(r.replicaBucket),await a.deleteBucket(r.replicaBucket),t(`Deleted failover replica bucket ${r.replicaBucket}`)}}import Mi from"node:process";import{existsSync as SA}from"node:fs";import{join as wA}from"node:path";async function lg(e){let t=Date.now(),r=e.sourceDir??"dist";if(!SA(wA(r,"index.html")))return Eg(t,`${r}/ has no index.html — build first.`);if(!Mi.env.AWS_ACCESS_KEY_ID||!Mi.env.AWS_SECRET_ACCESS_KEY)return Eg(t,"Missing AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY in env.");let a=kA(e.dnsProvider);if("error"in a)return Eg(t,a.error);let u=await Ln({siteName:e.siteName,region:e.region??"us-east-1",domain:e.domain,bucket:e.bucket,stackName:e.stackName,certificateArn:e.certificateArn,defaultRootObject:e.defaultRootObject??"index.html",errorDocument:e.errorDocument??"404.html",cacheControl:e.cacheControl??"max-age=3600, public",sourceDir:r,cleanBucket:e.cleanBucket??!1,singlePageApp:e.singlePageApp??!1,dnsProvider:a,tags:{ManagedBy:"ts-cloud",Application:e.siteName,...e.tags},onProgress:e.onProgress});return{success:!!u.success,domain:u.domain,url:u.domain?`https://${u.domain}`:u.distributionDomain?`https://${u.distributionDomain}`:void 0,bucket:u.bucket,distributionId:u.distributionId,distributionDomain:u.distributionDomain,certificateArn:u.certificateArn,filesUploaded:u.filesUploaded,filesSkipped:u.filesSkipped,message:u.message,durationMs:Date.now()-t}}function kA(e){let t=typeof e==="string"?{provider:e}:e??{provider:"porkbun"};if(t.provider==="porkbun"){let r=t,a=r?.apiKey??Mi.env.PORKBUN_API_KEY,u=r?.secretKey??Mi.env.PORKBUN_SECRET_KEY??Mi.env.PORKBUN_SECRET_API_KEY;if(!a||!u)return{error:"Missing PORKBUN_API_KEY / PORKBUN_SECRET_KEY in env."};return{provider:"porkbun",apiKey:a,secretKey:u}}if(t.provider==="godaddy"){let r=t,a=r?.apiKey??Mi.env.GODADDY_API_KEY,u=r?.secretKey??Mi.env.GODADDY_API_SECRET,f=r?.environment??Mi.env.GODADDY_ENVIRONMENT;if(!a||!u)return{error:"Missing GODADDY_API_KEY / GODADDY_API_SECRET in env."};return{provider:"godaddy",apiKey:a,apiSecret:u,environment:f}}return{error:`Unsupported DNS provider: ${t.provider}`}}function Eg(e,t){return{success:!1,message:t,durationMs:Date.now()-e}}import{createHash as IA}from"node:crypto";var EA=`let coldStart = true
166
+ `))}import{createHash as fA}from"node:crypto";function hA(e){return fA("sha256").update(fo(e)).digest("hex")}function fo(e){if(Array.isArray(e))return`[${e.map((t)=>fo(t)).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).filter(([,t])=>t!==void 0&&typeof t!=="function").sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${fo(r)}`).join(",")}}`;return JSON.stringify(e)??"null"}function v(e,t){let r=`dashboard:${t.username.toLowerCase()}`;return e.getActorByExternalId("user",r)??e.createActor({kind:"user",externalId:r,displayName:t.name??t.username,metadata:{source:"dashboard",role:t.role}})}function ng(e,t){let r=new Li({cwd:e}),a=hA(t),u=r.getProjectBySlug(t.project.slug),f=t.project.slug.length>=3?t.project.slug:`${t.project.slug}-org`,h=(u?.organizationId?r.getOrganization(u.organizationId):void 0)??r.getOrganizationBySlug(f)??r.createOrganization({id:u?.organizationId,slug:f,name:t.project.name}),b=u?u.name!==t.project.name||u.desiredConfigHash!==a||u.organizationId!==h.id?r.updateProject(u.id,u.version,{name:t.project.name,organizationId:h.id,desiredConfigHash:a}):u:r.createProject({organizationId:h.id,slug:t.project.slug,name:t.project.name,desiredConfigHash:a}),S=new Map;for(let[D,O]of Object.entries(t.environments??{})){let z=r.getEnvironmentBySlug(b.id,D)??r.createEnvironment({projectId:b.id,slug:D,name:D.replace(/(^|[-_])(\w)/g,(te,he,ye)=>ye.toUpperCase()),kind:String(O?.type??D),region:O?.region??t.project.region,desiredState:s(O)});S.set(D,z);let J=new Map(r.listResources(b.id,z.id).map((te)=>[`${te.kind}:${te.slug}`,te])),Z=(te,he,ye,ie)=>{let xe=`${te}:${he}`,ee=J.get(xe),De=s(ie);if(ee){if(ee.name!==ye||fo(ee.desiredState)!==fo(De))J.set(xe,r.updateResource(ee.id,ee.version,{name:ye,desiredState:De}));return}let Ge=r.createResource({projectId:b.id,environmentId:z.id,kind:te,slug:he,name:ye,provider:t.cloud?.provider,desiredState:De,metadata:{source:"cloud-config"}});J.set(xe,Ge)};for(let[te,he]of Object.entries(t.sites??{}))Z("application",te,te,he);let oe=O?.app;if(oe)for(let te of["http","queue","cli"])Z("function",te,`${te.toUpperCase()} function`,{...s(oe),function:te});let G=t.infrastructure;for(let[te,he]of Object.entries(G?.functions??{}))Z("function",te,te,he);if(G?.compute)Z("server",`${b.slug}-server`,b.name,{...s(G.compute),label:b.name});for(let[te,he]of Object.entries(G?.databases??{}))Z("database",te,te,he);if(G?.appDatabase)Z("database","application-database","Application database",G.appDatabase);else if(G?.database)Z("database","application-database","Application database",{engine:G.database})}let y=new c(r).recoverExpired(),k=r.reconcileOrphanedOperations({policy:"fail"}),R={requeued:y.requeued+k.requeued,failed:y.failed+y.cancelled+k.failed};return{store:r,organization:h,project:b,environments:S,reconciliation:R}}var yA=["project:read","config:read","deployments:read","deployments:create","runtime:read","runtime:logs"];function Cs(e,t){let{store:r,organization:a,project:u}=e,f=new Set;for(let h of t){let b=v(r,h);f.add(b.id);let S=r.getMembershipForActor(a.id,b.id);if(S&&S.source!=="legacy")continue;let y=r.listResources(u.id).filter((M)=>M.kind==="application"&&Object.hasOwn(h.sites,M.slug)),k=h.role==="admin"?"owner":"viewer",R=h.role==="admin"||y.length===0?{type:"organization"}:{type:"resource",id:y[0].id},D=S?S.roleTemplate!==k||fo(S.scope)!==fo(R)?r.updateMembership({id:S.id,roleTemplate:k,scope:R,actorId:b.id}):S:r.createMembership({organizationId:a.id,actorId:b.id,roleTemplate:k,scope:R,source:"legacy"}),O=new Set;if(h.role==="member"&&y.length===0)for(let M of rr("viewer"))O.add(`deny|${M}|organization|`);for(let M of y){let z=h.sites[M.slug];for(let J of yA)O.add(`allow|${J}|resource|${M.id}`);if(z==="owner")O.add(`allow|config:write|resource|${M.id}`)}for(let M of r.listGrants(D.id).filter((z)=>z.source==="legacy")){let z=`${M.effect}|${M.capability}|${M.scope.type}|${M.scope.id??""}`;if(!O.has(z))r.removeGrant(M.id,b.id)}for(let M of O){let[z,J,Z,oe]=M.split("|");r.upsertGrant({organizationId:a.id,membershipId:D.id,effect:z,capability:J,scope:Z==="organization"?{type:"organization"}:{type:Z,id:oe},source:"legacy"})}}for(let h of r.listMemberships(a.id))if(h.source==="legacy"&&!f.has(h.actorId))r.revokeMembership(h.id)}async function Me(e){let{controlPlane:t,environment:r,actor:a}=e,u=v(t.store,a),f=t.environments.get(r),h=e.resourceSlug&&f?t.store.listResources(t.project.id,f.id).find((k)=>k.slug===e.resourceSlug):void 0,b=new c(t.store,{workerId:`dashboard:${process.pid}`}),S=b.enqueue({projectId:t.project.id,environmentId:f?.id,resourceId:h?.id,actorId:u.id,kind:e.kind,input:e.input??{},lockKey:h?`resource:${h.id}`:f?`environment:${f.id}`:`project:${t.project.id}`,providerKey:h?.provider??"dashboard",buildSlot:e.kind.includes("deploy"),maxAttempts:1,timeoutSeconds:3600,resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;if(!b.claim(S.id)?.operation)throw Error(`Could not claim control-plane operation ${S.id}`);try{let k=await e.execute(),R=typeof k.stdout==="string"?String(k.stdout):"",D=typeof k.stderr==="string"?String(k.stderr):"";if(R)b.appendLog(S.id,R,{stream:"stdout"});if(D)b.appendLog(S.id,D,{stream:"stderr"});let O=k.ok?b.complete(S.id,kv(k)):b.fail(S.id,vA(k),kv(k));return{result:k,operation:O}}catch(k){throw b.fail(S.id,k instanceof Error?k.message:String(k),{ok:!1,threw:!0}),k}}function vA(e){let t=e;return String(t.error??t.stderr??"Operation failed")}function kv(e){let t=e,r=typeof t.stdout==="string"?t.stdout:"",a=typeof t.stderr==="string"?t.stderr:"",u={ok:e.ok,stdoutBytes:Buffer.byteLength(r),stderrBytes:Buffer.byteLength(a)};if(typeof t.operation==="string")u.operation=t.operation;if(typeof t.error==="string")u.error=t.error;return s(u)}var ig=[{id:"server.overview",path:"/",label:"Dashboard",group:"overview",modes:["server"],adminOnly:!0,legacyPaths:["/server"]},{id:"server.activity",path:"/server/activity",label:"Activity",group:"overview",modes:["server"],adminOnly:!0,legacyPaths:["/activity"]},{id:"services.list",path:"/server/sites",label:"Services",group:"applications",modes:["server"],adminOnly:!1,legacyPaths:["/sites","/services"]},{id:"deployments.list",path:"/server/deployments",label:"Deployments",group:"applications",modes:["server"],adminOnly:!1,legacyPaths:["/deployments"]},{id:"logs.list",path:"/server/logs",label:"Logs",group:"applications",modes:["server"],adminOnly:!1,legacyPaths:["/logs"]},{id:"sources.integrations",path:"/integrations",label:"Git integrations",group:"applications",modes:["server","serverless"],adminOnly:!1},{id:"applications.create",path:"/applications/new",label:"Create application",group:"applications",modes:["server","serverless"],adminOnly:!1},{id:"applications.compose",path:"/applications/compose",label:"Compose applications",group:"applications",modes:["server"],adminOnly:!1},{id:"operations.queue",path:"/operations/queue",label:"Deployment queue",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"operations.previews",path:"/operations/previews",label:"Preview environments",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"operations.releases",path:"/operations/releases",label:"Releases & promotion",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"runtime.workloads",path:"/operations/workloads",label:"Workloads",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"observability.overview",path:"/operations/observability",label:"Observability",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"alerts.overview",path:"/operations/alerts",label:"Alerts & health",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"spend.overview",path:"/operations/spend",label:"Spend & budgets",group:"operations",modes:["server","serverless"],adminOnly:!1},{id:"automation.jobs",path:"/operations/jobs",label:"Workers & schedules",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/server/workers","/serverless/scheduler"]},{id:"configuration.entries",path:"/operations/configuration",label:"Environment & secrets",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/serverless/secrets"]},{id:"metrics.overview",path:"/server/metrics",label:"Metrics",group:"operations",modes:["server"],adminOnly:!0},{id:"runtime.services",path:"/server/services",label:"Runtime services",group:"operations",modes:["server"],adminOnly:!0},{id:"backups.list",path:"/data/backups",label:"Backups & recovery",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/server/backups"]},{id:"volumes.list",path:"/data/volumes",label:"Persistent volumes",group:"operations",modes:["server","serverless"],adminOnly:!1,legacyPaths:[]},{id:"fleet.list",path:"/server/fleet",label:"Fleet inventory",group:"operations",modes:["server"],adminOnly:!1,legacyPaths:[]},{id:"operations.run",path:"/server/actions",label:"Run operations",group:"operations",modes:["server"],adminOnly:!0},{id:"infrastructure.topology",path:"/infrastructure/topology",label:"Infrastructure map",group:"infrastructure",modes:["server","serverless"],adminOnly:!0,legacyPaths:["/topology"]},{id:"data.services",path:"/data/services",label:"Data services",group:"infrastructure",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/database","/databases","/server/database","/serverless/data"]},{id:"network.firewall",path:"/server/firewall",label:"Network & firewall",group:"infrastructure",modes:["server"],adminOnly:!0},{id:"security.posture",path:"/security",label:"Security posture",group:"infrastructure",modes:["server","serverless"],adminOnly:!1,legacyPaths:["/server/security"]},{id:"access.ssh",path:"/server/ssh-keys",label:"SSH keys",group:"infrastructure",modes:["server"],adminOnly:!0},{id:"runtime.terminal",path:"/server/terminal",label:"Terminal",group:"infrastructure",modes:["server"],adminOnly:!0},{id:"organization.people",path:"/server/team",label:"People & access",group:"organization",modes:["server","serverless"],adminOnly:!0,legacyPaths:["/team"]},{id:"organization.automation",path:"/account/automation",label:"API & automation",group:"organization",modes:["server","serverless"],adminOnly:!0},{id:"serverless.overview",path:"/serverless",label:"Dashboard",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.deployments",path:"/serverless/deployments",label:"Deployments",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.logs",path:"/serverless/logs",label:"Logs",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.metrics",path:"/serverless/metrics",label:"Metrics",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.traces",path:"/serverless/traces",label:"Traces",group:"overview",modes:["serverless"],adminOnly:!0},{id:"serverless.functions",path:"/serverless/functions",label:"Functions",group:"compute-data",modes:["serverless"],adminOnly:!0},{id:"serverless.queues",path:"/serverless/queues",label:"Queues",group:"compute-data",modes:["serverless"],adminOnly:!0},{id:"serverless.assets",path:"/serverless/assets",label:"Assets",group:"compute-data",modes:["serverless"],adminOnly:!0},{id:"serverless.network",path:"/serverless/firewall",label:"Network",group:"settings",modes:["serverless"],adminOnly:!0},{id:"serverless.alerts",path:"/serverless/alarms",label:"Alerts",group:"settings",modes:["serverless"],adminOnly:!0},{id:"serverless.cost",path:"/serverless/cost",label:"Costs",group:"settings",modes:["serverless"],adminOnly:!0}],bA=new Map(ig.flatMap((e)=>(e.legacyPaths??[]).map((t)=>[t,e.path])));function sg(e){return bA.get(e)}function qS(e,t){return ig.filter((r)=>r.modes.includes(e)&&(!t||!r.adminOnly))}var Bd=()=>{};async function og(e,t=Bd){for(let r of e){let a=new o(r.replicaRegion),u;try{u=await a.headBucket(r.replicaBucket)}catch(f){if(f?.statusCode===301)throw Error(`Failover replica bucket ${r.replicaBucket} already exists outside ${r.replicaRegion}. Pick another failover.bucket or region for infrastructure.storage.${r.name}.`);if(f?.statusCode===403)throw Error(`Failover replica bucket ${r.replicaBucket} exists but this account cannot reach it (S3 names are global, so another account may own it). Set infrastructure.storage.${r.name}.failover.bucket to a name you own.`);throw f}if(u.exists&&u.region&&u.region!==r.replicaRegion)throw Error(`Failover replica bucket ${r.replicaBucket} is in ${u.region}, not ${r.replicaRegion}.`);if(!u.exists)t(`Creating failover replica bucket ${r.replicaBucket} in ${r.replicaRegion}`),await a.createBucket(r.replicaBucket);if(await a.putPublicAccessBlock(r.replicaBucket,{BlockPublicAcls:!0,IgnorePublicAcls:!0,BlockPublicPolicy:!0,RestrictPublicBuckets:!0}),await a.putBucketEncryption(r.replicaBucket,"AES256"),r.replicate){if((await a.getBucketVersioning(r.replicaBucket)).Status!=="Enabled")t(`Enabling versioning on ${r.replicaBucket} (S3 replication requires it)`),await a.putBucketVersioning(r.replicaBucket,"Enabled")}}}async function ag(e,t,r=Bd){for(let a of e){let u=t[a.distributionArnOutput];if(!u)throw Error(`Stack output ${a.distributionArnOutput} is missing, so the failover replica ${a.replicaBucket} cannot be scoped to its distribution.`);let f=new o(a.replicaRegion),S={Version:"2012-10-17",Statement:[...((await f.getBucketPolicy(a.replicaBucket))?.Statement??[]).filter((y)=>y?.Sid!==Go),gl({replicaBucket:a.replicaBucket,distributionArn:u})]};r(`Granting ${u} read access to ${a.replicaBucket}`),await f.putBucketPolicy(a.replicaBucket,S)}}async function cg(e,t=Bd){let r={};for(let a of e){let u=new o(a.primaryRegion),f=new o(a.replicaRegion),[h,b]=await Promise.all([u.listAllObjects({bucket:a.primaryBucket}),f.listAllObjects({bucket:a.replicaBucket})]),S=new Map(b.map((k)=>[k.Key,k.Size])),y=h.filter((k)=>S.get(k.Key)!==k.Size);for(let k of y)await f.copyObject({sourceBucket:a.primaryBucket,sourceKey:k.Key,destinationBucket:a.replicaBucket,destinationKey:k.Key});if(y.length>0)t(`Copied ${y.length} object(s) from ${a.primaryBucket} to ${a.replicaBucket}`);r[a.replicaBucket]=y.length}return r}async function dg(e,t=Bd){for(let r of e){let a=new o(r.replicaRegion);if(!(await a.headBucket(r.replicaBucket)).exists)continue;await a.emptyBucket(r.replicaBucket),await a.deleteBucket(r.replicaBucket),t(`Deleted failover replica bucket ${r.replicaBucket}`)}}import Mi from"node:process";import{existsSync as SA}from"node:fs";import{join as wA}from"node:path";async function lg(e){let t=Date.now(),r=e.sourceDir??"dist";if(!SA(wA(r,"index.html")))return Eg(t,`${r}/ has no index.html — build first.`);if(!Mi.env.AWS_ACCESS_KEY_ID||!Mi.env.AWS_SECRET_ACCESS_KEY)return Eg(t,"Missing AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY in env.");let a=kA(e.dnsProvider);if("error"in a)return Eg(t,a.error);let u=await Ln({siteName:e.siteName,region:e.region??"us-east-1",domain:e.domain,bucket:e.bucket,stackName:e.stackName,certificateArn:e.certificateArn,defaultRootObject:e.defaultRootObject??"index.html",errorDocument:e.errorDocument??"404.html",cacheControl:e.cacheControl??"max-age=3600, public",sourceDir:r,cleanBucket:e.cleanBucket??!1,singlePageApp:e.singlePageApp??!1,dnsProvider:a,tags:{ManagedBy:"ts-cloud",Application:e.siteName,...e.tags},onProgress:e.onProgress});return{success:!!u.success,domain:u.domain,url:u.domain?`https://${u.domain}`:u.distributionDomain?`https://${u.distributionDomain}`:void 0,bucket:u.bucket,distributionId:u.distributionId,distributionDomain:u.distributionDomain,certificateArn:u.certificateArn,filesUploaded:u.filesUploaded,filesSkipped:u.filesSkipped,message:u.message,durationMs:Date.now()-t}}function kA(e){let t=typeof e==="string"?{provider:e}:e??{provider:"porkbun"};if(t.provider==="porkbun"){let r=t,a=r?.apiKey??Mi.env.PORKBUN_API_KEY,u=r?.secretKey??Mi.env.PORKBUN_SECRET_KEY??Mi.env.PORKBUN_SECRET_API_KEY;if(!a||!u)return{error:"Missing PORKBUN_API_KEY / PORKBUN_SECRET_KEY in env."};return{provider:"porkbun",apiKey:a,secretKey:u}}if(t.provider==="godaddy"){let r=t,a=r?.apiKey??Mi.env.GODADDY_API_KEY,u=r?.secretKey??Mi.env.GODADDY_API_SECRET,f=r?.environment??Mi.env.GODADDY_ENVIRONMENT;if(!a||!u)return{error:"Missing GODADDY_API_KEY / GODADDY_API_SECRET in env."};return{provider:"godaddy",apiKey:a,apiSecret:u,environment:f}}return{error:`Unsupported DNS provider: ${t.provider}`}}function Eg(e,t){return{success:!1,message:t,durationMs:Date.now()-e}}import{createHash as IA}from"node:crypto";var EA=`let coldStart = true
167
167
  const initializedAt = new Date().toISOString()
168
168
  export const handler = async (event) => {
169
169
  const currentColdStart = coldStart
@@ -176,9 +176,9 @@ export const handler = async (event) => {
176
176
  body: JSON.stringify({ ok: statusCode === 200, service: 'ts-cloud-static-api', path, coldStart: currentColdStart, initializedAt })
177
177
  }
178
178
  }
179
- `;function Rv(e){let t=e;return String(t?.code||t?.name||t?.statusCode||"")}function RA(e){return["NoSuchEntity","ResourceNotFoundException","404"].includes(Rv(e))}function Iv(e){return["EntityAlreadyExists","ResourceAlreadyExistsException","ResourceConflictException","409"].includes(Rv(e))}function Ev(e,t){let r=e?.Items;if(!r)return[];if(Array.isArray(r))return r;let a=r[t];if(a===void 0)return[];return Array.isArray(a)?a:[a]}function Rg(e){let t=e?.Aliases?.Items,r=t?.CNAME??t;if(Array.isArray(r))return r.map(String);if(typeof r==="string")return[r];return[]}function AA(e){if(!/^[A-Z0-9]{8,32}$/.test(e.distributionId))throw Error("CloudFront distribution ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$/.test(e.expectedAlias))throw Error("Expected CloudFront alias is invalid");if(!/^[A-Za-z0-9-_]{1,64}$/.test(e.functionName))throw Error("Lambda function name is invalid");let t=e.pathPattern?.startsWith("/")?e.pathPattern:`/${e.pathPattern||"api/*"}`;if(t==="/"||t==="/*"||!t.endsWith("*"))throw Error("API path must be a non-default wildcard pattern such as /api/*");let r=e.originId||`${e.functionName}-url`,a=e.roleName||`${e.functionName}-execution`;if(!/^[A-Za-z0-9_.-]{1,64}$/.test(a))throw Error("IAM role name is invalid");let u=e.memorySize??256,f=e.timeout??10,h=e.logRetentionDays??14;if(u<128||u>10240)throw Error("Lambda memory must be between 128 and 10240 MB");if(f<1||f>900)throw Error("Lambda timeout must be between 1 and 900 seconds");return{region:e.region||"us-east-1",pathPattern:t,originId:r,roleName:a,memorySize:u,timeout:f,logRetentionDays:h}}function hh(e){let t=e.region||"us-east-1";return{cloudfront:new I(e.profile),iam:new Re(t,e.profile),lambda:new T(t,e.profile),logs:new we(t,e.profile),sts:new Te(t,e.profile),sleep:(r)=>new Promise((a)=>setTimeout(a,r))}}async function qS(e,t){let r=AA(e),a=t||hh({profile:e.profile,region:r.region}),[u,f,h]=await Promise.all([a.sts.getCallerIdentity(),a.cloudfront.getDistribution(e.distributionId),a.cloudfront.getDistributionConfig(e.distributionId)]);if(!u.Account)throw Error("AWS identity did not return an account ID");if(!f.Enabled)throw Error(`CloudFront distribution ${e.distributionId} is disabled`);if(!(Rg(f).length?Rg(f):Rg(h.DistributionConfig)).includes(e.expectedAlias))throw Error(`Distribution ${e.distributionId} does not contain expected alias ${e.expectedAlias}`);let S,y=!0;try{S=await a.iam.getRole({RoleName:r.roleName})}catch(Ze){if(!RA(Ze))throw Ze;y=!1}let k=S?.Arn||`arn:aws:iam::${u.Account}:role/${r.roleName}`,R=await a.lambda.functionExists(e.functionName),D=R?await a.lambda.getFunctionUrl(e.functionName):null,O=await a.cloudfront.listOriginAccessControls(),M=`${e.functionName}-lambda-url`,z=O.some((Ze)=>Ze.Name===M&&Ze.OriginAccessControlOriginType==="lambda"),J=Ev(h.DistributionConfig.Origins,"Origin"),Z=Ev(h.DistributionConfig.CacheBehaviors,"CacheBehavior"),oe=J.some((Ze)=>String(Ze.Id)===r.originId),G=Z.some((Ze)=>String(Ze.PathPattern)===r.pathPattern),te=[...!y?[`create IAM execution role ${r.roleName}`]:[`reconcile IAM execution policy ${r.roleName}`],...R?[`update Lambda ${e.functionName} code and configuration`]:[`create Lambda ${e.functionName}`],...!D?["create private AWS_IAM function URL"]:[],...!z?[`create Lambda origin access control ${M}`]:[],"grant CloudFront function-URL and invocation permissions",`${G?"reconcile":"add"} ${r.pathPattern} behavior without changing the default behavior`],he={command:`cloud cdn:origin:remove ${e.distributionId} FUNCTION_URL_HOST --id ${r.originId} --path '${r.pathPattern}' --apply --confirm 'remove:${e.distributionId}:${r.pathPattern}'`,removeFunction:!R,removeRole:!y},ye={mode:e.apply?"apply":"plan",accountId:u.Account,identityArn:u.Arn,distribution:{id:f.Id,arn:f.ARN,alias:e.expectedAlias,domainName:f.DomainName,status:f.Status},function:{name:e.functionName,existed:R,runtime:"nodejs22.x",urlExisted:!!D,url:D?.FunctionUrl},role:{name:r.roleName,existed:y,arn:k},origin:{id:r.originId,pathPattern:r.pathPattern,existed:oe,behaviorExisted:G,accessControlExisted:z},changes:te,rollback:he,applied:!1};if(!e.apply)return ye;let ie=`${e.distributionId}:${r.pathPattern}`;if(e.confirm!==ie)throw Error(`Pass exact confirmation token ${ie} to mutate the live distribution`);if(!S)S=await a.iam.createRole({RoleName:r.roleName,Description:`Execution role for ${e.functionName}`,AssumeRolePolicyDocument:JSON.stringify({Version:"2012-10-17",Statement:[{Effect:"Allow",Principal:{Service:"lambda.amazonaws.com"},Action:"sts:AssumeRole"}]}),Tags:[{Key:"ManagedBy",Value:"ts-cloud"}]});await a.iam.putRolePolicy({RoleName:r.roleName,PolicyName:"lambda-logs",PolicyDocument:JSON.stringify({Version:"2012-10-17",Statement:[{Effect:"Allow",Action:["logs:CreateLogStream","logs:PutLogEvents"],Resource:`arn:aws:logs:${r.region}:${u.Account}:log-group:/aws/lambda/${e.functionName}:*`}]})});try{await a.logs.createLogGroup(`/aws/lambda/${e.functionName}`,{ManagedBy:"ts-cloud"})}catch(Ze){if(!Iv(Ze))throw Ze}await a.logs.putRetentionPolicy(`/aws/lambda/${e.functionName}`,r.logRetentionDays);let xe=e.code||EA;if(R)await a.lambda.updateFunctionCodeInline(e.functionName,xe,"index.mjs"),await a.lambda.waitForFunctionActive(e.functionName),await a.lambda.updateFunctionConfiguration({FunctionName:e.functionName,Runtime:"nodejs22.x",Role:S.Arn,Handler:"index.handler",Description:`Private API origin for ${e.expectedAlias}`,Timeout:r.timeout,MemorySize:r.memorySize});else{let Ze;for(let wt=0;wt<8;wt++)try{await a.lambda.createFunctionWithCode({FunctionName:e.functionName,Runtime:"nodejs22.x",Role:S.Arn,Handler:"index.handler",Code:xe,Filename:"index.mjs",Description:`Private API origin for ${e.expectedAlias}`,Timeout:r.timeout,MemorySize:r.memorySize}),Ze=void 0;break}catch(zt){if(Ze=zt,!String(zt.message).toLowerCase().includes("role"))throw zt;await a.sleep(1000)}if(Ze)throw Ze}await a.lambda.waitForFunctionActive(e.functionName);let ee=D||await a.lambda.createFunctionUrl({FunctionName:e.functionName,AuthType:"AWS_IAM",InvokeMode:"BUFFERED"});if(!ee.FunctionUrl)throw Error("Lambda did not return a function URL");let De=new URL(ee.FunctionUrl).hostname,Ge=await a.cloudfront.findOrCreateOriginAccessControl(M,"lambda"),pt=f.ARN||`arn:aws:cloudfront::${u.Account}:distribution/${e.distributionId}`,Bt=[{FunctionName:e.functionName,StatementId:"AllowCloudFrontFunctionUrl",Action:"lambda:InvokeFunctionUrl",Principal:"cloudfront.amazonaws.com",SourceArn:pt,FunctionUrlAuthType:"AWS_IAM"},{FunctionName:e.functionName,StatementId:"AllowCloudFrontInvoke",Action:"lambda:InvokeFunction",Principal:"cloudfront.amazonaws.com",SourceArn:pt,InvokedViaFunctionUrl:!0}];for(let Ze of Bt)try{await a.lambda.addPermission(Ze)}catch(wt){if(!Iv(wt))throw wt}return await a.cloudfront.upsertExistingDistributionOrigin(e.distributionId,{id:r.originId,domainName:De,pathPattern:r.pathPattern,originAccessControlId:Ge.Id}),{...ye,function:{...ye.function,url:ee.FunctionUrl},applied:!0}}async function jS(e){let t=`https://${e.alias}/`,r=`https://${e.alias}/api/health`,a=await fetch(t,{redirect:"follow",headers:{"cache-control":"no-cache"}}),u=new Uint8Array(await a.arrayBuffer()),f=IA("sha256").update(u).digest("hex"),h=Date.now(),b=await fetch(r,{redirect:"follow",headers:{"cache-control":"no-cache"}}),S=Date.now()-h,y=await b.text(),k=y;try{k=JSON.parse(y)}catch{}let R;if(e.logs&&e.functionName){let D=await e.logs.filterLogEvents({logGroupName:`/aws/lambda/${e.functionName}`,startTime:h-60000,filterPattern:'"Init Duration"',limit:25});for(let O of D.events||[]){let M=O.message?.match(/Init Duration:\s*([0-9.]+)\s*ms/i);if(M)R=Number(M[1])}}return{frontend:{url:t,status:a.status,sha256:f,unchanged:e.expectedFrontendSha256?f===e.expectedFrontendSha256:void 0,bytes:u.byteLength},api:{url:r,status:b.status,latencyMs:S,healthy:b.ok&&!!k?.ok,body:k},coldStart:{observed:R!==void 0,initDurationMs:R},verifiedAt:(e.now?.()||new Date).toISOString()}}function zS(e){let t=(e.memoryMb||256)/1024,r=Math.max(0,e.requests-(e.includeFreeTier===!1?0:1e6)),a=Math.max(0,e.requests*(e.averageDurationMs/1000)*t-(e.includeFreeTier===!1?0:400000)),u=r/1e6*0.2+a*0.0000166667,f=9.010025,h=16.425;return{lambdaUsd:Number(u.toFixed(2)),alwaysOnFargateAndAlbUsd:Number(25.435025000000003 .toFixed(2)),assumptions:["us-east-1 public list rates snapshot, July 2026","Lambda x86 request and duration pricing with optional monthly free tier","Fargate comparison uses one always-on 0.25 vCPU/0.5 GB task plus one ALB before LCU charges","excludes CloudFront, data transfer, logs, taxes, and application data services"]}}import{createHash as CA}from"node:crypto";function PA(e){let t=e;return String(t?.code||t?.name||t?.statusCode||"")}function _A(e){return PA(e)==="ValidationError"&&String(e.message).includes("does not exist")}function TA(e){return Object.fromEntries((e||[]).map((t)=>[t.OutputKey,t.OutputValue]))}function xA(e){let t=e?.Aliases?.Items??e?.Aliases,r=t?.CNAME??t;if(Array.isArray(r))return r.map(String);if(typeof r==="string")return[r];return[]}function Av(e){if(!/^[a-z][a-z0-9-]{1,62}$/.test(e.slug))throw Error("Slug must be a lowercase DNS-safe identifier");if(!/^[A-Z0-9]{8,32}$/.test(e.distributionId))throw Error("CloudFront distribution ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$/.test(e.expectedAlias))throw Error("Expected distribution alias is invalid");let t=e.imageUri.match(/@((?:sha256:)[a-f0-9]{64})$/i)?.[1];if(!t)throw Error("Container image must use an immutable ECR digest URI ending in @sha256:<64 hex>");let r=e.stackName||`${e.slug}-backend`;if(!/^[A-Za-z][A-Za-z0-9-]{0,127}$/.test(r))throw Error("CloudFormation stack name is invalid");let a=e.pathPattern||"/api/*";if(!/^\/[A-Za-z0-9_.*?~!$&'()+,;=:@%/-]+\*$/.test(a)||a==="/*")throw Error("Backend path must be a non-default wildcard pattern");let u=e.originId||`${e.slug}-backend`;if(!/^[A-Za-z0-9_.-]{1,128}$/.test(u))throw Error("CloudFront origin ID is invalid");if(e.originVerifySecret&&e.originVerifySecret.length<24)throw Error("Origin verification secret must contain at least 24 characters");if(!!e.originDomain!==!!e.certificateArn)throw Error("A custom origin domain and matching ACM certificate ARN must be provided together");return{stackName:r,region:e.region||"us-east-1",pathPattern:a,originId:u,digest:t}}function Ah(e){let t=e.region||"us-east-1";return{cloudformation:new A(t,e.profile),cloudfront:new I(e.profile),sts:new Te(t,e.profile),fetch,sleep:(r)=>new Promise((a)=>setTimeout(a,r))}}function yh(e){let t=Av(e),r=hl({name:e.name,slug:e.slug,domain:e.originDomain||e.expectedAlias,imageUri:e.imageUri,certificateArn:e.certificateArn,originVerifySecret:e.originVerifySecret,desiredCount:e.desiredCount,database:e.database,cache:e.cache,queue:e.queue}),a=fl(r);return a.Description=`Managed backend for existing static frontend ${e.expectedAlias}`,a.Metadata={ManagedBy:"ts-cloud",ExistingDistributionId:e.distributionId,ExistingDistributionAlias:e.expectedAlias,BackendPathPattern:t.pathPattern,ContainerDigest:t.digest},a}async function DA(e,t,r){let a;for(let u=0;u<30;u++){let f=Date.now();try{let h=await e.fetch(t,{redirect:"manual",headers:r?{"x-origin-verify":r}:void 0}),b=Date.now()-f,S=await h.text(),y=S;try{y=JSON.parse(S)}catch{}if(h.ok)return{url:t,status:h.status,latencyMs:b,body:y};a=Error(`origin returned ${h.status}`)}catch(h){a=h}if(u<29)await e.sleep(1e4)}throw Error(`Backend origin did not become healthy: ${a instanceof Error?a.message:String(a)}`)}async function KS(e,t){let r=Av(e),a=t||Ah({region:r.region,profile:e.profile}),[u,f]=await Promise.all([a.sts.getCallerIdentity(),a.cloudfront.getDistribution(e.distributionId)]);if(!u.Account)throw Error("AWS identity did not return an account ID");if(!f.Enabled)throw Error(`CloudFront distribution ${e.distributionId} is disabled`);if(!xA(f).includes(e.expectedAlias))throw Error(`Distribution ${e.distributionId} does not contain expected alias ${e.expectedAlias}`);let h;try{h=(await a.cloudformation.describeStacks({stackName:r.stackName})).Stacks[0]}catch(te){if(!_A(te))throw te}let b=yh(e),S=JSON.stringify(b);if(Buffer.byteLength(S)>51200)throw Error("Generated template exceeds the direct CloudFormation template body limit");let y=Object.values(b.Resources||{}).reduce((te,he)=>(te[he.Type]=(te[he.Type]||0)+1,te),{}),k=[`cloud cdn:origin:remove ${e.distributionId} ${e.originDomain||"ALB_HOST"} --id ${r.originId} --path '${r.pathPattern}' --profile ${e.profile||"default"} --apply --confirm 'remove:${e.distributionId}:${r.pathPattern}'`,`After CloudFront is deployed, restore external DNS if changed and delete stack ${r.stackName} only with an approved data-retention decision.`],R={mode:e.apply?"apply":"plan",accountId:u.Account,stack:{name:r.stackName,existed:!!h,status:h?.StackStatus,templateSha256:CA("sha256").update(S).digest("hex"),resourceCount:Object.keys(b.Resources||{}).length,resourceTypes:y},distribution:{id:f.Id,alias:e.expectedAlias,domainName:f.DomainName,status:f.Status,pathPattern:r.pathPattern,originId:r.originId},artifact:{imageUri:e.imageUri,digest:r.digest},services:{database:e.database!==!1,cache:e.cache!==!1,queue:e.queue!==!1,mail:"ses",desiredCount:e.desiredCount||1},cloudFrontApplied:!1,dnsApplied:!1,applied:!1,rollback:k};if(!e.apply)return R;let D=`${e.distributionId}:${r.pathPattern}:${r.stackName}`;if(e.confirm!==D)throw Error(`Pass exact confirmation token ${D} to provision the backend and change live routing`);if(h)try{await a.cloudformation.updateStack({stackName:r.stackName,templateBody:S,capabilities:["CAPABILITY_NAMED_IAM"],tags:[{Key:"ManagedBy",Value:"ts-cloud"},{Key:"Application",Value:e.slug}]}),await a.cloudformation.waitForStack(r.stackName,"stack-update-complete")}catch(te){if(!String(te.message).includes("No updates are to be performed"))throw te}else await a.cloudformation.createStack({stackName:r.stackName,templateBody:S,capabilities:["CAPABILITY_NAMED_IAM"],onFailure:"ROLLBACK",tags:[{Key:"ManagedBy",Value:"ts-cloud"},{Key:"Application",Value:e.slug}]}),await a.cloudformation.waitForStack(r.stackName,"stack-create-complete");let O=(await a.cloudformation.describeStacks({stackName:r.stackName})).Stacks[0],M=TA(O?.Outputs),z=M.AppLoadBalancerDnsName;if(!z)throw Error("Backend stack did not return AppLoadBalancerDnsName");let J=!1;if(e.originDomain&&e.originDomain!==z){if(!a.dns)throw Error(`External DNS provider is required to map ${e.originDomain} to ${z}`);let te=await a.dns.upsertRecord(e.originDomain,{name:e.originDomain,type:"CNAME",content:z,ttl:300});if(!te.success)throw Error(te.message||"External DNS update failed");J=!0}let Z=e.originDomain||z,oe=e.certificateArn?"https-only":"http-only",G=e.skipHealthCheck?void 0:await DA(a,`${oe==="https-only"?"https":"http"}://${Z}/api/health`,e.originVerifySecret);return await a.cloudfront.upsertExistingDistributionOrigin(e.distributionId,{id:r.originId,domainName:Z,pathPattern:r.pathPattern,protocolPolicy:oe,customHeaders:e.originVerifySecret?{"X-Origin-Verify":e.originVerifySecret}:void 0}),{...R,outputs:M,health:G,cloudFrontApplied:!0,dnsApplied:J,applied:!0}}function WS(e={}){let r={fargate:730*(e.desiredCount||1)*0.012342500000000001,applicationLoadBalancer:16.425,natGateway:32.85,postgres:730*(e.multiAzDatabase?0.032:0.016),redis:23.36};return{monthlyUsd:Number(Object.values(r).reduce((a,u)=>a+u,0).toFixed(2)),components:Object.fromEntries(Object.entries(r).map(([a,u])=>[a,Number(u.toFixed(2))])),assumptions:["us-east-1 public on-demand rate snapshot, July 2026","one 0.25 vCPU/0.5 GB Linux Fargate task unless desiredCount is changed","one ALB before LCU charges and one NAT gateway before data processing","single-AZ db.t4g.micro PostgreSQL by default and two cache.t4g.micro Redis nodes","excludes storage, backups, CloudFront, data transfer, public IPv4, logs, email, queue requests, taxes, and free-tier credits"]}}import{execFileSync as OA}from"node:child_process";import{createHash as $A}from"node:crypto";import{existsSync as Cv,mkdirSync as NA,mkdtempSync as jA,readdirSync as BA,readFileSync as MA,rmSync as LA,statSync as Pv,writeFileSync as FA}from"node:fs";import{tmpdir as zA}from"node:os";import{basename as UA,join as as,relative as qA,resolve as Cg}from"node:path";var VA=new Set([".git","node_modules","dist","coverage"]);function _v(e,t=e){let r=[];for(let a of BA(e).sort()){if(VA.has(a))continue;let u=as(e,a);if(sl(u,t))continue;let f=Pv(u);if(f.isDirectory())r.push(..._v(u,t));else if(f.isFile())r.push(qA(t,u))}return r}function Sh(e){let t=Cg(e);if(!Cv(t)||!Pv(t).isDirectory())throw Error(`Container context does not exist: ${t}`);let r=$A("sha256");for(let a of _v(t))r.update(a),r.update("\x00"),r.update(MA(as(t,a))),r.update("\x00");return r.digest("hex")}function Ih(e){return{ecr:new He(e.region||"us-east-1",e.profile),run:(t,r,a)=>{OA(t,r,{cwd:a?.cwd,env:a?.env,stdio:a?.stdio||"inherit"})}}}async function JS(e,t){let r=Cg(e.context),a=Cg(e.dockerfile||as(r,"Dockerfile"));if(!Cv(a))throw Error(`Dockerfile does not exist: ${a}`);if(!e.repository.split("/").every((M)=>/^[a-z0-9][a-z0-9._-]*$/.test(M)&&!/[._-]$/.test(M)&&!/[._-]{2}/.test(M)))throw Error("ECR repository name is invalid");let h=t||Ih(e),b=Sh(r),S=`sha-${b.slice(0,20)}`,y="";try{y=(await h.ecr.describeRepositories({repositoryNames:[e.repository]})).repositories?.[0]?.repositoryUri||""}catch{}if(!y)y=(await h.ecr.createRepository({repositoryName:e.repository,imageTagMutability:"IMMUTABLE",imageScanningConfiguration:{scanOnPush:!0},tags:[{Key:"ManagedBy",Value:"ts-cloud"}]})).repository?.repositoryUri||"";if(!y)throw Error(`Could not resolve ECR repository URI for ${e.repository}`);await h.ecr.putLifecyclePolicy({repositoryName:e.repository,lifecyclePolicyText:JSON.stringify({rules:[{rulePriority:1,description:"Retain the newest 25 release images",selection:{tagStatus:"any",countType:"imageCountMoreThan",countNumber:25},action:{type:"expire"}}]})});let k=`${y}:${S}`,R=jA(as(zA(),"ts-cloud-container-"));try{h.run("docker",["version"],{stdio:"ignore"}),h.run("docker",["build","--platform",e.platform||"linux/amd64","--provenance=false","--sbom=false","--file",a,"--tag",k,r],{cwd:r});let M=(await h.ecr.getAuthorizationToken()).authorizationData?.[0];if(!M?.authorizationToken||!M.proxyEndpoint)throw Error("ECR did not return Docker authorization data");let z=M.proxyEndpoint.replace(/^https?:\/\//,""),J=as(R,"docker");NA(J,{recursive:!0}),FA(as(J,"config.json"),JSON.stringify({auths:{[z]:{auth:M.authorizationToken}}}),{mode:384}),h.run("docker",["push",k],{env:{...process.env,DOCKER_CONFIG:J}})}finally{LA(R,{recursive:!0,force:!0})}let O=(await h.ecr.describeImages({repositoryName:e.repository,imageIds:[{imageTag:S}]})).imageDetails?.[0]?.imageDigest;if(!O||!/^sha256:[a-f0-9]{64}$/i.test(O))throw Error(`ECR did not return an immutable digest for ${UA(k)}`);return{repository:e.repository,tag:S,imageUri:k,digest:O,digestUri:`${y}@${O}`,contextSha256:b}}import{existsSync as WA,readdirSync as HA,readFileSync as KA,statSync as JA}from"node:fs";import{join as Tv,relative as GA}from"node:path";function So(e,t){let r=e.environments?.[t]?.app;if(!r)throw Error(`No serverless app configured for environment '${t}'. Add environments.${t}.app to your config.`);let a=e.project.slug,u=e.environments?.[t]?.region||e.project.region||"us-east-1";return{app:r,slug:a,region:u,stackName:dr(e,t),artifactBucket:cl(a,t),assetsBucket:Xi(a,t)}}async function ho(e,t=8){let r;for(let a=0;a<t;a++)try{return await e()}catch(u){let f=u?.code||u?.name||"",h=String(u?.message||"");if(f==="ResourceConflictException"||/update is in progress|currently in the following state/i.test(h)){r=u,await new Promise((b)=>setTimeout(b,3000));continue}throw u}throw r}var xv=(e,t)=>`releases/${e}/${t}/current.json`;async function Ld(e,t,r,a){try{return await e.getObjectJson(t,xv(r,a))}catch{return null}}async function Dv(e,t,r,a,u){await e.putObjectJson(t,xv(r,a),u)}async function QA(e,t){if(!e.secrets)return{};let r=new re(t),a={},u=Array.isArray(e.secrets)?e.secrets.map((f)=>({envName:f.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),secretId:f})):Object.entries(e.secrets).map(([f,h])=>({envName:f,secretId:h}));if(Array.isArray(e.secrets)){let f=new Map;for(let{envName:b,secretId:S}of u)f.set(b,[...f.get(b)??[],S]);let h=[...f.entries()].filter(([,b])=>b.length>1);if(h.length){let b=h.map(([S,y])=>`${S} ← ${y.join(", ")}`).join("; ");throw Error(`serverless secrets: multiple secrets map to the same env var (${b}). Use the map form { ENV_NAME: 'secret/id' } to disambiguate.`)}}for(let{envName:f,secretId:h}of u){let S=(await r.getSecretValue({SecretId:h})).SecretString??"";try{let y=JSON.parse(S);if(y&&typeof y==="object"&&!Array.isArray(y)){for(let[k,R]of Object.entries(y))a[k]=String(R);continue}}catch{}a[f]=S}return a}function Es(e,t){let r={},a=t.DbProxyEndpoint||t.DbEndpoint;if(a)r.DB_CONNECTION="mysql",r.DB_HOST=a,r.DB_PORT="3306",r.DB_DATABASE=r.DB_DATABASE||"app";if(t.CacheEndpoint){if(r.REDIS_HOST=t.CacheEndpoint,r.REDIS_PORT="6379",e.cache?.driver==="elasticache")r.CACHE_STORE="redis",r.CACHE_DRIVER="redis",r.SESSION_DRIVER="redis"}return r}function br(e,t,r,a,u,f,h,b={}){let S=e.kind==="php"?ql({cacheDriver:e.cache?.driver==="elasticache"?"redis":"dynamodb"}):{};return{TSCLOUD_LAMBDA_MODE:a,TSCLOUD_ENV:r,MAINTENANCE_MODE:"0",...e.octane?{TSCLOUD_OCTANE:"1"}:{},...e.serveAssets?{TSCLOUD_SERVE_ASSETS:"1"}:{},...e.redirectRobotsTxt===!1?{TSCLOUD_REDIRECT_ROBOTS_TXT:"0"}:{},...S,...b,...t.app.cache?.driver!=="elasticache"?{TSCLOUD_CACHE_TABLE:`${t.slug}-${r}-cache`}:{},...h?{TSCLOUD_QUEUE:h,SQS_QUEUE:h}:{},...f?{ASSET_URL:f}:{},...e.env??{},...u}}function YA(e){let t=e.slice(e.lastIndexOf(".")).toLowerCase();return{".html":"text/html",".css":"text/css",".js":"text/javascript",".mjs":"text/javascript",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".txt":"text/plain",".map":"application/json"}[t]??"application/octet-stream"}function*Ov(e){for(let t of HA(e)){let r=Tv(e,t);if(JA(r).isDirectory())yield*Ov(r);else yield r}}async function ZA(e,t,r,a,u=!1){let f=0;for(let h of Ov(r)){let b=GA(r,h).replace(/\\/g,"/");if(!u&&b.split("/").some((S)=>S.startsWith(".")))continue;await e.putObject({bucket:t,key:`${a}/${b}`,body:KA(h),contentType:YA(h),cacheControl:"public, max-age=31536000, immutable"}),f++}return f}function XA(e,t){let r=Object.entries(t).reduce((a,[u,f])=>a+Buffer.byteLength(`${u}=${f}`,"utf8"),0);if(r>4096){let a=Object.entries(t).map(([u,f])=>[u,Buffer.byteLength(`${u}=${f}`,"utf8")]).sort((u,f)=>f[1]-u[1]).slice(0,5).map(([u,f])=>`${u} (${f}B)`).join(", ");throw Error(`${e}: environment variables total ${r}B, over AWS's 4096B limit (${r-4096}B too large). Largest: ${a}. Move large/secret values out of env — store them in Secrets Manager and fetch at cold start.`)}}async function sa(e,t,r,a){XA(t,r),await ho(()=>e.updateFunctionConfiguration({FunctionName:t,Environment:{Variables:r}})),await e.waitForFunctionActive(t,120);let u=a.kind==="image"?{FunctionName:t,ImageUri:a.imageUri}:{FunctionName:t,S3Bucket:a.bucket,S3Key:a.key};await ho(()=>e.updateFunctionCode(u)),await e.waitForFunctionActive(t,120)}async function Md(e,t){let a=(await ho(()=>e.publishVersion({FunctionName:t}))).Version;if(!a)throw Error(`publishVersion returned no version for ${t}`);return await ho(()=>e.updateAlias({FunctionName:t,Name:"live",FunctionVersion:a})),a}async function Xa(e,t,r={}){let a=So(e,t),{app:u,slug:f,region:h,stackName:b,artifactBucket:S}=a,y=r.projectRoot??process.cwd();xs(`Deploying serverless app: ${f} (${t})`),L(`Stack: ${b}`),L(`Region: ${h}`);let k=new o(h),R=new A(h),D=new T(h),O=u.kind==="php",M=u.packaging==="image",z=ns(u),J,Z,oe,G,te=[];if(M&&z.usesLayer&&z.layerKind!=="php")throw Error(`packaging: 'image' currently supports PHP and managed Node runtimes. ${z.kind}${z.kind==="node"?` ${z.version}`:""} uses a custom runtime — `+"use the default zip packaging (the runtime layer is built + attached automatically).");if(M){P("Building + pushing container image");let{buildAndPushServerlessImage:le}=await import("./chunk-3b08b1zx.js"),Ce=await le({app:u,projectRoot:y,region:h,repository:`${f}-${t}`,skipBuild:r.skipBuild,onStep:(gt)=>L(` ${gt}`)});J=Ce.handlers,Z={kind:"image",imageUri:Ce.imageUri},oe=Ce.tag,te.push({ParameterKey:"ImageUri",ParameterValue:Ce.imageUri})}else{P("Packaging application");let le=O?jl({projectRoot:y,app:u,skipBuild:r.skipBuild,onStep:(kt)=>L(` ${kt}`)}):await pn({projectRoot:y,app:u,skipBuild:r.skipBuild,onStep:(kt)=>L(` ${kt}`)}),Ce=$l(f,t,le.sha256);if(L(`Artifact: ${le.sha256.slice(0,12)} (${(le.zip.length/1024).toFixed(0)} KB)`),J=le.handlers,oe=le.sha256,z.usesLayer){let kt=z.layerEnvVar?process.env[z.layerEnvVar]:void 0;if(G=u.layers??(kt?[kt]:void 0),!G?.length){let _e=z.layerKind==="php"?"serverless:build-php-layer":z.layerKind==="bun"?"serverless:build-bun-layer":"serverless:build-node-layer";throw Error(`${z.kind} apps on provided.al2023 need a runtime layer. Set environments.<env>.app.layers or the ${z.layerEnvVar} env var (build one with \`cloud ${_e}\`)${z.kind==="node"?", or use a managed Node version (18/20/22)":""}.`)}}if(!await k.bucketExists(S))P(`Creating artifact bucket ${S}`),await k.createBucket(S);if(await k.headObject(S,Ce).then((kt)=>kt!==null).catch(()=>!1))L("Artifact already uploaded — reusing");else P("Uploading artifact"),await k.putObject({bucket:S,key:Ce,body:le.zip,contentType:"application/zip"});Z={kind:"zip",bucket:S,key:Ce},te.push({ParameterKey:"ArtifactBucket",ParameterValue:S},{ParameterKey:"ArtifactKey",ParameterValue:Ce})}let he=Fl({config:e,environment:t,app:u,handlers:J,runtimeLayers:G}),ye=JSON.stringify(he.template),ie=["CAPABILITY_NAMED_IAM"],xe=await R.describeStacks({stackName:b}).then((le)=>le.Stacks[0]?.StackStatus).catch(()=>{return}),ee=xe!==void 0;if(xe&&/DELETE_IN_PROGRESS/.test(xe))P("Waiting for an in-progress stack delete to finish"),await R.waitForStack(b,"stack-delete-complete").catch(()=>{}),ee=!1;else if(xe&&/(?:ROLLBACK_COMPLETE|REVIEW_IN_PROGRESS|CREATE_FAILED)/.test(xe))P(`Deleting unusable stack (status ${xe}) before recreate`),await R.deleteStack(b),await R.waitForStack(b,"stack-delete-complete").catch(()=>{}),ee=!1;P(ee?"Updating infrastructure stack":"Creating infrastructure stack");try{if(ee)await R.updateStack({stackName:b,templateBody:ye,parameters:te,capabilities:ie}),await R.waitForStack(b,"stack-update-complete");else await R.createStack({stackName:b,templateBody:ye,parameters:te,capabilities:ie,onFailure:"DELETE"}),await R.waitForStack(b,"stack-create-complete")}catch(le){if(/No updates are to be performed/i.test(String(le?.message)))L("No infrastructure changes");else throw le}let De=await R.getStackOutputs(b).catch(()=>({})),Ge;if(u.assets){let le=Tv(y,u.assets);if(WA(le)){let Ce=u.assetDomain||De.AssetsCdnDomain;Ge=Ce?`https://${Ce}/${oe}`:void 0,P(`Syncing assets from ${u.assets}`);let gt=await ZA(k,a.assetsBucket,le,oe,u.dotFilesAsAssets);L(`Uploaded ${gt} asset(s)${Ge?` → ${Ge}`:""}`)}else Bs(`Assets directory not found: ${le}`)}P("Resolving secrets");let pt=await QA(u,h);if(u.database?.connection==="aurora-serverless")try{let Ce=await new re(h).getSecretValue({SecretId:`${f}/${t}/db`}),gt=JSON.parse(Ce.SecretString??"{}");if(gt.username)pt.DB_USERNAME=gt.username;if(gt.password)pt.DB_PASSWORD=gt.password}catch(le){Bs(`Could not resolve Aurora DB credentials: ${le.message}`)}if(!await k.bucketExists(S))await k.createBucket(S);let Bt=await Ld(k,S,f,t),Ze={},wt=he.queueNames[0],zt=Es(u,De);if(P("Activating functions"),Ze.http=br(u,a,t,"http",pt,Ge,wt,zt),await sa(D,he.functionNames.http,Ze.http,Z),Ze.cli=br(u,a,t,"cli",pt,Ge,wt,zt),await sa(D,he.functionNames.cli,Ze.cli,Z),he.queueNames.length)Ze.queue=br(u,a,t,"queue",pt,Ge,wt,zt),await sa(D,he.functionNames.queue,Ze.queue,Z);let rt=(u.provisionedConcurrency??0)>0,W={};if(rt){if(P("Publishing versions + flipping live alias"),W.http=await Md(D,he.functionNames.http),W.cli=await Md(D,he.functionNames.cli),he.queueNames.length)W.queue=await Md(D,he.functionNames.queue)}if(await Dv(k,S,f,t,{sha:oe,code:Z,previousSha:Bt?.sha,previousCode:Bt?.code,previousFunctionEnv:Bt?.functionEnv,...rt?{functionVersions:W,previousFunctionVersions:Bt?.functionVersions}:{},functionEnv:Ze,functionNames:{http:he.functionNames.http,cli:he.functionNames.cli,...he.queueNames.length?{queue:he.functionNames.queue}:{}},assetUrl:Ge,timestamp:new Date().toISOString()}),!r.skipDeployHooks&&u.deploy?.length){P("Running deploy hooks");for(let le of u.deploy){L(` deploy: ${le}`);let Ce=await D.invoke({FunctionName:he.functionNames.cli,InvocationType:"RequestResponse",Payload:{command:le},LogType:"Tail"});if(Ce.FunctionError)throw Ig("Deploy hook failed — the new build is ALREADY LIVE."),L(` Roll back with: cloud serverless:rollback --env ${t}`),Error(`Deploy hook failed (${le}): ${Ce.Payload}`)}}let se=De.HttpApiEndpoint;if(!r.skipHealthCheck&&se){P("Health check");try{let le=await fetch(se,{method:"GET"});L(`GET ${se} → ${le.status}`)}catch(le){Bs(`Health check could not reach ${se}: ${le.message}`)}}bg(["Serverless deploy complete","",se?`URL: ${se}`:"",`Stack: ${b}`,`Build: ${oe.slice(0,12)}`].filter(Boolean).join(`
180
- `),"green")}async function kn(e,t){let r=So(e,t),a=new o(r.region),u=new T(r.region),f=await Ld(a,r.artifactBucket,r.slug,t);if(!f)throw Error("No previous release to redeploy. Run a full deploy first.");xs(`Redeploying ${r.slug} (${t}) — build ${f.sha.slice(0,12)}`);for(let[h,b]of Object.entries(f.functionNames)){if(!b)continue;P(`Re-activating ${h} (${b})`),await sa(u,b,f.functionEnv[h]??{},f.code);let S=f.functionVersions?.[h];if(S)await ho(()=>u.updateAlias({FunctionName:b,Name:"live",FunctionVersion:S}))}$n("Redeploy complete")}async function Nn(e,t){let r=So(e,t),a=new o(r.region),u=new T(r.region),f=await Ld(a,r.artifactBucket,r.slug,t);if(!f?.previousCode)throw Error("No previous release to roll back to.");xs(`Rolling back ${r.slug} (${t}) → ${f.previousSha?.slice(0,12)}`);for(let[h,b]of Object.entries(f.functionNames)){if(!b)continue;P(`Restoring ${h} (${b})`);let S=f.previousFunctionEnv?.[h]??f.functionEnv[h]??{};await sa(u,b,S,f.previousCode);let y=f.previousFunctionVersions?.[h];if(y)await ho(()=>u.updateAlias({FunctionName:b,Name:"live",FunctionVersion:y}))}await Dv(a,r.artifactBucket,r.slug,t,{...f,sha:f.previousSha??f.sha,code:f.previousCode,functionEnv:f.previousFunctionEnv??f.functionEnv,functionVersions:f.previousFunctionVersions??f.functionVersions,previousSha:void 0,previousCode:void 0,previousFunctionEnv:void 0,previousFunctionVersions:void 0,timestamp:new Date().toISOString()}),$n("Rollback complete")}async function Cr(e,t,r,a){let u=So(e,t),f=new T(u.region),h=`${u.slug}-${t}-http`,S={...(await f.getFunction(h)).Configuration?.Environment?.Variables??{}};if(S.MAINTENANCE_MODE=r?"1":"0",r&&a)S.MAINTENANCE_BYPASS_SECRET=a;if(!r)delete S.MAINTENANCE_BYPASS_SECRET;if(await ho(()=>f.updateFunctionConfiguration({FunctionName:h,Environment:{Variables:S}})),(u.app.provisionedConcurrency??0)>0)await f.waitForFunctionActive(h,120),await Md(f,h);$n(r?"Application is now in maintenance mode (503)":"Application is live")}async function ct(e,t,r){let a=So(e,t),u=new T(a.region),f=`${a.slug}-${t}-cli`,h=await u.invoke({FunctionName:f,InvocationType:"RequestResponse",Payload:{command:r},LogType:"Tail"});if(h.FunctionError)throw Error(`Command failed: ${h.Payload}`);return h.Payload??""}async function vr(e,t){let r=So(e,t),a=new A(r.region),u=new T(r.region),f=new o(r.region),h="not deployed",b={};try{let{Stacks:M}=await a.describeStacks({stackName:r.stackName});h=M?.[0]?.StackStatus??h;for(let z of M?.[0]?.Outputs??[])if(z.OutputKey)b[z.OutputKey]=z.OutputValue??""}catch{}let S=Ml(r.app,r.slug,t),y=r.app.provisionedConcurrency??0,k=["http","cli",...S.length?["queue"]:[]],R=`${r.slug}-${t}`,D=[];for(let M of k){let z=`${R}-${M}`,J={mode:M,name:z,version:"$LATEST"};if(y>0){let Z=await u.getAlias(z,"live").catch(()=>null);if(Z?.FunctionVersion){J.version=Z.FunctionVersion;let oe=await u.getProvisionedConcurrencyConfig(z,"live").catch(()=>null);if(oe)J.provisioned={status:oe.Status??"-",allocated:oe.AllocatedProvisionedConcurrentExecutions??0,requested:oe.RequestedProvisionedConcurrentExecutions??0}}}D.push(J)}let O=await Ld(f,r.artifactBucket,r.slug,t).catch(()=>null);return{slug:r.slug,environment:t,region:r.region,stackStatus:h,endpoint:b.HttpApiEndpoint,assetUrl:O?.assetUrl,scheduler:r.app.scheduler??"on",queues:S,provisionedConcurrency:y,functions:D,lastRelease:O?{sha:O.sha,timestamp:O.timestamp}:void 0}}function eC(e,t){return`${e}-${t}-db`}async function $v(e,t,r,a){let u=So(e,t);if(u.app.database?.connection!=="aurora-serverless")throw Error("No Aurora Serverless v2 database is configured for this environment.");let{RDSClient:f}=await import("./chunk-fc9n4dpq.js"),h=new f(u.region),b=eC(u.slug,t);P(`Scaling ${b} → ${r}–${a} ACUs`),await h.modifyDBCluster({DBClusterIdentifier:b,ServerlessV2ScalingConfiguration:{MinCapacity:r,MaxCapacity:a},ApplyImmediately:!0}),$n(`Scaling applied to ${b} (takes effect shortly).`)}class Pg{client;region;constructor(e="us-east-1"){this.region=e,this.client=new n}async call(e,t){return this.client.request({service:"wafv2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`AWSWAF_20190729.${e}`},body:JSON.stringify(t)})}async listWebACLs(e="REGIONAL"){return(await this.call("ListWebACLs",{Scope:e,Limit:100}))?.WebACLs??[]}async getWebACLRules(e,t,r="REGIONAL"){return((await this.call("GetWebACL",{Name:e,Id:t,Scope:r}))?.WebACL?.Rules??[]).map((f)=>({Name:f.Name,Priority:f.Priority,Action:f.Action?Object.keys(f.Action)[0]:f.OverrideAction?Object.keys(f.OverrideAction)[0]:"count"}))}}var tC=[{index:0,id:"clients",label:"Clients"},{index:1,id:"dns",label:"DNS & TLS"},{index:2,id:"edge",label:"Edge"},{index:3,id:"routing",label:"Routing"},{index:4,id:"apps",label:"Applications"},{index:5,id:"runtime",label:"Background runtime"},{index:6,id:"data",label:"Data services"},{index:7,id:"durability",label:"Durability"}],rC=[{index:0,id:"clients",label:"Clients"},{index:1,id:"dns",label:"DNS & TLS"},{index:2,id:"edge",label:"Edge"},{index:3,id:"entry",label:"Entry points"},{index:4,id:"compute",label:"Compute"},{index:5,id:"messaging",label:"Messaging & pooling"},{index:6,id:"data",label:"Data services"},{index:7,id:"durability",label:"Durability"}],nC=[{match:/^redis/,kind:"cache",label:"Redis"},{match:/^(?:mysql|mariadb)/,kind:"database",label:"MySQL"},{match:/^postgres/,kind:"database",label:"PostgreSQL"},{match:/^meilisearch/,kind:"database",label:"Meilisearch"},{match:/^vitess|^vtgate/,kind:"database",label:"Vitess"},{match:/^memcached/,kind:"cache",label:"Memcached"}],iC=/^(?:rpx-gateway|nginx|caddy|traefik|haproxy)$/;function Pe(e,t=""){let r=e==null?"":String(e).trim();return r&&r!=="-"&&r!=="—"?r:t}function oC(e){return Array.isArray(e)?e.length:0}function Jn(e){let t=Pe(e).toLowerCase();if(!t)return"unknown";if(["running","live","active","available","success","ok","healthy","enabled"].includes(t))return"ok";if(["failed","stopped","unreachable","error","critical","disabled"].includes(t))return"bad";if(["configured","creating","pending","degraded","shadowed","warn","unknown"].includes(t))return"warn";return"warn"}function Gt(e,t,r){if(r.has(t.source)&&r.has(t.target))e.push(t)}function Ft(e,t={}){let r=[],a=[],u=[],f=e.server??{},h=Array.isArray(e.sites)?e.sites:[],b=Array.isArray(e.services)?e.services:[],S=Array.isArray(e.workers)?e.workers:[],y=e.security??{},k=!!e._serverReachable&&!e.metricsUnavailable,R="box";if(!k)u.push("The compute box could not be probed, so live service state is missing; the shape comes from your cloud config.");r.push({id:"internet",label:"Internet",kind:"internet",layer:0,status:"ok",sub:"Public traffic",facts:[],external:!0});let D=[...new Set(h.map((ie)=>Pe(ie.domain)||Pe(ie.route).split("/")[0]).filter((ie)=>ie&&ie!=="internal"&&ie!=="loopback"))],O=Array.isArray(y.tlsCertificates)?y.tlsCertificates:[],M=O.filter((ie)=>Number(ie?.daysRemaining??999)<21).length;r.push({id:"dns",label:D.length===1?D[0]:"Public domains",kind:"dns",layer:1,status:M?"warn":D.length?"ok":"unknown",sub:D.length>1?`${D.length} domains`:"DNS & certificates",facts:[{label:"Domains",value:D.length?D.slice(0,6).join(", "):"none resolved"},{label:"Certificates",value:O.length?`${O.length} issued`:"none reported"},...M?[{label:"Expiring",value:`${M} within 21 days`}]:[]],href:"/server/security",external:!0});let z=y.firewall??{},J=Array.isArray(y.ports)?y.ports:[];r.push({id:"firewall",label:"Host firewall",kind:"firewall",layer:2,status:Jn(z.status),sub:Pe(z.summary,"Inbound filtering"),facts:[{label:"State",value:Pe(z.status,"unknown")},{label:"Open ports",value:J.length?J.map((ie)=>Pe(ie.listen)).join(", "):"not reported"}],href:"/server/firewall",group:"box"});let Z=b.find((ie)=>iC.test(Pe(ie.name)));r.push({id:"proxy",label:Pe(Z?.name,"Reverse proxy"),kind:"proxy",layer:3,status:Z?Jn(Z.status):"unknown",sub:"TLS termination & routing",facts:[{label:"Service",value:Pe(Z?.name,"not detected")},{label:"State",value:Pe(Z?.status,k?"not running":"not probed")},{label:"Routes",value:`${h.length} site${h.length===1?"":"s"}`}],href:"/server/services",group:"box"});for(let ie of h){let xe=`site:${Pe(ie.name)}`;if(!Pe(ie.name))continue;r.push({id:xe,label:Pe(ie.name),kind:"site",layer:4,status:Jn(ie.status),sub:Pe(ie.runtime,"runtime"),facts:[{label:"Route",value:Pe(ie.route,"internal")},{label:"Runtime",value:Pe(ie.runtime,"unknown")},{label:"Delivery",value:Pe(ie.deploy,"unknown")},{label:"TLS",value:Pe(ie.tls,"unknown")},...ie.responseMs!=null?[{label:"Response",value:`${Math.round(Number(ie.responseMs))} ms`}]:[],...ie.httpStatus!=null?[{label:"HTTP",value:String(ie.httpStatus)}]:[]],href:"/server/sites",group:"box"})}for(let ie of S){let xe=`worker:${Pe(ie.name)}`;if(!Pe(ie.name))continue;r.push({id:xe,label:Pe(ie.name),kind:"worker",layer:5,status:Jn(ie.status),sub:`${Number(ie.processes??1)} process${Number(ie.processes??1)===1?"":"es"}`,facts:[{label:"Processes",value:String(ie.processes??1)},{label:"State",value:Pe(ie.status,"unknown")},...Pe(ie.site)?[{label:"Site",value:Pe(ie.site)}]:[]],href:"/operations/jobs",group:"box"})}let oe=e.serverScheduler??{};if(oe.enabled)r.push({id:"scheduler",label:"Scheduler",kind:"scheduler",layer:5,status:"ok",sub:"Cron dispatch",facts:[{label:"Last run",value:Pe(oe.lastRun,"unknown")}],href:"/operations/jobs",group:"box"});let G=b.map((ie)=>{let xe=Pe(ie.name),ee=nC.find((De)=>De.match.test(xe));return ee?{service:ie,name:xe,...ee}:null}).filter((ie)=>!!ie);for(let ie of G)r.push({id:`data:${ie.name}`,label:ie.label,kind:ie.kind,layer:6,status:Jn(ie.service.status),sub:ie.name,facts:[{label:"Unit",value:ie.name},{label:"State",value:Pe(ie.service.status,"unknown")}],href:"/data/services",group:"box"});let te=e.backup??{};if(te.enabled)r.push({id:"backup",label:"Backups",kind:"backup",layer:7,status:"ok",sub:Pe(te.destination,"destination"),facts:[{label:"Destination",value:Pe(te.destination,"unknown")},{label:"Schedule",value:Pe(te.schedule,"unknown")},{label:"Retention",value:`${te.retention??0} copies`},{label:"Last run",value:Pe(te.last,"unknown")}],href:"/data/backups"});let he=new Set(r.map((ie)=>ie.id));Gt(a,{source:"internet",target:"dns",flow:"request",label:"https"},he),Gt(a,{source:"dns",target:"firewall",flow:"request",label:"443/80"},he),Gt(a,{source:"firewall",target:"proxy",flow:"request"},he);for(let ie of h){let xe=`site:${Pe(ie.name)}`;Gt(a,{source:"proxy",target:xe,flow:"request",label:Pe(ie.path)||void 0,status:Jn(ie.status)},he)}for(let ie of S){let xe=`worker:${Pe(ie.name)}`,ee=`site:${Pe(ie.site)}`;if(he.has(ee))Gt(a,{source:ee,target:xe,flow:"async",label:"queue"},he);else Gt(a,{source:"proxy",target:xe,flow:"async",label:"queue"},he)}for(let ie of S)Gt(a,{source:"scheduler",target:`worker:${Pe(ie.name)}`,flow:"async",label:"dispatch"},he);let ye=[...h.map((ie)=>`site:${Pe(ie.name)}`),...S.map((ie)=>`worker:${Pe(ie.name)}`)];for(let ie of G)for(let xe of ye)Gt(a,{source:xe,target:`data:${ie.name}`,flow:"data",label:"localhost"},he);if(G.length&&ye.length)u.push("Data-service edges show co-location on the box: every process on it can reach localhost. They are not a declared per-site binding.");for(let ie of G)Gt(a,{source:`data:${ie.name}`,target:"backup",flow:"backup",label:"snapshot"},he);for(let ie of h)Gt(a,{source:`site:${Pe(ie.name)}`,target:"backup",flow:"backup"},he);return{mode:"server",project:Pe(t.project)||Pe(e.project?.name)||Pe(f.name,"project"),environment:Pe(t.environment)||Pe(e.environment,"production"),provider:Pe(f.provider,"unknown"),region:Pe(f.region,"unknown"),generatedAt:new Date().toISOString(),layers:tC,groups:[{id:"box",label:Pe(f.name,"App server"),sub:[Pe(f.provider),Pe(f.region),Pe(f.ip)].filter(Boolean).join(" · ")}],nodes:r,links:a,notes:u}}function vs(e,t={}){let r=[],a=[],u=[],f=e.app??{},h=Array.isArray(e.functions)?e.functions:[],b=Array.isArray(e.queues)?e.queues:[],S=e.metrics??{};if(!h.length)u.push("No Lambda functions were read for this environment, so the compute layer is empty rather than assumed.");r.push({id:"internet",label:"Internet",kind:"internet",layer:0,status:"ok",sub:"Public traffic",facts:[],external:!0});let y=Pe(f.url),k=y.replace(/^https?:\/\//,"").split("/")[0];r.push({id:"dns",label:k||"Application domain",kind:"dns",layer:1,status:k?"ok":"unknown",sub:"DNS & certificates",facts:[{label:"Endpoint",value:y||"not resolved"}],external:!0});let R=e.waf;if(R)r.push({id:"waf",label:"WAF",kind:"waf",layer:2,status:Jn(R.status??"active"),sub:Pe(R.scope,"Managed rules"),facts:[{label:"Web ACL",value:Pe(R.name,"unnamed")},...R.blocked!=null?[{label:"Blocked (24h)",value:String(R.blocked)}]:[],{label:"Rules",value:String(oC(e.wafRules))}],href:"/serverless/firewall"});let D=e.assetsInfo;if(D)r.push({id:"cdn",label:"Asset CDN",kind:"cdn",layer:2,status:"ok",sub:Pe(D.cdn,"CloudFront"),facts:[{label:"Distribution",value:Pe(D.cdn,"unknown")},{label:"Custom domain",value:Pe(D.customDomain,"none")}],href:"/serverless/assets"}),r.push({id:"assets",label:"Asset bucket",kind:"storage",layer:6,status:"ok",sub:Pe(D.bucket,"S3"),facts:[{label:"Bucket",value:Pe(D.bucket,"unknown")},...D.files?[{label:"Objects",value:String(D.files)}]:[],...D.sizeMb?[{label:"Size",value:`${D.sizeMb} MB`}]:[]],href:"/serverless/assets"});let O=h.find((ee)=>Pe(ee.key).startsWith("http"));r.push({id:"gateway",label:"HTTP entry point",kind:"gateway",layer:3,status:O?"ok":"unknown",sub:"Function URL / API Gateway",facts:[{label:"Endpoint",value:y||"not resolved"},{label:"Invocations (24h)",value:String(S.invocations??0)},...S.errorRatePct!=null?[{label:"Error rate",value:`${S.errorRatePct}%`}]:[]],href:"/serverless/metrics"});for(let ee of h){let De=`fn:${Pe(ee.name)}`;if(!Pe(ee.name))continue;let Ge=Number(ee.errors??0),pt=Number(ee.invocations??0);r.push({id:De,label:Pe(ee.key,Pe(ee.name)),kind:"function",layer:4,status:Ge>0?pt&&Ge/pt>0.02?"bad":"warn":pt?"ok":"idle",sub:Pe(ee.runtime,"lambda"),facts:[{label:"Function",value:Pe(ee.name)},{label:"Memory",value:`${ee.memory??0} MB`},{label:"Timeout",value:`${ee.timeout??0}s`},{label:"Invocations (24h)",value:String(pt)},{label:"Errors (24h)",value:String(Ge)},{label:"p95",value:`${ee.p95??0} ms`},...ee.provisioned?[{label:"Provisioned",value:Pe(ee.provisioned)}]:[]],href:"/serverless/functions"})}for(let ee of b){let De=`queue:${Pe(ee.name)}`;if(!Pe(ee.name))continue;let Ge=Number(ee.dlq??0);r.push({id:De,label:Pe(ee.name),kind:"queue",layer:5,status:Ge>0?"bad":Number(ee.visible??0)>0?"warn":"ok",sub:"SQS",facts:[{label:"Visible",value:String(ee.visible??0)},{label:"In flight",value:String(ee.inFlight??0)},{label:"Processed (24h)",value:String(ee.processed??0)},{label:"Dead letter",value:String(Ge)}],href:"/serverless/queues"})}let M=e.aurora;if(M)r.push({id:"database",label:"Aurora Serverless",kind:"database",layer:6,status:Jn(M.status),sub:Pe(M.engine,"aurora"),facts:[{label:"Cluster",value:Pe(M.id,"unknown")},{label:"Capacity",value:`${M.currentAcu??0} ACU (${M.minAcu??0}–${M.maxAcu??0})`},{label:"Connections",value:String(M.connections??0)}],href:"/serverless/data"});let z=e.proxy;if(z)r.push({id:"rds-proxy",label:"RDS Proxy",kind:"database",layer:5,status:Jn(z.status),sub:"Connection pooling",facts:[{label:"Proxy",value:Pe(z.name,"unknown")},{label:"Endpoint",value:Pe(z.endpoint,"unknown")},{label:"Pooled",value:String(z.pooledConns??0)}],href:"/serverless/data"});let J=e.redis;if(J)r.push({id:"cache",label:"ElastiCache",kind:"cache",layer:6,status:Jn(J.status),sub:Pe(J.node,"redis"),facts:[{label:"Group",value:Pe(J.id,"unknown")},{label:"Hit rate",value:`${J.hitRate??0}%`}],href:"/serverless/data"});let Z=e.efs;if(Z)r.push({id:"efs",label:"EFS",kind:"filesystem",layer:6,status:Jn(Z.status),sub:Pe(Z.mount,"/mnt/local"),facts:[{label:"File system",value:Pe(Z.id,"unknown")},{label:"Mount",value:Pe(Z.mount,"unknown")},{label:"Size",value:`${Z.sizeMb??0} MB`}],href:"/data/volumes"});let oe=e.scheduler??{};if(oe.enabled)r.push({id:"scheduler",label:"Scheduler",kind:"scheduler",layer:3,status:"ok",sub:Pe(oe.expression,"rate(1 minute)"),facts:[{label:"Expression",value:Pe(oe.expression,"unknown")},{label:"Last run",value:Pe(oe.lastRun,"unknown")}],href:"/operations/jobs"});let G=new Set(r.map((ee)=>ee.id)),te=G.has("waf")?"waf":"gateway";Gt(a,{source:"internet",target:"dns",flow:"request",label:"https"},G),Gt(a,{source:"dns",target:te,flow:"request"},G),Gt(a,{source:"dns",target:"cdn",flow:"request",label:"assets"},G),Gt(a,{source:"waf",target:"gateway",flow:"request",label:"allowed"},G),Gt(a,{source:"cdn",target:"assets",flow:"data",label:"origin"},G);let he=h.filter((ee)=>Pe(ee.key).startsWith("http")),ye=h.filter((ee)=>Pe(ee.key).startsWith("queue")),ie=h.filter((ee)=>Pe(ee.key).startsWith("cli"));for(let ee of he)Gt(a,{source:"gateway",target:`fn:${Pe(ee.name)}`,flow:"request",label:"invoke"},G);for(let ee of ie)Gt(a,{source:"scheduler",target:`fn:${Pe(ee.name)}`,flow:"async",label:"schedule"},G);for(let ee of b){for(let De of he)Gt(a,{source:`fn:${Pe(De.name)}`,target:`queue:${Pe(ee.name)}`,flow:"async",label:"publish"},G);for(let De of ye)Gt(a,{source:`queue:${Pe(ee.name)}`,target:`fn:${Pe(De.name)}`,flow:"async",label:"consume"},G)}let xe=["rds-proxy","database","cache","efs","assets"];for(let ee of h){let De=`fn:${Pe(ee.name)}`;if(G.has("rds-proxy"))Gt(a,{source:De,target:"rds-proxy",flow:"data",label:"pooled"},G);else Gt(a,{source:De,target:"database",flow:"data",label:"sql"},G);for(let Ge of xe.filter((pt)=>pt!=="rds-proxy"&&pt!=="database"))Gt(a,{source:De,target:Ge,flow:"data"},G)}return Gt(a,{source:"rds-proxy",target:"database",flow:"data",label:"sql"},G),{mode:"serverless",project:Pe(t.project)||Pe(f.name,"application"),environment:Pe(t.environment)||Pe(f.env,"production"),provider:"aws",region:Pe(f.region,"unknown"),generatedAt:new Date().toISOString(),layers:rC,groups:[],nodes:r,links:a,notes:u}}function bh(e,t,r={}){return e==="serverless"?vs(t,r):Ft(t,r)}function Nv(e){return String(e).padStart(2,"0")}function ks(e){return`${e.getUTCFullYear()}-${Nv(e.getUTCMonth()+1)}-${Nv(e.getUTCDate())}`}function sC(e){let t=Math.max(0,Math.round((Date.now()-e)/1000));if(t<60)return`${t}s ago`;let r=Math.round(t/60);if(r<60)return`${r}m ago`;let a=Math.round(r/60);if(a<48)return`${a}h ago`;return`${Math.round(a/24)}d ago`}async function aa(e,t,r,a,u,f){let h=await e.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:r,Dimensions:[{Name:"FunctionName",Value:t}],StartTime:u,EndTime:f,Period:86400,Statistics:[a]}).catch(()=>[]);if(!h.length)return 0;if(a==="Sum")return h.reduce((b,S)=>b+(S.Sum??0),0);if(a==="Maximum")return Math.max(...h.map((b)=>b.Maximum??0));return h.reduce((b,S)=>b+(S.Average??0),0)/h.length}async function pc(e,t,r,a,u,f,h){let b=await e.getMetricStatistics({Namespace:t,MetricName:r,Dimensions:a,StartTime:f,EndTime:h,Period:86400,Statistics:[u]}).catch(()=>[]);if(!b.length)return 0;if(u==="Sum")return b.reduce((S,y)=>S+(y.Sum??0),0);if(u==="Maximum")return Math.max(...b.map((S)=>S.Maximum??0));return b.reduce((S,y)=>S+(y.Average??0),0)/b.length}async function Tg(e,t,r,a,u){let f=await e.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Duration",Dimensions:[{Name:"FunctionName",Value:t}],StartTime:a,EndTime:u,Period:86400,ExtendedStatistics:[r]}).catch(()=>[]);return Math.round(f.reduce((h,b)=>h+(b.Percentiles?.[r]??0),0))}async function Bn(e,t){let r=await vr(e,t),a=r.region,u=new me(a),f=new T(a),h=new we(a),b=new Date,S=new Date(b.getTime()-86400000),y=e.environments?.[t]?.app,k={};k.app={name:r.slug,env:t,region:a,runtime:y?.kind==="php"?`php-${y?.phpVersion??"8.3"} (fpm)`:y?.kind??"node",url:r.endpoint??"",build:r.lastRelease?.sha?.slice(0,7)??"—",deployedAt:r.lastRelease?.timestamp??"—"},k.maintenance={enabled:!1},k.scheduler={enabled:r.scheduler!=="off",expression:r.scheduler==="sub-minute"?"rate(1 minute) · sub-minute":"rate(1 minute)",lastRun:"—"};let R=0,D=0,O=0,M=[],z=[],J=[];for(let te of r.functions){let[he,ye,ie,xe,ee,De,Ge,pt,Bt]=await Promise.all([aa(u,te.name,"Invocations","Sum",S,b),aa(u,te.name,"Errors","Sum",S,b),aa(u,te.name,"Throttles","Sum",S,b),aa(u,te.name,"Duration","Average",S,b),f.getFunction(te.name).catch(()=>null),Tg(u,te.name,"p50",S,b),Tg(u,te.name,"p95",S,b),Tg(u,te.name,"p99",S,b),u.getMetricSeries({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:[{Name:"FunctionName",Value:te.name}],StartTime:new Date(b.getTime()-43200000),EndTime:b,Period:3600,Stat:"Sum"}).catch(()=>[])]);R+=he,D+=ye,O=Math.max(O,xe);let Ze=ee?.Configuration?.MemorySize??0,wt=Object.keys(ee?.Configuration?.Environment?.Variables??{}),zt=[],rt=0;try{let{events:se=[]}=await h.filterLogEvents({logGroupName:`/aws/lambda/${te.name}`,startTime:S.getTime(),limit:120});for(let le of se){let Ce=(le.message??"").trim(),gt=/Max Memory Used:\s*(\d+)\s*MB/.exec(Ce);if(gt)rt=Math.max(rt,Number(gt[1]));if(Ce&&!/^(?:START|END|REPORT|INIT_START)/.test(Ce))J.push({source:te.mode||te.name,timestamp:new Date(le.timestamp??0).toISOString(),when:sC(le.timestamp??0),message:Ce.slice(0,400),level:/error|exception|fatal|panic|traceback/i.test(Ce)?"error":/warn|warning|timeout|retr(?:y|ies)|throttl/i.test(Ce)?"warn":"info"})}zt=se.filter((le)=>!/^(?:START|END|REPORT|INIT_START)/.test((le.message??"").trim())).slice(-6).map((le)=>({ts:new Date(le.timestamp??0).toISOString().slice(11,19),msg:(le.message??"").trim().slice(0,120),err:/error|exception|fatal/i.test(le.message??"")}))}catch{}let W=Math.max(1,...Bt);M.push({key:te.mode,name:te.name,version:te.version,memory:Ze,timeout:ee?.Configuration?.Timeout??0,runtime:ee?.Configuration?.Runtime??"provided.al2023",invocations:Math.round(he),errors:Math.round(ye),p95:Ge||Math.round(xe),status:"active",provisioned:te.provisioned?`${te.provisioned.allocated}/${te.provisioned.requested}`:void 0}),z.push({key:te.mode,name:te.name,runtime:ee?.Configuration?.Runtime??"provided.al2023",arch:ee?.Configuration?.Architectures?.[0]??"x86_64",memory:Ze,timeout:ee?.Configuration?.Timeout??0,ephemeral:ee?.Configuration?.EphemeralStorage?.Size??512,version:te.version,concurrency:y?.concurrency??"—",invocations:Math.round(he),errors:Math.round(ye),throttles:Math.round(ie),p50:De||Math.round(xe),p95:Ge||Math.round(xe),p99:pt||Math.round(xe),maxMem:rt,spark:Bt.length?Bt.map((se)=>Math.round(se/W*100)):[0],env:wt.length?wt:["(none)"],recent:zt.length?zt:[{ts:"—",msg:"no recent events",err:!1}]})}k.functions=M,k.functionsDetail=z,k.serverlessLogs=J.sort((te,he)=>String(he.timestamp).localeCompare(String(te.timestamp))).slice(0,600),k.serverlessLogsEmptyReason=J.length?void 0:"No recent function logs were found in CloudWatch for this environment.";let Z=R?Number((D/R*100).toFixed(2)):0,oe=Math.round(await aa(u,r.functions[0]?.name??"","ConcurrentExecutions","Maximum",S,b));k.metrics={invocations:Math.round(R),errorRatePct:Z,p95Ms:Math.round(O),coldStartPct:void 0,concurrency:oe,estCostUsd:void 0};try{let te=new pe(a),he=[],ye=[],ie=0;try{let{QueueUrl:ee}=await te.getQueueUrl(`${r.slug}-${t}-dlq`),{Attributes:De}=await te.getQueueAttributes(ee);ie=Number(De.ApproximateNumberOfMessages??0)}catch{}let xe=y?hr(y,r.slug,t):[];for(let ee of xe){let De=ee.name.replace(`${r.slug}-${t}-`,""),Ge=0,pt=0;try{let{QueueUrl:Ze}=await te.getQueueUrl(ee.name),{Attributes:wt}=await te.getQueueAttributes(Ze);Ge=Number(wt.ApproximateNumberOfMessages??0),pt=Number(wt.ApproximateNumberOfMessagesNotVisible??0)}catch{}let Bt=Math.round(await pc(u,"AWS/SQS","NumberOfMessagesDeleted",[{Name:"QueueName",Value:ee.name}],"Sum",S,b));he.push({name:De,visible:Ge,inFlight:pt,processed:Bt,dlq:ie}),ye.push({name:ee.name,short:De,visible:Ge,inFlight:pt,delayed:0,processed:Bt,oldestSec:0,concurrency:ee.concurrency??y?.queueConcurrency??"—",tries:y?.queueTries??3,visTimeout:(y?.queueTimeout??120)*6,dlq:ie})}if(he.length)k.queues=he;if(ye.length)k.queuesDetail=ye;k.dlqItems=[]}catch{}try{let te=new A(a),{Stacks:he}=await te.describeStacks({stackName:dr(e,t)}),ye={};for(let ie of he?.[0]?.Outputs??[])if(ie.OutputKey)ye[ie.OutputKey]=ie.OutputValue??"";if(y?.database?.connection==="aurora-serverless"){let ie=`${r.slug}-${t}-db`,xe=[{Name:"DBClusterIdentifier",Value:ie}],[ee,De]=await Promise.all([pc(u,"AWS/RDS","ServerlessDatabaseCapacity",xe,"Average",S,b),pc(u,"AWS/RDS","DatabaseConnections",xe,"Maximum",S,b)]);if(k.aurora={id:ie,engine:"aurora-mysql",minAcu:y?.database?.minCapacity??0.5,maxAcu:y?.database?.maxCapacity??4,currentAcu:ee?Number(ee.toFixed(1)):y?.database?.minCapacity??0.5,database:"app",connections:Math.round(De),status:ye.DbEndpoint?"available":"creating"},y?.rdsProxy)k.proxy={name:`${r.slug}-${t}-proxy`,endpoint:ye.DbProxyEndpoint??"—",pooledConns:Math.round(De),status:"available"}}if(y?.cache?.driver==="elasticache"){let ie=`${r.slug}-${t}-cache`,xe=[{Name:"CacheClusterId",Value:`${ie}-001`}],[ee,De]=await Promise.all([pc(u,"AWS/ElastiCache","CacheHits",xe,"Sum",S,b),pc(u,"AWS/ElastiCache","CacheMisses",xe,"Sum",S,b)]),Ge=ee+De>0?Number((ee/(ee+De)*100).toFixed(1)):0;k.redis={id:ie,node:"cache.t4g.micro",engine:"redis",hitRate:Ge,status:ye.CacheEndpoint?"available":"creating"}}if(y?.efs){let ie=0;try{if(ye.EfsFileSystemId){let xe=new Dr(a),{FileSystems:ee}=await xe.describeFileSystems({FileSystemId:ye.EfsFileSystemId});ie=Number(((ee?.[0]?.SizeInBytes?.Value??0)/1048576).toFixed(1))}}catch{}k.efs={id:ye.EfsFileSystemId??"efs",mount:"/mnt/local",sizeMb:ie,status:"available"}}k.assetsInfo=ye.AssetsCdnDomain?{bucket:ye.AssetsBucketName??`${r.slug}-${t}-assets`,cdn:ye.AssetsCdnDomain,customDomain:y?.assetDomain??"—",assetUrl:r.assetUrl??"—",files:0,sizeMb:0,cacheHitPct:0,build:k.app.build}:void 0}catch{}if(k.assetsInfo)try{let he=await new o(a).list({bucket:k.assetsInfo.bucket,maxKeys:1000});k.assetsInfo.files=he.length,k.assetsInfo.sizeMb=Number((he.reduce((ye,ie)=>ye+(ie.Size??0),0)/1048576).toFixed(1)),k.assetsRecent=he.slice(0,8).map((ye)=>({path:`/${ye.Key}`,size:`${Math.max(1,Math.round((ye.Size??0)/1024))} KB`,type:ye.Key.split(".").pop()??""}))}catch{}try{if(y?.secrets){let te=Array.isArray(y.secrets)?y.secrets.map((he)=>({key:he.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),source:he})):Object.entries(y.secrets).map(([he,ye])=>({key:he,source:String(ye)}));k.secretsList=te.map((he)=>({...he,updated:"—"}))}}catch{}try{let te=new o(a),he=`${r.slug}-${t}-deployments`,ye=await te.getObjectJson(he,`deployments/${r.slug}/${t}/history.json`).catch(()=>null);if(ye?.records?.length)k.deploymentsDetail=ye.records.slice(-12).reverse().map((ie)=>({sha:(ie.sha??"").slice(0,7),status:ie.status??"success",when:ie.timestamp??"—",took:ie.took??"—",by:ie.by??"—",version:ie.version??"—",hooks:ie.hooks??[]}))}catch{}k.metricsTotals={invocations:k.metrics.invocations,errors:Math.round(D),errorRatePct:Z,p95Ms:k.metrics.p95Ms,throttles:z.reduce((te,he)=>te+he.throttles,0),coldStartPct:void 0,estCostUsd:void 0,concurrency:oe},k.metricsPerFn=z.map((te)=>({key:te.key,invocations:te.invocations,errors:te.errors,throttles:te.throttles,avgMs:te.p50,maxMs:te.p99,costUsd:void 0}));try{k.invSpark=await u.getMetricSeries({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:[{Name:"FunctionName",Value:r.functions.find((te)=>te.mode==="http")?.name??""}],StartTime:new Date(b.getTime()-86400000),EndTime:b,Period:3600,Stat:"Sum"})}catch{}try{let te=new $s,he=b,ye=new Date(Date.UTC(he.getUTCFullYear(),he.getUTCMonth(),1)),ie=new Date(Date.UTC(he.getUTCFullYear(),he.getUTCMonth()-1,1)),[xe,ee]=await Promise.all([te.getCostByService({start:ks(ye),end:ks(he),granularity:"MONTHLY"}).catch(()=>[]),te.getCostByService({start:ks(ie),end:ks(ye),granularity:"MONTHLY"}).catch(()=>[])]);if(xe.length){let De=xe.reduce((rt,W)=>rt+W.amount,0),Ge=ee.reduce((rt,W)=>rt+W.amount,0),pt=he.getUTCDate(),Bt=new Date(Date.UTC(he.getUTCFullYear(),he.getUTCMonth()+1,0)).getUTCDate();k.costSummary={monthToDateUsd:Number(De.toFixed(2)),projectedUsd:Number((De/pt*Bt).toFixed(2)),lastMonthUsd:Number(Ge.toFixed(2)),dailyAvgUsd:Number((De/pt).toFixed(2))},k.costServices=xe.filter((rt)=>rt.amount>0).sort((rt,W)=>W.amount-rt.amount).slice(0,12).map((rt)=>({name:rt.service,usd:Number(rt.amount.toFixed(2)),note:""})),k.metrics.estCostUsd=Number((De/pt).toFixed(2)),k.metricsTotals.estCostUsd=k.metrics.estCostUsd,k.costTrend=await te.getDailyTotals({start:ks(ye),end:ks(he)}).catch(()=>[]);let Ze=xe.find((rt)=>/lambda/i.test(rt.service))?.amount??0,wt=(rt)=>rt.invocations*(rt.p50/1000)*(rt.memory/1024),zt=z.reduce((rt,W)=>rt+wt(W),0)||1;k.costPerFn=z.map((rt)=>({key:rt.key,requests:rt.invocations,gbSec:Math.round(wt(rt)),usd:Number((Ze*(wt(rt)/zt)).toFixed(2))}))}}catch{}if(y?.firewall)try{let te=await u.getMetricStatistics({Namespace:"AWS/WAFV2",MetricName:"BlockedRequests",StartTime:S,EndTime:b,Period:86400,Statistics:["Sum"]}).catch(()=>[]),he=await u.getMetricStatistics({Namespace:"AWS/WAFV2",MetricName:"AllowedRequests",StartTime:S,EndTime:b,Period:86400,Statistics:["Sum"]}).catch(()=>[]);k.waf={enabled:!0,scope:"REGIONAL",acl:`${r.slug}-${t}-waf`,allowed24h:Math.round(he.reduce((ye,ie)=>ye+(ie.Sum??0),0)),blocked24h:Math.round(te.reduce((ye,ie)=>ye+(ie.Sum??0),0))};try{let ye=new Pg(a),ie=await ye.listWebACLs("REGIONAL"),xe=ie.find((ee)=>ee.Name?.includes(`${r.slug}-${t}`))??ie[0];if(xe?.Name&&xe.Id){k.waf.acl=xe.Name;let ee=await ye.getWebACLRules(xe.Name,xe.Id,"REGIONAL");if(ee.length)k.wafRules=ee.map((De)=>({name:De.Name??"—",detail:`priority ${De.Priority??0}`,action:De.Action??"count",blocked24h:0}))}}catch{}}catch{}let G=[];if(k.aurora)G.push({name:"Aurora Serverless v2",detail:`${k.aurora.id} · ${k.aurora.minAcu}-${k.aurora.maxAcu} ACU`,status:k.aurora.status});if(k.proxy)G.push({name:"RDS Proxy",detail:k.proxy.name,status:k.proxy.status});if(k.redis)G.push({name:`ElastiCache (${k.redis.engine})`,detail:`${k.redis.node} · ${k.redis.hitRate}% hit rate`,status:k.redis.status});if(k.efs)G.push({name:"EFS",detail:`${k.efs.mount} · ${k.efs.sizeMb} MB`,status:k.efs.status});if(G.length)k.dataServices=G;if(r.scheduler!=="off"&&y?.kind==="php")try{let te=await ct(e,t,"schedule:list"),he=[];for(let ye of(te||"").split(`
181
- `)){let ie=/^\s*([\d*/,\-\s]+?)\s{2,}(.+?)(?:\s{2,}Next Due.*)?$/.exec(ye);if(ie&&/[*\d]/.test(ie[1])&&ie[1].trim().split(/\s+/).length===5)he.push({command:ie[2].trim().replace(/^php artisan /,""),cron:ie[1].trim(),desc:"",lastRun:"—",lastStatus:"ok"})}if(he.length)k.schedulerTasks=he}catch{}return k.topology=vs(k,{project:e.project.name,environment:t}),k}function Ui(e){let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function aC(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;let t=Date.parse(`${e}T12:00:00.000Z`);return Number.isFinite(t)?new Date(t).toISOString():null}function ug(e,t){if(!e||typeof e!=="object")return[];let r={source:t.name},a=[],u=t.now,f=(y,k,R,D=u)=>{if(k!==null)a.push({name:y,value:k,unit:R,timestamp:D,attributes:r})};f("storage.egress.month",Ui(e.monthBytes),"bytes"),f("storage.egress.today",Ui(e.todayBytes),"bytes"),f("storage.egress.projected_month",Ui(e.projectedMonthBytes),"bytes");let h=Ui(e.budgetBytes);if(h!==null&&h>0){f("storage.egress.budget",h,"bytes");let y=e.budgetUsedPercent,k=typeof y==="number"&&Number.isFinite(y)?y:Ui(e.monthBytes)!==null?Math.round(Ui(e.monthBytes)/h*1000)/10:null;f("storage.egress.budget_used_percent",k,"percent")}let b=t.maxReplayDays??45,S=Array.isArray(e.days)?e.days.slice(-b):[];for(let y of S){let k=aC(String(y?.date??"")),R=Ui(y?.bytes);if(!k||R===null)continue;a.push({name:"storage.egress.day",value:R,unit:"bytes",timestamp:k,attributes:r});let D=Ui(y?.downloads);if(D!==null)a.push({name:"storage.egress.day_downloads",value:D,unit:"count",timestamp:k,attributes:r})}return a}async function gg(e,t=process.env,r=fetch){let a=e.tokenEnv?t[e.tokenEnv]:void 0,u=await r(e.url,{headers:a?{Authorization:`Bearer ${a}`}:{},signal:AbortSignal.timeout(1e4)});if(!u.ok)throw Error(`HTTP ${u.status}`);return await u.json()}async function Ya(e,t){let r=[],a=[];if(!Array.isArray(e)||e.length===0)return{metrics:r,errors:a};let u=await Promise.all(e.map(async(f)=>{if(!f?.name||!f?.url)return{endpoint:f,error:"egress endpoint needs both a name and a url"};try{let h=await gg(f,t.env,t.fetchImpl);return{endpoint:f,report:h}}catch(h){return{endpoint:f,error:h instanceof Error?h.message:String(h)}}}));for(let f of u){let h=`egress:${f.endpoint?.name??"unnamed"}`;if("error"in f&&f.error){a.push({source:h,message:f.error});continue}r.push(...ug(f.report,{name:f.endpoint.name,now:t.now}))}return{metrics:r,errors:a}}import{createHash as O_}from"node:crypto";import{existsSync as Si,mkdtempSync as km,readdirSync as BS,rmSync as Po,statSync as aw}from"node:fs";import{readFile as ni,writeFile as Ao}from"node:fs/promises";import{tmpdir as yl}from"node:os";import{dirname as $_,extname as Ic,join as Tt,normalize as N_,relative as j_,resolve as B_,sep as M_}from"node:path";import{fileURLToPath as L_}from"node:url";import{isIP as jv}from"node:net";var vt=(e)=>e==null?void 0:String(e),Fd=(e)=>Number(e)===1,qi=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}};function Bv(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),name:String(e.name),provider:String(e.provider),endpoint:vt(e.endpoint),endpointPolicy:String(e.endpoint_policy),bucket:vt(e.bucket),prefix:String(e.prefix),region:vt(e.region),forcePathStyle:Fd(e.force_path_style),credentialRef:vt(e.credential_ref),encryption:String(e.encryption),encryptionKeyRef:vt(e.encryption_key_ref),immutability:qi(e.immutability,{}),status:String(e.status),lastTestedAt:vt(e.last_tested_at),lastSuccessAt:vt(e.last_success_at),lastFailureAt:vt(e.last_failure_at),lastError:vt(e.last_error),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function xg(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:vt(e.environment_id),resourceId:vt(e.resource_id),dataServiceId:vt(e.data_service_id),destinationId:String(e.destination_id),name:String(e.name),resourceKind:String(e.resource_kind),schedule:String(e.schedule),timezone:String(e.timezone),retention:qi(e.retention,{}),compression:String(e.compression),encryption:String(e.encryption),includePatterns:qi(e.include_patterns,[]),excludePatterns:qi(e.exclude_patterns,[]),expectedRpoMinutes:Number(e.expected_rpo_minutes),expectedRtoMinutes:Number(e.expected_rto_minutes),healthCheckId:vt(e.health_check_id),enabled:Fd(e.enabled),nextRunAt:vt(e.next_run_at),lastRunAt:vt(e.last_run_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Dg(e){return{id:String(e.id),projectId:String(e.project_id),policyId:vt(e.policy_id),destinationId:String(e.destination_id),resourceId:vt(e.resource_id),dataServiceId:vt(e.data_service_id),backupJobId:vt(e.backup_job_id),kind:String(e.kind),pointInTime:String(e.point_in_time),uri:String(e.uri),sizeBytes:Number(e.size_bytes),checksum:String(e.checksum),manifest:qi(e.manifest,{}),toolVersion:vt(e.tool_version),engineVersion:vt(e.engine_version),expiresAt:vt(e.expires_at),lockedUntil:vt(e.locked_until),held:Fd(e.held),pinned:Fd(e.pinned),status:String(e.status),verificationState:String(e.verification_state),verifiedAt:vt(e.verified_at),durationMs:e.duration_ms==null?void 0:Number(e.duration_ms),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Og(e){return{id:String(e.id),projectId:String(e.project_id),policyId:vt(e.policy_id),recoveryPointId:vt(e.recovery_point_id),operationId:vt(e.operation_id),kind:String(e.kind),status:String(e.status),idempotencyKey:String(e.idempotency_key),target:qi(e.target,{}),restoreMode:vt(e.restore_mode),cancellability:String(e.cancellability),safetyBackupId:vt(e.safety_backup_id),healthResult:e.health_result?qi(e.health_result,{}):void 0,progress:qi(e.progress,{}),error:vt(e.error),startedAt:vt(e.started_at),finishedAt:vt(e.finished_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function cC(e){let t=e.toLowerCase();if(t==="localhost"||t.endsWith(".localhost")||t.endsWith(".local")||t.endsWith(".internal"))return!0;if(jv(t)===6)return t==="::1"||t.startsWith("fe80:");if(jv(t)!==4)return!1;let[r,a]=t.split(".").map(Number);return r===10||r===127||r===0||r===169&&a===254||r===172&&a>=16&&a<=31||r===192&&a===168}function Ch(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Backup destination names must be 2-63 lowercase letters, numbers, or dashes.");if(e.provider!=="aws_backup"&&!e.bucket)throw Error("S3 backup destinations require a bucket.");if(e.provider==="s3_compatible"&&!e.endpoint)throw Error("S3-compatible destinations require an explicit endpoint.");if(e.provider==="s3_compatible"&&!e.credentialRef)throw Error("S3-compatible destinations require a credential reference.");if(e.encryption!=="provider"&&!e.encryptionKeyRef)throw Error("Client-side encryption requires an encryption key reference.");if(e.endpoint){let t=new URL(e.endpoint);if(t.protocol!=="https:"||t.username||t.password||t.search||t.hash||t.pathname!=="/")throw Error("Backup endpoints must be origin-only HTTPS URLs without credentials, paths, queries, or fragments.");if(cC(t.hostname)&&e.endpointPolicy!=="allow_private")throw Error("Private backup endpoints require endpointPolicy allow_private.")}}class Za{controlPlane;now;constructor(e,t=()=>new Date){this.controlPlane=e;this.now=t}createDestination(e){Ch(e);let t=crypto.randomUUID(),r=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO backup_destinations (id,organization_id,project_id,name,provider,endpoint,endpoint_policy,bucket,prefix,region,force_path_style,credential_ref,encryption,encryption_key_ref,immutability,status,last_tested_at,last_success_at,last_failure_at,last_error,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.name,e.provider,e.endpoint??null,e.endpointPolicy,e.bucket??null,e.prefix,e.region??null,e.forcePathStyle?1:0,e.credentialRef??null,e.encryption,e.encryptionKeyRef??null,JSON.stringify(e.immutability),e.status,e.lastTestedAt??null,e.lastSuccessAt??null,e.lastFailureAt??null,e.lastError??null,1,r,r]),this.getDestination(t)}getDestination(e){let t=this.controlPlane.database.query("SELECT * FROM backup_destinations WHERE id=?").get(e);return t?Bv(t):void 0}listDestinations(e){return this.controlPlane.database.query("SELECT * FROM backup_destinations WHERE project_id=? ORDER BY name").all(e).map(Bv)}recordDestinationTest(e,t){let r=this.now().toISOString();return this.controlPlane.database.run("UPDATE backup_destinations SET status=?,last_tested_at=?,last_success_at=CASE WHEN ? THEN ? ELSE last_success_at END,last_failure_at=CASE WHEN ? THEN last_failure_at ELSE ? END,last_error=?,version=version+1,updated_at=? WHERE id=?",[t.ok?"healthy":"failing",r,t.ok?1:0,r,t.ok?1:0,r,t.ok?null:String(t.error??"Destination test failed.").slice(0,1000),r,e]),this.getDestination(e)}createPolicy(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Backup policy names must be lowercase slugs.");if(!e.resourceId&&!e.dataServiceId&&!["control_plane","infrastructure"].includes(e.resourceKind))throw Error("A backup policy requires a resource or data service target.");let t=this.getDestination(e.destinationId);if(!t||t.projectId!==e.projectId)throw Error("Backup destination was not found.");if(e.resourceKind==="control_plane"&&t.encryption==="provider")throw Error("Control-plane backups require client-side destination encryption.");if(["logical_database","volume","files","control_plane"].includes(e.resourceKind)&&t.provider==="aws_backup")throw Error(`${e.resourceKind} backups require an object-storage destination.`);if(e.resourceKind==="infrastructure"&&t.provider!=="aws_backup")throw Error("Infrastructure backups require an AWS Backup destination.");let r=at(e.schedule),a=$t(r.normalized,e.timezone,this.now(),1)[0],u=crypto.randomUUID(),f=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO backup_policies (id,organization_id,project_id,environment_id,resource_id,data_service_id,destination_id,name,resource_kind,schedule,timezone,retention,compression,encryption,include_patterns,exclude_patterns,expected_rpo_minutes,expected_rto_minutes,health_check_id,enabled,next_run_at,last_run_at,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[u,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.dataServiceId??null,e.destinationId,e.name,e.resourceKind,r.normalized,e.timezone,JSON.stringify(e.retention),e.compression,e.encryption,JSON.stringify(e.includePatterns),JSON.stringify(e.excludePatterns),e.expectedRpoMinutes,e.expectedRtoMinutes,e.healthCheckId??null,e.enabled?1:0,a,e.lastRunAt??null,1,f,f]),this.getPolicy(u)}getPolicy(e){let t=this.controlPlane.database.query("SELECT * FROM backup_policies WHERE id=?").get(e);return t?xg(t):void 0}listPolicies(e,t){return this.controlPlane.database.query(`SELECT * FROM backup_policies WHERE project_id=?${t?" AND environment_id=?":""} ORDER BY name`).all(e,...t?[t]:[]).map(xg)}duePolicies(e=this.now()){return this.controlPlane.database.query("SELECT * FROM backup_policies WHERE enabled=1 AND next_run_at<=? ORDER BY next_run_at,id").all(e.toISOString()).map(xg)}advancePolicy(e,t){let r=this.getPolicy(e);if(!r)throw Error("Backup policy was not found.");let a=$t(r.schedule,r.timezone,new Date(t),1)[0];return this.controlPlane.database.run("UPDATE backup_policies SET last_run_at=?,next_run_at=?,version=version+1,updated_at=? WHERE id=?",[t,a,this.now().toISOString(),e]),this.getPolicy(e)}createJob(e){let t=this.controlPlane.database.query("SELECT * FROM backup_jobs WHERE idempotency_key=?").get(e.idempotencyKey);if(t)return Og(t);let r=crypto.randomUUID(),a=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO backup_jobs (id,project_id,policy_id,recovery_point_id,operation_id,kind,status,idempotency_key,target,restore_mode,cancellability,safety_backup_id,health_result,progress,error,started_at,finished_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[r,e.projectId,e.policyId??null,e.recoveryPointId??null,e.operationId??null,e.kind,e.status,e.idempotencyKey,JSON.stringify(e.target),e.restoreMode??null,e.cancellability,e.safetyBackupId??null,e.healthResult?JSON.stringify(e.healthResult):null,JSON.stringify(e.progress),e.error??null,e.startedAt??null,e.finishedAt??null,a,a]),this.getJob(r)}getJob(e){let t=this.controlPlane.database.query("SELECT * FROM backup_jobs WHERE id=?").get(e);return t?Og(t):void 0}listJobs(e){return this.controlPlane.database.query("SELECT * FROM backup_jobs WHERE project_id=? ORDER BY created_at DESC").all(e).map(Og)}updateJob(e,t){let r=this.getJob(e);if(!r)throw Error("Backup job was not found.");let a={...r,...t};return this.controlPlane.database.run("UPDATE backup_jobs SET status=?,operation_id=?,recovery_point_id=?,progress=?,health_result=?,error=?,started_at=?,finished_at=?,safety_backup_id=?,updated_at=? WHERE id=?",[a.status,a.operationId??null,a.recoveryPointId??null,JSON.stringify(a.progress),a.healthResult?JSON.stringify(a.healthResult):null,a.error??null,a.startedAt??null,a.finishedAt??null,a.safetyBackupId??null,this.now().toISOString(),e]),this.getJob(e)}createRecoveryPoint(e){if(!/^sha256:[a-f0-9]{64}$/i.test(e.checksum))throw Error("Recovery points require a SHA-256 checksum.");if(typeof e.uri!=="string"||!["s3:","aws-backup:","file:"].some((a)=>e.uri.startsWith(a)))throw Error("Recovery point URI uses an unsupported destination scheme.");let t=crypto.randomUUID(),r=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO recovery_points (id,project_id,policy_id,destination_id,resource_id,data_service_id,backup_job_id,kind,point_in_time,uri,size_bytes,checksum,manifest,tool_version,engine_version,expires_at,locked_until,held,pinned,status,verification_state,verified_at,duration_ms,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.projectId,e.policyId??null,e.destinationId,e.resourceId??null,e.dataServiceId??null,e.backupJobId??null,e.kind,e.pointInTime,e.uri,e.sizeBytes,e.checksum,JSON.stringify(e.manifest),e.toolVersion??null,e.engineVersion??null,e.expiresAt??null,e.lockedUntil??null,e.held?1:0,e.pinned?1:0,e.status,e.verificationState,e.verifiedAt??null,e.durationMs??null,r,r]),this.getRecoveryPoint(t)}getRecoveryPoint(e){let t=this.controlPlane.database.query("SELECT * FROM recovery_points WHERE id=?").get(e);return t?Dg(t):void 0}listRecoveryPoints(e,t){return this.controlPlane.database.query(`SELECT * FROM recovery_points WHERE project_id=?${t?" AND policy_id=?":""} ORDER BY point_in_time DESC`).all(e,...t?[t]:[]).map(Dg)}updateRecoveryPoint(e,t){let r=this.getRecoveryPoint(e);if(!r)throw Error("Recovery point was not found.");let a={...r,...t};return this.controlPlane.database.run("UPDATE recovery_points SET status=?,verification_state=?,verified_at=?,held=?,pinned=?,manifest=?,duration_ms=?,updated_at=? WHERE id=?",[a.status,a.verificationState,a.verifiedAt??null,a.held?1:0,a.pinned?1:0,JSON.stringify(a.manifest),a.durationMs??null,this.now().toISOString(),e]),this.getRecoveryPoint(e)}retentionCandidates(e=this.now()){let t=this.controlPlane.database.query(`SELECT rp.* FROM recovery_points rp
179
+ `;function Rv(e){let t=e;return String(t?.code||t?.name||t?.statusCode||"")}function RA(e){return["NoSuchEntity","ResourceNotFoundException","404"].includes(Rv(e))}function Iv(e){return["EntityAlreadyExists","ResourceAlreadyExistsException","ResourceConflictException","409"].includes(Rv(e))}function Ev(e,t){let r=e?.Items;if(!r)return[];if(Array.isArray(r))return r;let a=r[t];if(a===void 0)return[];return Array.isArray(a)?a:[a]}function Rg(e){let t=e?.Aliases?.Items,r=t?.CNAME??t;if(Array.isArray(r))return r.map(String);if(typeof r==="string")return[r];return[]}function AA(e){if(!/^[A-Z0-9]{8,32}$/.test(e.distributionId))throw Error("CloudFront distribution ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$/.test(e.expectedAlias))throw Error("Expected CloudFront alias is invalid");if(!/^[A-Za-z0-9-_]{1,64}$/.test(e.functionName))throw Error("Lambda function name is invalid");let t=e.pathPattern?.startsWith("/")?e.pathPattern:`/${e.pathPattern||"api/*"}`;if(t==="/"||t==="/*"||!t.endsWith("*"))throw Error("API path must be a non-default wildcard pattern such as /api/*");let r=e.originId||`${e.functionName}-url`,a=e.roleName||`${e.functionName}-execution`;if(!/^[A-Za-z0-9_.-]{1,64}$/.test(a))throw Error("IAM role name is invalid");let u=e.memorySize??256,f=e.timeout??10,h=e.logRetentionDays??14;if(u<128||u>10240)throw Error("Lambda memory must be between 128 and 10240 MB");if(f<1||f>900)throw Error("Lambda timeout must be between 1 and 900 seconds");return{region:e.region||"us-east-1",pathPattern:t,originId:r,roleName:a,memorySize:u,timeout:f,logRetentionDays:h}}function Ah(e){let t=e.region||"us-east-1";return{cloudfront:new I(e.profile),iam:new Re(t,e.profile),lambda:new T(t,e.profile),logs:new we(t,e.profile),sts:new Te(t,e.profile),sleep:(r)=>new Promise((a)=>setTimeout(a,r))}}async function jS(e,t){let r=AA(e),a=t||Ah({profile:e.profile,region:r.region}),[u,f,h]=await Promise.all([a.sts.getCallerIdentity(),a.cloudfront.getDistribution(e.distributionId),a.cloudfront.getDistributionConfig(e.distributionId)]);if(!u.Account)throw Error("AWS identity did not return an account ID");if(!f.Enabled)throw Error(`CloudFront distribution ${e.distributionId} is disabled`);if(!(Rg(f).length?Rg(f):Rg(h.DistributionConfig)).includes(e.expectedAlias))throw Error(`Distribution ${e.distributionId} does not contain expected alias ${e.expectedAlias}`);let S,y=!0;try{S=await a.iam.getRole({RoleName:r.roleName})}catch(Ze){if(!RA(Ze))throw Ze;y=!1}let k=S?.Arn||`arn:aws:iam::${u.Account}:role/${r.roleName}`,R=await a.lambda.functionExists(e.functionName),D=R?await a.lambda.getFunctionUrl(e.functionName):null,O=await a.cloudfront.listOriginAccessControls(),M=`${e.functionName}-lambda-url`,z=O.some((Ze)=>Ze.Name===M&&Ze.OriginAccessControlOriginType==="lambda"),J=Ev(h.DistributionConfig.Origins,"Origin"),Z=Ev(h.DistributionConfig.CacheBehaviors,"CacheBehavior"),oe=J.some((Ze)=>String(Ze.Id)===r.originId),G=Z.some((Ze)=>String(Ze.PathPattern)===r.pathPattern),te=[...!y?[`create IAM execution role ${r.roleName}`]:[`reconcile IAM execution policy ${r.roleName}`],...R?[`update Lambda ${e.functionName} code and configuration`]:[`create Lambda ${e.functionName}`],...!D?["create private AWS_IAM function URL"]:[],...!z?[`create Lambda origin access control ${M}`]:[],"grant CloudFront function-URL and invocation permissions",`${G?"reconcile":"add"} ${r.pathPattern} behavior without changing the default behavior`],he={command:`cloud cdn:origin:remove ${e.distributionId} FUNCTION_URL_HOST --id ${r.originId} --path '${r.pathPattern}' --apply --confirm 'remove:${e.distributionId}:${r.pathPattern}'`,removeFunction:!R,removeRole:!y},ye={mode:e.apply?"apply":"plan",accountId:u.Account,identityArn:u.Arn,distribution:{id:f.Id,arn:f.ARN,alias:e.expectedAlias,domainName:f.DomainName,status:f.Status},function:{name:e.functionName,existed:R,runtime:"nodejs22.x",urlExisted:!!D,url:D?.FunctionUrl},role:{name:r.roleName,existed:y,arn:k},origin:{id:r.originId,pathPattern:r.pathPattern,existed:oe,behaviorExisted:G,accessControlExisted:z},changes:te,rollback:he,applied:!1};if(!e.apply)return ye;let ie=`${e.distributionId}:${r.pathPattern}`;if(e.confirm!==ie)throw Error(`Pass exact confirmation token ${ie} to mutate the live distribution`);if(!S)S=await a.iam.createRole({RoleName:r.roleName,Description:`Execution role for ${e.functionName}`,AssumeRolePolicyDocument:JSON.stringify({Version:"2012-10-17",Statement:[{Effect:"Allow",Principal:{Service:"lambda.amazonaws.com"},Action:"sts:AssumeRole"}]}),Tags:[{Key:"ManagedBy",Value:"ts-cloud"}]});await a.iam.putRolePolicy({RoleName:r.roleName,PolicyName:"lambda-logs",PolicyDocument:JSON.stringify({Version:"2012-10-17",Statement:[{Effect:"Allow",Action:["logs:CreateLogStream","logs:PutLogEvents"],Resource:`arn:aws:logs:${r.region}:${u.Account}:log-group:/aws/lambda/${e.functionName}:*`}]})});try{await a.logs.createLogGroup(`/aws/lambda/${e.functionName}`,{ManagedBy:"ts-cloud"})}catch(Ze){if(!Iv(Ze))throw Ze}await a.logs.putRetentionPolicy(`/aws/lambda/${e.functionName}`,r.logRetentionDays);let xe=e.code||EA;if(R)await a.lambda.updateFunctionCodeInline(e.functionName,xe,"index.mjs"),await a.lambda.waitForFunctionActive(e.functionName),await a.lambda.updateFunctionConfiguration({FunctionName:e.functionName,Runtime:"nodejs22.x",Role:S.Arn,Handler:"index.handler",Description:`Private API origin for ${e.expectedAlias}`,Timeout:r.timeout,MemorySize:r.memorySize});else{let Ze;for(let wt=0;wt<8;wt++)try{await a.lambda.createFunctionWithCode({FunctionName:e.functionName,Runtime:"nodejs22.x",Role:S.Arn,Handler:"index.handler",Code:xe,Filename:"index.mjs",Description:`Private API origin for ${e.expectedAlias}`,Timeout:r.timeout,MemorySize:r.memorySize}),Ze=void 0;break}catch(zt){if(Ze=zt,!String(zt.message).toLowerCase().includes("role"))throw zt;await a.sleep(1000)}if(Ze)throw Ze}await a.lambda.waitForFunctionActive(e.functionName);let ee=D||await a.lambda.createFunctionUrl({FunctionName:e.functionName,AuthType:"AWS_IAM",InvokeMode:"BUFFERED"});if(!ee.FunctionUrl)throw Error("Lambda did not return a function URL");let De=new URL(ee.FunctionUrl).hostname,Ge=await a.cloudfront.findOrCreateOriginAccessControl(M,"lambda"),pt=f.ARN||`arn:aws:cloudfront::${u.Account}:distribution/${e.distributionId}`,Bt=[{FunctionName:e.functionName,StatementId:"AllowCloudFrontFunctionUrl",Action:"lambda:InvokeFunctionUrl",Principal:"cloudfront.amazonaws.com",SourceArn:pt,FunctionUrlAuthType:"AWS_IAM"},{FunctionName:e.functionName,StatementId:"AllowCloudFrontInvoke",Action:"lambda:InvokeFunction",Principal:"cloudfront.amazonaws.com",SourceArn:pt,InvokedViaFunctionUrl:!0}];for(let Ze of Bt)try{await a.lambda.addPermission(Ze)}catch(wt){if(!Iv(wt))throw wt}return await a.cloudfront.upsertExistingDistributionOrigin(e.distributionId,{id:r.originId,domainName:De,pathPattern:r.pathPattern,originAccessControlId:Ge.Id}),{...ye,function:{...ye.function,url:ee.FunctionUrl},applied:!0}}async function zS(e){let t=`https://${e.alias}/`,r=`https://${e.alias}/api/health`,a=await fetch(t,{redirect:"follow",headers:{"cache-control":"no-cache"}}),u=new Uint8Array(await a.arrayBuffer()),f=IA("sha256").update(u).digest("hex"),h=Date.now(),b=await fetch(r,{redirect:"follow",headers:{"cache-control":"no-cache"}}),S=Date.now()-h,y=await b.text(),k=y;try{k=JSON.parse(y)}catch{}let R;if(e.logs&&e.functionName){let D=await e.logs.filterLogEvents({logGroupName:`/aws/lambda/${e.functionName}`,startTime:h-60000,filterPattern:'"Init Duration"',limit:25});for(let O of D.events||[]){let M=O.message?.match(/Init Duration:\s*([0-9.]+)\s*ms/i);if(M)R=Number(M[1])}}return{frontend:{url:t,status:a.status,sha256:f,unchanged:e.expectedFrontendSha256?f===e.expectedFrontendSha256:void 0,bytes:u.byteLength},api:{url:r,status:b.status,latencyMs:S,healthy:b.ok&&!!k?.ok,body:k},coldStart:{observed:R!==void 0,initDurationMs:R},verifiedAt:(e.now?.()||new Date).toISOString()}}function KS(e){let t=(e.memoryMb||256)/1024,r=Math.max(0,e.requests-(e.includeFreeTier===!1?0:1e6)),a=Math.max(0,e.requests*(e.averageDurationMs/1000)*t-(e.includeFreeTier===!1?0:400000)),u=r/1e6*0.2+a*0.0000166667,f=9.010025,h=16.425;return{lambdaUsd:Number(u.toFixed(2)),alwaysOnFargateAndAlbUsd:Number(25.435025000000003 .toFixed(2)),assumptions:["us-east-1 public list rates snapshot, July 2026","Lambda x86 request and duration pricing with optional monthly free tier","Fargate comparison uses one always-on 0.25 vCPU/0.5 GB task plus one ALB before LCU charges","excludes CloudFront, data transfer, logs, taxes, and application data services"]}}import{createHash as CA}from"node:crypto";function PA(e){let t=e;return String(t?.code||t?.name||t?.statusCode||"")}function _A(e){return PA(e)==="ValidationError"&&String(e.message).includes("does not exist")}function TA(e){return Object.fromEntries((e||[]).map((t)=>[t.OutputKey,t.OutputValue]))}function xA(e){let t=e?.Aliases?.Items??e?.Aliases,r=t?.CNAME??t;if(Array.isArray(r))return r.map(String);if(typeof r==="string")return[r];return[]}function Av(e){if(!/^[a-z][a-z0-9-]{1,62}$/.test(e.slug))throw Error("Slug must be a lowercase DNS-safe identifier");if(!/^[A-Z0-9]{8,32}$/.test(e.distributionId))throw Error("CloudFront distribution ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$/.test(e.expectedAlias))throw Error("Expected distribution alias is invalid");let t=e.imageUri.match(/@((?:sha256:)[a-f0-9]{64})$/i)?.[1];if(!t)throw Error("Container image must use an immutable ECR digest URI ending in @sha256:<64 hex>");let r=e.stackName||`${e.slug}-backend`;if(!/^[A-Za-z][A-Za-z0-9-]{0,127}$/.test(r))throw Error("CloudFormation stack name is invalid");let a=e.pathPattern||"/api/*";if(!/^\/[A-Za-z0-9_.*?~!$&'()+,;=:@%/-]+\*$/.test(a)||a==="/*")throw Error("Backend path must be a non-default wildcard pattern");let u=e.originId||`${e.slug}-backend`;if(!/^[A-Za-z0-9_.-]{1,128}$/.test(u))throw Error("CloudFront origin ID is invalid");if(e.originVerifySecret&&e.originVerifySecret.length<24)throw Error("Origin verification secret must contain at least 24 characters");if(!!e.originDomain!==!!e.certificateArn)throw Error("A custom origin domain and matching ACM certificate ARN must be provided together");return{stackName:r,region:e.region||"us-east-1",pathPattern:a,originId:u,digest:t}}function yh(e){let t=e.region||"us-east-1";return{cloudformation:new A(t,e.profile),cloudfront:new I(e.profile),sts:new Te(t,e.profile),fetch,sleep:(r)=>new Promise((a)=>setTimeout(a,r))}}function Sh(e){let t=Av(e),r=hl({name:e.name,slug:e.slug,domain:e.originDomain||e.expectedAlias,imageUri:e.imageUri,certificateArn:e.certificateArn,originVerifySecret:e.originVerifySecret,desiredCount:e.desiredCount,database:e.database,cache:e.cache,queue:e.queue}),a=fl(r);return a.Description=`Managed backend for existing static frontend ${e.expectedAlias}`,a.Metadata={ManagedBy:"ts-cloud",ExistingDistributionId:e.distributionId,ExistingDistributionAlias:e.expectedAlias,BackendPathPattern:t.pathPattern,ContainerDigest:t.digest},a}async function DA(e,t,r){let a;for(let u=0;u<30;u++){let f=Date.now();try{let h=await e.fetch(t,{redirect:"manual",headers:r?{"x-origin-verify":r}:void 0}),b=Date.now()-f,S=await h.text(),y=S;try{y=JSON.parse(S)}catch{}if(h.ok)return{url:t,status:h.status,latencyMs:b,body:y};a=Error(`origin returned ${h.status}`)}catch(h){a=h}if(u<29)await e.sleep(1e4)}throw Error(`Backend origin did not become healthy: ${a instanceof Error?a.message:String(a)}`)}async function WS(e,t){let r=Av(e),a=t||yh({region:r.region,profile:e.profile}),[u,f]=await Promise.all([a.sts.getCallerIdentity(),a.cloudfront.getDistribution(e.distributionId)]);if(!u.Account)throw Error("AWS identity did not return an account ID");if(!f.Enabled)throw Error(`CloudFront distribution ${e.distributionId} is disabled`);if(!xA(f).includes(e.expectedAlias))throw Error(`Distribution ${e.distributionId} does not contain expected alias ${e.expectedAlias}`);let h;try{h=(await a.cloudformation.describeStacks({stackName:r.stackName})).Stacks[0]}catch(te){if(!_A(te))throw te}let b=Sh(e),S=JSON.stringify(b);if(Buffer.byteLength(S)>51200)throw Error("Generated template exceeds the direct CloudFormation template body limit");let y=Object.values(b.Resources||{}).reduce((te,he)=>(te[he.Type]=(te[he.Type]||0)+1,te),{}),k=[`cloud cdn:origin:remove ${e.distributionId} ${e.originDomain||"ALB_HOST"} --id ${r.originId} --path '${r.pathPattern}' --profile ${e.profile||"default"} --apply --confirm 'remove:${e.distributionId}:${r.pathPattern}'`,`After CloudFront is deployed, restore external DNS if changed and delete stack ${r.stackName} only with an approved data-retention decision.`],R={mode:e.apply?"apply":"plan",accountId:u.Account,stack:{name:r.stackName,existed:!!h,status:h?.StackStatus,templateSha256:CA("sha256").update(S).digest("hex"),resourceCount:Object.keys(b.Resources||{}).length,resourceTypes:y},distribution:{id:f.Id,alias:e.expectedAlias,domainName:f.DomainName,status:f.Status,pathPattern:r.pathPattern,originId:r.originId},artifact:{imageUri:e.imageUri,digest:r.digest},services:{database:e.database!==!1,cache:e.cache!==!1,queue:e.queue!==!1,mail:"ses",desiredCount:e.desiredCount||1},cloudFrontApplied:!1,dnsApplied:!1,applied:!1,rollback:k};if(!e.apply)return R;let D=`${e.distributionId}:${r.pathPattern}:${r.stackName}`;if(e.confirm!==D)throw Error(`Pass exact confirmation token ${D} to provision the backend and change live routing`);if(h)try{await a.cloudformation.updateStack({stackName:r.stackName,templateBody:S,capabilities:["CAPABILITY_NAMED_IAM"],tags:[{Key:"ManagedBy",Value:"ts-cloud"},{Key:"Application",Value:e.slug}]}),await a.cloudformation.waitForStack(r.stackName,"stack-update-complete")}catch(te){if(!String(te.message).includes("No updates are to be performed"))throw te}else await a.cloudformation.createStack({stackName:r.stackName,templateBody:S,capabilities:["CAPABILITY_NAMED_IAM"],onFailure:"ROLLBACK",tags:[{Key:"ManagedBy",Value:"ts-cloud"},{Key:"Application",Value:e.slug}]}),await a.cloudformation.waitForStack(r.stackName,"stack-create-complete");let O=(await a.cloudformation.describeStacks({stackName:r.stackName})).Stacks[0],M=TA(O?.Outputs),z=M.AppLoadBalancerDnsName;if(!z)throw Error("Backend stack did not return AppLoadBalancerDnsName");let J=!1;if(e.originDomain&&e.originDomain!==z){if(!a.dns)throw Error(`External DNS provider is required to map ${e.originDomain} to ${z}`);let te=await a.dns.upsertRecord(e.originDomain,{name:e.originDomain,type:"CNAME",content:z,ttl:300});if(!te.success)throw Error(te.message||"External DNS update failed");J=!0}let Z=e.originDomain||z,oe=e.certificateArn?"https-only":"http-only",G=e.skipHealthCheck?void 0:await DA(a,`${oe==="https-only"?"https":"http"}://${Z}/api/health`,e.originVerifySecret);return await a.cloudfront.upsertExistingDistributionOrigin(e.distributionId,{id:r.originId,domainName:Z,pathPattern:r.pathPattern,protocolPolicy:oe,customHeaders:e.originVerifySecret?{"X-Origin-Verify":e.originVerifySecret}:void 0}),{...R,outputs:M,health:G,cloudFrontApplied:!0,dnsApplied:J,applied:!0}}function JS(e={}){let r={fargate:730*(e.desiredCount||1)*0.012342500000000001,applicationLoadBalancer:16.425,natGateway:32.85,postgres:730*(e.multiAzDatabase?0.032:0.016),redis:23.36};return{monthlyUsd:Number(Object.values(r).reduce((a,u)=>a+u,0).toFixed(2)),components:Object.fromEntries(Object.entries(r).map(([a,u])=>[a,Number(u.toFixed(2))])),assumptions:["us-east-1 public on-demand rate snapshot, July 2026","one 0.25 vCPU/0.5 GB Linux Fargate task unless desiredCount is changed","one ALB before LCU charges and one NAT gateway before data processing","single-AZ db.t4g.micro PostgreSQL by default and two cache.t4g.micro Redis nodes","excludes storage, backups, CloudFront, data transfer, public IPv4, logs, email, queue requests, taxes, and free-tier credits"]}}import{execFileSync as OA}from"node:child_process";import{createHash as $A}from"node:crypto";import{existsSync as Cv,mkdirSync as NA,mkdtempSync as jA,readdirSync as BA,readFileSync as MA,rmSync as LA,statSync as Pv,writeFileSync as FA}from"node:fs";import{tmpdir as zA}from"node:os";import{basename as UA,join as as,relative as qA,resolve as Cg}from"node:path";var VA=new Set([".git","node_modules","dist","coverage"]);function _v(e,t=e){let r=[];for(let a of BA(e).sort()){if(VA.has(a))continue;let u=as(e,a);if(sl(u,t))continue;let f=Pv(u);if(f.isDirectory())r.push(..._v(u,t));else if(f.isFile())r.push(qA(t,u))}return r}function Ih(e){let t=Cg(e);if(!Cv(t)||!Pv(t).isDirectory())throw Error(`Container context does not exist: ${t}`);let r=$A("sha256");for(let a of _v(t))r.update(a),r.update("\x00"),r.update(MA(as(t,a))),r.update("\x00");return r.digest("hex")}function bh(e){return{ecr:new He(e.region||"us-east-1",e.profile),run:(t,r,a)=>{OA(t,r,{cwd:a?.cwd,env:a?.env,stdio:a?.stdio||"inherit"})}}}async function XS(e,t){let r=Cg(e.context),a=Cg(e.dockerfile||as(r,"Dockerfile"));if(!Cv(a))throw Error(`Dockerfile does not exist: ${a}`);if(!e.repository.split("/").every((M)=>/^[a-z0-9][a-z0-9._-]*$/.test(M)&&!/[._-]$/.test(M)&&!/[._-]{2}/.test(M)))throw Error("ECR repository name is invalid");let h=t||bh(e),b=Ih(r),S=`sha-${b.slice(0,20)}`,y="";try{y=(await h.ecr.describeRepositories({repositoryNames:[e.repository]})).repositories?.[0]?.repositoryUri||""}catch{}if(!y)y=(await h.ecr.createRepository({repositoryName:e.repository,imageTagMutability:"IMMUTABLE",imageScanningConfiguration:{scanOnPush:!0},tags:[{Key:"ManagedBy",Value:"ts-cloud"}]})).repository?.repositoryUri||"";if(!y)throw Error(`Could not resolve ECR repository URI for ${e.repository}`);await h.ecr.putLifecyclePolicy({repositoryName:e.repository,lifecyclePolicyText:JSON.stringify({rules:[{rulePriority:1,description:"Retain the newest 25 release images",selection:{tagStatus:"any",countType:"imageCountMoreThan",countNumber:25},action:{type:"expire"}}]})});let k=`${y}:${S}`,R=jA(as(zA(),"ts-cloud-container-"));try{h.run("docker",["version"],{stdio:"ignore"}),h.run("docker",["build","--platform",e.platform||"linux/amd64","--provenance=false","--sbom=false","--file",a,"--tag",k,r],{cwd:r});let M=(await h.ecr.getAuthorizationToken()).authorizationData?.[0];if(!M?.authorizationToken||!M.proxyEndpoint)throw Error("ECR did not return Docker authorization data");let z=M.proxyEndpoint.replace(/^https?:\/\//,""),J=as(R,"docker");NA(J,{recursive:!0}),FA(as(J,"config.json"),JSON.stringify({auths:{[z]:{auth:M.authorizationToken}}}),{mode:384}),h.run("docker",["push",k],{env:{...process.env,DOCKER_CONFIG:J}})}finally{LA(R,{recursive:!0,force:!0})}let O=(await h.ecr.describeImages({repositoryName:e.repository,imageIds:[{imageTag:S}]})).imageDetails?.[0]?.imageDigest;if(!O||!/^sha256:[a-f0-9]{64}$/i.test(O))throw Error(`ECR did not return an immutable digest for ${UA(k)}`);return{repository:e.repository,tag:S,imageUri:k,digest:O,digestUri:`${y}@${O}`,contextSha256:b}}import{existsSync as WA,readdirSync as HA,readFileSync as KA,statSync as JA}from"node:fs";import{join as Tv,relative as GA}from"node:path";function So(e,t){let r=e.environments?.[t]?.app;if(!r)throw Error(`No serverless app configured for environment '${t}'. Add environments.${t}.app to your config.`);let a=e.project.slug,u=e.environments?.[t]?.region||e.project.region||"us-east-1";return{app:r,slug:a,region:u,stackName:dr(e,t),artifactBucket:cl(a,t),assetsBucket:Xi(a,t)}}async function ho(e,t=8){let r;for(let a=0;a<t;a++)try{return await e()}catch(u){let f=u?.code||u?.name||"",h=String(u?.message||"");if(f==="ResourceConflictException"||/update is in progress|currently in the following state/i.test(h)){r=u,await new Promise((b)=>setTimeout(b,3000));continue}throw u}throw r}var xv=(e,t)=>`releases/${e}/${t}/current.json`;async function Ld(e,t,r,a){try{return await e.getObjectJson(t,xv(r,a))}catch{return null}}async function Dv(e,t,r,a,u){await e.putObjectJson(t,xv(r,a),u)}async function QA(e,t){if(!e.secrets)return{};let r=new re(t),a={},u=Array.isArray(e.secrets)?e.secrets.map((f)=>({envName:f.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),secretId:f})):Object.entries(e.secrets).map(([f,h])=>({envName:f,secretId:h}));if(Array.isArray(e.secrets)){let f=new Map;for(let{envName:b,secretId:S}of u)f.set(b,[...f.get(b)??[],S]);let h=[...f.entries()].filter(([,b])=>b.length>1);if(h.length){let b=h.map(([S,y])=>`${S} ← ${y.join(", ")}`).join("; ");throw Error(`serverless secrets: multiple secrets map to the same env var (${b}). Use the map form { ENV_NAME: 'secret/id' } to disambiguate.`)}}for(let{envName:f,secretId:h}of u){let S=(await r.getSecretValue({SecretId:h})).SecretString??"";try{let y=JSON.parse(S);if(y&&typeof y==="object"&&!Array.isArray(y)){for(let[k,R]of Object.entries(y))a[k]=String(R);continue}}catch{}a[f]=S}return a}function Es(e,t){let r={},a=t.DbProxyEndpoint||t.DbEndpoint;if(a)r.DB_CONNECTION="mysql",r.DB_HOST=a,r.DB_PORT="3306",r.DB_DATABASE=r.DB_DATABASE||"app";if(t.CacheEndpoint){if(r.REDIS_HOST=t.CacheEndpoint,r.REDIS_PORT="6379",e.cache?.driver==="elasticache")r.CACHE_STORE="redis",r.CACHE_DRIVER="redis",r.SESSION_DRIVER="redis"}return r}function br(e,t,r,a,u,f,h,b={}){let S=e.kind==="php"?ql({cacheDriver:e.cache?.driver==="elasticache"?"redis":"dynamodb"}):{};return{TSCLOUD_LAMBDA_MODE:a,TSCLOUD_ENV:r,MAINTENANCE_MODE:"0",...e.octane?{TSCLOUD_OCTANE:"1"}:{},...e.serveAssets?{TSCLOUD_SERVE_ASSETS:"1"}:{},...e.redirectRobotsTxt===!1?{TSCLOUD_REDIRECT_ROBOTS_TXT:"0"}:{},...S,...b,...t.app.cache?.driver!=="elasticache"?{TSCLOUD_CACHE_TABLE:`${t.slug}-${r}-cache`}:{},...h?{TSCLOUD_QUEUE:h,SQS_QUEUE:h}:{},...f?{ASSET_URL:f}:{},...e.env??{},...u}}function YA(e){let t=e.slice(e.lastIndexOf(".")).toLowerCase();return{".html":"text/html",".css":"text/css",".js":"text/javascript",".mjs":"text/javascript",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".txt":"text/plain",".map":"application/json"}[t]??"application/octet-stream"}function*Ov(e){for(let t of HA(e)){let r=Tv(e,t);if(JA(r).isDirectory())yield*Ov(r);else yield r}}async function ZA(e,t,r,a,u=!1){let f=0;for(let h of Ov(r)){let b=GA(r,h).replace(/\\/g,"/");if(!u&&b.split("/").some((S)=>S.startsWith(".")))continue;await e.putObject({bucket:t,key:`${a}/${b}`,body:KA(h),contentType:YA(h),cacheControl:"public, max-age=31536000, immutable"}),f++}return f}function XA(e,t){let r=Object.entries(t).reduce((a,[u,f])=>a+Buffer.byteLength(`${u}=${f}`,"utf8"),0);if(r>4096){let a=Object.entries(t).map(([u,f])=>[u,Buffer.byteLength(`${u}=${f}`,"utf8")]).sort((u,f)=>f[1]-u[1]).slice(0,5).map(([u,f])=>`${u} (${f}B)`).join(", ");throw Error(`${e}: environment variables total ${r}B, over AWS's 4096B limit (${r-4096}B too large). Largest: ${a}. Move large/secret values out of env — store them in Secrets Manager and fetch at cold start.`)}}async function sa(e,t,r,a){XA(t,r),await ho(()=>e.updateFunctionConfiguration({FunctionName:t,Environment:{Variables:r}})),await e.waitForFunctionActive(t,120);let u=a.kind==="image"?{FunctionName:t,ImageUri:a.imageUri}:{FunctionName:t,S3Bucket:a.bucket,S3Key:a.key};await ho(()=>e.updateFunctionCode(u)),await e.waitForFunctionActive(t,120)}async function Md(e,t){let a=(await ho(()=>e.publishVersion({FunctionName:t}))).Version;if(!a)throw Error(`publishVersion returned no version for ${t}`);return await ho(()=>e.updateAlias({FunctionName:t,Name:"live",FunctionVersion:a})),a}async function Xa(e,t,r={}){let a=So(e,t),{app:u,slug:f,region:h,stackName:b,artifactBucket:S}=a,y=r.projectRoot??process.cwd();xs(`Deploying serverless app: ${f} (${t})`),L(`Stack: ${b}`),L(`Region: ${h}`);let k=new o(h),R=new A(h),D=new T(h),O=u.kind==="php",M=u.packaging==="image",z=ns(u),J,Z,oe,G,te=[];if(M&&z.usesLayer&&z.layerKind!=="php")throw Error(`packaging: 'image' currently supports PHP and managed Node runtimes. ${z.kind}${z.kind==="node"?` ${z.version}`:""} uses a custom runtime — `+"use the default zip packaging (the runtime layer is built + attached automatically).");if(M){P("Building + pushing container image");let{buildAndPushServerlessImage:le}=await import("./chunk-8crqfe8x.js"),Ce=await le({app:u,projectRoot:y,region:h,repository:`${f}-${t}`,skipBuild:r.skipBuild,onStep:(gt)=>L(` ${gt}`)});J=Ce.handlers,Z={kind:"image",imageUri:Ce.imageUri},oe=Ce.tag,te.push({ParameterKey:"ImageUri",ParameterValue:Ce.imageUri})}else{P("Packaging application");let le=O?jl({projectRoot:y,app:u,skipBuild:r.skipBuild,onStep:(kt)=>L(` ${kt}`)}):await pn({projectRoot:y,app:u,skipBuild:r.skipBuild,onStep:(kt)=>L(` ${kt}`)}),Ce=$l(f,t,le.sha256);if(L(`Artifact: ${le.sha256.slice(0,12)} (${(le.zip.length/1024).toFixed(0)} KB)`),J=le.handlers,oe=le.sha256,z.usesLayer){let kt=z.layerEnvVar?process.env[z.layerEnvVar]:void 0;if(G=u.layers??(kt?[kt]:void 0),!G?.length){let _e=z.layerKind==="php"?"serverless:build-php-layer":z.layerKind==="bun"?"serverless:build-bun-layer":"serverless:build-node-layer";throw Error(`${z.kind} apps on provided.al2023 need a runtime layer. Set environments.<env>.app.layers or the ${z.layerEnvVar} env var (build one with \`cloud ${_e}\`)${z.kind==="node"?", or use a managed Node version (18/20/22)":""}.`)}}if(!await k.bucketExists(S))P(`Creating artifact bucket ${S}`),await k.createBucket(S);if(await k.headObject(S,Ce).then((kt)=>kt!==null).catch(()=>!1))L("Artifact already uploaded — reusing");else P("Uploading artifact"),await k.putObject({bucket:S,key:Ce,body:le.zip,contentType:"application/zip"});Z={kind:"zip",bucket:S,key:Ce},te.push({ParameterKey:"ArtifactBucket",ParameterValue:S},{ParameterKey:"ArtifactKey",ParameterValue:Ce})}let he=Fl({config:e,environment:t,app:u,handlers:J,runtimeLayers:G}),ye=JSON.stringify(he.template),ie=["CAPABILITY_NAMED_IAM"],xe=await R.describeStacks({stackName:b}).then((le)=>le.Stacks[0]?.StackStatus).catch(()=>{return}),ee=xe!==void 0;if(xe&&/DELETE_IN_PROGRESS/.test(xe))P("Waiting for an in-progress stack delete to finish"),await R.waitForStack(b,"stack-delete-complete").catch(()=>{}),ee=!1;else if(xe&&/(?:ROLLBACK_COMPLETE|REVIEW_IN_PROGRESS|CREATE_FAILED)/.test(xe))P(`Deleting unusable stack (status ${xe}) before recreate`),await R.deleteStack(b),await R.waitForStack(b,"stack-delete-complete").catch(()=>{}),ee=!1;P(ee?"Updating infrastructure stack":"Creating infrastructure stack");try{if(ee)await R.updateStack({stackName:b,templateBody:ye,parameters:te,capabilities:ie}),await R.waitForStack(b,"stack-update-complete");else await R.createStack({stackName:b,templateBody:ye,parameters:te,capabilities:ie,onFailure:"DELETE"}),await R.waitForStack(b,"stack-create-complete")}catch(le){if(/No updates are to be performed/i.test(String(le?.message)))L("No infrastructure changes");else throw le}let De=await R.getStackOutputs(b).catch(()=>({})),Ge;if(u.assets){let le=Tv(y,u.assets);if(WA(le)){let Ce=u.assetDomain||De.AssetsCdnDomain;Ge=Ce?`https://${Ce}/${oe}`:void 0,P(`Syncing assets from ${u.assets}`);let gt=await ZA(k,a.assetsBucket,le,oe,u.dotFilesAsAssets);L(`Uploaded ${gt} asset(s)${Ge?` → ${Ge}`:""}`)}else Bs(`Assets directory not found: ${le}`)}P("Resolving secrets");let pt=await QA(u,h);if(u.database?.connection==="aurora-serverless")try{let Ce=await new re(h).getSecretValue({SecretId:`${f}/${t}/db`}),gt=JSON.parse(Ce.SecretString??"{}");if(gt.username)pt.DB_USERNAME=gt.username;if(gt.password)pt.DB_PASSWORD=gt.password}catch(le){Bs(`Could not resolve Aurora DB credentials: ${le.message}`)}if(!await k.bucketExists(S))await k.createBucket(S);let Bt=await Ld(k,S,f,t),Ze={},wt=he.queueNames[0],zt=Es(u,De);if(P("Activating functions"),Ze.http=br(u,a,t,"http",pt,Ge,wt,zt),await sa(D,he.functionNames.http,Ze.http,Z),Ze.cli=br(u,a,t,"cli",pt,Ge,wt,zt),await sa(D,he.functionNames.cli,Ze.cli,Z),he.queueNames.length)Ze.queue=br(u,a,t,"queue",pt,Ge,wt,zt),await sa(D,he.functionNames.queue,Ze.queue,Z);let rt=(u.provisionedConcurrency??0)>0,W={};if(rt){if(P("Publishing versions + flipping live alias"),W.http=await Md(D,he.functionNames.http),W.cli=await Md(D,he.functionNames.cli),he.queueNames.length)W.queue=await Md(D,he.functionNames.queue)}if(await Dv(k,S,f,t,{sha:oe,code:Z,previousSha:Bt?.sha,previousCode:Bt?.code,previousFunctionEnv:Bt?.functionEnv,...rt?{functionVersions:W,previousFunctionVersions:Bt?.functionVersions}:{},functionEnv:Ze,functionNames:{http:he.functionNames.http,cli:he.functionNames.cli,...he.queueNames.length?{queue:he.functionNames.queue}:{}},assetUrl:Ge,timestamp:new Date().toISOString()}),!r.skipDeployHooks&&u.deploy?.length){P("Running deploy hooks");for(let le of u.deploy){L(` deploy: ${le}`);let Ce=await D.invoke({FunctionName:he.functionNames.cli,InvocationType:"RequestResponse",Payload:{command:le},LogType:"Tail"});if(Ce.FunctionError)throw Ig("Deploy hook failed — the new build is ALREADY LIVE."),L(` Roll back with: cloud serverless:rollback --env ${t}`),Error(`Deploy hook failed (${le}): ${Ce.Payload}`)}}let se=De.HttpApiEndpoint;if(!r.skipHealthCheck&&se){P("Health check");try{let le=await fetch(se,{method:"GET"});L(`GET ${se} → ${le.status}`)}catch(le){Bs(`Health check could not reach ${se}: ${le.message}`)}}bg(["Serverless deploy complete","",se?`URL: ${se}`:"",`Stack: ${b}`,`Build: ${oe.slice(0,12)}`].filter(Boolean).join(`
180
+ `),"green")}async function kn(e,t){let r=So(e,t),a=new o(r.region),u=new T(r.region),f=await Ld(a,r.artifactBucket,r.slug,t);if(!f)throw Error("No previous release to redeploy. Run a full deploy first.");xs(`Redeploying ${r.slug} (${t}) — build ${f.sha.slice(0,12)}`);for(let[h,b]of Object.entries(f.functionNames)){if(!b)continue;P(`Re-activating ${h} (${b})`),await sa(u,b,f.functionEnv[h]??{},f.code);let S=f.functionVersions?.[h];if(S)await ho(()=>u.updateAlias({FunctionName:b,Name:"live",FunctionVersion:S}))}$n("Redeploy complete")}async function Nn(e,t){let r=So(e,t),a=new o(r.region),u=new T(r.region),f=await Ld(a,r.artifactBucket,r.slug,t);if(!f?.previousCode)throw Error("No previous release to roll back to.");xs(`Rolling back ${r.slug} (${t}) → ${f.previousSha?.slice(0,12)}`);for(let[h,b]of Object.entries(f.functionNames)){if(!b)continue;P(`Restoring ${h} (${b})`);let S=f.previousFunctionEnv?.[h]??f.functionEnv[h]??{};await sa(u,b,S,f.previousCode);let y=f.previousFunctionVersions?.[h];if(y)await ho(()=>u.updateAlias({FunctionName:b,Name:"live",FunctionVersion:y}))}await Dv(a,r.artifactBucket,r.slug,t,{...f,sha:f.previousSha??f.sha,code:f.previousCode,functionEnv:f.previousFunctionEnv??f.functionEnv,functionVersions:f.previousFunctionVersions??f.functionVersions,previousSha:void 0,previousCode:void 0,previousFunctionEnv:void 0,previousFunctionVersions:void 0,timestamp:new Date().toISOString()}),$n("Rollback complete")}async function Cr(e,t,r,a){let u=So(e,t),f=new T(u.region),h=`${u.slug}-${t}-http`,S={...(await f.getFunction(h)).Configuration?.Environment?.Variables??{}};if(S.MAINTENANCE_MODE=r?"1":"0",r&&a)S.MAINTENANCE_BYPASS_SECRET=a;if(!r)delete S.MAINTENANCE_BYPASS_SECRET;if(await ho(()=>f.updateFunctionConfiguration({FunctionName:h,Environment:{Variables:S}})),(u.app.provisionedConcurrency??0)>0)await f.waitForFunctionActive(h,120),await Md(f,h);$n(r?"Application is now in maintenance mode (503)":"Application is live")}async function ct(e,t,r){let a=So(e,t),u=new T(a.region),f=`${a.slug}-${t}-cli`,h=await u.invoke({FunctionName:f,InvocationType:"RequestResponse",Payload:{command:r},LogType:"Tail"});if(h.FunctionError)throw Error(`Command failed: ${h.Payload}`);return h.Payload??""}async function vr(e,t){let r=So(e,t),a=new A(r.region),u=new T(r.region),f=new o(r.region),h="not deployed",b={};try{let{Stacks:M}=await a.describeStacks({stackName:r.stackName});h=M?.[0]?.StackStatus??h;for(let z of M?.[0]?.Outputs??[])if(z.OutputKey)b[z.OutputKey]=z.OutputValue??""}catch{}let S=Ml(r.app,r.slug,t),y=r.app.provisionedConcurrency??0,k=["http","cli",...S.length?["queue"]:[]],R=`${r.slug}-${t}`,D=[];for(let M of k){let z=`${R}-${M}`,J={mode:M,name:z,version:"$LATEST"};if(y>0){let Z=await u.getAlias(z,"live").catch(()=>null);if(Z?.FunctionVersion){J.version=Z.FunctionVersion;let oe=await u.getProvisionedConcurrencyConfig(z,"live").catch(()=>null);if(oe)J.provisioned={status:oe.Status??"-",allocated:oe.AllocatedProvisionedConcurrentExecutions??0,requested:oe.RequestedProvisionedConcurrentExecutions??0}}}D.push(J)}let O=await Ld(f,r.artifactBucket,r.slug,t).catch(()=>null);return{slug:r.slug,environment:t,region:r.region,stackStatus:h,endpoint:b.HttpApiEndpoint,assetUrl:O?.assetUrl,scheduler:r.app.scheduler??"on",queues:S,provisionedConcurrency:y,functions:D,lastRelease:O?{sha:O.sha,timestamp:O.timestamp}:void 0}}function eC(e,t){return`${e}-${t}-db`}async function $v(e,t,r,a){let u=So(e,t);if(u.app.database?.connection!=="aurora-serverless")throw Error("No Aurora Serverless v2 database is configured for this environment.");let{RDSClient:f}=await import("./chunk-wxjd9gyb.js"),h=new f(u.region),b=eC(u.slug,t);P(`Scaling ${b} → ${r}–${a} ACUs`),await h.modifyDBCluster({DBClusterIdentifier:b,ServerlessV2ScalingConfiguration:{MinCapacity:r,MaxCapacity:a},ApplyImmediately:!0}),$n(`Scaling applied to ${b} (takes effect shortly).`)}class Pg{client;region;constructor(e="us-east-1"){this.region=e,this.client=new n}async call(e,t){return this.client.request({service:"wafv2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`AWSWAF_20190729.${e}`},body:JSON.stringify(t)})}async listWebACLs(e="REGIONAL"){return(await this.call("ListWebACLs",{Scope:e,Limit:100}))?.WebACLs??[]}async getWebACLRules(e,t,r="REGIONAL"){return((await this.call("GetWebACL",{Name:e,Id:t,Scope:r}))?.WebACL?.Rules??[]).map((f)=>({Name:f.Name,Priority:f.Priority,Action:f.Action?Object.keys(f.Action)[0]:f.OverrideAction?Object.keys(f.OverrideAction)[0]:"count"}))}}var tC=[{index:0,id:"clients",label:"Clients"},{index:1,id:"dns",label:"DNS & TLS"},{index:2,id:"edge",label:"Edge"},{index:3,id:"routing",label:"Routing"},{index:4,id:"apps",label:"Applications"},{index:5,id:"runtime",label:"Background runtime"},{index:6,id:"data",label:"Data services"},{index:7,id:"durability",label:"Durability"}],rC=[{index:0,id:"clients",label:"Clients"},{index:1,id:"dns",label:"DNS & TLS"},{index:2,id:"edge",label:"Edge"},{index:3,id:"entry",label:"Entry points"},{index:4,id:"compute",label:"Compute"},{index:5,id:"messaging",label:"Messaging & pooling"},{index:6,id:"data",label:"Data services"},{index:7,id:"durability",label:"Durability"}],nC=[{match:/^redis/,kind:"cache",label:"Redis"},{match:/^(?:mysql|mariadb)/,kind:"database",label:"MySQL"},{match:/^postgres/,kind:"database",label:"PostgreSQL"},{match:/^meilisearch/,kind:"database",label:"Meilisearch"},{match:/^vitess|^vtgate/,kind:"database",label:"Vitess"},{match:/^memcached/,kind:"cache",label:"Memcached"}],iC=/^(?:rpx-gateway|nginx|caddy|traefik|haproxy)$/;function Pe(e,t=""){let r=e==null?"":String(e).trim();return r&&r!=="-"&&r!=="—"?r:t}function oC(e){return Array.isArray(e)?e.length:0}function Jn(e){let t=Pe(e).toLowerCase();if(!t)return"unknown";if(["running","live","active","available","success","ok","healthy","enabled"].includes(t))return"ok";if(["failed","stopped","unreachable","error","critical","disabled"].includes(t))return"bad";if(["configured","creating","pending","degraded","shadowed","warn","unknown"].includes(t))return"warn";return"warn"}function Gt(e,t,r){if(r.has(t.source)&&r.has(t.target))e.push(t)}function Ft(e,t={}){let r=[],a=[],u=[],f=e.server??{},h=Array.isArray(e.sites)?e.sites:[],b=Array.isArray(e.services)?e.services:[],S=Array.isArray(e.workers)?e.workers:[],y=e.security??{},k=!!e._serverReachable&&!e.metricsUnavailable,R="box";if(!k)u.push("The compute box could not be probed, so live service state is missing; the shape comes from your cloud config.");r.push({id:"internet",label:"Internet",kind:"internet",layer:0,status:"ok",sub:"Public traffic",facts:[],external:!0});let D=[...new Set(h.map((ie)=>Pe(ie.domain)||Pe(ie.route).split("/")[0]).filter((ie)=>ie&&ie!=="internal"&&ie!=="loopback"))],O=Array.isArray(y.tlsCertificates)?y.tlsCertificates:[],M=O.filter((ie)=>Number(ie?.daysRemaining??999)<21).length;r.push({id:"dns",label:D.length===1?D[0]:"Public domains",kind:"dns",layer:1,status:M?"warn":D.length?"ok":"unknown",sub:D.length>1?`${D.length} domains`:"DNS & certificates",facts:[{label:"Domains",value:D.length?D.slice(0,6).join(", "):"none resolved"},{label:"Certificates",value:O.length?`${O.length} issued`:"none reported"},...M?[{label:"Expiring",value:`${M} within 21 days`}]:[]],href:"/server/security",external:!0});let z=y.firewall??{},J=Array.isArray(y.ports)?y.ports:[];r.push({id:"firewall",label:"Host firewall",kind:"firewall",layer:2,status:Jn(z.status),sub:Pe(z.summary,"Inbound filtering"),facts:[{label:"State",value:Pe(z.status,"unknown")},{label:"Open ports",value:J.length?J.map((ie)=>Pe(ie.listen)).join(", "):"not reported"}],href:"/server/firewall",group:"box"});let Z=b.find((ie)=>iC.test(Pe(ie.name)));r.push({id:"proxy",label:Pe(Z?.name,"Reverse proxy"),kind:"proxy",layer:3,status:Z?Jn(Z.status):"unknown",sub:"TLS termination & routing",facts:[{label:"Service",value:Pe(Z?.name,"not detected")},{label:"State",value:Pe(Z?.status,k?"not running":"not probed")},{label:"Routes",value:`${h.length} site${h.length===1?"":"s"}`}],href:"/server/services",group:"box"});for(let ie of h){let xe=`site:${Pe(ie.name)}`;if(!Pe(ie.name))continue;r.push({id:xe,label:Pe(ie.name),kind:"site",layer:4,status:Jn(ie.status),sub:Pe(ie.runtime,"runtime"),facts:[{label:"Route",value:Pe(ie.route,"internal")},{label:"Runtime",value:Pe(ie.runtime,"unknown")},{label:"Delivery",value:Pe(ie.deploy,"unknown")},{label:"TLS",value:Pe(ie.tls,"unknown")},...ie.responseMs!=null?[{label:"Response",value:`${Math.round(Number(ie.responseMs))} ms`}]:[],...ie.httpStatus!=null?[{label:"HTTP",value:String(ie.httpStatus)}]:[]],href:"/server/sites",group:"box"})}for(let ie of S){let xe=`worker:${Pe(ie.name)}`;if(!Pe(ie.name))continue;r.push({id:xe,label:Pe(ie.name),kind:"worker",layer:5,status:Jn(ie.status),sub:`${Number(ie.processes??1)} process${Number(ie.processes??1)===1?"":"es"}`,facts:[{label:"Processes",value:String(ie.processes??1)},{label:"State",value:Pe(ie.status,"unknown")},...Pe(ie.site)?[{label:"Site",value:Pe(ie.site)}]:[]],href:"/operations/jobs",group:"box"})}let oe=e.serverScheduler??{};if(oe.enabled)r.push({id:"scheduler",label:"Scheduler",kind:"scheduler",layer:5,status:"ok",sub:"Cron dispatch",facts:[{label:"Last run",value:Pe(oe.lastRun,"unknown")}],href:"/operations/jobs",group:"box"});let G=b.map((ie)=>{let xe=Pe(ie.name),ee=nC.find((De)=>De.match.test(xe));return ee?{service:ie,name:xe,...ee}:null}).filter((ie)=>!!ie);for(let ie of G)r.push({id:`data:${ie.name}`,label:ie.label,kind:ie.kind,layer:6,status:Jn(ie.service.status),sub:ie.name,facts:[{label:"Unit",value:ie.name},{label:"State",value:Pe(ie.service.status,"unknown")}],href:"/data/services",group:"box"});let te=e.backup??{};if(te.enabled)r.push({id:"backup",label:"Backups",kind:"backup",layer:7,status:"ok",sub:Pe(te.destination,"destination"),facts:[{label:"Destination",value:Pe(te.destination,"unknown")},{label:"Schedule",value:Pe(te.schedule,"unknown")},{label:"Retention",value:`${te.retention??0} copies`},{label:"Last run",value:Pe(te.last,"unknown")}],href:"/data/backups"});let he=new Set(r.map((ie)=>ie.id));Gt(a,{source:"internet",target:"dns",flow:"request",label:"https"},he),Gt(a,{source:"dns",target:"firewall",flow:"request",label:"443/80"},he),Gt(a,{source:"firewall",target:"proxy",flow:"request"},he);for(let ie of h){let xe=`site:${Pe(ie.name)}`;Gt(a,{source:"proxy",target:xe,flow:"request",label:Pe(ie.path)||void 0,status:Jn(ie.status)},he)}for(let ie of S){let xe=`worker:${Pe(ie.name)}`,ee=`site:${Pe(ie.site)}`;if(he.has(ee))Gt(a,{source:ee,target:xe,flow:"async",label:"queue"},he);else Gt(a,{source:"proxy",target:xe,flow:"async",label:"queue"},he)}for(let ie of S)Gt(a,{source:"scheduler",target:`worker:${Pe(ie.name)}`,flow:"async",label:"dispatch"},he);let ye=[...h.map((ie)=>`site:${Pe(ie.name)}`),...S.map((ie)=>`worker:${Pe(ie.name)}`)];for(let ie of G)for(let xe of ye)Gt(a,{source:xe,target:`data:${ie.name}`,flow:"data",label:"localhost"},he);if(G.length&&ye.length)u.push("Data-service edges show co-location on the box: every process on it can reach localhost. They are not a declared per-site binding.");for(let ie of G)Gt(a,{source:`data:${ie.name}`,target:"backup",flow:"backup",label:"snapshot"},he);for(let ie of h)Gt(a,{source:`site:${Pe(ie.name)}`,target:"backup",flow:"backup"},he);return{mode:"server",project:Pe(t.project)||Pe(e.project?.name)||Pe(f.name,"project"),environment:Pe(t.environment)||Pe(e.environment,"production"),provider:Pe(f.provider,"unknown"),region:Pe(f.region,"unknown"),generatedAt:new Date().toISOString(),layers:tC,groups:[{id:"box",label:Pe(f.name,"App server"),sub:[Pe(f.provider),Pe(f.region),Pe(f.ip)].filter(Boolean).join(" · ")}],nodes:r,links:a,notes:u}}function vs(e,t={}){let r=[],a=[],u=[],f=e.app??{},h=Array.isArray(e.functions)?e.functions:[],b=Array.isArray(e.queues)?e.queues:[],S=e.metrics??{};if(!h.length)u.push("No Lambda functions were read for this environment, so the compute layer is empty rather than assumed.");r.push({id:"internet",label:"Internet",kind:"internet",layer:0,status:"ok",sub:"Public traffic",facts:[],external:!0});let y=Pe(f.url),k=y.replace(/^https?:\/\//,"").split("/")[0];r.push({id:"dns",label:k||"Application domain",kind:"dns",layer:1,status:k?"ok":"unknown",sub:"DNS & certificates",facts:[{label:"Endpoint",value:y||"not resolved"}],external:!0});let R=e.waf;if(R)r.push({id:"waf",label:"WAF",kind:"waf",layer:2,status:Jn(R.status??"active"),sub:Pe(R.scope,"Managed rules"),facts:[{label:"Web ACL",value:Pe(R.name,"unnamed")},...R.blocked!=null?[{label:"Blocked (24h)",value:String(R.blocked)}]:[],{label:"Rules",value:String(oC(e.wafRules))}],href:"/serverless/firewall"});let D=e.assetsInfo;if(D)r.push({id:"cdn",label:"Asset CDN",kind:"cdn",layer:2,status:"ok",sub:Pe(D.cdn,"CloudFront"),facts:[{label:"Distribution",value:Pe(D.cdn,"unknown")},{label:"Custom domain",value:Pe(D.customDomain,"none")}],href:"/serverless/assets"}),r.push({id:"assets",label:"Asset bucket",kind:"storage",layer:6,status:"ok",sub:Pe(D.bucket,"S3"),facts:[{label:"Bucket",value:Pe(D.bucket,"unknown")},...D.files?[{label:"Objects",value:String(D.files)}]:[],...D.sizeMb?[{label:"Size",value:`${D.sizeMb} MB`}]:[]],href:"/serverless/assets"});let O=h.find((ee)=>Pe(ee.key).startsWith("http"));r.push({id:"gateway",label:"HTTP entry point",kind:"gateway",layer:3,status:O?"ok":"unknown",sub:"Function URL / API Gateway",facts:[{label:"Endpoint",value:y||"not resolved"},{label:"Invocations (24h)",value:String(S.invocations??0)},...S.errorRatePct!=null?[{label:"Error rate",value:`${S.errorRatePct}%`}]:[]],href:"/serverless/metrics"});for(let ee of h){let De=`fn:${Pe(ee.name)}`;if(!Pe(ee.name))continue;let Ge=Number(ee.errors??0),pt=Number(ee.invocations??0);r.push({id:De,label:Pe(ee.key,Pe(ee.name)),kind:"function",layer:4,status:Ge>0?pt&&Ge/pt>0.02?"bad":"warn":pt?"ok":"idle",sub:Pe(ee.runtime,"lambda"),facts:[{label:"Function",value:Pe(ee.name)},{label:"Memory",value:`${ee.memory??0} MB`},{label:"Timeout",value:`${ee.timeout??0}s`},{label:"Invocations (24h)",value:String(pt)},{label:"Errors (24h)",value:String(Ge)},{label:"p95",value:`${ee.p95??0} ms`},...ee.provisioned?[{label:"Provisioned",value:Pe(ee.provisioned)}]:[]],href:"/serverless/functions"})}for(let ee of b){let De=`queue:${Pe(ee.name)}`;if(!Pe(ee.name))continue;let Ge=Number(ee.dlq??0);r.push({id:De,label:Pe(ee.name),kind:"queue",layer:5,status:Ge>0?"bad":Number(ee.visible??0)>0?"warn":"ok",sub:"SQS",facts:[{label:"Visible",value:String(ee.visible??0)},{label:"In flight",value:String(ee.inFlight??0)},{label:"Processed (24h)",value:String(ee.processed??0)},{label:"Dead letter",value:String(Ge)}],href:"/serverless/queues"})}let M=e.aurora;if(M)r.push({id:"database",label:"Aurora Serverless",kind:"database",layer:6,status:Jn(M.status),sub:Pe(M.engine,"aurora"),facts:[{label:"Cluster",value:Pe(M.id,"unknown")},{label:"Capacity",value:`${M.currentAcu??0} ACU (${M.minAcu??0}–${M.maxAcu??0})`},{label:"Connections",value:String(M.connections??0)}],href:"/serverless/data"});let z=e.proxy;if(z)r.push({id:"rds-proxy",label:"RDS Proxy",kind:"database",layer:5,status:Jn(z.status),sub:"Connection pooling",facts:[{label:"Proxy",value:Pe(z.name,"unknown")},{label:"Endpoint",value:Pe(z.endpoint,"unknown")},{label:"Pooled",value:String(z.pooledConns??0)}],href:"/serverless/data"});let J=e.redis;if(J)r.push({id:"cache",label:"ElastiCache",kind:"cache",layer:6,status:Jn(J.status),sub:Pe(J.node,"redis"),facts:[{label:"Group",value:Pe(J.id,"unknown")},{label:"Hit rate",value:`${J.hitRate??0}%`}],href:"/serverless/data"});let Z=e.efs;if(Z)r.push({id:"efs",label:"EFS",kind:"filesystem",layer:6,status:Jn(Z.status),sub:Pe(Z.mount,"/mnt/local"),facts:[{label:"File system",value:Pe(Z.id,"unknown")},{label:"Mount",value:Pe(Z.mount,"unknown")},{label:"Size",value:`${Z.sizeMb??0} MB`}],href:"/data/volumes"});let oe=e.scheduler??{};if(oe.enabled)r.push({id:"scheduler",label:"Scheduler",kind:"scheduler",layer:3,status:"ok",sub:Pe(oe.expression,"rate(1 minute)"),facts:[{label:"Expression",value:Pe(oe.expression,"unknown")},{label:"Last run",value:Pe(oe.lastRun,"unknown")}],href:"/operations/jobs"});let G=new Set(r.map((ee)=>ee.id)),te=G.has("waf")?"waf":"gateway";Gt(a,{source:"internet",target:"dns",flow:"request",label:"https"},G),Gt(a,{source:"dns",target:te,flow:"request"},G),Gt(a,{source:"dns",target:"cdn",flow:"request",label:"assets"},G),Gt(a,{source:"waf",target:"gateway",flow:"request",label:"allowed"},G),Gt(a,{source:"cdn",target:"assets",flow:"data",label:"origin"},G);let he=h.filter((ee)=>Pe(ee.key).startsWith("http")),ye=h.filter((ee)=>Pe(ee.key).startsWith("queue")),ie=h.filter((ee)=>Pe(ee.key).startsWith("cli"));for(let ee of he)Gt(a,{source:"gateway",target:`fn:${Pe(ee.name)}`,flow:"request",label:"invoke"},G);for(let ee of ie)Gt(a,{source:"scheduler",target:`fn:${Pe(ee.name)}`,flow:"async",label:"schedule"},G);for(let ee of b){for(let De of he)Gt(a,{source:`fn:${Pe(De.name)}`,target:`queue:${Pe(ee.name)}`,flow:"async",label:"publish"},G);for(let De of ye)Gt(a,{source:`queue:${Pe(ee.name)}`,target:`fn:${Pe(De.name)}`,flow:"async",label:"consume"},G)}let xe=["rds-proxy","database","cache","efs","assets"];for(let ee of h){let De=`fn:${Pe(ee.name)}`;if(G.has("rds-proxy"))Gt(a,{source:De,target:"rds-proxy",flow:"data",label:"pooled"},G);else Gt(a,{source:De,target:"database",flow:"data",label:"sql"},G);for(let Ge of xe.filter((pt)=>pt!=="rds-proxy"&&pt!=="database"))Gt(a,{source:De,target:Ge,flow:"data"},G)}return Gt(a,{source:"rds-proxy",target:"database",flow:"data",label:"sql"},G),{mode:"serverless",project:Pe(t.project)||Pe(f.name,"application"),environment:Pe(t.environment)||Pe(f.env,"production"),provider:"aws",region:Pe(f.region,"unknown"),generatedAt:new Date().toISOString(),layers:rC,groups:[],nodes:r,links:a,notes:u}}function Ch(e,t,r={}){return e==="serverless"?vs(t,r):Ft(t,r)}function Nv(e){return String(e).padStart(2,"0")}function ks(e){return`${e.getUTCFullYear()}-${Nv(e.getUTCMonth()+1)}-${Nv(e.getUTCDate())}`}function sC(e){let t=Math.max(0,Math.round((Date.now()-e)/1000));if(t<60)return`${t}s ago`;let r=Math.round(t/60);if(r<60)return`${r}m ago`;let a=Math.round(r/60);if(a<48)return`${a}h ago`;return`${Math.round(a/24)}d ago`}async function aa(e,t,r,a,u,f){let h=await e.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:r,Dimensions:[{Name:"FunctionName",Value:t}],StartTime:u,EndTime:f,Period:86400,Statistics:[a]}).catch(()=>[]);if(!h.length)return 0;if(a==="Sum")return h.reduce((b,S)=>b+(S.Sum??0),0);if(a==="Maximum")return Math.max(...h.map((b)=>b.Maximum??0));return h.reduce((b,S)=>b+(S.Average??0),0)/h.length}async function pc(e,t,r,a,u,f,h){let b=await e.getMetricStatistics({Namespace:t,MetricName:r,Dimensions:a,StartTime:f,EndTime:h,Period:86400,Statistics:[u]}).catch(()=>[]);if(!b.length)return 0;if(u==="Sum")return b.reduce((S,y)=>S+(y.Sum??0),0);if(u==="Maximum")return Math.max(...b.map((S)=>S.Maximum??0));return b.reduce((S,y)=>S+(y.Average??0),0)/b.length}async function Tg(e,t,r,a,u){let f=await e.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Duration",Dimensions:[{Name:"FunctionName",Value:t}],StartTime:a,EndTime:u,Period:86400,ExtendedStatistics:[r]}).catch(()=>[]);return Math.round(f.reduce((h,b)=>h+(b.Percentiles?.[r]??0),0))}async function Bn(e,t){let r=await vr(e,t),a=r.region,u=new me(a),f=new T(a),h=new we(a),b=new Date,S=new Date(b.getTime()-86400000),y=e.environments?.[t]?.app,k={};k.app={name:r.slug,env:t,region:a,runtime:y?.kind==="php"?`php-${y?.phpVersion??"8.3"} (fpm)`:y?.kind??"node",url:r.endpoint??"",build:r.lastRelease?.sha?.slice(0,7)??"—",deployedAt:r.lastRelease?.timestamp??"—"},k.maintenance={enabled:!1},k.scheduler={enabled:r.scheduler!=="off",expression:r.scheduler==="sub-minute"?"rate(1 minute) · sub-minute":"rate(1 minute)",lastRun:"—"};let R=0,D=0,O=0,M=[],z=[],J=[];for(let te of r.functions){let[he,ye,ie,xe,ee,De,Ge,pt,Bt]=await Promise.all([aa(u,te.name,"Invocations","Sum",S,b),aa(u,te.name,"Errors","Sum",S,b),aa(u,te.name,"Throttles","Sum",S,b),aa(u,te.name,"Duration","Average",S,b),f.getFunction(te.name).catch(()=>null),Tg(u,te.name,"p50",S,b),Tg(u,te.name,"p95",S,b),Tg(u,te.name,"p99",S,b),u.getMetricSeries({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:[{Name:"FunctionName",Value:te.name}],StartTime:new Date(b.getTime()-43200000),EndTime:b,Period:3600,Stat:"Sum"}).catch(()=>[])]);R+=he,D+=ye,O=Math.max(O,xe);let Ze=ee?.Configuration?.MemorySize??0,wt=Object.keys(ee?.Configuration?.Environment?.Variables??{}),zt=[],rt=0;try{let{events:se=[]}=await h.filterLogEvents({logGroupName:`/aws/lambda/${te.name}`,startTime:S.getTime(),limit:120});for(let le of se){let Ce=(le.message??"").trim(),gt=/Max Memory Used:\s*(\d+)\s*MB/.exec(Ce);if(gt)rt=Math.max(rt,Number(gt[1]));if(Ce&&!/^(?:START|END|REPORT|INIT_START)/.test(Ce))J.push({source:te.mode||te.name,timestamp:new Date(le.timestamp??0).toISOString(),when:sC(le.timestamp??0),message:Ce.slice(0,400),level:/error|exception|fatal|panic|traceback/i.test(Ce)?"error":/warn|warning|timeout|retr(?:y|ies)|throttl/i.test(Ce)?"warn":"info"})}zt=se.filter((le)=>!/^(?:START|END|REPORT|INIT_START)/.test((le.message??"").trim())).slice(-6).map((le)=>({ts:new Date(le.timestamp??0).toISOString().slice(11,19),msg:(le.message??"").trim().slice(0,120),err:/error|exception|fatal/i.test(le.message??"")}))}catch{}let W=Math.max(1,...Bt);M.push({key:te.mode,name:te.name,version:te.version,memory:Ze,timeout:ee?.Configuration?.Timeout??0,runtime:ee?.Configuration?.Runtime??"provided.al2023",invocations:Math.round(he),errors:Math.round(ye),p95:Ge||Math.round(xe),status:"active",provisioned:te.provisioned?`${te.provisioned.allocated}/${te.provisioned.requested}`:void 0}),z.push({key:te.mode,name:te.name,runtime:ee?.Configuration?.Runtime??"provided.al2023",arch:ee?.Configuration?.Architectures?.[0]??"x86_64",memory:Ze,timeout:ee?.Configuration?.Timeout??0,ephemeral:ee?.Configuration?.EphemeralStorage?.Size??512,version:te.version,concurrency:y?.concurrency??"—",invocations:Math.round(he),errors:Math.round(ye),throttles:Math.round(ie),p50:De||Math.round(xe),p95:Ge||Math.round(xe),p99:pt||Math.round(xe),maxMem:rt,spark:Bt.length?Bt.map((se)=>Math.round(se/W*100)):[0],env:wt.length?wt:["(none)"],recent:zt.length?zt:[{ts:"—",msg:"no recent events",err:!1}]})}k.functions=M,k.functionsDetail=z,k.serverlessLogs=J.sort((te,he)=>String(he.timestamp).localeCompare(String(te.timestamp))).slice(0,600),k.serverlessLogsEmptyReason=J.length?void 0:"No recent function logs were found in CloudWatch for this environment.";let Z=R?Number((D/R*100).toFixed(2)):0,oe=Math.round(await aa(u,r.functions[0]?.name??"","ConcurrentExecutions","Maximum",S,b));k.metrics={invocations:Math.round(R),errorRatePct:Z,p95Ms:Math.round(O),coldStartPct:void 0,concurrency:oe,estCostUsd:void 0};try{let te=new pe(a),he=[],ye=[],ie=0;try{let{QueueUrl:ee}=await te.getQueueUrl(`${r.slug}-${t}-dlq`),{Attributes:De}=await te.getQueueAttributes(ee);ie=Number(De.ApproximateNumberOfMessages??0)}catch{}let xe=y?hr(y,r.slug,t):[];for(let ee of xe){let De=ee.name.replace(`${r.slug}-${t}-`,""),Ge=0,pt=0;try{let{QueueUrl:Ze}=await te.getQueueUrl(ee.name),{Attributes:wt}=await te.getQueueAttributes(Ze);Ge=Number(wt.ApproximateNumberOfMessages??0),pt=Number(wt.ApproximateNumberOfMessagesNotVisible??0)}catch{}let Bt=Math.round(await pc(u,"AWS/SQS","NumberOfMessagesDeleted",[{Name:"QueueName",Value:ee.name}],"Sum",S,b));he.push({name:De,visible:Ge,inFlight:pt,processed:Bt,dlq:ie}),ye.push({name:ee.name,short:De,visible:Ge,inFlight:pt,delayed:0,processed:Bt,oldestSec:0,concurrency:ee.concurrency??y?.queueConcurrency??"—",tries:y?.queueTries??3,visTimeout:(y?.queueTimeout??120)*6,dlq:ie})}if(he.length)k.queues=he;if(ye.length)k.queuesDetail=ye;k.dlqItems=[]}catch{}try{let te=new A(a),{Stacks:he}=await te.describeStacks({stackName:dr(e,t)}),ye={};for(let ie of he?.[0]?.Outputs??[])if(ie.OutputKey)ye[ie.OutputKey]=ie.OutputValue??"";if(y?.database?.connection==="aurora-serverless"){let ie=`${r.slug}-${t}-db`,xe=[{Name:"DBClusterIdentifier",Value:ie}],[ee,De]=await Promise.all([pc(u,"AWS/RDS","ServerlessDatabaseCapacity",xe,"Average",S,b),pc(u,"AWS/RDS","DatabaseConnections",xe,"Maximum",S,b)]);if(k.aurora={id:ie,engine:"aurora-mysql",minAcu:y?.database?.minCapacity??0.5,maxAcu:y?.database?.maxCapacity??4,currentAcu:ee?Number(ee.toFixed(1)):y?.database?.minCapacity??0.5,database:"app",connections:Math.round(De),status:ye.DbEndpoint?"available":"creating"},y?.rdsProxy)k.proxy={name:`${r.slug}-${t}-proxy`,endpoint:ye.DbProxyEndpoint??"—",pooledConns:Math.round(De),status:"available"}}if(y?.cache?.driver==="elasticache"){let ie=`${r.slug}-${t}-cache`,xe=[{Name:"CacheClusterId",Value:`${ie}-001`}],[ee,De]=await Promise.all([pc(u,"AWS/ElastiCache","CacheHits",xe,"Sum",S,b),pc(u,"AWS/ElastiCache","CacheMisses",xe,"Sum",S,b)]),Ge=ee+De>0?Number((ee/(ee+De)*100).toFixed(1)):0;k.redis={id:ie,node:"cache.t4g.micro",engine:"redis",hitRate:Ge,status:ye.CacheEndpoint?"available":"creating"}}if(y?.efs){let ie=0;try{if(ye.EfsFileSystemId){let xe=new Dr(a),{FileSystems:ee}=await xe.describeFileSystems({FileSystemId:ye.EfsFileSystemId});ie=Number(((ee?.[0]?.SizeInBytes?.Value??0)/1048576).toFixed(1))}}catch{}k.efs={id:ye.EfsFileSystemId??"efs",mount:"/mnt/local",sizeMb:ie,status:"available"}}k.assetsInfo=ye.AssetsCdnDomain?{bucket:ye.AssetsBucketName??`${r.slug}-${t}-assets`,cdn:ye.AssetsCdnDomain,customDomain:y?.assetDomain??"—",assetUrl:r.assetUrl??"—",files:0,sizeMb:0,cacheHitPct:0,build:k.app.build}:void 0}catch{}if(k.assetsInfo)try{let he=await new o(a).list({bucket:k.assetsInfo.bucket,maxKeys:1000});k.assetsInfo.files=he.length,k.assetsInfo.sizeMb=Number((he.reduce((ye,ie)=>ye+(ie.Size??0),0)/1048576).toFixed(1)),k.assetsRecent=he.slice(0,8).map((ye)=>({path:`/${ye.Key}`,size:`${Math.max(1,Math.round((ye.Size??0)/1024))} KB`,type:ye.Key.split(".").pop()??""}))}catch{}try{if(y?.secrets){let te=Array.isArray(y.secrets)?y.secrets.map((he)=>({key:he.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),source:he})):Object.entries(y.secrets).map(([he,ye])=>({key:he,source:String(ye)}));k.secretsList=te.map((he)=>({...he,updated:"—"}))}}catch{}try{let te=new o(a),he=`${r.slug}-${t}-deployments`,ye=await te.getObjectJson(he,`deployments/${r.slug}/${t}/history.json`).catch(()=>null);if(ye?.records?.length)k.deploymentsDetail=ye.records.slice(-12).reverse().map((ie)=>({sha:(ie.sha??"").slice(0,7),status:ie.status??"success",when:ie.timestamp??"—",took:ie.took??"—",by:ie.by??"—",version:ie.version??"—",hooks:ie.hooks??[]}))}catch{}k.metricsTotals={invocations:k.metrics.invocations,errors:Math.round(D),errorRatePct:Z,p95Ms:k.metrics.p95Ms,throttles:z.reduce((te,he)=>te+he.throttles,0),coldStartPct:void 0,estCostUsd:void 0,concurrency:oe},k.metricsPerFn=z.map((te)=>({key:te.key,invocations:te.invocations,errors:te.errors,throttles:te.throttles,avgMs:te.p50,maxMs:te.p99,costUsd:void 0}));try{k.invSpark=await u.getMetricSeries({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:[{Name:"FunctionName",Value:r.functions.find((te)=>te.mode==="http")?.name??""}],StartTime:new Date(b.getTime()-86400000),EndTime:b,Period:3600,Stat:"Sum"})}catch{}try{let te=new $s,he=b,ye=new Date(Date.UTC(he.getUTCFullYear(),he.getUTCMonth(),1)),ie=new Date(Date.UTC(he.getUTCFullYear(),he.getUTCMonth()-1,1)),[xe,ee]=await Promise.all([te.getCostByService({start:ks(ye),end:ks(he),granularity:"MONTHLY"}).catch(()=>[]),te.getCostByService({start:ks(ie),end:ks(ye),granularity:"MONTHLY"}).catch(()=>[])]);if(xe.length){let De=xe.reduce((rt,W)=>rt+W.amount,0),Ge=ee.reduce((rt,W)=>rt+W.amount,0),pt=he.getUTCDate(),Bt=new Date(Date.UTC(he.getUTCFullYear(),he.getUTCMonth()+1,0)).getUTCDate();k.costSummary={monthToDateUsd:Number(De.toFixed(2)),projectedUsd:Number((De/pt*Bt).toFixed(2)),lastMonthUsd:Number(Ge.toFixed(2)),dailyAvgUsd:Number((De/pt).toFixed(2))},k.costServices=xe.filter((rt)=>rt.amount>0).sort((rt,W)=>W.amount-rt.amount).slice(0,12).map((rt)=>({name:rt.service,usd:Number(rt.amount.toFixed(2)),note:""})),k.metrics.estCostUsd=Number((De/pt).toFixed(2)),k.metricsTotals.estCostUsd=k.metrics.estCostUsd,k.costTrend=await te.getDailyTotals({start:ks(ye),end:ks(he)}).catch(()=>[]);let Ze=xe.find((rt)=>/lambda/i.test(rt.service))?.amount??0,wt=(rt)=>rt.invocations*(rt.p50/1000)*(rt.memory/1024),zt=z.reduce((rt,W)=>rt+wt(W),0)||1;k.costPerFn=z.map((rt)=>({key:rt.key,requests:rt.invocations,gbSec:Math.round(wt(rt)),usd:Number((Ze*(wt(rt)/zt)).toFixed(2))}))}}catch{}if(y?.firewall)try{let te=await u.getMetricStatistics({Namespace:"AWS/WAFV2",MetricName:"BlockedRequests",StartTime:S,EndTime:b,Period:86400,Statistics:["Sum"]}).catch(()=>[]),he=await u.getMetricStatistics({Namespace:"AWS/WAFV2",MetricName:"AllowedRequests",StartTime:S,EndTime:b,Period:86400,Statistics:["Sum"]}).catch(()=>[]);k.waf={enabled:!0,scope:"REGIONAL",acl:`${r.slug}-${t}-waf`,allowed24h:Math.round(he.reduce((ye,ie)=>ye+(ie.Sum??0),0)),blocked24h:Math.round(te.reduce((ye,ie)=>ye+(ie.Sum??0),0))};try{let ye=new Pg(a),ie=await ye.listWebACLs("REGIONAL"),xe=ie.find((ee)=>ee.Name?.includes(`${r.slug}-${t}`))??ie[0];if(xe?.Name&&xe.Id){k.waf.acl=xe.Name;let ee=await ye.getWebACLRules(xe.Name,xe.Id,"REGIONAL");if(ee.length)k.wafRules=ee.map((De)=>({name:De.Name??"—",detail:`priority ${De.Priority??0}`,action:De.Action??"count",blocked24h:0}))}}catch{}}catch{}let G=[];if(k.aurora)G.push({name:"Aurora Serverless v2",detail:`${k.aurora.id} · ${k.aurora.minAcu}-${k.aurora.maxAcu} ACU`,status:k.aurora.status});if(k.proxy)G.push({name:"RDS Proxy",detail:k.proxy.name,status:k.proxy.status});if(k.redis)G.push({name:`ElastiCache (${k.redis.engine})`,detail:`${k.redis.node} · ${k.redis.hitRate}% hit rate`,status:k.redis.status});if(k.efs)G.push({name:"EFS",detail:`${k.efs.mount} · ${k.efs.sizeMb} MB`,status:k.efs.status});if(G.length)k.dataServices=G;if(r.scheduler!=="off"&&y?.kind==="php")try{let te=await ct(e,t,"schedule:list"),he=[];for(let ye of(te||"").split(`
181
+ `)){let ie=/^\s*([\d*/,\-\s]+?)\s{2,}(.+?)(?:\s{2,}Next Due.*)?$/.exec(ye);if(ie&&/[*\d]/.test(ie[1])&&ie[1].trim().split(/\s+/).length===5)he.push({command:ie[2].trim().replace(/^php artisan /,""),cron:ie[1].trim(),desc:"",lastRun:"—",lastStatus:"ok"})}if(he.length)k.schedulerTasks=he}catch{}return k.topology=vs(k,{project:e.project.name,environment:t}),k}function Ui(e){let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function aC(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;let t=Date.parse(`${e}T12:00:00.000Z`);return Number.isFinite(t)?new Date(t).toISOString():null}function ug(e,t){if(!e||typeof e!=="object")return[];let r={source:t.name},a=[],u=t.now,f=(y,k,R,D=u)=>{if(k!==null)a.push({name:y,value:k,unit:R,timestamp:D,attributes:r})};f("storage.egress.month",Ui(e.monthBytes),"bytes"),f("storage.egress.today",Ui(e.todayBytes),"bytes"),f("storage.egress.projected_month",Ui(e.projectedMonthBytes),"bytes");let h=Ui(e.budgetBytes);if(h!==null&&h>0){f("storage.egress.budget",h,"bytes");let y=e.budgetUsedPercent,k=typeof y==="number"&&Number.isFinite(y)?y:Ui(e.monthBytes)!==null?Math.round(Ui(e.monthBytes)/h*1000)/10:null;f("storage.egress.budget_used_percent",k,"percent")}let b=t.maxReplayDays??45,S=Array.isArray(e.days)?e.days.slice(-b):[];for(let y of S){let k=aC(String(y?.date??"")),R=Ui(y?.bytes);if(!k||R===null)continue;a.push({name:"storage.egress.day",value:R,unit:"bytes",timestamp:k,attributes:r});let D=Ui(y?.downloads);if(D!==null)a.push({name:"storage.egress.day_downloads",value:D,unit:"count",timestamp:k,attributes:r})}return a}async function gg(e,t=process.env,r=fetch){let a=e.tokenEnv?t[e.tokenEnv]:void 0,u=await r(e.url,{headers:a?{Authorization:`Bearer ${a}`}:{},signal:AbortSignal.timeout(1e4)});if(!u.ok)throw Error(`HTTP ${u.status}`);return await u.json()}async function Ya(e,t){let r=[],a=[];if(!Array.isArray(e)||e.length===0)return{metrics:r,errors:a};let u=await Promise.all(e.map(async(f)=>{if(!f?.name||!f?.url)return{endpoint:f,error:"egress endpoint needs both a name and a url"};try{let h=await gg(f,t.env,t.fetchImpl);return{endpoint:f,report:h}}catch(h){return{endpoint:f,error:h instanceof Error?h.message:String(h)}}}));for(let f of u){let h=`egress:${f.endpoint?.name??"unnamed"}`;if("error"in f&&f.error){a.push({source:h,message:f.error});continue}r.push(...ug(f.report,{name:f.endpoint.name,now:t.now}))}return{metrics:r,errors:a}}import{createHash as O_}from"node:crypto";import{existsSync as Si,mkdtempSync as km,readdirSync as NS,rmSync as Po,statSync as aw}from"node:fs";import{readFile as ni,writeFile as Ao}from"node:fs/promises";import{tmpdir as yl}from"node:os";import{dirname as $_,extname as Ic,join as Tt,normalize as N_,relative as j_,resolve as B_,sep as M_}from"node:path";import{fileURLToPath as L_}from"node:url";import{isIP as jv}from"node:net";var vt=(e)=>e==null?void 0:String(e),Fd=(e)=>Number(e)===1,qi=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}};function Bv(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),name:String(e.name),provider:String(e.provider),endpoint:vt(e.endpoint),endpointPolicy:String(e.endpoint_policy),bucket:vt(e.bucket),prefix:String(e.prefix),region:vt(e.region),forcePathStyle:Fd(e.force_path_style),credentialRef:vt(e.credential_ref),encryption:String(e.encryption),encryptionKeyRef:vt(e.encryption_key_ref),immutability:qi(e.immutability,{}),status:String(e.status),lastTestedAt:vt(e.last_tested_at),lastSuccessAt:vt(e.last_success_at),lastFailureAt:vt(e.last_failure_at),lastError:vt(e.last_error),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function xg(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:vt(e.environment_id),resourceId:vt(e.resource_id),dataServiceId:vt(e.data_service_id),destinationId:String(e.destination_id),name:String(e.name),resourceKind:String(e.resource_kind),schedule:String(e.schedule),timezone:String(e.timezone),retention:qi(e.retention,{}),compression:String(e.compression),encryption:String(e.encryption),includePatterns:qi(e.include_patterns,[]),excludePatterns:qi(e.exclude_patterns,[]),expectedRpoMinutes:Number(e.expected_rpo_minutes),expectedRtoMinutes:Number(e.expected_rto_minutes),healthCheckId:vt(e.health_check_id),enabled:Fd(e.enabled),nextRunAt:vt(e.next_run_at),lastRunAt:vt(e.last_run_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Dg(e){return{id:String(e.id),projectId:String(e.project_id),policyId:vt(e.policy_id),destinationId:String(e.destination_id),resourceId:vt(e.resource_id),dataServiceId:vt(e.data_service_id),backupJobId:vt(e.backup_job_id),kind:String(e.kind),pointInTime:String(e.point_in_time),uri:String(e.uri),sizeBytes:Number(e.size_bytes),checksum:String(e.checksum),manifest:qi(e.manifest,{}),toolVersion:vt(e.tool_version),engineVersion:vt(e.engine_version),expiresAt:vt(e.expires_at),lockedUntil:vt(e.locked_until),held:Fd(e.held),pinned:Fd(e.pinned),status:String(e.status),verificationState:String(e.verification_state),verifiedAt:vt(e.verified_at),durationMs:e.duration_ms==null?void 0:Number(e.duration_ms),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Og(e){return{id:String(e.id),projectId:String(e.project_id),policyId:vt(e.policy_id),recoveryPointId:vt(e.recovery_point_id),operationId:vt(e.operation_id),kind:String(e.kind),status:String(e.status),idempotencyKey:String(e.idempotency_key),target:qi(e.target,{}),restoreMode:vt(e.restore_mode),cancellability:String(e.cancellability),safetyBackupId:vt(e.safety_backup_id),healthResult:e.health_result?qi(e.health_result,{}):void 0,progress:qi(e.progress,{}),error:vt(e.error),startedAt:vt(e.started_at),finishedAt:vt(e.finished_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function cC(e){let t=e.toLowerCase();if(t==="localhost"||t.endsWith(".localhost")||t.endsWith(".local")||t.endsWith(".internal"))return!0;if(jv(t)===6)return t==="::1"||t.startsWith("fe80:");if(jv(t)!==4)return!1;let[r,a]=t.split(".").map(Number);return r===10||r===127||r===0||r===169&&a===254||r===172&&a>=16&&a<=31||r===192&&a===168}function Eh(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Backup destination names must be 2-63 lowercase letters, numbers, or dashes.");if(e.provider!=="aws_backup"&&!e.bucket)throw Error("S3 backup destinations require a bucket.");if(e.provider==="s3_compatible"&&!e.endpoint)throw Error("S3-compatible destinations require an explicit endpoint.");if(e.provider==="s3_compatible"&&!e.credentialRef)throw Error("S3-compatible destinations require a credential reference.");if(e.encryption!=="provider"&&!e.encryptionKeyRef)throw Error("Client-side encryption requires an encryption key reference.");if(e.endpoint){let t=new URL(e.endpoint);if(t.protocol!=="https:"||t.username||t.password||t.search||t.hash||t.pathname!=="/")throw Error("Backup endpoints must be origin-only HTTPS URLs without credentials, paths, queries, or fragments.");if(cC(t.hostname)&&e.endpointPolicy!=="allow_private")throw Error("Private backup endpoints require endpointPolicy allow_private.")}}class Za{controlPlane;now;constructor(e,t=()=>new Date){this.controlPlane=e;this.now=t}createDestination(e){Eh(e);let t=crypto.randomUUID(),r=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO backup_destinations (id,organization_id,project_id,name,provider,endpoint,endpoint_policy,bucket,prefix,region,force_path_style,credential_ref,encryption,encryption_key_ref,immutability,status,last_tested_at,last_success_at,last_failure_at,last_error,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.name,e.provider,e.endpoint??null,e.endpointPolicy,e.bucket??null,e.prefix,e.region??null,e.forcePathStyle?1:0,e.credentialRef??null,e.encryption,e.encryptionKeyRef??null,JSON.stringify(e.immutability),e.status,e.lastTestedAt??null,e.lastSuccessAt??null,e.lastFailureAt??null,e.lastError??null,1,r,r]),this.getDestination(t)}getDestination(e){let t=this.controlPlane.database.query("SELECT * FROM backup_destinations WHERE id=?").get(e);return t?Bv(t):void 0}listDestinations(e){return this.controlPlane.database.query("SELECT * FROM backup_destinations WHERE project_id=? ORDER BY name").all(e).map(Bv)}recordDestinationTest(e,t){let r=this.now().toISOString();return this.controlPlane.database.run("UPDATE backup_destinations SET status=?,last_tested_at=?,last_success_at=CASE WHEN ? THEN ? ELSE last_success_at END,last_failure_at=CASE WHEN ? THEN last_failure_at ELSE ? END,last_error=?,version=version+1,updated_at=? WHERE id=?",[t.ok?"healthy":"failing",r,t.ok?1:0,r,t.ok?1:0,r,t.ok?null:String(t.error??"Destination test failed.").slice(0,1000),r,e]),this.getDestination(e)}createPolicy(e){if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.name))throw Error("Backup policy names must be lowercase slugs.");if(!e.resourceId&&!e.dataServiceId&&!["control_plane","infrastructure"].includes(e.resourceKind))throw Error("A backup policy requires a resource or data service target.");let t=this.getDestination(e.destinationId);if(!t||t.projectId!==e.projectId)throw Error("Backup destination was not found.");if(e.resourceKind==="control_plane"&&t.encryption==="provider")throw Error("Control-plane backups require client-side destination encryption.");if(["logical_database","volume","files","control_plane"].includes(e.resourceKind)&&t.provider==="aws_backup")throw Error(`${e.resourceKind} backups require an object-storage destination.`);if(e.resourceKind==="infrastructure"&&t.provider!=="aws_backup")throw Error("Infrastructure backups require an AWS Backup destination.");let r=at(e.schedule),a=$t(r.normalized,e.timezone,this.now(),1)[0],u=crypto.randomUUID(),f=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO backup_policies (id,organization_id,project_id,environment_id,resource_id,data_service_id,destination_id,name,resource_kind,schedule,timezone,retention,compression,encryption,include_patterns,exclude_patterns,expected_rpo_minutes,expected_rto_minutes,health_check_id,enabled,next_run_at,last_run_at,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[u,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.dataServiceId??null,e.destinationId,e.name,e.resourceKind,r.normalized,e.timezone,JSON.stringify(e.retention),e.compression,e.encryption,JSON.stringify(e.includePatterns),JSON.stringify(e.excludePatterns),e.expectedRpoMinutes,e.expectedRtoMinutes,e.healthCheckId??null,e.enabled?1:0,a,e.lastRunAt??null,1,f,f]),this.getPolicy(u)}getPolicy(e){let t=this.controlPlane.database.query("SELECT * FROM backup_policies WHERE id=?").get(e);return t?xg(t):void 0}listPolicies(e,t){return this.controlPlane.database.query(`SELECT * FROM backup_policies WHERE project_id=?${t?" AND environment_id=?":""} ORDER BY name`).all(e,...t?[t]:[]).map(xg)}duePolicies(e=this.now()){return this.controlPlane.database.query("SELECT * FROM backup_policies WHERE enabled=1 AND next_run_at<=? ORDER BY next_run_at,id").all(e.toISOString()).map(xg)}advancePolicy(e,t){let r=this.getPolicy(e);if(!r)throw Error("Backup policy was not found.");let a=$t(r.schedule,r.timezone,new Date(t),1)[0];return this.controlPlane.database.run("UPDATE backup_policies SET last_run_at=?,next_run_at=?,version=version+1,updated_at=? WHERE id=?",[t,a,this.now().toISOString(),e]),this.getPolicy(e)}createJob(e){let t=this.controlPlane.database.query("SELECT * FROM backup_jobs WHERE idempotency_key=?").get(e.idempotencyKey);if(t)return Og(t);let r=crypto.randomUUID(),a=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO backup_jobs (id,project_id,policy_id,recovery_point_id,operation_id,kind,status,idempotency_key,target,restore_mode,cancellability,safety_backup_id,health_result,progress,error,started_at,finished_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[r,e.projectId,e.policyId??null,e.recoveryPointId??null,e.operationId??null,e.kind,e.status,e.idempotencyKey,JSON.stringify(e.target),e.restoreMode??null,e.cancellability,e.safetyBackupId??null,e.healthResult?JSON.stringify(e.healthResult):null,JSON.stringify(e.progress),e.error??null,e.startedAt??null,e.finishedAt??null,a,a]),this.getJob(r)}getJob(e){let t=this.controlPlane.database.query("SELECT * FROM backup_jobs WHERE id=?").get(e);return t?Og(t):void 0}listJobs(e){return this.controlPlane.database.query("SELECT * FROM backup_jobs WHERE project_id=? ORDER BY created_at DESC").all(e).map(Og)}updateJob(e,t){let r=this.getJob(e);if(!r)throw Error("Backup job was not found.");let a={...r,...t};return this.controlPlane.database.run("UPDATE backup_jobs SET status=?,operation_id=?,recovery_point_id=?,progress=?,health_result=?,error=?,started_at=?,finished_at=?,safety_backup_id=?,updated_at=? WHERE id=?",[a.status,a.operationId??null,a.recoveryPointId??null,JSON.stringify(a.progress),a.healthResult?JSON.stringify(a.healthResult):null,a.error??null,a.startedAt??null,a.finishedAt??null,a.safetyBackupId??null,this.now().toISOString(),e]),this.getJob(e)}createRecoveryPoint(e){if(!/^sha256:[a-f0-9]{64}$/i.test(e.checksum))throw Error("Recovery points require a SHA-256 checksum.");if(typeof e.uri!=="string"||!["s3:","aws-backup:","file:"].some((a)=>e.uri.startsWith(a)))throw Error("Recovery point URI uses an unsupported destination scheme.");let t=crypto.randomUUID(),r=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO recovery_points (id,project_id,policy_id,destination_id,resource_id,data_service_id,backup_job_id,kind,point_in_time,uri,size_bytes,checksum,manifest,tool_version,engine_version,expires_at,locked_until,held,pinned,status,verification_state,verified_at,duration_ms,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.projectId,e.policyId??null,e.destinationId,e.resourceId??null,e.dataServiceId??null,e.backupJobId??null,e.kind,e.pointInTime,e.uri,e.sizeBytes,e.checksum,JSON.stringify(e.manifest),e.toolVersion??null,e.engineVersion??null,e.expiresAt??null,e.lockedUntil??null,e.held?1:0,e.pinned?1:0,e.status,e.verificationState,e.verifiedAt??null,e.durationMs??null,r,r]),this.getRecoveryPoint(t)}getRecoveryPoint(e){let t=this.controlPlane.database.query("SELECT * FROM recovery_points WHERE id=?").get(e);return t?Dg(t):void 0}listRecoveryPoints(e,t){return this.controlPlane.database.query(`SELECT * FROM recovery_points WHERE project_id=?${t?" AND policy_id=?":""} ORDER BY point_in_time DESC`).all(e,...t?[t]:[]).map(Dg)}updateRecoveryPoint(e,t){let r=this.getRecoveryPoint(e);if(!r)throw Error("Recovery point was not found.");let a={...r,...t};return this.controlPlane.database.run("UPDATE recovery_points SET status=?,verification_state=?,verified_at=?,held=?,pinned=?,manifest=?,duration_ms=?,updated_at=? WHERE id=?",[a.status,a.verificationState,a.verifiedAt??null,a.held?1:0,a.pinned?1:0,JSON.stringify(a.manifest),a.durationMs??null,this.now().toISOString(),e]),this.getRecoveryPoint(e)}retentionCandidates(e=this.now()){let t=this.controlPlane.database.query(`SELECT rp.* FROM recovery_points rp
182
182
  WHERE rp.status='available' AND rp.held=0 AND rp.pinned=0
183
183
  AND rp.expires_at IS NOT NULL AND rp.expires_at<=?
184
184
  AND (rp.locked_until IS NULL OR rp.locked_until<=?)
@@ -186,7 +186,7 @@ export const handler = async (event) => {
186
186
  SELECT 1 FROM backup_jobs bj WHERE bj.recovery_point_id=rp.id
187
187
  AND bj.kind IN ('restore','drill') AND bj.status IN ('queued','running','cleanup_required')
188
188
  )
189
- ORDER BY rp.expires_at,rp.id`).all(e.toISOString(),e.toISOString()).map(Dg),r=new Set;for(let a of new Set(t.map((u)=>u.projectId)))for(let u of this.listPolicies(a)){let f=this.listRecoveryPoints(u.projectId,u.id).filter((b)=>b.status==="available").sort((b,S)=>S.pointInTime.localeCompare(b.pointInTime));for(let b of f.slice(0,Math.max(0,u.retention.keepLast??0)))r.add(b.id);let h=[[u.retention.hourly,(b)=>b.toISOString().slice(0,13)],[u.retention.daily,(b)=>b.toISOString().slice(0,10)],[u.retention.weekly,(b)=>new Date(Date.UTC(b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()-(b.getUTCDay()+6)%7)).toISOString().slice(0,10)],[u.retention.monthly,(b)=>b.toISOString().slice(0,7)]];for(let[b,S]of h){let y=new Set;for(let k of f){let R=S(new Date(k.pointInTime));if(y.has(R))continue;if(y.add(R),y.size<=Math.max(0,b??0))r.add(k.id)}}}return t.filter((a)=>!r.has(a.id))}coverage(e,t=this.now()){let r=new Map(this.listDestinations(e).map((a)=>[a.id,a]));return this.listPolicies(e).map((a)=>{let u=this.listRecoveryPoints(e,a.id).filter((b)=>b.status==="available"),f=u[0],h=f?(t.getTime()-new Date(f.pointInTime).getTime())/60000:Number.POSITIVE_INFINITY;return{policy:a,lastRecoveryPoint:f,missedRpo:a.enabled&&h>a.expectedRpoMinutes,unverified:u.filter((b)=>b.verificationState!=="verified").length,destinationHealthy:r.get(a.destinationId)?.status==="healthy"}})}}import{createCipheriv as dC,createDecipheriv as lC,createHash as Mv,randomBytes as Lv}from"node:crypto";var Ng=Buffer.from("TSCB1"),zd=(e)=>`sha256:${Mv("sha256").update(e).digest("hex")}`;function Fv(e){return Mv("sha256").update(e).digest()}function Eh(e,t,r){let a=r?Buffer.from(r):Lv(12);if(a.length!==12)throw Error("Backup encryption IV must contain 12 bytes.");let u=dC("aes-256-gcm",Fv(t),a),f=Buffer.concat([u.update(e),u.final()]),h=u.getAuthTag();return Buffer.concat([Ng,a,h,f])}function vh(e,t){let r=Buffer.from(e);if(!r.subarray(0,Ng.length).equals(Ng))throw Error("Backup does not contain a valid encrypted envelope.");let a=r.subarray(5,17),u=r.subarray(17,33),f=r.subarray(33),h=lC("aes-256-gcm",Fv(t),a);return h.setAuthTag(u),Buffer.concat([h.update(f),h.final()])}function uC(e){let t;try{t=JSON.parse(e)}catch{throw Error("Backup destination credential must be a JSON object with accessKeyId and secretAccessKey.")}if(!t.accessKeyId||!t.secretAccessKey)throw Error("Backup destination credential requires accessKeyId and secretAccessKey.");if(t.expiresAt){let r=new Date(String(t.expiresAt));if(!Number.isFinite(r.getTime()))throw Error("Backup destination credential expiresAt must be an ISO timestamp.");if(r.getTime()<=Date.now())throw Error("Backup destination credential has expired.")}return{accessKeyId:String(t.accessKeyId),secretAccessKey:String(t.secretAccessKey),sessionToken:t.sessionToken?String(t.sessionToken):void 0}}async function pg(e,t,r=new Date){if(!e.credentialRef)return{status:"default"};try{let a=JSON.parse(await t.resolve(e.credentialRef));if(!a.accessKeyId||!a.secretAccessKey)return{status:"invalid"};if(!a.expiresAt)return{status:"static"};let u=new Date(String(a.expiresAt));if(!Number.isFinite(u.getTime()))return{status:"invalid"};let f=u.getTime()-r.getTime();return{status:f<=0?"expired":f<=604800000?"expiring":"valid",expiresAt:u.toISOString()}}catch{return{status:"invalid"}}}class ec{secrets;clientFactory;multipartThreshold;partSize;constructor(e,t=(u,f)=>new o(u.region??"us-east-1",void 0,{endpoint:u.endpoint?new URL(u.endpoint).host:void 0,forcePathStyle:u.forcePathStyle,credentials:f}),r=8388608,a=8388608){this.secrets=e;this.clientFactory=t;this.multipartThreshold=r;this.partSize=a}async client(e){let t=e.credentialRef?uC(await this.secrets.resolve(e.credentialRef)):void 0;return this.clientFactory(e,t)}async test(e){if(!e.bucket)throw Error("S3 destination has no configured bucket.");let t=await this.client(e),r=`${e.prefix?`${e.prefix.replace(/\/$/,"")}/`:""}.ts-cloud-health/${crypto.randomUUID()}`;await t.putObject({bucket:e.bucket,key:r,body:"ts-cloud backup destination health check",contentType:"text/plain"});try{let a=await t.getObjectBytes(e.bucket,r);if(Buffer.from(a.body).toString()!=="ts-cloud backup destination health check")throw Error("Backup destination health object was corrupted.")}finally{await t.deleteObject(e.bucket,r)}}async upload(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");let r=await this.client(e),a=zd(t.body),u=e.encryption!=="provider"?await this.secrets.resolve(e.encryptionKeyRef):void 0,f=u?t.resume?.encryptionIv?Buffer.from(t.resume.encryptionIv,"base64url"):Lv(12):void 0,h=u?Eh(t.body,u,f):Buffer.from(t.body),b=zd(h),S=`${e.prefix?`${e.prefix.replace(/\/$/,"")}/`:""}${t.key.replace(/^\/+/,"")}`,y=t.contentType??"application/octet-stream",k={"ts-cloud-format":"v1","ts-cloud-sha256":b.slice(7),"ts-cloud-encrypted":u?"true":"false"};if(t.resume&&t.resume.key!==S)throw Error("Multipart checkpoint does not match the requested backup key.");if(t.resume&&u&&!t.resume.encryptionIv)throw Error("Encrypted multipart checkpoint has no resumable envelope state.");if(t.resume&&u&&t.resume.plaintextChecksum!==a)throw Error("Encrypted multipart checkpoint does not match the backup payload.");if(h.length<this.multipartThreshold)await r.putObject({bucket:e.bucket,key:S,body:h,contentType:y,metadata:k});else{let R=t.resume?void 0:await r.createMultipartUpload(e.bucket,S,{contentType:y,metadata:k}),D=t.resume??{uploadId:R.UploadId,key:S,parts:[],bytesUploaded:0,encryptionIv:f?.toString("base64url"),plaintextChecksum:a},O=new Map(D.parts.map((z)=>[z.PartNumber,z])),M=Math.ceil(h.length/this.partSize);for(let z=0;z<M;z++){let J=z+1;if(!O.has(J)){let Z=z*this.partSize,oe=await r.uploadPart(e.bucket,S,D.uploadId,J,h.subarray(Z,Math.min(h.length,Z+this.partSize)));O.set(J,{PartNumber:J,ETag:oe.ETag})}D.parts=[...O.values()].sort((Z,oe)=>Z.PartNumber-oe.PartNumber),D.bytesUploaded=Math.min(h.length,J*this.partSize),t.checkpoint?.(D)}await r.completeMultipartUpload(e.bucket,S,D.uploadId,D.parts)}return{uri:`s3://${e.bucket}/${S}`,key:S,sizeBytes:h.length,checksum:b,manifest:{format:"ts-cloud-backup-v1",encrypted:!!u,plaintextChecksum:a,storageChecksum:b,contentType:y}}}async download(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");let r=await this.client(e),a=await r.getObjectBytes(e.bucket,t.key),u=Buffer.from(a.body);if(zd(u)!==t.checksum)throw Error("Backup checksum verification failed; object is corrupt.");let f=t.manifest.encrypted?vh(u,await this.secrets.resolve(e.encryptionKeyRef)):u;if(zd(f)!==t.manifest.plaintextChecksum)throw Error("Backup plaintext checksum verification failed.");return f}async abortPartial(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");await(await this.client(e)).abortMultipartUpload(e.bucket,t.key,t.uploadId)}async delete(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");await(await this.client(e)).deleteObject(e.bucket,t)}}import{createHash as pC}from"node:crypto";var gC=(e)=>`sha256:${pC("sha256").update(e).digest("hex")}`;class Ts{store;queue;now;constructor(e,t,r=()=>new Date){this.store=e;this.queue=t;this.now=r}enqueueBackup(e,t=this.now().toISOString(),r){if(!e.enabled)throw Error("Backup policy is disabled.");let a=this.store.createJob({projectId:e.projectId,policyId:e.id,kind:"backup",status:"queued",idempotencyKey:`backup:${e.id}:${t}`,target:{scheduledFor:t},cancellability:"checkpoint_only",progress:{phase:"queued"}});if(!a.operationId){let u=this.queue.enqueue({projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:r,kind:"backup.run",input:{backupJobId:a.id},lockKey:e.dataServiceId?`data-service:${e.dataServiceId}`:e.resourceId?`resource:${e.resourceId}`:`backup-policy:${e.id}`,providerKey:"backup",maxAttempts:3,timeoutSeconds:14400,retryClasses:["provider_transient"],resumePolicy:"requeue"});return this.store.updateJob(a.id,{operationId:u.operation.id})}return a}enqueueDue(e=this.now()){return this.store.duePolicies(e).map((t)=>{let r=t.nextRunAt;return this.store.advancePolicy(t.id,r),this.enqueueBackup(t,r)})}enqueueVerification(e){let t=this.store.createJob({projectId:e.projectId,policyId:e.policyId,recoveryPointId:e.id,kind:"verify",status:"queued",idempotencyKey:`verify:${e.id}:${e.checksum}`,target:{},cancellability:"safe",progress:{phase:"queued"}});if(!t.operationId){let r=this.queue.enqueue({projectId:e.projectId,resourceId:e.resourceId,kind:"backup.verify",input:{backupJobId:t.id},lockKey:`recovery-point:${e.id}`,providerKey:"backup",maxAttempts:2,timeoutSeconds:7200,retryClasses:["provider_transient"],resumePolicy:"requeue"});return this.store.updateJob(t.id,{operationId:r.operation.id})}return t}planRestore(e,t){if(e.status!=="available")throw Error("Only available recovery points can be restored.");if(e.verificationState!=="verified")throw Error("Restore requires a verified recovery point.");if(t.mode==="in_place"){if(!t.recentAuth)throw Error("In-place restore requires recent authentication.");if(t.confirm!==t.targetName)throw Error(`Type ${t.targetName} to confirm in-place restore.`);if(!t.downtimeAcknowledged)throw Error("In-place restore requires downtime acknowledgement.");let r=t.safetyBackupId?this.store.getRecoveryPoint(t.safetyBackupId):void 0;if(!r||r.id===e.id||r.status!=="available"||r.verificationState!=="verified"||r.resourceId!==e.resourceId||r.dataServiceId!==e.dataServiceId)throw Error("In-place restore requires a distinct verified safety backup for the same target.")}return{point:e,mode:t.mode,target:{...t.target,inPlace:t.mode==="in_place",restoreMode:t.mode},warnings:t.mode==="in_place"?["The target is locked against deployments and backup work.","Downtime and data replacement are expected.","Provider cancellation may stop only at a checkpoint."]:["An isolated target is created and health-validated before cleanup."]}}enqueueRestore(e,t){let r=this.planRestore(e,t),a=t.drill?"drill":"restore",u=gC(JSON.stringify({point:e.id,mode:t.mode,target:t.target,safety:t.safetyBackupId,drill:!!t.drill})),f=this.store.createJob({projectId:e.projectId,policyId:e.policyId,recoveryPointId:e.id,kind:a,status:"queued",idempotencyKey:`${a}:${u}`,target:r.target,restoreMode:r.mode,cancellability:"checkpoint_only",safetyBackupId:t.safetyBackupId,progress:{phase:"queued",warnings:r.warnings}});if(!f.operationId){let h=this.queue.enqueue({projectId:e.projectId,resourceId:e.resourceId,actorId:t.actorId,kind:t.drill?"backup.drill":"backup.restore",input:{backupJobId:f.id},lockKey:e.dataServiceId?`data-service:${e.dataServiceId}`:e.resourceId?`resource:${e.resourceId}`:`recovery-point:${e.id}`,providerKey:"backup",maxAttempts:1,timeoutSeconds:14400,retryClasses:[],resumePolicy:"fail"});return this.store.updateJob(f.id,{operationId:h.operation.id})}return f}enqueueRetention(e=this.now()){return this.store.retentionCandidates(e).map((t)=>{let r=this.store.createJob({projectId:t.projectId,policyId:t.policyId,recoveryPointId:t.id,kind:"cleanup",status:"queued",idempotencyKey:`cleanup:${t.id}:${t.expiresAt}`,target:{},cancellability:"safe",progress:{phase:"queued"}});if(!r.operationId){let a=this.queue.enqueue({projectId:t.projectId,resourceId:t.resourceId,kind:"backup.cleanup",input:{backupJobId:r.id},lockKey:`recovery-point:${t.id}`,providerKey:"backup",maxAttempts:3,timeoutSeconds:7200,retryClasses:["provider_transient"],resumePolicy:"requeue"});return this.store.updateJob(r.id,{operationId:a.operation.id})}return r})}}function mg(e){let t=e.now??(()=>new Date),r=new Ts(e.store,e.queue,t),a=(b)=>{let S=b.recoveryPointId?e.store.getRecoveryPoint(b.recoveryPointId):void 0,y=b.policyId?e.store.getPolicy(b.policyId):S?.policyId?e.store.getPolicy(S.policyId):void 0;if(!y)throw Error("Backup policy was not found.");let k=e.store.getDestination(S?.destinationId??y.destinationId),R=e.resolveSource(y);if(!k)throw Error("Backup destination was not found.");if(!R)throw Error(`No ${y.resourceKind} backup adapter is configured.`);return{point:S,policy:y,destination:k,source:R}},u=(b)=>{let S=b.operation.input,y=e.store.getJob(String(S.backupJobId??""));if(!y)throw Error("Backup job was not found.");return e.store.updateJob(y.id,{status:"running",startedAt:y.startedAt??t().toISOString(),progress:{...y.progress,phase:"running"}}),y},f=(b,S)=>{let y=e.store.getJob(b.id)??b;e.store.updateJob(b.id,{status:"failed",finishedAt:t().toISOString(),error:S instanceof Error?S.message:String(S),progress:{...y.progress,phase:"failed"}})};return{"backup.run":async(b)=>{let S=u(b);try{let{policy:y,destination:k,source:R}=a(S),D=await R.create(y,b),O=e.resolveDestination(k),M=D.mode==="object"?await(async()=>{if(!O)throw Error("Backup destination adapter is not configured.");let oe=e.store.getJob(S.id)?.progress,G=oe?.multipart,te=G&&typeof G==="object"&&!Array.isArray(G)&&typeof G.uploadId==="string"&&typeof G.key==="string"&&Array.isArray(G.parts)?G:void 0;return O.upload(k,{key:D.key,body:D.body,contentType:D.contentType,resume:te,checkpoint:(he)=>{b.checkpoint("uploading",`Uploaded ${Number(he.bytesUploaded??0)} backup bytes.`),e.store.updateJob(S.id,{progress:{phase:"uploading",multipart:{...he}}})}})})():{uri:D.uri,key:D.uri,sizeBytes:D.sizeBytes,checksum:D.checksum,manifest:{format:"ts-cloud-backup-v1",encrypted:!1,plaintextChecksum:D.checksum,storageChecksum:D.checksum,contentType:"application/provider-snapshot"}},z=y.retention.expireAfterDays?new Date(t().getTime()+y.retention.expireAfterDays*86400000).toISOString():void 0,J=e.store.getJob(S.id)?.startedAt,Z=e.store.createRecoveryPoint({projectId:y.projectId,policyId:y.id,destinationId:k.id,resourceId:y.resourceId,dataServiceId:y.dataServiceId,backupJobId:S.id,kind:y.resourceKind,pointInTime:t().toISOString(),uri:M.uri,sizeBytes:M.sizeBytes,checksum:M.checksum,manifest:{...D.manifest,...M.manifest,storageKey:M.key},toolVersion:D.toolVersion,engineVersion:D.engineVersion,expiresAt:z,lockedUntil:k.immutability.defaultRetentionDays?new Date(t().getTime()+k.immutability.defaultRetentionDays*86400000).toISOString():void 0,held:!1,pinned:!1,status:"available",verificationState:"unverified",durationMs:Math.max(0,t().getTime()-new Date(J??t().toISOString()).getTime())});if(D.mode==="external"&&k.provider==="aws_backup")e.store.recordDestinationTest(k.id,{ok:!0});return e.store.updateJob(S.id,{status:"succeeded",recoveryPointId:Z.id,finishedAt:t().toISOString(),progress:{phase:"stored",recoveryPointId:Z.id}}),r.enqueueVerification(Z),{backupJobId:S.id,recoveryPointId:Z.id}}catch(y){let k=e.store.getJob(S.id),R=k?.progress.multipart,D=(()=>{try{return a(S)}catch{return}})();if(D?.destination.provider==="aws_backup")e.store.recordDestinationTest(D.destination.id,{ok:!1,error:y instanceof Error?y.message:String(y)});let O=!1;if(R&&typeof R==="object"&&!Array.isArray(R)&&D){let M=e.resolveDestination(D.destination);if(O=!0,M?.abortPartial)try{await M.abortPartial(D.destination,R),O=!1,e.store.updateJob(S.id,{progress:{...k.progress,partialCleanup:"aborted"}})}catch{e.store.updateJob(S.id,{progress:{...k.progress,partialCleanup:"required"}})}}if(O)e.store.updateJob(S.id,{status:"cleanup_required",finishedAt:t().toISOString(),error:y instanceof Error?y.message:String(y),progress:{...e.store.getJob(S.id)?.progress??{},phase:"cleanup_required"}});else f(S,y);throw y}},"backup.verify":async(b)=>{let S=u(b);try{let{point:y,destination:k,source:R}=a(S);if(!y)throw Error("Recovery point was not found.");e.store.updateRecoveryPoint(y.id,{verificationState:"verifying"});let D;if(y.uri.startsWith("s3:")){let O=e.resolveDestination(k);if(!O)throw Error("Backup destination adapter is not configured.");let M=await O.download(k,{key:String(y.manifest.storageKey??""),checksum:y.checksum,manifest:y.manifest}),z=R.verify?await R.verify(y,M,b):{};D={bytes:M.length,checksum:y.checksum,...z}}else if(R.verifyExternal)D=await R.verifyExternal(y,b);else throw Error("External recovery point verification is not supported.");return e.store.updateRecoveryPoint(y.id,{verificationState:"verified",verifiedAt:t().toISOString(),manifest:{...y.manifest,verification:D}}),e.store.updateJob(S.id,{status:"succeeded",finishedAt:t().toISOString(),progress:{phase:"verified",evidence:D}}),{backupJobId:S.id,recoveryPointId:y.id,evidence:D}}catch(y){if(S.recoveryPointId)e.store.updateRecoveryPoint(S.recoveryPointId,{verificationState:/checksum|corrupt|authentic/i.test(y instanceof Error?y.message:String(y))?"corrupt":"failed"});throw f(S,y),y}},"backup.restore":async(b)=>h(b,!1),"backup.drill":async(b)=>h(b,!0),"backup.cleanup":async(b)=>{let S=u(b);try{let{point:y,destination:k,source:R}=a(S);if(!y)throw Error("Recovery point was not found.");if(!e.store.retentionCandidates(t()).some((D)=>D.id===y.id))throw Error("Recovery point is held, pinned, locked, or in active use.");if(e.store.updateRecoveryPoint(y.id,{status:"deleting"}),y.uri.startsWith("s3:")){let D=e.resolveDestination(k);if(!D)throw Error("Destination cleanup is unavailable.");await D.delete(k,String(y.manifest.storageKey??""))}else if(R.deleteExternal)await R.deleteExternal(y,b);else throw Error("External recovery point cleanup is unavailable.");return e.store.updateRecoveryPoint(y.id,{status:"deleted"}),e.store.updateJob(S.id,{status:"succeeded",finishedAt:t().toISOString(),progress:{phase:"deleted"}}),{backupJobId:S.id,recoveryPointId:y.id,deleted:!0}}catch(y){throw f(S,y),y}}};async function h(b,S){let y=u(b);try{let{point:k,policy:R,destination:D,source:O}=a(y);if(!k)throw Error("Recovery point was not found.");if(S&&!O.cleanup)throw Error("This backup source cannot safely clean a recovery drill target.");let M=k.uri.startsWith("s3:")?e.resolveDestination(D):void 0,z=M?await M.download(D,{key:String(k.manifest.storageKey??""),checksum:k.checksum,manifest:k.manifest}):void 0,J=await O.restore(k,z,y.target,b),Z=O.validateHealth?await O.validateHealth({...y.target,...J},b):{healthy:!0,mode:"adapter"},oe=e.validateHealth?await e.validateHealth(R,y.target):{healthy:!0,mode:"not_configured"},G={...Z,healthy:Z.healthy===!0&&oe.healthy===!0,configured:oe};if(G.healthy!==!0)throw Error("Restored target did not pass its configured health check.");if(S&&O.cleanup)await O.cleanup({...y.target,provider:k.manifest.provider??null},b);return e.store.updateJob(y.id,{status:"succeeded",finishedAt:t().toISOString(),healthResult:G,progress:{phase:S?"drill_cleaned":"restored",restored:J}}),{backupJobId:y.id,recoveryPointId:k.id,restored:J,health:G,cleaned:S}}catch(k){let R=(()=>{try{return a(y)}catch{return}})(),D=k instanceof Error?k.message:String(k),O=!1;if(S&&R?.source.cleanup)try{await R.source.cleanup({...y.target,provider:R.point?.manifest.provider??null},b)}catch{O=!0}if(O)e.store.updateJob(y.id,{status:"cleanup_required",finishedAt:t().toISOString(),error:D,progress:{...y.progress,phase:"cleanup_required"}});else f(y,k);throw k}}}import{createHash as mC}from"node:crypto";var fC=(e)=>`sha256:${mC("sha256").update(e).digest("hex")}`;class tc{dataServices;client;constructor(e,t=new ne){this.dataServices=e;this.client=t}service(e){let t=e.dataServiceId?this.dataServices.get(e.dataServiceId):void 0;if(!t||!["aws_rds","aws_aurora"].includes(t.provider))throw Error("Managed database backup policy requires an RDS or Aurora data service.");return t}async waitForSnapshot(e,t,r){for(;;){r.throwIfCancellationRequested?.(),r.heartbeat?.();let a=e==="aws_aurora"?(await this.client.describeDBClusterSnapshots({DBClusterSnapshotIdentifier:t})).DBClusterSnapshots[0]:(await this.client.describeDBSnapshots({DBSnapshotIdentifier:t})).DBSnapshots?.[0];if(!a)throw Error("Provider snapshot was not found.");let u=a,f=String(u.Status??u.DBSnapshotStatus??"unknown");if(r.checkpoint?.("provider_snapshot",`Database snapshot ${t} is ${f}.`),f==="available")return u;if(["deleted","deleting","failed"].includes(f))throw Error(`Provider snapshot ${t} failed with state ${f}.`);await Bun.sleep(5000)}}async create(e,t){let r=this.service(e),a=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,20),u=`${r.placement.slice(0,42).replace(/-+$/,"")}-${a}`;if(r.provider==="aws_aurora")await this.client.createDBClusterSnapshot(r.placement,u);else await this.client.createDBSnapshot({DBInstanceIdentifier:r.placement,DBSnapshotIdentifier:u});await this.waitForSnapshot(r.provider,u,t);let f=`${r.provider}:${r.placement}:${u}`;return{mode:"external",uri:`aws-backup:${f}`,checksum:fC(f),sizeBytes:0,manifest:{provider:r.provider,sourceId:r.placement,snapshotId:u,plan:r.plan,engine:r.engine},engineVersion:r.engineVersion,toolVersion:"aws-rds-api-2014-10-31"}}async verifyExternal(e,t){let r=String(e.manifest.snapshotId??""),a=String(e.manifest.provider??"");if(!r)throw Error("Snapshot recovery point has no snapshot ID.");let u=await this.waitForSnapshot(a,r,t),f=String(u.Status??u.DBSnapshotStatus??"unknown");return{snapshotId:r,status:f,encrypted:u.Encrypted??u.StorageEncrypted??!0}}async restore(e,t,r,a){let u=String(r.targetId??""),f=String(e.manifest.snapshotId??""),h=String(e.manifest.provider??"");if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(u))throw Error("Managed restore requires a valid distinct targetId.");if(u===e.manifest.sourceId)throw Error("Managed restore target must differ from its source.");if(h==="aws_aurora"){let b=e.manifest.engine==="postgres"?"aurora-postgresql":"aurora-mysql";await this.client.restoreDBClusterFromSnapshot({DBClusterIdentifier:u,SnapshotIdentifier:f,Engine:b,EngineVersion:e.engineVersion,DeletionProtection:!0,ServerlessV2ScalingConfiguration:{MinCapacity:Number(r.minCapacity)||0.5,MaxCapacity:Number(r.maxCapacity)||4}}),await this.client.createDBInstance({DBInstanceIdentifier:`${u}-writer-1`,DBClusterIdentifier:u,DBInstanceClass:String(r.plan??e.manifest.plan??"db.serverless"),Engine:b,PubliclyAccessible:!1})}else await this.client.restoreDBInstanceFromDBSnapshot({DBInstanceIdentifier:u,DBSnapshotIdentifier:f,DBInstanceClass:String(r.plan??e.manifest.plan??""),PubliclyAccessible:!1,DeletionProtection:!0,Tags:[{Key:"managed-by",Value:"ts-cloud-restore"}]});return{targetId:u,provider:h,status:"creating",isolated:!0}}async validateHealth(e,t){let r=String(e.targetId??""),a=String(e.provider??"");for(;;){t.throwIfCancellationRequested?.(),t.heartbeat?.();let u=a==="aws_aurora"?(await this.client.describeDBClusters({DBClusterIdentifier:r})).DBClusters?.[0]:(await this.client.describeDBInstances({DBInstanceIdentifier:r})).DBInstances?.[0];if(!u)throw Error("Restored managed database was not found.");let f=String(u.Status??u.DBInstanceStatus??"unknown");if(t.checkpoint?.("provider_restore",`Restored database ${r} is ${f}.`),f==="available")return{healthy:!0,targetId:r,provider:a,status:f};if(["deleted","deleting","failed","incompatible-restore"].includes(f))throw Error(`Restored managed database ${r} failed with state ${f}.`);await Bun.sleep(5000)}}async cleanup(e,t){let r=String(e.targetId??""),a=String(e.provider??"");if(!r)throw Error("Restore cleanup target is required.");if(a==="aws_aurora")await this.client.deleteDBInstance({DBInstanceIdentifier:`${r}-writer-1`,SkipFinalSnapshot:!0}),await this.client.modifyDBCluster({DBClusterIdentifier:r,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBCluster(r);else await this.client.modifyDBInstance({DBInstanceIdentifier:r,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBInstance({DBInstanceIdentifier:r,SkipFinalSnapshot:!0,DeleteAutomatedBackups:!0})}async deleteExternal(e,t){let r=String(e.manifest.snapshotId??"");if(e.manifest.provider==="aws_aurora")await this.client.deleteDBClusterSnapshot(r);else await this.client.deleteDBSnapshot(r)}}import{existsSync as mc}from"node:fs";import{mkdir as qd,readdir as hC,rename as jg,rm as Ps}from"node:fs/promises";import{relative as yC,resolve as Gr,sep as Vd}from"node:path";function Ut(e,t){if(t==="gzip")return Buffer.from(Bun.gzipSync(Uint8Array.from(e)));if(t==="zstd")return Buffer.from(Bun.zstdCompressSync(Uint8Array.from(e)));return Buffer.from(e)}function Fe(e,t){if(t==="gzip")return Buffer.from(Bun.gunzipSync(Uint8Array.from(e)));if(t==="zstd")return Buffer.from(Bun.zstdDecompressSync(Uint8Array.from(e)));return Buffer.from(e)}async function Bg(e,t){let r=Bun.spawn(["tar",...e],{stdin:t?Buffer.from(t):void 0,stdout:"pipe",stderr:"pipe"}),[a,u,f]=await Promise.all([r.exited,new Response(r.stdout).arrayBuffer(),new Response(r.stderr).text()]);if(a!==0)throw Error(f.trim()||`tar exited with status ${a}.`);return{stdout:Buffer.from(u),stderr:f}}function vC(e){let t=e.replaceAll("\\","/").replace(/^\.\//,"");return!!t&&!t.startsWith("/")&&!t.split("/").includes("..")}class fg{async create(e,t,r){return(await Bg(["-C",e,"-cf","-",...r.map((u)=>`--exclude=${u}`),"--",...t])).stdout}async extract(e,t){await qd(t,{recursive:!0,mode:448}),await Bg(["-C",t,"-xf","-"],e)}async inspect(e){let t=await Bg(["-tf","-"],e),r=t.stdout.toString().split(`
189
+ ORDER BY rp.expires_at,rp.id`).all(e.toISOString(),e.toISOString()).map(Dg),r=new Set;for(let a of new Set(t.map((u)=>u.projectId)))for(let u of this.listPolicies(a)){let f=this.listRecoveryPoints(u.projectId,u.id).filter((b)=>b.status==="available").sort((b,S)=>S.pointInTime.localeCompare(b.pointInTime));for(let b of f.slice(0,Math.max(0,u.retention.keepLast??0)))r.add(b.id);let h=[[u.retention.hourly,(b)=>b.toISOString().slice(0,13)],[u.retention.daily,(b)=>b.toISOString().slice(0,10)],[u.retention.weekly,(b)=>new Date(Date.UTC(b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()-(b.getUTCDay()+6)%7)).toISOString().slice(0,10)],[u.retention.monthly,(b)=>b.toISOString().slice(0,7)]];for(let[b,S]of h){let y=new Set;for(let k of f){let R=S(new Date(k.pointInTime));if(y.has(R))continue;if(y.add(R),y.size<=Math.max(0,b??0))r.add(k.id)}}}return t.filter((a)=>!r.has(a.id))}coverage(e,t=this.now()){let r=new Map(this.listDestinations(e).map((a)=>[a.id,a]));return this.listPolicies(e).map((a)=>{let u=this.listRecoveryPoints(e,a.id).filter((b)=>b.status==="available"),f=u[0],h=f?(t.getTime()-new Date(f.pointInTime).getTime())/60000:Number.POSITIVE_INFINITY;return{policy:a,lastRecoveryPoint:f,missedRpo:a.enabled&&h>a.expectedRpoMinutes,unverified:u.filter((b)=>b.verificationState!=="verified").length,destinationHealthy:r.get(a.destinationId)?.status==="healthy"}})}}import{createCipheriv as dC,createDecipheriv as lC,createHash as Mv,randomBytes as Lv}from"node:crypto";var Ng=Buffer.from("TSCB1"),zd=(e)=>`sha256:${Mv("sha256").update(e).digest("hex")}`;function Fv(e){return Mv("sha256").update(e).digest()}function vh(e,t,r){let a=r?Buffer.from(r):Lv(12);if(a.length!==12)throw Error("Backup encryption IV must contain 12 bytes.");let u=dC("aes-256-gcm",Fv(t),a),f=Buffer.concat([u.update(e),u.final()]),h=u.getAuthTag();return Buffer.concat([Ng,a,h,f])}function Th(e,t){let r=Buffer.from(e);if(!r.subarray(0,Ng.length).equals(Ng))throw Error("Backup does not contain a valid encrypted envelope.");let a=r.subarray(5,17),u=r.subarray(17,33),f=r.subarray(33),h=lC("aes-256-gcm",Fv(t),a);return h.setAuthTag(u),Buffer.concat([h.update(f),h.final()])}function uC(e){let t;try{t=JSON.parse(e)}catch{throw Error("Backup destination credential must be a JSON object with accessKeyId and secretAccessKey.")}if(!t.accessKeyId||!t.secretAccessKey)throw Error("Backup destination credential requires accessKeyId and secretAccessKey.");if(t.expiresAt){let r=new Date(String(t.expiresAt));if(!Number.isFinite(r.getTime()))throw Error("Backup destination credential expiresAt must be an ISO timestamp.");if(r.getTime()<=Date.now())throw Error("Backup destination credential has expired.")}return{accessKeyId:String(t.accessKeyId),secretAccessKey:String(t.secretAccessKey),sessionToken:t.sessionToken?String(t.sessionToken):void 0}}async function pg(e,t,r=new Date){if(!e.credentialRef)return{status:"default"};try{let a=JSON.parse(await t.resolve(e.credentialRef));if(!a.accessKeyId||!a.secretAccessKey)return{status:"invalid"};if(!a.expiresAt)return{status:"static"};let u=new Date(String(a.expiresAt));if(!Number.isFinite(u.getTime()))return{status:"invalid"};let f=u.getTime()-r.getTime();return{status:f<=0?"expired":f<=604800000?"expiring":"valid",expiresAt:u.toISOString()}}catch{return{status:"invalid"}}}class ec{secrets;clientFactory;multipartThreshold;partSize;constructor(e,t=(u,f)=>new o(u.region??"us-east-1",void 0,{endpoint:u.endpoint?new URL(u.endpoint).host:void 0,forcePathStyle:u.forcePathStyle,credentials:f}),r=8388608,a=8388608){this.secrets=e;this.clientFactory=t;this.multipartThreshold=r;this.partSize=a}async client(e){let t=e.credentialRef?uC(await this.secrets.resolve(e.credentialRef)):void 0;return this.clientFactory(e,t)}async test(e){if(!e.bucket)throw Error("S3 destination has no configured bucket.");let t=await this.client(e),r=`${e.prefix?`${e.prefix.replace(/\/$/,"")}/`:""}.ts-cloud-health/${crypto.randomUUID()}`;await t.putObject({bucket:e.bucket,key:r,body:"ts-cloud backup destination health check",contentType:"text/plain"});try{let a=await t.getObjectBytes(e.bucket,r);if(Buffer.from(a.body).toString()!=="ts-cloud backup destination health check")throw Error("Backup destination health object was corrupted.")}finally{await t.deleteObject(e.bucket,r)}}async upload(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");let r=await this.client(e),a=zd(t.body),u=e.encryption!=="provider"?await this.secrets.resolve(e.encryptionKeyRef):void 0,f=u?t.resume?.encryptionIv?Buffer.from(t.resume.encryptionIv,"base64url"):Lv(12):void 0,h=u?vh(t.body,u,f):Buffer.from(t.body),b=zd(h),S=`${e.prefix?`${e.prefix.replace(/\/$/,"")}/`:""}${t.key.replace(/^\/+/,"")}`,y=t.contentType??"application/octet-stream",k={"ts-cloud-format":"v1","ts-cloud-sha256":b.slice(7),"ts-cloud-encrypted":u?"true":"false"};if(t.resume&&t.resume.key!==S)throw Error("Multipart checkpoint does not match the requested backup key.");if(t.resume&&u&&!t.resume.encryptionIv)throw Error("Encrypted multipart checkpoint has no resumable envelope state.");if(t.resume&&u&&t.resume.plaintextChecksum!==a)throw Error("Encrypted multipart checkpoint does not match the backup payload.");if(h.length<this.multipartThreshold)await r.putObject({bucket:e.bucket,key:S,body:h,contentType:y,metadata:k});else{let R=t.resume?void 0:await r.createMultipartUpload(e.bucket,S,{contentType:y,metadata:k}),D=t.resume??{uploadId:R.UploadId,key:S,parts:[],bytesUploaded:0,encryptionIv:f?.toString("base64url"),plaintextChecksum:a},O=new Map(D.parts.map((z)=>[z.PartNumber,z])),M=Math.ceil(h.length/this.partSize);for(let z=0;z<M;z++){let J=z+1;if(!O.has(J)){let Z=z*this.partSize,oe=await r.uploadPart(e.bucket,S,D.uploadId,J,h.subarray(Z,Math.min(h.length,Z+this.partSize)));O.set(J,{PartNumber:J,ETag:oe.ETag})}D.parts=[...O.values()].sort((Z,oe)=>Z.PartNumber-oe.PartNumber),D.bytesUploaded=Math.min(h.length,J*this.partSize),t.checkpoint?.(D)}await r.completeMultipartUpload(e.bucket,S,D.uploadId,D.parts)}return{uri:`s3://${e.bucket}/${S}`,key:S,sizeBytes:h.length,checksum:b,manifest:{format:"ts-cloud-backup-v1",encrypted:!!u,plaintextChecksum:a,storageChecksum:b,contentType:y}}}async download(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");let r=await this.client(e),a=await r.getObjectBytes(e.bucket,t.key),u=Buffer.from(a.body);if(zd(u)!==t.checksum)throw Error("Backup checksum verification failed; object is corrupt.");let f=t.manifest.encrypted?Th(u,await this.secrets.resolve(e.encryptionKeyRef)):u;if(zd(f)!==t.manifest.plaintextChecksum)throw Error("Backup plaintext checksum verification failed.");return f}async abortPartial(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");await(await this.client(e)).abortMultipartUpload(e.bucket,t.key,t.uploadId)}async delete(e,t){if(!e.bucket)throw Error("S3 destination has no configured bucket.");await(await this.client(e)).deleteObject(e.bucket,t)}}import{createHash as pC}from"node:crypto";var gC=(e)=>`sha256:${pC("sha256").update(e).digest("hex")}`;class Ts{store;queue;now;constructor(e,t,r=()=>new Date){this.store=e;this.queue=t;this.now=r}enqueueBackup(e,t=this.now().toISOString(),r){if(!e.enabled)throw Error("Backup policy is disabled.");let a=this.store.createJob({projectId:e.projectId,policyId:e.id,kind:"backup",status:"queued",idempotencyKey:`backup:${e.id}:${t}`,target:{scheduledFor:t},cancellability:"checkpoint_only",progress:{phase:"queued"}});if(!a.operationId){let u=this.queue.enqueue({projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:r,kind:"backup.run",input:{backupJobId:a.id},lockKey:e.dataServiceId?`data-service:${e.dataServiceId}`:e.resourceId?`resource:${e.resourceId}`:`backup-policy:${e.id}`,providerKey:"backup",maxAttempts:3,timeoutSeconds:14400,retryClasses:["provider_transient"],resumePolicy:"requeue"});return this.store.updateJob(a.id,{operationId:u.operation.id})}return a}enqueueDue(e=this.now()){return this.store.duePolicies(e).map((t)=>{let r=t.nextRunAt;return this.store.advancePolicy(t.id,r),this.enqueueBackup(t,r)})}enqueueVerification(e){let t=this.store.createJob({projectId:e.projectId,policyId:e.policyId,recoveryPointId:e.id,kind:"verify",status:"queued",idempotencyKey:`verify:${e.id}:${e.checksum}`,target:{},cancellability:"safe",progress:{phase:"queued"}});if(!t.operationId){let r=this.queue.enqueue({projectId:e.projectId,resourceId:e.resourceId,kind:"backup.verify",input:{backupJobId:t.id},lockKey:`recovery-point:${e.id}`,providerKey:"backup",maxAttempts:2,timeoutSeconds:7200,retryClasses:["provider_transient"],resumePolicy:"requeue"});return this.store.updateJob(t.id,{operationId:r.operation.id})}return t}planRestore(e,t){if(e.status!=="available")throw Error("Only available recovery points can be restored.");if(e.verificationState!=="verified")throw Error("Restore requires a verified recovery point.");if(t.mode==="in_place"){if(!t.recentAuth)throw Error("In-place restore requires recent authentication.");if(t.confirm!==t.targetName)throw Error(`Type ${t.targetName} to confirm in-place restore.`);if(!t.downtimeAcknowledged)throw Error("In-place restore requires downtime acknowledgement.");let r=t.safetyBackupId?this.store.getRecoveryPoint(t.safetyBackupId):void 0;if(!r||r.id===e.id||r.status!=="available"||r.verificationState!=="verified"||r.resourceId!==e.resourceId||r.dataServiceId!==e.dataServiceId)throw Error("In-place restore requires a distinct verified safety backup for the same target.")}return{point:e,mode:t.mode,target:{...t.target,inPlace:t.mode==="in_place",restoreMode:t.mode},warnings:t.mode==="in_place"?["The target is locked against deployments and backup work.","Downtime and data replacement are expected.","Provider cancellation may stop only at a checkpoint."]:["An isolated target is created and health-validated before cleanup."]}}enqueueRestore(e,t){let r=this.planRestore(e,t),a=t.drill?"drill":"restore",u=gC(JSON.stringify({point:e.id,mode:t.mode,target:t.target,safety:t.safetyBackupId,drill:!!t.drill})),f=this.store.createJob({projectId:e.projectId,policyId:e.policyId,recoveryPointId:e.id,kind:a,status:"queued",idempotencyKey:`${a}:${u}`,target:r.target,restoreMode:r.mode,cancellability:"checkpoint_only",safetyBackupId:t.safetyBackupId,progress:{phase:"queued",warnings:r.warnings}});if(!f.operationId){let h=this.queue.enqueue({projectId:e.projectId,resourceId:e.resourceId,actorId:t.actorId,kind:t.drill?"backup.drill":"backup.restore",input:{backupJobId:f.id},lockKey:e.dataServiceId?`data-service:${e.dataServiceId}`:e.resourceId?`resource:${e.resourceId}`:`recovery-point:${e.id}`,providerKey:"backup",maxAttempts:1,timeoutSeconds:14400,retryClasses:[],resumePolicy:"fail"});return this.store.updateJob(f.id,{operationId:h.operation.id})}return f}enqueueRetention(e=this.now()){return this.store.retentionCandidates(e).map((t)=>{let r=this.store.createJob({projectId:t.projectId,policyId:t.policyId,recoveryPointId:t.id,kind:"cleanup",status:"queued",idempotencyKey:`cleanup:${t.id}:${t.expiresAt}`,target:{},cancellability:"safe",progress:{phase:"queued"}});if(!r.operationId){let a=this.queue.enqueue({projectId:t.projectId,resourceId:t.resourceId,kind:"backup.cleanup",input:{backupJobId:r.id},lockKey:`recovery-point:${t.id}`,providerKey:"backup",maxAttempts:3,timeoutSeconds:7200,retryClasses:["provider_transient"],resumePolicy:"requeue"});return this.store.updateJob(r.id,{operationId:a.operation.id})}return r})}}function mg(e){let t=e.now??(()=>new Date),r=new Ts(e.store,e.queue,t),a=(b)=>{let S=b.recoveryPointId?e.store.getRecoveryPoint(b.recoveryPointId):void 0,y=b.policyId?e.store.getPolicy(b.policyId):S?.policyId?e.store.getPolicy(S.policyId):void 0;if(!y)throw Error("Backup policy was not found.");let k=e.store.getDestination(S?.destinationId??y.destinationId),R=e.resolveSource(y);if(!k)throw Error("Backup destination was not found.");if(!R)throw Error(`No ${y.resourceKind} backup adapter is configured.`);return{point:S,policy:y,destination:k,source:R}},u=(b)=>{let S=b.operation.input,y=e.store.getJob(String(S.backupJobId??""));if(!y)throw Error("Backup job was not found.");return e.store.updateJob(y.id,{status:"running",startedAt:y.startedAt??t().toISOString(),progress:{...y.progress,phase:"running"}}),y},f=(b,S)=>{let y=e.store.getJob(b.id)??b;e.store.updateJob(b.id,{status:"failed",finishedAt:t().toISOString(),error:S instanceof Error?S.message:String(S),progress:{...y.progress,phase:"failed"}})};return{"backup.run":async(b)=>{let S=u(b);try{let{policy:y,destination:k,source:R}=a(S),D=await R.create(y,b),O=e.resolveDestination(k),M=D.mode==="object"?await(async()=>{if(!O)throw Error("Backup destination adapter is not configured.");let oe=e.store.getJob(S.id)?.progress,G=oe?.multipart,te=G&&typeof G==="object"&&!Array.isArray(G)&&typeof G.uploadId==="string"&&typeof G.key==="string"&&Array.isArray(G.parts)?G:void 0;return O.upload(k,{key:D.key,body:D.body,contentType:D.contentType,resume:te,checkpoint:(he)=>{b.checkpoint("uploading",`Uploaded ${Number(he.bytesUploaded??0)} backup bytes.`),e.store.updateJob(S.id,{progress:{phase:"uploading",multipart:{...he}}})}})})():{uri:D.uri,key:D.uri,sizeBytes:D.sizeBytes,checksum:D.checksum,manifest:{format:"ts-cloud-backup-v1",encrypted:!1,plaintextChecksum:D.checksum,storageChecksum:D.checksum,contentType:"application/provider-snapshot"}},z=y.retention.expireAfterDays?new Date(t().getTime()+y.retention.expireAfterDays*86400000).toISOString():void 0,J=e.store.getJob(S.id)?.startedAt,Z=e.store.createRecoveryPoint({projectId:y.projectId,policyId:y.id,destinationId:k.id,resourceId:y.resourceId,dataServiceId:y.dataServiceId,backupJobId:S.id,kind:y.resourceKind,pointInTime:t().toISOString(),uri:M.uri,sizeBytes:M.sizeBytes,checksum:M.checksum,manifest:{...D.manifest,...M.manifest,storageKey:M.key},toolVersion:D.toolVersion,engineVersion:D.engineVersion,expiresAt:z,lockedUntil:k.immutability.defaultRetentionDays?new Date(t().getTime()+k.immutability.defaultRetentionDays*86400000).toISOString():void 0,held:!1,pinned:!1,status:"available",verificationState:"unverified",durationMs:Math.max(0,t().getTime()-new Date(J??t().toISOString()).getTime())});if(D.mode==="external"&&k.provider==="aws_backup")e.store.recordDestinationTest(k.id,{ok:!0});return e.store.updateJob(S.id,{status:"succeeded",recoveryPointId:Z.id,finishedAt:t().toISOString(),progress:{phase:"stored",recoveryPointId:Z.id}}),r.enqueueVerification(Z),{backupJobId:S.id,recoveryPointId:Z.id}}catch(y){let k=e.store.getJob(S.id),R=k?.progress.multipart,D=(()=>{try{return a(S)}catch{return}})();if(D?.destination.provider==="aws_backup")e.store.recordDestinationTest(D.destination.id,{ok:!1,error:y instanceof Error?y.message:String(y)});let O=!1;if(R&&typeof R==="object"&&!Array.isArray(R)&&D){let M=e.resolveDestination(D.destination);if(O=!0,M?.abortPartial)try{await M.abortPartial(D.destination,R),O=!1,e.store.updateJob(S.id,{progress:{...k.progress,partialCleanup:"aborted"}})}catch{e.store.updateJob(S.id,{progress:{...k.progress,partialCleanup:"required"}})}}if(O)e.store.updateJob(S.id,{status:"cleanup_required",finishedAt:t().toISOString(),error:y instanceof Error?y.message:String(y),progress:{...e.store.getJob(S.id)?.progress??{},phase:"cleanup_required"}});else f(S,y);throw y}},"backup.verify":async(b)=>{let S=u(b);try{let{point:y,destination:k,source:R}=a(S);if(!y)throw Error("Recovery point was not found.");e.store.updateRecoveryPoint(y.id,{verificationState:"verifying"});let D;if(y.uri.startsWith("s3:")){let O=e.resolveDestination(k);if(!O)throw Error("Backup destination adapter is not configured.");let M=await O.download(k,{key:String(y.manifest.storageKey??""),checksum:y.checksum,manifest:y.manifest}),z=R.verify?await R.verify(y,M,b):{};D={bytes:M.length,checksum:y.checksum,...z}}else if(R.verifyExternal)D=await R.verifyExternal(y,b);else throw Error("External recovery point verification is not supported.");return e.store.updateRecoveryPoint(y.id,{verificationState:"verified",verifiedAt:t().toISOString(),manifest:{...y.manifest,verification:D}}),e.store.updateJob(S.id,{status:"succeeded",finishedAt:t().toISOString(),progress:{phase:"verified",evidence:D}}),{backupJobId:S.id,recoveryPointId:y.id,evidence:D}}catch(y){if(S.recoveryPointId)e.store.updateRecoveryPoint(S.recoveryPointId,{verificationState:/checksum|corrupt|authentic/i.test(y instanceof Error?y.message:String(y))?"corrupt":"failed"});throw f(S,y),y}},"backup.restore":async(b)=>h(b,!1),"backup.drill":async(b)=>h(b,!0),"backup.cleanup":async(b)=>{let S=u(b);try{let{point:y,destination:k,source:R}=a(S);if(!y)throw Error("Recovery point was not found.");if(!e.store.retentionCandidates(t()).some((D)=>D.id===y.id))throw Error("Recovery point is held, pinned, locked, or in active use.");if(e.store.updateRecoveryPoint(y.id,{status:"deleting"}),y.uri.startsWith("s3:")){let D=e.resolveDestination(k);if(!D)throw Error("Destination cleanup is unavailable.");await D.delete(k,String(y.manifest.storageKey??""))}else if(R.deleteExternal)await R.deleteExternal(y,b);else throw Error("External recovery point cleanup is unavailable.");return e.store.updateRecoveryPoint(y.id,{status:"deleted"}),e.store.updateJob(S.id,{status:"succeeded",finishedAt:t().toISOString(),progress:{phase:"deleted"}}),{backupJobId:S.id,recoveryPointId:y.id,deleted:!0}}catch(y){throw f(S,y),y}}};async function h(b,S){let y=u(b);try{let{point:k,policy:R,destination:D,source:O}=a(y);if(!k)throw Error("Recovery point was not found.");if(S&&!O.cleanup)throw Error("This backup source cannot safely clean a recovery drill target.");let M=k.uri.startsWith("s3:")?e.resolveDestination(D):void 0,z=M?await M.download(D,{key:String(k.manifest.storageKey??""),checksum:k.checksum,manifest:k.manifest}):void 0,J=await O.restore(k,z,y.target,b),Z=O.validateHealth?await O.validateHealth({...y.target,...J},b):{healthy:!0,mode:"adapter"},oe=e.validateHealth?await e.validateHealth(R,y.target):{healthy:!0,mode:"not_configured"},G={...Z,healthy:Z.healthy===!0&&oe.healthy===!0,configured:oe};if(G.healthy!==!0)throw Error("Restored target did not pass its configured health check.");if(S&&O.cleanup)await O.cleanup({...y.target,provider:k.manifest.provider??null},b);return e.store.updateJob(y.id,{status:"succeeded",finishedAt:t().toISOString(),healthResult:G,progress:{phase:S?"drill_cleaned":"restored",restored:J}}),{backupJobId:y.id,recoveryPointId:k.id,restored:J,health:G,cleaned:S}}catch(k){let R=(()=>{try{return a(y)}catch{return}})(),D=k instanceof Error?k.message:String(k),O=!1;if(S&&R?.source.cleanup)try{await R.source.cleanup({...y.target,provider:R.point?.manifest.provider??null},b)}catch{O=!0}if(O)e.store.updateJob(y.id,{status:"cleanup_required",finishedAt:t().toISOString(),error:D,progress:{...y.progress,phase:"cleanup_required"}});else f(y,k);throw k}}}import{createHash as mC}from"node:crypto";var fC=(e)=>`sha256:${mC("sha256").update(e).digest("hex")}`;class tc{dataServices;client;constructor(e,t=new ne){this.dataServices=e;this.client=t}service(e){let t=e.dataServiceId?this.dataServices.get(e.dataServiceId):void 0;if(!t||!["aws_rds","aws_aurora"].includes(t.provider))throw Error("Managed database backup policy requires an RDS or Aurora data service.");return t}async waitForSnapshot(e,t,r){for(;;){r.throwIfCancellationRequested?.(),r.heartbeat?.();let a=e==="aws_aurora"?(await this.client.describeDBClusterSnapshots({DBClusterSnapshotIdentifier:t})).DBClusterSnapshots[0]:(await this.client.describeDBSnapshots({DBSnapshotIdentifier:t})).DBSnapshots?.[0];if(!a)throw Error("Provider snapshot was not found.");let u=a,f=String(u.Status??u.DBSnapshotStatus??"unknown");if(r.checkpoint?.("provider_snapshot",`Database snapshot ${t} is ${f}.`),f==="available")return u;if(["deleted","deleting","failed"].includes(f))throw Error(`Provider snapshot ${t} failed with state ${f}.`);await Bun.sleep(5000)}}async create(e,t){let r=this.service(e),a=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,20),u=`${r.placement.slice(0,42).replace(/-+$/,"")}-${a}`;if(r.provider==="aws_aurora")await this.client.createDBClusterSnapshot(r.placement,u);else await this.client.createDBSnapshot({DBInstanceIdentifier:r.placement,DBSnapshotIdentifier:u});await this.waitForSnapshot(r.provider,u,t);let f=`${r.provider}:${r.placement}:${u}`;return{mode:"external",uri:`aws-backup:${f}`,checksum:fC(f),sizeBytes:0,manifest:{provider:r.provider,sourceId:r.placement,snapshotId:u,plan:r.plan,engine:r.engine},engineVersion:r.engineVersion,toolVersion:"aws-rds-api-2014-10-31"}}async verifyExternal(e,t){let r=String(e.manifest.snapshotId??""),a=String(e.manifest.provider??"");if(!r)throw Error("Snapshot recovery point has no snapshot ID.");let u=await this.waitForSnapshot(a,r,t),f=String(u.Status??u.DBSnapshotStatus??"unknown");return{snapshotId:r,status:f,encrypted:u.Encrypted??u.StorageEncrypted??!0}}async restore(e,t,r,a){let u=String(r.targetId??""),f=String(e.manifest.snapshotId??""),h=String(e.manifest.provider??"");if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(u))throw Error("Managed restore requires a valid distinct targetId.");if(u===e.manifest.sourceId)throw Error("Managed restore target must differ from its source.");if(h==="aws_aurora"){let b=e.manifest.engine==="postgres"?"aurora-postgresql":"aurora-mysql";await this.client.restoreDBClusterFromSnapshot({DBClusterIdentifier:u,SnapshotIdentifier:f,Engine:b,EngineVersion:e.engineVersion,DeletionProtection:!0,ServerlessV2ScalingConfiguration:{MinCapacity:Number(r.minCapacity)||0.5,MaxCapacity:Number(r.maxCapacity)||4}}),await this.client.createDBInstance({DBInstanceIdentifier:`${u}-writer-1`,DBClusterIdentifier:u,DBInstanceClass:String(r.plan??e.manifest.plan??"db.serverless"),Engine:b,PubliclyAccessible:!1})}else await this.client.restoreDBInstanceFromDBSnapshot({DBInstanceIdentifier:u,DBSnapshotIdentifier:f,DBInstanceClass:String(r.plan??e.manifest.plan??""),PubliclyAccessible:!1,DeletionProtection:!0,Tags:[{Key:"managed-by",Value:"ts-cloud-restore"}]});return{targetId:u,provider:h,status:"creating",isolated:!0}}async validateHealth(e,t){let r=String(e.targetId??""),a=String(e.provider??"");for(;;){t.throwIfCancellationRequested?.(),t.heartbeat?.();let u=a==="aws_aurora"?(await this.client.describeDBClusters({DBClusterIdentifier:r})).DBClusters?.[0]:(await this.client.describeDBInstances({DBInstanceIdentifier:r})).DBInstances?.[0];if(!u)throw Error("Restored managed database was not found.");let f=String(u.Status??u.DBInstanceStatus??"unknown");if(t.checkpoint?.("provider_restore",`Restored database ${r} is ${f}.`),f==="available")return{healthy:!0,targetId:r,provider:a,status:f};if(["deleted","deleting","failed","incompatible-restore"].includes(f))throw Error(`Restored managed database ${r} failed with state ${f}.`);await Bun.sleep(5000)}}async cleanup(e,t){let r=String(e.targetId??""),a=String(e.provider??"");if(!r)throw Error("Restore cleanup target is required.");if(a==="aws_aurora")await this.client.deleteDBInstance({DBInstanceIdentifier:`${r}-writer-1`,SkipFinalSnapshot:!0}),await this.client.modifyDBCluster({DBClusterIdentifier:r,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBCluster(r);else await this.client.modifyDBInstance({DBInstanceIdentifier:r,DeletionProtection:!1,ApplyImmediately:!0}),await this.client.deleteDBInstance({DBInstanceIdentifier:r,SkipFinalSnapshot:!0,DeleteAutomatedBackups:!0})}async deleteExternal(e,t){let r=String(e.manifest.snapshotId??"");if(e.manifest.provider==="aws_aurora")await this.client.deleteDBClusterSnapshot(r);else await this.client.deleteDBSnapshot(r)}}import{existsSync as mc}from"node:fs";import{mkdir as qd,readdir as hC,rename as jg,rm as Ps}from"node:fs/promises";import{relative as yC,resolve as Gr,sep as Vd}from"node:path";function Ut(e,t){if(t==="gzip")return Buffer.from(Bun.gzipSync(Uint8Array.from(e)));if(t==="zstd")return Buffer.from(Bun.zstdCompressSync(Uint8Array.from(e)));return Buffer.from(e)}function Fe(e,t){if(t==="gzip")return Buffer.from(Bun.gunzipSync(Uint8Array.from(e)));if(t==="zstd")return Buffer.from(Bun.zstdDecompressSync(Uint8Array.from(e)));return Buffer.from(e)}async function Bg(e,t){let r=Bun.spawn(["tar",...e],{stdin:t?Buffer.from(t):void 0,stdout:"pipe",stderr:"pipe"}),[a,u,f]=await Promise.all([r.exited,new Response(r.stdout).arrayBuffer(),new Response(r.stderr).text()]);if(a!==0)throw Error(f.trim()||`tar exited with status ${a}.`);return{stdout:Buffer.from(u),stderr:f}}function vC(e){let t=e.replaceAll("\\","/").replace(/^\.\//,"");return!!t&&!t.startsWith("/")&&!t.split("/").includes("..")}class fg{async create(e,t,r){return(await Bg(["-C",e,"-cf","-",...r.map((u)=>`--exclude=${u}`),"--",...t])).stdout}async extract(e,t){await qd(t,{recursive:!0,mode:448}),await Bg(["-C",t,"-xf","-"],e)}async inspect(e){let t=await Bg(["-tf","-"],e),r=t.stdout.toString().split(`
190
190
  `).filter(Boolean);if(r.some((a)=>!vC(a)))throw Error("Backup archive contains an unsafe path.");return{entries:r,bytes:e.byteLength}}}function zv(e,t){if(!t.trim())throw Error("File backup paths cannot be empty.");let r=Gr(e,t),a=yC(e,r);if(a===".."||a.startsWith(`..${Vd}`)||a==="")throw Error(`File backup path ${t} is outside the project root.`);return a}function Ud(e){let t=String(e.targetId??e.path??"");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(t))throw Error("File restores require a safe target name.");return t}class rc{runtime;root;restoreRoot;constructor(e,t=new fg,r=l(e,"restores","files")){this.runtime=t;this.root=Gr(e),this.restoreRoot=Gr(r)}paths(e){let t=[...new Set(e.includePatterns.map((r)=>zv(this.root,r)))];if(!t.length)throw Error("File backup policies require at least one project-relative path.");for(let r of t)if(!mc(Gr(this.root,r)))throw Error(`File backup path ${r} was not found.`);return t.filter((r)=>!t.some((a)=>a!==r&&r.startsWith(`${a}${Vd}`)))}async create(e,t){let r=this.paths(e),a=await this.runtime.create(this.root,r,e.excludePatterns),u=await this.runtime.inspect(a),f=e.compression??"none",h=Ut(a,f),b=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/files/${b}.tar${f==="none"?"":f==="gzip"?".gz":".zst"}`,body:h,contentType:f==="gzip"?"application/gzip":f==="zstd"?"application/zstd":"application/x-tar",manifest:{archive:"tar",compression:f,sourcePaths:r,excluded:e.excludePatterns,entries:u.entries.length},toolVersion:"system-tar"}}async restore(e,t,r,a){if(!t)throw Error("File restore requires an archive payload.");let u=Fe(t,String(e.manifest.compression??"none"));if(await this.runtime.inspect(u),r.restoreMode==="in_place"){let h=Gr(this.restoreRoot,`.staging-${Ud(r)}`),b=Gr(this.restoreRoot,`.rollback-${Ud(r)}`),S=Array.isArray(e.manifest.sourcePaths)?e.manifest.sourcePaths.map(String):[];if(!S.length)throw Error("File recovery point has no source path manifest.");await Ps(h,{recursive:!0,force:!0}),await Ps(b,{recursive:!0,force:!0}),await this.runtime.extract(u,h),await qd(b,{recursive:!0,mode:448});let y=[];try{for(let k of S){let R=Gr(this.root,zv(this.root,k)),D=Gr(h,k),O=Gr(b,k);if(await qd(Gr(O,".."),{recursive:!0}),mc(R))await jg(R,O);await qd(Gr(R,".."),{recursive:!0}),await jg(D,R),y.push(k)}}catch(k){for(let R of y.reverse()){let D=Gr(this.root,R),O=Gr(b,R);if(await Ps(D,{recursive:!0,force:!0}),mc(O))await jg(O,D)}throw k}finally{await Ps(h,{recursive:!0,force:!0})}return await Ps(b,{recursive:!0,force:!0}),{path:this.root,restoredPaths:S,inPlace:!0}}let f=Gr(this.restoreRoot,Ud(r));if(mc(f))throw Error("The isolated file restore target already exists.");return await this.runtime.extract(u,f),{path:f,isolated:!0}}async verify(e,t,r){let a=Fe(t,String(e.manifest.compression??"none")),u=await this.runtime.inspect(a);return{archive:"tar",entries:u.entries.length,uncompressedBytes:u.bytes}}async validateHealth(e,t){let r=String(e.path??"");if(!r||!r.startsWith(`${this.restoreRoot}${Vd}`)||!mc(r))throw Error("Isolated file restore target was not found.");let a=await hC(r);return{healthy:!0,path:r,topLevelEntries:a.length}}async cleanup(e,t){let r=Ud(e),a=Gr(this.restoreRoot,r);if(!a.startsWith(`${this.restoreRoot}${Vd}`))throw Error("Refusing to clean a file restore outside the restore root.");await Ps(a,{recursive:!0,force:!0})}}class nc{services;secrets;transport;constructor(e,t,r=new Sr){this.services=e;this.secrets=t;this.transport=r}async create(e,t){if(!e.dataServiceId)throw Error("Logical database backups require a data service.");let r=this.services.get(e.dataServiceId);if(!r)throw Error("Logical database service was not found.");if(!["container","server"].includes(r.provider))throw Error("Logical database backups require an on-box data service.");let a=await this.transport.exportLogicalBackup(r.id),u=e.compression??"none",f=Ut(a.body,u),h=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/databases/${r.id}/${h}.sql${u==="none"?"":u==="gzip"?".gz":".zst"}`,body:f,contentType:u==="gzip"?"application/gzip":u==="zstd"?"application/zstd":"application/sql",engineVersion:a.engineVersion,toolVersion:"engine-native",manifest:{format:"logical-sql-v1",sourceDataServiceId:r.id,engine:a.engine,database:a.database,username:a.username,compression:u}}}async restore(e,t,r,a){if(!t)throw Error("Logical database backup body is unavailable.");let u=String(e.dataServiceId??e.manifest.sourceDataServiceId??""),f=String(r.dataServiceId??r.targetId??""),h=r.inPlace===!0;if(!u||!f)throw Error("Logical database restore requires source and target identifiers.");if(h&&f!==u)throw Error("An in-place restore must target the source data service.");let b=this.services.get(u);if(!b?.credentialRef)throw Error("Logical database credential reference was not found.");let S=await this.secrets.resolve(b.credentialRef);return this.transport.restoreLogicalBackup({sourceId:u,targetId:f,body:Fe(t,String(e.manifest.compression??"none")),credential:S,inPlace:h})}async cleanup(e,t){if(e.inPlace===!0)throw Error("In-place database restores cannot be cleaned as drills.");let r=String(e.dataServiceId??e.targetId??"");if(!r)throw Error("Database cleanup requires a target identifier.");await this.transport.removeRestoredService(r)}}var Mg=/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/;async function wo(e,t,r=!1){let a=Bun.spawn(["docker",...e],{stdin:t?"pipe":"ignore",stdout:"pipe",stderr:"pipe"}),u=new Response(a.stdout).arrayBuffer(),f=new Response(a.stderr).text();if(t)a.stdin.write(t),a.stdin.end();let[h,b,S]=await Promise.all([a.exited,u,f]);if(h!==0&&!r)throw Error(`Docker volume command failed (${h}): ${S.trim()}`);return{code:h,stdout:Buffer.from(b),stderr:S}}class hg{async exists(e){return(await wo(["volume","inspect",e],void 0,!0)).code===0}async export(e){return(await wo(["run","--rm","-v",`${e}:/source:ro`,"alpine:3.21","tar","-C","/source","-czf","-","."])).stdout}async import(e,t,r=!1){if(!await this.exists(e))await wo(["volume","create",e]);try{if(r)await wo(["run","--rm","-v",`${e}:/target`,"alpine:3.21","sh","-c","find /target -mindepth 1 -delete"]);await wo(["run","--rm","-i","-v",`${e}:/target`,"alpine:3.21","tar","-C","/target","--no-same-owner","-xzf","-"],t)}catch(a){throw await this.remove(e),a}}async remove(e){await wo(["volume","rm",e],void 0,!0)}async probe(e){let t=(await wo(["run","--rm","-v",`${e}:/target:ro`,"alpine:3.21","sh","-c",`find /target -mindepth 1 -printf '%s\\n' | awk '{n+=1;b+=$1} END {print n ":" b}'`])).stdout.toString(),[r,a]=t.trim().split(":").map(Number);if(!Number.isFinite(r)||!Number.isFinite(a))throw Error("Restored volume health probe returned invalid output.");return{entries:r,bytes:a}}}class ic{runtime;constructor(e=new hg){this.runtime=e}async create(e,t){let r=String(e.includePatterns?.[0]??e.resourceId??"");if(!Mg.test(r))throw Error("Volume backups require a valid named-volume resource identifier.");if(!await this.runtime.exists(r))throw Error(`Volume ${r} was not found.`);let a=await this.runtime.export(r),u=Buffer.from(Bun.gunzipSync(Uint8Array.from(a))),f=e.compression??"gzip",h=f==="gzip"?a:Ut(u,f),b=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/volumes/${r}/${b}.tar${f==="none"?"":f==="gzip"?".gz":".zst"}`,body:h,contentType:f==="gzip"?"application/gzip":f==="zstd"?"application/zstd":"application/x-tar",toolVersion:"alpine-tar",manifest:{format:"docker-volume-tar-v1",archive:"tar",compression:f,sourceVolume:r}}}async restore(e,t,r,a){if(!t)throw Error("Volume backup body is unavailable.");let u=String(e.manifest.sourceVolume??e.resourceId??""),f=String(r.volumeName??r.targetId??"");if(!Mg.test(f))throw Error("Volume restore requires a valid target volume name.");if(f===u&&r.inPlace!==!0)throw Error("An isolated volume restore requires a distinct target.");let h=await this.runtime.exists(f);if(!r.inPlace&&h)throw Error(`Restore target volume ${f} already exists.`);if(r.inPlace===!0&&f!==u)throw Error("An in-place volume restore must target the source volume.");if(r.inPlace===!0&&!h)throw Error("The in-place target volume was not found.");let b=String(e.manifest.compression??"gzip"),S=b==="gzip"?Buffer.from(t):Buffer.from(Bun.gzipSync(Uint8Array.from(Fe(t,b))));await this.runtime.import(f,S,r.inPlace===!0);let y=await this.runtime.probe(f);return{volumeName:f,healthy:!0,...y}}async cleanup(e,t){if(e.inPlace===!0)throw Error("In-place volume restores cannot be cleaned as drills.");let r=String(e.volumeName??e.targetId??"");if(!Mg.test(r))throw Error("Volume cleanup requires a valid target volume name.");await this.runtime.remove(r)}}import{existsSync as Fg}from"node:fs";import{mkdir as bC,readFile as Uv,rm as SC,writeFile as qv}from"node:fs/promises";import{basename as Jv,resolve as Wi,sep as Vv}from"node:path";import{Database as wC}from"bun:sqlite";function Wv(e){let t=String(e.targetId??e.path??"");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(t))throw Error("Control-plane restores require a safe target name.");return t}function Hv(e){let t=JSON.parse(Buffer.from(e).toString());if(t.format!=="ts-cloud-control-plane-v1"||!t.database)throw Error("Control-plane backup archive is invalid.");if(!Array.isArray(t.config)||t.config.some((r)=>Jv(r.name)!==r.name))throw Error("Control-plane backup contains an unsafe config path.");return t}function Kv(e){let t=wC.deserialize(Uint8Array.from(e));try{let r=t.query("PRAGMA integrity_check").get()?.integrity_check??"unknown",a=t.query("SELECT count(*) AS count FROM sqlite_master WHERE type='table'").get()?.count??0;if(r!=="ok")throw Error(`Restored control-plane integrity check failed: ${r}.`);return{integrity:r,tables:a}}finally{t.close()}}class sc{controlPlane;root;restoreRoot;constructor(e,t,r=l(t,"restores","control-plane")){this.controlPlane=e;this.root=Wi(t),this.restoreRoot=Wi(r)}async create(e,t){let r=e.includePatterns.length?e.includePatterns:["cloud.config.ts"],a=[];for(let S of r){let y=Jv(S),k=Wi(this.root,y);if(y!==S&&S!==`./${y}`)throw Error("Control-plane config paths must be project-root files.");if(Fg(k))a.push({name:y,body:(await Uv(k)).toString("base64")})}let u={format:"ts-cloud-control-plane-v1",createdAt:new Date().toISOString(),database:Buffer.from(this.controlPlane.database.serialize()).toString("base64"),config:a},f=e.compression??"none",h=Ut(Buffer.from(JSON.stringify(u)),f),b=String(t.operation?.id??u.createdAt).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/control-plane/${b}.json${f==="none"?"":f==="gzip"?".gz":".zst"}`,body:h,contentType:f==="gzip"?"application/gzip":f==="zstd"?"application/zstd":"application/vnd.ts-cloud.control-plane+json",manifest:{format:u.format,configFiles:a.map((S)=>S.name),sensitive:!0,compression:f},toolVersion:"bun-sqlite-serialize"}}async restore(e,t,r,a){if(!t)throw Error("Control-plane restore requires an archive payload.");if(r.restoreMode==="in_place")throw Error("A live control plane can only be restored into an isolated recovery target.");let u=Hv(Fe(t,String(e.manifest.compression??"none"))),f=Wi(this.restoreRoot,Wv(r));if(Fg(f))throw Error("The isolated control-plane restore target already exists.");await bC(f,{recursive:!0,mode:448}),await qv(Wi(f,"control-plane.sqlite"),Buffer.from(u.database,"base64"),{mode:384});for(let h of u.config)await qv(Wi(f,h.name),Buffer.from(h.body,"base64"),{mode:384});return{path:f,isolated:!0,configFiles:u.config.length}}async verify(e,t,r){let a=Hv(Fe(t,String(e.manifest.compression??"none")));return{...Kv(Buffer.from(a.database,"base64")),configFiles:a.config.length}}async validateHealth(e,t){let r=String(e.path??""),a=Wi(r,"control-plane.sqlite");if(!r.startsWith(`${this.restoreRoot}${Vv}`)||!Fg(a))throw Error("Isolated control-plane database was not found.");return{healthy:!0,...Kv(await Uv(a))}}async cleanup(e,t){let r=Wi(this.restoreRoot,Wv(e));if(!r.startsWith(`${this.restoreRoot}${Vv}`))throw Error("Refusing to clean a control-plane restore outside the restore root.");await SC(r,{recursive:!0,force:!0})}}import{createHash as kC}from"node:crypto";function zg(e,t){return e.find((r)=>r.startsWith(`${t}:`))?.slice(t.length+1)}function IC(e){let t=zg(e.includePatterns,"resource")??e.includePatterns.find((u)=>u.startsWith("arn:")),r=zg(e.includePatterns,"role"),a=zg(e.includePatterns,"vault")??"Default";if(!t?.startsWith("arn:"))throw Error("Infrastructure backups require resource:<arn> in include patterns.");if(!r?.startsWith("arn:"))throw Error("Infrastructure backups require role:<iam-role-arn> in include patterns.");if(!/^[A-Za-z0-9_.-]{2,50}$/.test(a))throw Error("Infrastructure backup vault name is invalid.");return{resourceArn:t,roleArn:r,vaultName:a}}async function EC(e,t,r){for(;;){r.throwIfCancellationRequested(),r.heartbeat();let a=await e.describeBackupJob(t),u=String(a.State??"");if(r.checkpoint("provider_backup",`AWS Backup job ${t} is ${u||"pending"}.`),u==="COMPLETED"&&a.RecoveryPointArn)return{recoveryPointArn:a.RecoveryPointArn,sizeBytes:Number(a.BackupSizeInBytes??0)};if(["ABORTED","EXPIRED","FAILED"].includes(u))throw Error(`AWS Backup job ${t} failed: ${a.StatusMessage??u}.`);await Bun.sleep(5000)}}async function RC(e,t,r){for(;;){r.throwIfCancellationRequested(),r.heartbeat();let a=await e.describeRestoreJob(t),u=String(a.Status??"");if(r.checkpoint("provider_restore",`AWS Backup restore ${t} is ${u||"pending"}.`),u==="COMPLETED"&&a.CreatedResourceArn)return a.CreatedResourceArn;if(["ABORTED","FAILED"].includes(u))throw Error(`AWS Backup restore ${t} failed: ${a.StatusMessage??u}.`);await Bun.sleep(5000)}}class oc{client;constructor(e=new Er){this.client=e}async create(e,t){let r=IC(e),a=String(t.operation.id).replace(/[^A-Za-z0-9-]/g,"").slice(0,64),u=await this.client.startBackupJob({BackupVaultName:r.vaultName,ResourceArn:r.resourceArn,IamRoleArn:r.roleArn,IdempotencyToken:a}),f=await EC(this.client,u.BackupJobId,t),h=`sha256:${kC("sha256").update(f.recoveryPointArn).digest("hex")}`;return{mode:"external",uri:f.recoveryPointArn,checksum:h,sizeBytes:f.sizeBytes,toolVersion:"aws-backup-api",manifest:{provider:"aws_backup",resourceArn:r.resourceArn,roleArn:r.roleArn,vaultName:r.vaultName,providerBackupJobId:u.BackupJobId,recoveryPointArn:f.recoveryPointArn}}}async verifyExternal(e,t){let r=String(e.manifest.providerBackupJobId??""),a=await this.client.describeBackupJob(r);if(a.State!=="COMPLETED"||a.RecoveryPointArn!==e.uri)throw Error(`AWS Backup recovery point verification failed: ${a.StatusMessage??a.State??"unknown"}.`);return{state:a.State,recoveryPointArn:a.RecoveryPointArn,sizeBytes:Number(a.BackupSizeInBytes??e.sizeBytes)}}async restore(e,t,r,a){if(r.inPlace===!0)throw Error("AWS Backup infrastructure restores must create isolated resources.");let u=String(r.roleArn??e.manifest.roleArn??""),f=r.metadata&&typeof r.metadata==="object"&&!Array.isArray(r.metadata)?Object.fromEntries(Object.entries(r.metadata).map(([S,y])=>[S,String(y)])):{};if(!u.startsWith("arn:"))throw Error("AWS Backup restore requires an IAM role ARN.");if(!Object.keys(f).length)throw Error("AWS Backup restore requires provider restore metadata.");let h=await this.client.startRestoreJob({RecoveryPointArn:e.uri,IamRoleArn:u,Metadata:f,IdempotencyToken:String(a.operation.id).replace(/[^A-Za-z0-9-]/g,"").slice(0,64)}),b=await RC(this.client,h.RestoreJobId,a);return{providerRestoreJobId:h.RestoreJobId,createdResourceArn:b,isolated:!0,healthy:!0}}async validateHealth(e,t){let r=String(e.createdResourceArn??"");return{healthy:r.startsWith("arn:"),createdResourceArn:r}}async deleteExternal(e,t){await this.client.deleteRecoveryPoint(String(e.manifest.vaultName??""),e.uri)}}var Hi=(e)=>e==null?void 0:String(e),qg=(e)=>Number(e)===1,Qv=(e,t)=>{try{return e==null?t:JSON.parse(String(e))}catch{return t}};function Ug(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),scope:{type:String(e.scope_type),id:String(e.scope_id),environmentId:Hi(e.environment_id),resourceId:Hi(e.resource_id),previewId:Hi(e.preview_id)},key:String(e.key),kind:String(e.kind),value:Hi(e.value),valueFingerprint:String(e.value_fingerprint),secretRef:Hi(e.secret_ref),backend:String(e.backend),backendVersion:Hi(e.backend_version),origin:String(e.origin),required:qg(e.required),metadata:Qv(e.metadata,{}),lastUsedAt:Hi(e.last_used_at),rotatedAt:Hi(e.rotated_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Gv(e){return{entryId:String(e.entry_id),resourceId:String(e.resource_id),injectionTarget:String(e.injection_target),required:qg(e.required),requiresRedeploy:qg(e.requires_redeploy),lastDeployedVersion:e.last_deployed_version==null?void 0:Number(e.last_deployed_version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class ac{controlPlane;now;constructor(e,t=()=>new Date){this.controlPlane=e;this.now=t}get(e){let t=this.controlPlane.database.query("SELECT * FROM configuration_entries WHERE id=?").get(e);return t?Ug(t):void 0}find(e,t,r){let a=this.controlPlane.database.query("SELECT * FROM configuration_entries WHERE project_id=? AND scope_type=? AND scope_id=? AND key=?").get(e,t.type,t.id,r);return a?Ug(a):void 0}list(e){let t=["project_id=?"],r=[e.projectId];if(e.scope)t.push("scope_type=?","scope_id=?"),r.push(e.scope.type,e.scope.id);if(e.kind)t.push("kind=?"),r.push(e.kind);return this.controlPlane.database.query(`SELECT * FROM configuration_entries WHERE ${t.join(" AND ")} ORDER BY key,scope_type,scope_id`).all(...r).map(Ug)}create(e){this.validateScope(e),this.validateEntry(e);let t=crypto.randomUUID(),r=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO configuration_entries (id,organization_id,project_id,scope_type,scope_id,environment_id,resource_id,preview_id,key,kind,value,value_fingerprint,secret_ref,backend,backend_version,origin,required,metadata,last_used_at,rotated_at,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.scope.type,e.scope.id,e.scope.environmentId??null,e.scope.resourceId??null,e.scope.previewId??null,e.key,e.kind,e.value??null,e.valueFingerprint,e.secretRef??null,e.backend,e.backendVersion??null,e.origin,e.required?1:0,JSON.stringify(e.metadata),e.lastUsedAt??null,e.rotatedAt??null,1,r,r]),this.get(t)}update(e,t,r){let a=this.get(e);if(!a)throw Error("Configuration entry was not found.");if(this.validateEntry({...a,...r}),this.controlPlane.database.run("UPDATE configuration_entries SET value=?,value_fingerprint=?,secret_ref=?,backend=?,backend_version=?,required=?,metadata=?,rotated_at=?,version=version+1,updated_at=? WHERE id=? AND version=?",[r.value??null,r.valueFingerprint,r.secretRef??null,r.backend,r.backendVersion??null,r.required?1:0,JSON.stringify(r.metadata),r.rotatedAt??null,this.now().toISOString(),e,t]).changes!==1)throw Error("Configuration entry changed; refresh and retry.");return this.get(e)}remove(e,t){let r=this.get(e);if(!r)throw Error("Configuration entry was not found.");if(r.version!==t)throw Error("Configuration entry changed; refresh and retry.");if(this.controlPlane.database.run("DELETE FROM configuration_entries WHERE id=? AND version=?",[e,t]).changes<1)throw Error("Configuration entry changed; refresh and retry.");return r}setDependency(e){let t=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO configuration_dependencies (entry_id,resource_id,injection_target,required,requires_redeploy,last_deployed_version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?) ON CONFLICT(entry_id,resource_id) DO UPDATE SET injection_target=excluded.injection_target,required=excluded.required,requires_redeploy=excluded.requires_redeploy,last_deployed_version=excluded.last_deployed_version,updated_at=excluded.updated_at",[e.entryId,e.resourceId,e.injectionTarget,e.required?1:0,e.requiresRedeploy?1:0,e.lastDeployedVersion??null,t,t]),this.dependencies(e.entryId).find((r)=>r.resourceId===e.resourceId)}dependencies(e){return this.controlPlane.database.query("SELECT * FROM configuration_dependencies WHERE entry_id=? ORDER BY resource_id").all(e).map(Gv)}dependenciesForResource(e){return this.controlPlane.database.query("SELECT * FROM configuration_dependencies WHERE resource_id=? ORDER BY entry_id").all(e).map(Gv)}mutation(e){let t=this.controlPlane.database.query("SELECT request_hash,result FROM configuration_mutations WHERE idempotency_key=?").get(e);return t?{requestHash:t.request_hash,result:Qv(t.result,{})}:void 0}recordMutation(e){this.controlPlane.database.run("INSERT INTO configuration_mutations (id,project_id,idempotency_key,request_hash,result,actor_id,created_at) VALUES (?,?,?,?,?,?,?)",[crypto.randomUUID(),e.projectId,e.idempotencyKey,e.requestHash,JSON.stringify(e.result),e.actorId??null,this.now().toISOString()])}validateEntry(e){if(!/^[A-Za-z_][A-Za-z0-9_]{0,255}$/.test(e.key))throw Error(`Invalid configuration key: ${e.key}`);if(e.kind==="variable"&&(e.value==null||e.secretRef||e.backend!=="plaintext"))throw Error("Variables require a plaintext value and cannot use a secret backend.");if(e.kind==="secret"&&(e.value!=null||!e.secretRef||e.backend==="plaintext"))throw Error("Secrets require a non-plaintext backend reference and cannot store a plaintext value.")}validateScope(e){let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Configuration project does not belong to the organization.");let r=e.scope;if(r.type==="project"){if(r.id!==e.projectId||r.environmentId||r.resourceId||r.previewId)throw Error("Project configuration scope must reference only its project.");return}if(r.type==="environment"){let u=this.controlPlane.database.query("SELECT project_id FROM environments WHERE id=?").get(r.id);if(!u||u.project_id!==e.projectId||r.environmentId&&r.environmentId!==r.id||r.resourceId||r.previewId)throw Error("Environment configuration scope does not belong to the project.");return}if(r.type==="service"||r.type==="function"){let u=this.controlPlane.getResource(r.id);if(!u||u.projectId!==e.projectId||r.type==="function"&&u.kind!=="function"||r.resourceId&&r.resourceId!==r.id||r.environmentId&&u.environmentId!==r.environmentId||r.previewId)throw Error(`${r.type==="function"?"Function":"Service"} configuration scope does not belong to the project.`);return}let a=this.controlPlane.database.query("SELECT project_id,base_environment_id,resource_id FROM preview_instances WHERE id=?").get(r.id);if(!a||a.project_id!==e.projectId||r.previewId&&r.previewId!==r.id||r.environmentId&&r.environmentId!==a.base_environment_id||r.resourceId&&r.resourceId!==a.resource_id)throw Error("Preview configuration scope does not belong to the project.")}}var Yv=/^[A-Za-z_][A-Za-z0-9_]{0,255}$/;function AC(e){let t={n:`
191
191
  `,r:"\r",t:"\t","\\":"\\",'"':'"',$:"$"};return e.replace(/\\(n|r|t|\\|"|\$)/g,(r,a)=>t[a])}function Ag(e){let t={},r=[],a=e.replace(/\r\n?/g,`
192
192
  `).split(`
@@ -655,7 +655,7 @@ EOF`,'echo "DISKPCT=${DISKPCT:-0}"','echo "DISKUSEDG=${DISKUSEDG:-0}"','echo "DI
655
655
  },
656
656
  ${S}`}class pm{client;region;constructor(e="us-east-1"){this.region=e,this.client=new n}async getTraceSummaries(e){let t={StartTime:Math.floor(e.startTime.getTime()/1000),EndTime:Math.floor(e.endTime.getTime()/1000),TimeRangeType:"Event",Sampling:!1};if(e.filterExpression)t.FilterExpression=e.filterExpression;if(e.nextToken)t.NextToken=e.nextToken;let r=await this.client.request({service:"xray",region:this.region,method:"POST",path:"/TraceSummaries",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{summaries:r?.TraceSummaries??[],nextToken:r?.NextToken}}async batchGetTraces(e){if(!e.length)return[];return(await this.client.request({service:"xray",region:this.region,method:"POST",path:"/Traces",headers:{"Content-Type":"application/json"},body:JSON.stringify({TraceIds:e.slice(0,5)})}))?.Traces??[]}}var uS=65536;function zr(e){return e.length<=uS?e:`${e.slice(0,uS)}
657
657
 
658
- [output truncated]`}function mm(e,t){return e.environments?.[t]?.app}function fm(e,t,r){let a=[],u=mm(e,t);a.push({id:"redeploy",label:"Redeploy current build",group:"deploy",target:"app",mutates:!0,confirm:"redeploy"}),a.push({id:"rollback",label:"Roll back to previous build",group:"deploy",target:"app",mutates:!0,confirm:"rollback",danger:!0});let f=r.maintenance?.enabled;if(f!==!0)a.push({id:"maintenance:on",label:"Enable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"maintenance",danger:!0});if(f!==!1)a.push({id:"maintenance:off",label:"Disable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"live"});if(u?.assets||r.assetsInfo)a.push({id:"assets:invalidate",label:"Invalidate CDN cache",group:"assets",target:"assets",mutates:!0,confirm:"invalidate"});if(u?.database?.connection==="aurora-serverless")a.push({id:"db:scale",label:"Scale Aurora capacity",group:"database",target:"database",mutates:!0,confirm:"scale",inputs:[{name:"min",label:"Min ACUs",placeholder:String(u.database.minCapacity??0.5)},{name:"max",label:"Max ACUs",placeholder:String(u.database.maxCapacity??4)}]});for(let h of r.queues??[]){let b=String(h?.name??"").trim();if(b&&/^[A-Za-z0-9_-]+$/.test(b))a.push({id:`queue:purge:${b}`,label:`Purge queue (${b})`,group:"queue",target:b,mutates:!0,confirm:b,danger:!0})}return a}function pS(e,t,r,a){return fm(t,r,a).find((u)=>u.id===e)}async function I_(e,t,r){try{let a=new A(r),{Stacks:u}=await a.describeStacks({stackName:dr(e,t)}),f={};for(let S of u?.[0]?.Outputs??[])if(S.OutputKey)f[S.OutputKey]=S.OutputValue??"";let h=f.AssetsCdnDomain;if(!h)return null;return(await new I(r).findDistributionByDomain(h))?.Id??null}catch{return null}}async function gS(e,t,r,a={}){try{if(r.id==="redeploy")return await kn(e,t),{operation:r.id,command:"serverless redeploy",ok:!0,stdout:"Redeploy complete."};if(r.id==="rollback")return await Nn(e,t),{operation:r.id,command:"serverless rollback",ok:!0,stdout:"Rollback complete."};if(r.id==="maintenance:on")return await Cr(e,t,!0),{operation:r.id,command:"maintenance on",ok:!0,stdout:"Application is now in maintenance mode."};if(r.id==="maintenance:off")return await Cr(e,t,!1),{operation:r.id,command:"maintenance off",ok:!0,stdout:"Application is live."};if(r.id==="db:scale"){let u=Number(a.min),f=Number(a.max);if(!Number.isFinite(u)||!Number.isFinite(f)||u<=0||f<u)return{operation:r.id,ok:!1,error:"Provide valid Aurora capacities (0 < min ≤ max)."};return await $v(e,t,u,f),{operation:r.id,command:`db:scale ${u}-${f} ACU`,ok:!0,stdout:`Scaling applied (${u}-${f} ACUs); takes effect shortly.`}}if(r.id==="assets:invalidate"){let u=await vr(e,t),f=await I_(e,t,u.region);if(!f)return{operation:r.id,ok:!1,error:"Could not resolve the asset CloudFront distribution for this environment."};let b=await new I(u.region).invalidateAll(f);return{operation:r.id,command:`cloudfront invalidate ${f} /*`,ok:!0,stdout:`Invalidation ${b?.Id??"created"} for ${f} (/*).`}}if(r.group==="queue"&&r.id.startsWith("queue:purge:")){let u=r.target,f=await vr(e,t),h=new pe(f.region),b=`${f.slug}-${t}-${u}`,{QueueUrl:S}=await h.getQueueUrl(b);return await h.purgeQueue(S),{operation:r.id,command:`sqs purge ${b}`,ok:!0,stdout:`Purged queue ${b}.`}}return{operation:r.id,ok:!1,error:"Unknown or unavailable serverless operation."}}catch(u){return{operation:r.id,ok:!1,error:zr(u?.message??String(u))}}}async function mS(e,t,r){let a=r.trim();if(!a)return{operation:"command",ok:!1,error:"A command is required."};try{let u=await ct(e,t,a);return{operation:"command",command:a,ok:!0,stdout:zr(u||"(no output)")}}catch(u){return{operation:"command",command:a,ok:!1,error:zr(u?.message??String(u))}}}var hm="No dead-letter queue is provisioned for this environment.";async function ym(e,t,r){try{let{QueueUrl:a}=await e.getQueueUrl(`${t}-${r}-dlq`);return a}catch{return null}}async function fS(e,t,r=10){try{let a=await vr(e,t),u=new pe(a.region),f=await ym(u,a.slug,t);if(!f)return{ok:!1,messages:[],error:hm};return{ok:!0,messages:((await u.receiveMessages({queueUrl:f,maxMessages:Math.min(10,Math.max(1,r)),waitTimeSeconds:1,visibilityTimeout:2})).Messages??[]).map((S)=>({id:S.MessageId,receiptHandle:S.ReceiptHandle,body:zr(String(S.Body??""))}))}}catch(a){return{ok:!1,messages:[],error:zr(a?.message??String(a))}}}async function hS(e,t,r={}){try{let a=await vr(e,t),u=mm(e,t),h=(u?hr(u,a.slug,t):[]).map((O)=>O.name.replace(`${a.slug}-${t}-`,"")),b=r.targetQueue&&h.includes(r.targetQueue)?r.targetQueue:h[0];if(!b)return{operation:"dlq:redrive",ok:!1,error:"No source queue is configured to redrive into."};let S=new pe(a.region),y=await ym(S,a.slug,t);if(!y)return{operation:"dlq:redrive",ok:!1,error:hm};let{QueueUrl:k}=await S.getQueueUrl(`${a.slug}-${t}-${b}`),R=Math.min(50,Math.max(1,r.max??10)),D=0;while(D<R){let M=(await S.receiveMessages({queueUrl:y,maxMessages:Math.min(10,R-D),waitTimeSeconds:1,visibilityTimeout:30})).Messages??[];if(!M.length)break;for(let z of M)await S.sendMessage({queueUrl:k,messageBody:String(z.Body??"")}),await S.deleteMessage(y,z.ReceiptHandle),D++}return{operation:"dlq:redrive",command:`redrive → ${b}`,ok:!0,stdout:`Moved ${D} message(s) from the DLQ to ${b}.`}}catch(a){return{operation:"dlq:redrive",ok:!1,error:zr(a?.message??String(a))}}}async function yS(e,t){try{let r=await vr(e,t),a=new pe(r.region),u=await ym(a,r.slug,t);if(!u)return{operation:"dlq:purge",ok:!1,error:hm};return await a.purgeQueue(u),{operation:"dlq:purge",command:"sqs purge dlq",ok:!0,stdout:"Dead-letter queue purged."}}catch(r){return{operation:"dlq:purge",ok:!1,error:zr(r?.message??String(r))}}}function vS(e,t){let r=mm(e,t);if(!r?.secrets)return[];return Array.isArray(r.secrets)?r.secrets.map((a)=>({key:a.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),secretId:a})):Object.entries(r.secrets).map(([a,u])=>({key:a,secretId:String(u)}))}async function bS(e,t,r,a){if(!r.trim())return{operation:"secret:set",ok:!1,error:"A secret id is required."};try{let u=await vr(e,t),f=new re(u.region);try{await f.putSecretValue({SecretId:r,SecretString:a})}catch{await f.createSecret({Name:r,SecretString:a})}return{operation:"secret:set",command:`secret set ${r}`,ok:!0,stdout:`Secret ${r} updated. Redeploy to apply it to the functions.`}}catch(u){return{operation:"secret:set",ok:!1,error:zr(u?.message??String(u))}}}async function SS(e,t,r){if(!r.trim())return{operation:"secret:delete",ok:!1,error:"A secret id is required."};try{let a=await vr(e,t);return await new re(a.region).deleteSecret({SecretId:r,RecoveryWindowInDays:7}),{operation:"secret:delete",command:`secret delete ${r}`,ok:!0,stdout:`Secret ${r} scheduled for deletion (recoverable for 7 days).`}}catch(a){return{operation:"secret:delete",ok:!1,error:zr(a?.message??String(a))}}}var E_=new Set(["http","queue","cli"]);async function wS(e,t,r,a){if(!E_.has(r))return{operation:"function:config",ok:!1,error:`Unknown function mode '${r}'.`};let u=a.memory==null?void 0:Number(a.memory),f=a.timeout==null?void 0:Number(a.timeout);if(u!=null&&(!Number.isInteger(u)||u<128||u>10240))return{operation:"function:config",ok:!1,error:"Memory must be an integer between 128 and 10240 MB."};if(f!=null&&(!Number.isInteger(f)||f<1||f>900))return{operation:"function:config",ok:!1,error:"Timeout must be an integer between 1 and 900 seconds."};if(u==null&&f==null)return{operation:"function:config",ok:!1,error:"Provide a memory and/or timeout value."};try{let h=await vr(e,t),b=new T(h.region),S=`${h.slug}-${t}-${r}`;await b.updateFunctionConfiguration({FunctionName:S,...u!=null?{MemorySize:u}:{},...f!=null?{Timeout:f}:{}});let y=[u!=null?`${u} MB`:"",f!=null?`${f}s`:""].filter(Boolean).join(", ");return{operation:"function:config",command:`update ${S} (${y})`,ok:!0,stdout:`Updated ${S}: ${y}.`}}catch(h){return{operation:"function:config",ok:!1,error:zr(h?.message??String(h))}}}var gm=[{key:"http-errors",label:"HTTP function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"errors / 5 min"},{key:"http-throttles",label:"HTTP function throttles",namespace:"AWS/Lambda",metricName:"Throttles",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"throttles / 5 min"},{key:"http-duration",label:"HTTP function duration (avg)",namespace:"AWS/Lambda",metricName:"Duration",statistic:"Average",comparison:"GreaterThanThreshold",fnMode:"http",unit:"ms"},{key:"http-concurrency",label:"HTTP concurrent executions",namespace:"AWS/Lambda",metricName:"ConcurrentExecutions",statistic:"Maximum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"concurrent"},{key:"queue-errors",label:"Queue function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"queue",unit:"errors / 5 min"}];function R_(e){return gm.find((t)=>t.key===e)}async function kS(e,t){try{let r=await vr(e,t);return{ok:!0,alarms:await new me(r.region).describeAlarms({AlarmNamePrefix:`${r.slug}-${t}-`,MaxRecords:100}),presets:gm}}catch(r){return{ok:!1,alarms:[],presets:gm,error:zr(r?.message??String(r))}}}async function IS(e,t,r,a){let u=R_(r);if(!u)return{operation:"alarm:create",ok:!1,error:`Unknown alarm metric '${r}'.`};if(!Number.isFinite(a)||a<0)return{operation:"alarm:create",ok:!1,error:"Provide a non-negative threshold."};try{let f=await vr(e,t),h=new me(f.region),b=`${f.slug}-${t}-${u.key}`,S=u.fnMode?[{Name:"FunctionName",Value:`${f.slug}-${t}-${u.fnMode}`}]:[];return await h.putMetricAlarm({AlarmName:b,Namespace:u.namespace,MetricName:u.metricName,ComparisonOperator:u.comparison,Threshold:a,EvaluationPeriods:1,Period:300,Statistic:u.statistic,Dimensions:S,AlarmDescription:`ts-cloud: ${u.label} > ${a} ${u.unit}`}),{operation:"alarm:create",command:`alarm ${b}`,ok:!0,stdout:`Alarm ${b} armed at ${a} ${u.unit}.`}}catch(f){return{operation:"alarm:create",ok:!1,error:zr(f?.message??String(f))}}}async function ES(e,t,r){try{let a=await vr(e,t);if(!r.startsWith(`${a.slug}-${t}-`))return{operation:"alarm:delete",ok:!1,error:"Refusing to delete an alarm outside this environment."};return await new me(a.region).deleteAlarms([r]),{operation:"alarm:delete",command:`delete alarm ${r}`,ok:!0,stdout:`Alarm ${r} deleted.`}}catch(a){return{operation:"alarm:delete",ok:!1,error:zr(a?.message??String(a))}}}function A_(e){let t=e.HasFault?"fault":e.HasError?"error":e.HasThrottle?"throttle":"ok";return{id:String(e.Id??""),timestamp:Number.isFinite(Number(e.StartTime))?new Date(Number(e.StartTime)*1000).toISOString():void 0,durationMs:Math.round((e.Duration??0)*1000),responseMs:Math.round((e.ResponseTime??0)*1000),status:t,method:e.Http?.HttpMethod??"-",url:e.Http?.HttpURL??"-",httpStatus:e.Http?.HttpStatus??0}}async function ul(e,t,r=30){try{let a=await vr(e,t),u=new pm(a.region),f=new Date,h=new Date(f.getTime()-Math.min(360,Math.max(1,r))*60000),b=`${a.slug}-${t}-http`,S=await u.getTraceSummaries({startTime:h,endTime:f,filterExpression:`service("${b}")`});if(!S.summaries.length)S=await u.getTraceSummaries({startTime:h,endTime:f});return{ok:!0,traces:S.summaries.slice(0,100).map(A_)}}catch(a){return{ok:!1,traces:[],error:zr(a?.message??String(a))}}}async function vm(e,t,r){try{let a=await vr(e,t),u=`${a.slug}-${t}-scheduler`;if(r==="run"){let h=await ct(e,t,"schedule:run");return{operation:"scheduler:run",command:"schedule:run",ok:!0,stdout:zr(h||"Scheduler run triggered.")}}let f=new wr(a.region);if(r==="enable")await f.enableRule({Name:u});else await f.disableRule({Name:u});return{operation:`scheduler:${r}`,command:`${r} ${u}`,ok:!0,stdout:`Scheduler rule ${u} ${r}d.`}}catch(a){return{operation:`scheduler:${r}`,ok:!1,error:zr(a?.message??String(a))}}}function RS(e,t,r){let a=(Array.isArray(r)?r:String(r??"").split(",")).map(String).filter(Boolean);if(!a.length){if(t)return;let f=e.map((h)=>h.id);return f.length?f:["__no_authorized_telemetry_resources__"]}let u=a.map((f)=>e.find((h)=>h.id===f||h.slug===f)?.id).filter((f)=>!!f);if(u.length!==a.length)throw Error("One or more telemetry resources are outside your authorized scope.");return[...new Set(u)]}import{createHash as CS}from"node:crypto";class PS{now;entries=new Map;constructor(e=Date.now){this.now=e}async getOrCreate(e,t,r,a){let u=this.entries.get(e);if(!r&&u&&u.expiresAt>this.now())return{value:await u.promise,cached:!0};let f=a().catch((h)=>{throw this.entries.delete(e),h});return this.entries.set(e,{expiresAt:this.now()+t,promise:f}),{value:await f,cached:!1}}invalidate(e){for(let t of this.entries.keys())if(t.startsWith(e))this.entries.delete(t)}}class TS{now;lastRun=new Map;constructor(e=Date.now){this.now=e}shouldRun(e,t,r=!1){let a=this.now(),u=this.lastRun.get(e);if(!r&&u!=null&&a-u<t)return!1;return this.lastRun.set(e,a),!0}}var xS=new PS,C_=new TS,P_=2000,__=3600000;function T_(e,t){if(e.kind==="log"&&!t.collectLogs)return!1;if(e.kind==="trace"&&!t.collectTraces)return!1;if((e.kind==="request"||e.name.startsWith("request."))&&!t.collectRequestAnalytics)return!1;if(!["log","trace","request"].includes(e.kind)&&!e.name.startsWith("request."))return!0;let r=e.requestId??e.traceId??`${e.source}\x00${e.workloadId??""}\x00${e.timestamp}`;return Number.parseInt(CS("sha256").update(r).digest("hex").slice(0,8),16)/4294967295<=t.samplingRate}function jr(...e){return`telemetry:${CS("sha256").update(e.map((t)=>String(t??"")).join("\x00")).digest("hex").slice(0,40)}`}function wc(e,t,r,a){if(!a)return;return e.listResources(t,r).find((u)=>u.slug===a)?.id}function x_(e,t){let r=String(t??"").toLowerCase();if(["debug","info","warn","warning","error","fatal"].includes(r))return r==="fatal"?"error":r;return/fatal|panic|exception|error/i.test(e)?"error":/warn|timeout|throttl|retr(?:y|ies)/i.test(e)?"warning":"info"}function AS(e){let t=e.timestamp&&Number.isFinite(new Date(e.timestamp).getTime())?new Date(e.timestamp).toISOString():new Date().toISOString(),r={};try{let z=JSON.parse(e.message);if(z&&typeof z==="object"&&!Array.isArray(z))r=z}catch{}let a=Object.fromEntries(Object.entries(r).filter(([z])=>!/^(?:body|requestBody|responseBody|headers|authorization|cookie|cookies|query|queryString)$/i.test(z))),u=String(r.requestId??r.request_id??r["x-request-id"]??"")||void 0,f=String(r.traceId??r.trace_id??r["x-amzn-trace-id"]??"")||void 0,h=Number(r.durationMs??r.duration_ms??r.latencyMs??r.latency_ms),b=Number(r.statusCode??r.status_code??r.status),S=String(r.method??r.httpMethod??"")||void 0,y=ji(String(r.pathTemplate??r.path??r.url??"")||void 0),k=String(r.releaseId??r.release_id??"")||void 0,R=String(r.deploymentId??r.deployment_id??"")||void 0,D={projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,source:e.source,timestamp:t,requestId:u,traceId:f,releaseId:k,deploymentId:R,workloadId:e.workloadId},O=Object.keys(r).length?JSON.stringify(a):e.message,M=[{...D,id:jr(e.source,e.name,t,O),kind:"log",name:e.name,level:x_(O,r.level),message:O,attributes:a}];if(S&&y&&Number.isFinite(b)){if(M.push({...D,id:jr("request",u,t,S,y,b),kind:"request",name:"http.request",method:S,pathTemplate:y,host:r.host,statusCode:b,durationMs:Number.isFinite(h)?h:void 0,bytesIn:Number(r.bytesIn)||void 0,bytesOut:Number(r.bytesOut)||void 0,region:r.region,cacheResult:r.cacheResult??r.cache,upstream:r.upstream,attributes:{userAgentFamily:r.userAgentFamily??"",protocol:r.protocol??""}}),Number.isFinite(h))M.push({...D,id:jr("request-duration",u,t),kind:"metric",name:"request.duration",value:h,unit:"ms",attributes:{method:S,pathTemplate:y,statusCode:b}});if(M.push({...D,id:jr("request-count",u,t),kind:"metric",name:"request.count",value:1,unit:"count",attributes:{method:S,pathTemplate:y,statusCode:b}}),b>=500)M.push({...D,id:jr("request-error",u,t),kind:"metric",name:"request.error",value:1,unit:"count",attributes:{method:S,pathTemplate:y,statusCode:b}})}return M}async function D_(e){let t=new Rt(e.controlPlane),r=cr(e.controlPlane,e.projectId),a=new Date,u=[],f=[],h={projectId:e.projectId,environmentId:e.environmentId},b=K(e.config);try{let D=(b==="serverless"?await Bn(e.config,e.environment):await Hd(e.config,e.environment,{includeSiteHealth:e.includeSiteHealth,telemetryOnly:e.lightweight}))??{};if(b==="serverless"){for(let M of D.functionsDetail??[]){let z=wc(e.controlPlane,e.projectId,e.environmentId,M.key),J={...h,resourceId:z,source:"cloudwatch",timestamp:a.toISOString(),workloadId:M.name,attributes:{provider:"aws",functionName:M.name,aggregationWindow:"24h"}};for(let[Z,oe,G]of[["snapshot.traffic.requests_24h",M.invocations,"count"],["snapshot.errors.count_24h",M.errors,"count"],["snapshot.latency.p50_24h",M.p50,"ms"],["snapshot.latency.p95_24h",M.p95,"ms"],["snapshot.latency.p99_24h",M.p99,"ms"],["snapshot.saturation.throttles_24h",M.throttles,"count"],["snapshot.memory.max_24h",M.maxMem,"MB"]])if(Number.isFinite(Number(oe)))u.push({...J,id:jr("cloudwatch",M.name,Z,a.toISOString()),kind:"metric",name:Z,value:Number(oe),unit:G})}try{let M=await vr(e.config,e.environment),z=new me(M.region),J=new Date(a.getTime()-3600000),Z=300;for(let oe of M.functions){let G=[{Name:"FunctionName",Value:oe.name}],[te,he,ye,ie,xe]=await Promise.all([z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Sum"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Errors",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Sum"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Duration",Dimensions:G,StartTime:J,EndTime:a,Period:300,ExtendedStatistics:["p50","p95","p99"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Throttles",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Sum"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"ConcurrentExecutions",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Maximum"]})]),ee=wc(e.controlPlane,e.projectId,e.environmentId,oe.mode),De=(Ge,pt,Bt,Ze)=>{for(let wt of Ge){let zt=wt.Timestamp&&Number.isFinite(new Date(wt.Timestamp).getTime())?new Date(wt.Timestamp).toISOString():void 0,rt=Bt(wt);if(zt&&rt!=null&&Number.isFinite(rt))u.push({...h,resourceId:ee,id:jr("cloudwatch-series",oe.name,pt,zt),kind:"metric",source:"cloudwatch",name:pt,timestamp:zt,value:rt,unit:Ze,workloadId:oe.name,region:M.region,attributes:{provider:"aws",functionName:oe.name,aggregationWindow:"300s"}})}};De(te,"traffic.requests",(Ge)=>Ge.Sum,"count"),De(he,"errors.count",(Ge)=>Ge.Sum,"count"),De(ye,"latency.p50",(Ge)=>Ge.Percentiles?.p50,"ms"),De(ye,"latency.p95",(Ge)=>Ge.Percentiles?.p95,"ms"),De(ye,"latency.p99",(Ge)=>Ge.Percentiles?.p99,"ms"),De(ie,"saturation.throttles",(Ge)=>Ge.Sum,"count"),De(xe,"saturation.concurrency",(Ge)=>Ge.Maximum,"count")}}catch(M){f.push({source:"cloudwatch:series",message:M instanceof Error?M.message:String(M)})}for(let M of(D.serverlessLogs??[]).slice(0,P_))u.push(...AS({...h,source:`cloudwatch:${M.source}`,name:`${M.source}.log`,timestamp:M.timestamp,message:String(M.message),resourceId:wc(e.controlPlane,e.projectId,e.environmentId,M.source)}));for(let M of D.queuesDetail??[]){let z={...h,source:"cloudwatch",timestamp:a.toISOString(),attributes:{queue:M.name}};u.push({...z,id:jr("queue-depth",M.name,a.toISOString()),kind:"metric",name:"queue.depth",value:Number(M.visible??M.depth??0),unit:"count"}),u.push({...z,id:jr("queue-inflight",M.name,a.toISOString()),kind:"metric",name:"queue.inflight",value:Number(M.inFlight??0),unit:"count"})}let O=await ul(e.config,e.environment,30);if(!O.ok)f.push({source:"xray",message:O.error??"X-Ray traces are unavailable."});for(let M of O.traces)u.push({...h,id:jr("xray",M.id),kind:"trace",source:"xray",name:"http.trace",timestamp:M.timestamp??a.toISOString(),traceId:M.id,durationMs:M.durationMs,statusCode:M.httpStatus,method:M.method,pathTemplate:M.url,attributes:{status:M.status,responseMs:M.responseMs}})}else{let O=D.systemMetrics;if(D.metricsUnavailable||!O)f.push({source:"host",message:"The host metrics probe is unavailable."});else{let M=Number(O.memTotalMb)>0?Number(O.memUsedMb)/Number(O.memTotalMb)*100:0,z=Number(O.swapTotalMb)>0?Number(O.swapUsedMb)/Number(O.swapTotalMb)*100:0,J=[["host.load",Number(O.load),"load"],["host.load.5m",Number(O.load5),"load"],["host.load.15m",Number(O.load15),"load"],["host.cpu.capacity",Number(O.cpus),"count"],["host.cpu.used_percent",Number(O.cpuUsedPct),"percent"],["host.memory.used",Number(O.memUsedMb)*1024*1024,"bytes"],["host.memory.total",Number(O.memTotalMb)*1024*1024,"bytes"],["host.memory.available",Number(O.memAvailableMb)*1024*1024,"bytes"],["host.memory.cache",Number(O.memCacheMb)*1024*1024,"bytes"],["host.memory.used_percent",M,"percent"],["host.swap.used",Number(O.swapUsedMb)*1024*1024,"bytes"],["host.swap.total",Number(O.swapTotalMb)*1024*1024,"bytes"],["host.swap.used_percent",z,"percent"],["host.disk.used_percent",Number(O.diskUsedPct),"percent"],["host.disk.used",Number(O.diskUsedGb)*1073741824,"bytes"],["host.disk.total",Number(O.diskTotalGb)*1073741824,"bytes"],["host.disk.inode_used_percent",Number(O.inodeUsedPct),"percent"],["host.network.rx",Number(O.networkRxBytes),"bytes"],["host.network.tx",Number(O.networkTxBytes),"bytes"],["host.network.rx_rate",Number(O.networkRxBytesPerSec),"bytes_per_second"],["host.network.tx_rate",Number(O.networkTxBytesPerSec),"bytes_per_second"],["host.network.rx_today",Number(O.networkRxBytesToday),"bytes"],["host.network.tx_today",Number(O.networkTxBytesToday),"bytes"],["host.network.rx_month",Number(O.networkRxBytesMonth),"bytes"],["host.network.tx_month",Number(O.networkTxBytesMonth),"bytes"],["host.processes",Number(O.processes),"count"],["host.uptime",Number(O.uptimeSeconds),"seconds"]];for(let[Z,oe,G]of J)if(Number.isFinite(oe))u.push({...h,id:jr("host",Z,a.toISOString()),kind:"metric",source:"host",name:Z,timestamp:a.toISOString(),value:oe,unit:G});for(let Z of O.disks??[]){if(Z.usedPercent===null||!Number.isFinite(Number(Z.usedPercent)))continue;u.push({...h,id:jr("host",`disk:${Z.path}`,a.toISOString()),kind:"metric",source:"host",name:"host.filesystem.used_percent",timestamp:a.toISOString(),value:Number(Z.usedPercent),unit:"percent",attributes:{path:String(Z.path),mounted:Z.mounted!==!1}})}for(let Z of D.siteHealth??[]){let oe=String(Z.project??e.config.project.slug),G=String(Z.name),te=G.startsWith(`${oe}:`)?G.slice(oe.length+1):G,he=`site:${oe}:${te}`,ye=wc(e.controlPlane,e.projectId,e.environmentId,G),ie={...h,resourceId:ye,source:he,timestamp:Z.checkedAt||a.toISOString(),host:Z.route,attributes:{project:oe,site:te,route:String(Z.route),status:String(Z.status)}},xe=[["site.health.up",Z.status==="live"?1:0,"boolean"],["site.http.status",Number(Z.httpStatus),"status"],["site.response.time",Number(Z.responseMs),"ms"]];if(Z.tlsDaysRemaining!=null)xe.push(["site.tls.days_remaining",Number(Z.tlsDaysRemaining),"days"]);for(let[ee,De,Ge]of xe)if(Number.isFinite(De))u.push({...ie,id:jr(he,ee,ie.timestamp),kind:"metric",name:ee,value:De,unit:Ge})}}}}catch(D){f.push({source:b==="serverless"?"aws":"host",message:D instanceof Error?D.message:String(D)})}{let D=e.config.infrastructure?.compute?.monitoring,O=typeof D==="object"?D?.egressEndpoints:void 0,M=await Ya(O,{now:a.toISOString()});f.push(...M.errors);for(let z of M.metrics)u.push({...h,id:jr(z.attributes.source,z.name,z.timestamp),kind:"metric",source:`egress:${z.attributes.source}`,name:z.name,timestamp:z.timestamp,value:z.value,unit:z.unit,attributes:z.attributes})}if(!e.lightweight)try{let D=await ge(e.config,e.environment),O=new ve(e.config,e.environment,{inventory:async()=>D});for(let M of D.workloads){let z=wc(e.controlPlane,e.projectId,e.environmentId,M.links.service),J={...h,resourceId:z,source:`runtime:${M.provider}`,timestamp:a.toISOString(),workloadId:M.id,releaseId:M.links.release,attributes:{status:M.status,provider:M.provider,service:M.links.service??""}};if(u.push({...J,id:jr(M.id,"health",a.toISOString()),kind:"metric",name:"health.up",value:M.status==="running"?1:0,unit:"boolean"}),u.push({...J,id:jr(M.id,"restarts",a.toISOString()),kind:"metric",name:"saturation.restarts",value:M.restartCount??0,unit:"count"}),M.resources?.memoryBytes!=null)u.push({...J,id:jr(M.id,"memory",a.toISOString()),kind:"metric",name:"runtime.memory.used",value:M.resources.memoryBytes,unit:"bytes"});if(!M.capabilities.logs.supported)continue;try{let Z=await O.logs(M.id,{limit:100,since:new Date(a.getTime()-300000)});for(let oe of Z.lines)u.push(...AS({...h,resourceId:z,source:`runtime:${M.provider}`,name:`${M.links.service??M.name}.log`,timestamp:oe.timestamp,message:oe.message,workloadId:M.id}))}catch(Z){f.push({source:`runtime:${M.provider}`,message:Z instanceof Error?Z.message:String(Z)})}}for(let M of D.sources.filter((z)=>z.status!=="fresh"))f.push({source:M.id,message:M.message??`Runtime source is ${M.status}.`})}catch(D){f.push({source:"runtime",message:D instanceof Error?D.message:String(D)})}if(!e.lightweight)for(let D of e.controlPlane.listEvents({projectId:e.projectId,limit:1000})){let O=D.payload;u.push({...h,id:`telemetry:event:${D.id}`,resourceId:D.resourceId,kind:"event",source:"control-plane",name:D.type,timestamp:D.createdAt,level:D.level,message:D.type,deploymentId:D.operationId,releaseId:typeof O.releaseId==="string"?O.releaseId:void 0,traceId:D.correlationId,attributes:O})}let S=u.filter((D)=>T_(D,r)).map((D)=>({...D,sampled:r.samplingRate<1&&(D.kind==="log"||D.kind==="trace"||D.kind==="request"||D.name.startsWith("request."))})),y=t.appendMany(S).length;if(C_.shouldRun(e.projectId,__,!e.lightweight))t.enforceRetention(r,e.projectId);let k=t.status(e.projectId,e.environmentId,r.rawDays,r.samplingRate);for(let D of f)if(!k.some((O)=>O.source===D.source))k.push({source:D.source,freshness:"unavailable",samplingRate:r.samplingRate,retentionDays:r.rawDays,estimatedDailyBytes:0,message:D.message});let R=a.toISOString();return e.controlPlane.setSetting(`telemetry.collection:${e.projectId}:${e.environmentId??"all"}`,{generatedAt:R,errors:f,statuses:k,policy:r}),{collected:y,cached:!1,generatedAt:R,statuses:k,errors:f,policy:r}}async function bm(e){let r=`${`${e.projectId}:${e.environmentId??"all"}:${e.environment}`}:${e.lightweight?"lightweight":"full"}`,a=K(e.config)==="serverless"?300000:60000,u=await xS.getOrCreate(r,a,!!e.force,()=>D_(e));return{...u.value,cached:u.cached}}function DS(e){xS.invalidate(`${e}:`)}function NS(e,t={}){let r=t.shell||(process.platform==="win32"?"powershell.exe":"bash"),a=Bun.spawn([r,"-i"],{stdin:"pipe",stdout:"pipe",stderr:"pipe",cwd:t.cwd,env:{...process.env,TERM:"xterm-256color",PS1:"\\w $ "}}),u=new TextDecoder,f=async(h)=>{if(!h)return;let b=h.getReader();try{for(;;){let{done:S,value:y}=await b.read();if(S)break;if(y)e(u.decode(y))}}catch{}};if(f(a.stdout),f(a.stderr),t.onExit)a.exited.then((h)=>t.onExit(h)).catch(()=>{});return{write(h){try{a.stdin.write(h),a.stdin.flush()}catch{}},close(){try{a.stdin.end()}catch{}try{a.kill()}catch{}}}}var F_="127.0.0.1",z_=7676,YS=65536,cw="ts-cloud-dashboard-",Fs=$_(L_(import.meta.url));function U_(e){try{return process.kill(e,0),!0}catch(t){return t?.code!=="ESRCH"}}function q_(e=yl(),t=U_){let r=0;for(let a of BS(e,{withFileTypes:!0})){if(!a.isDirectory()||!a.name.startsWith(cw))continue;let u=Tt(e,a.name),f=a.name.match(/^ts-cloud-dashboard-(\d+)-/);if(f){let h=Number(f[1]);if(h===process.pid||t(h))continue}else if(BS(u).length>0)continue;Po(u,{recursive:!0,force:!0}),r+=1}return r}var V_={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".ico":"image/x-icon"};function C(e,t=200,r={}){return new Response(JSON.stringify(e,null,2),{status:t,headers:{"content-type":"application/json; charset=utf-8",...r}})}function W_(e,t,r,a){let u=new TextEncoder,f=Math.max(0,Math.floor(r)),h,b,S=!1,y=new ReadableStream({start(k){let R=()=>{if(S)return;if(S=!0,h?.(),b)clearInterval(b);a.removeEventListener("abort",R);try{k.close()}catch{}},D=(M)=>{if(S)return;if(M.reset)k.enqueue(u.encode(`event: reset
658
+ [output truncated]`}function mm(e,t){return e.environments?.[t]?.app}function fm(e,t,r){let a=[],u=mm(e,t);a.push({id:"redeploy",label:"Redeploy current build",group:"deploy",target:"app",mutates:!0,confirm:"redeploy"}),a.push({id:"rollback",label:"Roll back to previous build",group:"deploy",target:"app",mutates:!0,confirm:"rollback",danger:!0});let f=r.maintenance?.enabled;if(f!==!0)a.push({id:"maintenance:on",label:"Enable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"maintenance",danger:!0});if(f!==!1)a.push({id:"maintenance:off",label:"Disable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"live"});if(u?.assets||r.assetsInfo)a.push({id:"assets:invalidate",label:"Invalidate CDN cache",group:"assets",target:"assets",mutates:!0,confirm:"invalidate"});if(u?.database?.connection==="aurora-serverless")a.push({id:"db:scale",label:"Scale Aurora capacity",group:"database",target:"database",mutates:!0,confirm:"scale",inputs:[{name:"min",label:"Min ACUs",placeholder:String(u.database.minCapacity??0.5)},{name:"max",label:"Max ACUs",placeholder:String(u.database.maxCapacity??4)}]});for(let h of r.queues??[]){let b=String(h?.name??"").trim();if(b&&/^[A-Za-z0-9_-]+$/.test(b))a.push({id:`queue:purge:${b}`,label:`Purge queue (${b})`,group:"queue",target:b,mutates:!0,confirm:b,danger:!0})}return a}function pS(e,t,r,a){return fm(t,r,a).find((u)=>u.id===e)}async function I_(e,t,r){try{let a=new A(r),{Stacks:u}=await a.describeStacks({stackName:dr(e,t)}),f={};for(let S of u?.[0]?.Outputs??[])if(S.OutputKey)f[S.OutputKey]=S.OutputValue??"";let h=f.AssetsCdnDomain;if(!h)return null;return(await new I(r).findDistributionByDomain(h))?.Id??null}catch{return null}}async function gS(e,t,r,a={}){try{if(r.id==="redeploy")return await kn(e,t),{operation:r.id,command:"serverless redeploy",ok:!0,stdout:"Redeploy complete."};if(r.id==="rollback")return await Nn(e,t),{operation:r.id,command:"serverless rollback",ok:!0,stdout:"Rollback complete."};if(r.id==="maintenance:on")return await Cr(e,t,!0),{operation:r.id,command:"maintenance on",ok:!0,stdout:"Application is now in maintenance mode."};if(r.id==="maintenance:off")return await Cr(e,t,!1),{operation:r.id,command:"maintenance off",ok:!0,stdout:"Application is live."};if(r.id==="db:scale"){let u=Number(a.min),f=Number(a.max);if(!Number.isFinite(u)||!Number.isFinite(f)||u<=0||f<u)return{operation:r.id,ok:!1,error:"Provide valid Aurora capacities (0 < min ≤ max)."};return await $v(e,t,u,f),{operation:r.id,command:`db:scale ${u}-${f} ACU`,ok:!0,stdout:`Scaling applied (${u}-${f} ACUs); takes effect shortly.`}}if(r.id==="assets:invalidate"){let u=await vr(e,t),f=await I_(e,t,u.region);if(!f)return{operation:r.id,ok:!1,error:"Could not resolve the asset CloudFront distribution for this environment."};let b=await new I(u.region).invalidateAll(f);return{operation:r.id,command:`cloudfront invalidate ${f} /*`,ok:!0,stdout:`Invalidation ${b?.Id??"created"} for ${f} (/*).`}}if(r.group==="queue"&&r.id.startsWith("queue:purge:")){let u=r.target,f=await vr(e,t),h=new pe(f.region),b=`${f.slug}-${t}-${u}`,{QueueUrl:S}=await h.getQueueUrl(b);return await h.purgeQueue(S),{operation:r.id,command:`sqs purge ${b}`,ok:!0,stdout:`Purged queue ${b}.`}}return{operation:r.id,ok:!1,error:"Unknown or unavailable serverless operation."}}catch(u){return{operation:r.id,ok:!1,error:zr(u?.message??String(u))}}}async function mS(e,t,r){let a=r.trim();if(!a)return{operation:"command",ok:!1,error:"A command is required."};try{let u=await ct(e,t,a);return{operation:"command",command:a,ok:!0,stdout:zr(u||"(no output)")}}catch(u){return{operation:"command",command:a,ok:!1,error:zr(u?.message??String(u))}}}var hm="No dead-letter queue is provisioned for this environment.";async function ym(e,t,r){try{let{QueueUrl:a}=await e.getQueueUrl(`${t}-${r}-dlq`);return a}catch{return null}}async function fS(e,t,r=10){try{let a=await vr(e,t),u=new pe(a.region),f=await ym(u,a.slug,t);if(!f)return{ok:!1,messages:[],error:hm};return{ok:!0,messages:((await u.receiveMessages({queueUrl:f,maxMessages:Math.min(10,Math.max(1,r)),waitTimeSeconds:1,visibilityTimeout:2})).Messages??[]).map((S)=>({id:S.MessageId,receiptHandle:S.ReceiptHandle,body:zr(String(S.Body??""))}))}}catch(a){return{ok:!1,messages:[],error:zr(a?.message??String(a))}}}async function hS(e,t,r={}){try{let a=await vr(e,t),u=mm(e,t),h=(u?hr(u,a.slug,t):[]).map((O)=>O.name.replace(`${a.slug}-${t}-`,"")),b=r.targetQueue&&h.includes(r.targetQueue)?r.targetQueue:h[0];if(!b)return{operation:"dlq:redrive",ok:!1,error:"No source queue is configured to redrive into."};let S=new pe(a.region),y=await ym(S,a.slug,t);if(!y)return{operation:"dlq:redrive",ok:!1,error:hm};let{QueueUrl:k}=await S.getQueueUrl(`${a.slug}-${t}-${b}`),R=Math.min(50,Math.max(1,r.max??10)),D=0;while(D<R){let M=(await S.receiveMessages({queueUrl:y,maxMessages:Math.min(10,R-D),waitTimeSeconds:1,visibilityTimeout:30})).Messages??[];if(!M.length)break;for(let z of M)await S.sendMessage({queueUrl:k,messageBody:String(z.Body??"")}),await S.deleteMessage(y,z.ReceiptHandle),D++}return{operation:"dlq:redrive",command:`redrive → ${b}`,ok:!0,stdout:`Moved ${D} message(s) from the DLQ to ${b}.`}}catch(a){return{operation:"dlq:redrive",ok:!1,error:zr(a?.message??String(a))}}}async function yS(e,t){try{let r=await vr(e,t),a=new pe(r.region),u=await ym(a,r.slug,t);if(!u)return{operation:"dlq:purge",ok:!1,error:hm};return await a.purgeQueue(u),{operation:"dlq:purge",command:"sqs purge dlq",ok:!0,stdout:"Dead-letter queue purged."}}catch(r){return{operation:"dlq:purge",ok:!1,error:zr(r?.message??String(r))}}}function vS(e,t){let r=mm(e,t);if(!r?.secrets)return[];return Array.isArray(r.secrets)?r.secrets.map((a)=>({key:a.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),secretId:a})):Object.entries(r.secrets).map(([a,u])=>({key:a,secretId:String(u)}))}async function bS(e,t,r,a){if(!r.trim())return{operation:"secret:set",ok:!1,error:"A secret id is required."};try{let u=await vr(e,t),f=new re(u.region);try{await f.putSecretValue({SecretId:r,SecretString:a})}catch{await f.createSecret({Name:r,SecretString:a})}return{operation:"secret:set",command:`secret set ${r}`,ok:!0,stdout:`Secret ${r} updated. Redeploy to apply it to the functions.`}}catch(u){return{operation:"secret:set",ok:!1,error:zr(u?.message??String(u))}}}async function SS(e,t,r){if(!r.trim())return{operation:"secret:delete",ok:!1,error:"A secret id is required."};try{let a=await vr(e,t);return await new re(a.region).deleteSecret({SecretId:r,RecoveryWindowInDays:7}),{operation:"secret:delete",command:`secret delete ${r}`,ok:!0,stdout:`Secret ${r} scheduled for deletion (recoverable for 7 days).`}}catch(a){return{operation:"secret:delete",ok:!1,error:zr(a?.message??String(a))}}}var E_=new Set(["http","queue","cli"]);async function wS(e,t,r,a){if(!E_.has(r))return{operation:"function:config",ok:!1,error:`Unknown function mode '${r}'.`};let u=a.memory==null?void 0:Number(a.memory),f=a.timeout==null?void 0:Number(a.timeout);if(u!=null&&(!Number.isInteger(u)||u<128||u>10240))return{operation:"function:config",ok:!1,error:"Memory must be an integer between 128 and 10240 MB."};if(f!=null&&(!Number.isInteger(f)||f<1||f>900))return{operation:"function:config",ok:!1,error:"Timeout must be an integer between 1 and 900 seconds."};if(u==null&&f==null)return{operation:"function:config",ok:!1,error:"Provide a memory and/or timeout value."};try{let h=await vr(e,t),b=new T(h.region),S=`${h.slug}-${t}-${r}`;await b.updateFunctionConfiguration({FunctionName:S,...u!=null?{MemorySize:u}:{},...f!=null?{Timeout:f}:{}});let y=[u!=null?`${u} MB`:"",f!=null?`${f}s`:""].filter(Boolean).join(", ");return{operation:"function:config",command:`update ${S} (${y})`,ok:!0,stdout:`Updated ${S}: ${y}.`}}catch(h){return{operation:"function:config",ok:!1,error:zr(h?.message??String(h))}}}var gm=[{key:"http-errors",label:"HTTP function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"errors / 5 min"},{key:"http-throttles",label:"HTTP function throttles",namespace:"AWS/Lambda",metricName:"Throttles",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"throttles / 5 min"},{key:"http-duration",label:"HTTP function duration (avg)",namespace:"AWS/Lambda",metricName:"Duration",statistic:"Average",comparison:"GreaterThanThreshold",fnMode:"http",unit:"ms"},{key:"http-concurrency",label:"HTTP concurrent executions",namespace:"AWS/Lambda",metricName:"ConcurrentExecutions",statistic:"Maximum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"concurrent"},{key:"queue-errors",label:"Queue function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"queue",unit:"errors / 5 min"}];function R_(e){return gm.find((t)=>t.key===e)}async function kS(e,t){try{let r=await vr(e,t);return{ok:!0,alarms:await new me(r.region).describeAlarms({AlarmNamePrefix:`${r.slug}-${t}-`,MaxRecords:100}),presets:gm}}catch(r){return{ok:!1,alarms:[],presets:gm,error:zr(r?.message??String(r))}}}async function IS(e,t,r,a){let u=R_(r);if(!u)return{operation:"alarm:create",ok:!1,error:`Unknown alarm metric '${r}'.`};if(!Number.isFinite(a)||a<0)return{operation:"alarm:create",ok:!1,error:"Provide a non-negative threshold."};try{let f=await vr(e,t),h=new me(f.region),b=`${f.slug}-${t}-${u.key}`,S=u.fnMode?[{Name:"FunctionName",Value:`${f.slug}-${t}-${u.fnMode}`}]:[];return await h.putMetricAlarm({AlarmName:b,Namespace:u.namespace,MetricName:u.metricName,ComparisonOperator:u.comparison,Threshold:a,EvaluationPeriods:1,Period:300,Statistic:u.statistic,Dimensions:S,AlarmDescription:`ts-cloud: ${u.label} > ${a} ${u.unit}`}),{operation:"alarm:create",command:`alarm ${b}`,ok:!0,stdout:`Alarm ${b} armed at ${a} ${u.unit}.`}}catch(f){return{operation:"alarm:create",ok:!1,error:zr(f?.message??String(f))}}}async function ES(e,t,r){try{let a=await vr(e,t);if(!r.startsWith(`${a.slug}-${t}-`))return{operation:"alarm:delete",ok:!1,error:"Refusing to delete an alarm outside this environment."};return await new me(a.region).deleteAlarms([r]),{operation:"alarm:delete",command:`delete alarm ${r}`,ok:!0,stdout:`Alarm ${r} deleted.`}}catch(a){return{operation:"alarm:delete",ok:!1,error:zr(a?.message??String(a))}}}function A_(e){let t=e.HasFault?"fault":e.HasError?"error":e.HasThrottle?"throttle":"ok";return{id:String(e.Id??""),timestamp:Number.isFinite(Number(e.StartTime))?new Date(Number(e.StartTime)*1000).toISOString():void 0,durationMs:Math.round((e.Duration??0)*1000),responseMs:Math.round((e.ResponseTime??0)*1000),status:t,method:e.Http?.HttpMethod??"-",url:e.Http?.HttpURL??"-",httpStatus:e.Http?.HttpStatus??0}}async function ul(e,t,r=30){try{let a=await vr(e,t),u=new pm(a.region),f=new Date,h=new Date(f.getTime()-Math.min(360,Math.max(1,r))*60000),b=`${a.slug}-${t}-http`,S=await u.getTraceSummaries({startTime:h,endTime:f,filterExpression:`service("${b}")`});if(!S.summaries.length)S=await u.getTraceSummaries({startTime:h,endTime:f});return{ok:!0,traces:S.summaries.slice(0,100).map(A_)}}catch(a){return{ok:!1,traces:[],error:zr(a?.message??String(a))}}}async function vm(e,t,r){try{let a=await vr(e,t),u=`${a.slug}-${t}-scheduler`;if(r==="run"){let h=await ct(e,t,"schedule:run");return{operation:"scheduler:run",command:"schedule:run",ok:!0,stdout:zr(h||"Scheduler run triggered.")}}let f=new wr(a.region);if(r==="enable")await f.enableRule({Name:u});else await f.disableRule({Name:u});return{operation:`scheduler:${r}`,command:`${r} ${u}`,ok:!0,stdout:`Scheduler rule ${u} ${r}d.`}}catch(a){return{operation:`scheduler:${r}`,ok:!1,error:zr(a?.message??String(a))}}}function RS(e,t,r){let a=(Array.isArray(r)?r:String(r??"").split(",")).map(String).filter(Boolean);if(!a.length){if(t)return;let f=e.map((h)=>h.id);return f.length?f:["__no_authorized_telemetry_resources__"]}let u=a.map((f)=>e.find((h)=>h.id===f||h.slug===f)?.id).filter((f)=>!!f);if(u.length!==a.length)throw Error("One or more telemetry resources are outside your authorized scope.");return[...new Set(u)]}import{createHash as CS}from"node:crypto";class PS{now;entries=new Map;constructor(e=Date.now){this.now=e}async getOrCreate(e,t,r,a){let u=this.entries.get(e);if(!r&&u&&u.expiresAt>this.now())return{value:await u.promise,cached:!0};let f=a().catch((h)=>{throw this.entries.delete(e),h});return this.entries.set(e,{expiresAt:this.now()+t,promise:f}),{value:await f,cached:!1}}invalidate(e){for(let t of this.entries.keys())if(t.startsWith(e))this.entries.delete(t)}}class TS{now;lastRun=new Map;constructor(e=Date.now){this.now=e}shouldRun(e,t,r=!1){let a=this.now(),u=this.lastRun.get(e);if(!r&&u!=null&&a-u<t)return!1;return this.lastRun.set(e,a),!0}}var xS=new PS,C_=new TS,P_=2000,__=3600000;function T_(e,t){if(e.kind==="log"&&!t.collectLogs)return!1;if(e.kind==="trace"&&!t.collectTraces)return!1;if((e.kind==="request"||e.name.startsWith("request."))&&!t.collectRequestAnalytics)return!1;if(!["log","trace","request"].includes(e.kind)&&!e.name.startsWith("request."))return!0;let r=e.requestId??e.traceId??`${e.source}\x00${e.workloadId??""}\x00${e.timestamp}`;return Number.parseInt(CS("sha256").update(r).digest("hex").slice(0,8),16)/4294967295<=t.samplingRate}function jr(...e){return`telemetry:${CS("sha256").update(e.map((t)=>String(t??"")).join("\x00")).digest("hex").slice(0,40)}`}function wc(e,t,r,a){if(!a)return;return e.listResources(t,r).find((u)=>u.slug===a)?.id}function x_(e,t){let r=String(t??"").toLowerCase();if(["debug","info","warn","warning","error","fatal"].includes(r))return r==="fatal"?"error":r;return/fatal|panic|exception|error/i.test(e)?"error":/warn|timeout|throttl|retr(?:y|ies)/i.test(e)?"warning":"info"}function AS(e){let t=e.timestamp&&Number.isFinite(new Date(e.timestamp).getTime())?new Date(e.timestamp).toISOString():new Date().toISOString(),r={};try{let z=JSON.parse(e.message);if(z&&typeof z==="object"&&!Array.isArray(z))r=z}catch{}let a=Object.fromEntries(Object.entries(r).filter(([z])=>!/^(?:body|requestBody|responseBody|headers|authorization|cookie|cookies|query|queryString)$/i.test(z))),u=String(r.requestId??r.request_id??r["x-request-id"]??"")||void 0,f=String(r.traceId??r.trace_id??r["x-amzn-trace-id"]??"")||void 0,h=Number(r.durationMs??r.duration_ms??r.latencyMs??r.latency_ms),b=Number(r.statusCode??r.status_code??r.status),S=String(r.method??r.httpMethod??"")||void 0,y=ji(String(r.pathTemplate??r.path??r.url??"")||void 0),k=String(r.releaseId??r.release_id??"")||void 0,R=String(r.deploymentId??r.deployment_id??"")||void 0,D={projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,source:e.source,timestamp:t,requestId:u,traceId:f,releaseId:k,deploymentId:R,workloadId:e.workloadId},O=Object.keys(r).length?JSON.stringify(a):e.message,M=[{...D,id:jr(e.source,e.name,t,O),kind:"log",name:e.name,level:x_(O,r.level),message:O,attributes:a}];if(S&&y&&Number.isFinite(b)){if(M.push({...D,id:jr("request",u,t,S,y,b),kind:"request",name:"http.request",method:S,pathTemplate:y,host:r.host,statusCode:b,durationMs:Number.isFinite(h)?h:void 0,bytesIn:Number(r.bytesIn)||void 0,bytesOut:Number(r.bytesOut)||void 0,region:r.region,cacheResult:r.cacheResult??r.cache,upstream:r.upstream,attributes:{userAgentFamily:r.userAgentFamily??"",protocol:r.protocol??""}}),Number.isFinite(h))M.push({...D,id:jr("request-duration",u,t),kind:"metric",name:"request.duration",value:h,unit:"ms",attributes:{method:S,pathTemplate:y,statusCode:b}});if(M.push({...D,id:jr("request-count",u,t),kind:"metric",name:"request.count",value:1,unit:"count",attributes:{method:S,pathTemplate:y,statusCode:b}}),b>=500)M.push({...D,id:jr("request-error",u,t),kind:"metric",name:"request.error",value:1,unit:"count",attributes:{method:S,pathTemplate:y,statusCode:b}})}return M}async function D_(e){let t=new Rt(e.controlPlane),r=cr(e.controlPlane,e.projectId),a=new Date,u=[],f=[],h={projectId:e.projectId,environmentId:e.environmentId},b=K(e.config);try{let D=(b==="serverless"?await Bn(e.config,e.environment):await Hd(e.config,e.environment,{includeSiteHealth:e.includeSiteHealth,telemetryOnly:e.lightweight}))??{};if(b==="serverless"){for(let M of D.functionsDetail??[]){let z=wc(e.controlPlane,e.projectId,e.environmentId,M.key),J={...h,resourceId:z,source:"cloudwatch",timestamp:a.toISOString(),workloadId:M.name,attributes:{provider:"aws",functionName:M.name,aggregationWindow:"24h"}};for(let[Z,oe,G]of[["snapshot.traffic.requests_24h",M.invocations,"count"],["snapshot.errors.count_24h",M.errors,"count"],["snapshot.latency.p50_24h",M.p50,"ms"],["snapshot.latency.p95_24h",M.p95,"ms"],["snapshot.latency.p99_24h",M.p99,"ms"],["snapshot.saturation.throttles_24h",M.throttles,"count"],["snapshot.memory.max_24h",M.maxMem,"MB"]])if(Number.isFinite(Number(oe)))u.push({...J,id:jr("cloudwatch",M.name,Z,a.toISOString()),kind:"metric",name:Z,value:Number(oe),unit:G})}try{let M=await vr(e.config,e.environment),z=new me(M.region),J=new Date(a.getTime()-3600000),Z=300;for(let oe of M.functions){let G=[{Name:"FunctionName",Value:oe.name}],[te,he,ye,ie,xe]=await Promise.all([z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Sum"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Errors",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Sum"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Duration",Dimensions:G,StartTime:J,EndTime:a,Period:300,ExtendedStatistics:["p50","p95","p99"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Throttles",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Sum"]}),z.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"ConcurrentExecutions",Dimensions:G,StartTime:J,EndTime:a,Period:300,Statistics:["Maximum"]})]),ee=wc(e.controlPlane,e.projectId,e.environmentId,oe.mode),De=(Ge,pt,Bt,Ze)=>{for(let wt of Ge){let zt=wt.Timestamp&&Number.isFinite(new Date(wt.Timestamp).getTime())?new Date(wt.Timestamp).toISOString():void 0,rt=Bt(wt);if(zt&&rt!=null&&Number.isFinite(rt))u.push({...h,resourceId:ee,id:jr("cloudwatch-series",oe.name,pt,zt),kind:"metric",source:"cloudwatch",name:pt,timestamp:zt,value:rt,unit:Ze,workloadId:oe.name,region:M.region,attributes:{provider:"aws",functionName:oe.name,aggregationWindow:"300s"}})}};De(te,"traffic.requests",(Ge)=>Ge.Sum,"count"),De(he,"errors.count",(Ge)=>Ge.Sum,"count"),De(ye,"latency.p50",(Ge)=>Ge.Percentiles?.p50,"ms"),De(ye,"latency.p95",(Ge)=>Ge.Percentiles?.p95,"ms"),De(ye,"latency.p99",(Ge)=>Ge.Percentiles?.p99,"ms"),De(ie,"saturation.throttles",(Ge)=>Ge.Sum,"count"),De(xe,"saturation.concurrency",(Ge)=>Ge.Maximum,"count")}}catch(M){f.push({source:"cloudwatch:series",message:M instanceof Error?M.message:String(M)})}for(let M of(D.serverlessLogs??[]).slice(0,P_))u.push(...AS({...h,source:`cloudwatch:${M.source}`,name:`${M.source}.log`,timestamp:M.timestamp,message:String(M.message),resourceId:wc(e.controlPlane,e.projectId,e.environmentId,M.source)}));for(let M of D.queuesDetail??[]){let z={...h,source:"cloudwatch",timestamp:a.toISOString(),attributes:{queue:M.name}};u.push({...z,id:jr("queue-depth",M.name,a.toISOString()),kind:"metric",name:"queue.depth",value:Number(M.visible??M.depth??0),unit:"count"}),u.push({...z,id:jr("queue-inflight",M.name,a.toISOString()),kind:"metric",name:"queue.inflight",value:Number(M.inFlight??0),unit:"count"})}let O=await ul(e.config,e.environment,30);if(!O.ok)f.push({source:"xray",message:O.error??"X-Ray traces are unavailable."});for(let M of O.traces)u.push({...h,id:jr("xray",M.id),kind:"trace",source:"xray",name:"http.trace",timestamp:M.timestamp??a.toISOString(),traceId:M.id,durationMs:M.durationMs,statusCode:M.httpStatus,method:M.method,pathTemplate:M.url,attributes:{status:M.status,responseMs:M.responseMs}})}else{let O=D.systemMetrics;if(D.metricsUnavailable||!O)f.push({source:"host",message:"The host metrics probe is unavailable."});else{let M=Number(O.memTotalMb)>0?Number(O.memUsedMb)/Number(O.memTotalMb)*100:0,z=Number(O.swapTotalMb)>0?Number(O.swapUsedMb)/Number(O.swapTotalMb)*100:0,J=[["host.load",Number(O.load),"load"],["host.load.5m",Number(O.load5),"load"],["host.load.15m",Number(O.load15),"load"],["host.cpu.capacity",Number(O.cpus),"count"],["host.cpu.used_percent",Number(O.cpuUsedPct),"percent"],["host.memory.used",Number(O.memUsedMb)*1024*1024,"bytes"],["host.memory.total",Number(O.memTotalMb)*1024*1024,"bytes"],["host.memory.available",Number(O.memAvailableMb)*1024*1024,"bytes"],["host.memory.cache",Number(O.memCacheMb)*1024*1024,"bytes"],["host.memory.used_percent",M,"percent"],["host.swap.used",Number(O.swapUsedMb)*1024*1024,"bytes"],["host.swap.total",Number(O.swapTotalMb)*1024*1024,"bytes"],["host.swap.used_percent",z,"percent"],["host.disk.used_percent",Number(O.diskUsedPct),"percent"],["host.disk.used",Number(O.diskUsedGb)*1073741824,"bytes"],["host.disk.total",Number(O.diskTotalGb)*1073741824,"bytes"],["host.disk.inode_used_percent",Number(O.inodeUsedPct),"percent"],["host.network.rx",Number(O.networkRxBytes),"bytes"],["host.network.tx",Number(O.networkTxBytes),"bytes"],["host.network.rx_rate",Number(O.networkRxBytesPerSec),"bytes_per_second"],["host.network.tx_rate",Number(O.networkTxBytesPerSec),"bytes_per_second"],["host.network.rx_today",Number(O.networkRxBytesToday),"bytes"],["host.network.tx_today",Number(O.networkTxBytesToday),"bytes"],["host.network.rx_month",Number(O.networkRxBytesMonth),"bytes"],["host.network.tx_month",Number(O.networkTxBytesMonth),"bytes"],["host.processes",Number(O.processes),"count"],["host.uptime",Number(O.uptimeSeconds),"seconds"]];for(let[Z,oe,G]of J)if(Number.isFinite(oe))u.push({...h,id:jr("host",Z,a.toISOString()),kind:"metric",source:"host",name:Z,timestamp:a.toISOString(),value:oe,unit:G});for(let Z of O.disks??[]){if(Z.usedPercent===null||!Number.isFinite(Number(Z.usedPercent)))continue;u.push({...h,id:jr("host",`disk:${Z.path}`,a.toISOString()),kind:"metric",source:"host",name:"host.filesystem.used_percent",timestamp:a.toISOString(),value:Number(Z.usedPercent),unit:"percent",attributes:{path:String(Z.path),mounted:Z.mounted!==!1}})}for(let Z of D.siteHealth??[]){let oe=String(Z.project??e.config.project.slug),G=String(Z.name),te=G.startsWith(`${oe}:`)?G.slice(oe.length+1):G,he=`site:${oe}:${te}`,ye=wc(e.controlPlane,e.projectId,e.environmentId,G),ie={...h,resourceId:ye,source:he,timestamp:Z.checkedAt||a.toISOString(),host:Z.route,attributes:{project:oe,site:te,route:String(Z.route),status:String(Z.status)}},xe=[["site.health.up",Z.status==="live"?1:0,"boolean"],["site.http.status",Number(Z.httpStatus),"status"],["site.response.time",Number(Z.responseMs),"ms"]];if(Z.tlsDaysRemaining!=null)xe.push(["site.tls.days_remaining",Number(Z.tlsDaysRemaining),"days"]);for(let[ee,De,Ge]of xe)if(Number.isFinite(De))u.push({...ie,id:jr(he,ee,ie.timestamp),kind:"metric",name:ee,value:De,unit:Ge})}}}}catch(D){f.push({source:b==="serverless"?"aws":"host",message:D instanceof Error?D.message:String(D)})}{let D=e.config.infrastructure?.compute?.monitoring,O=typeof D==="object"?D?.egressEndpoints:void 0,M=await Ya(O,{now:a.toISOString()});f.push(...M.errors);for(let z of M.metrics)u.push({...h,id:jr(z.attributes.source,z.name,z.timestamp),kind:"metric",source:`egress:${z.attributes.source}`,name:z.name,timestamp:z.timestamp,value:z.value,unit:z.unit,attributes:z.attributes})}if(!e.lightweight)try{let D=await ge(e.config,e.environment),O=new ve(e.config,e.environment,{inventory:async()=>D});for(let M of D.workloads){let z=wc(e.controlPlane,e.projectId,e.environmentId,M.links.service),J={...h,resourceId:z,source:`runtime:${M.provider}`,timestamp:a.toISOString(),workloadId:M.id,releaseId:M.links.release,attributes:{status:M.status,provider:M.provider,service:M.links.service??""}};if(u.push({...J,id:jr(M.id,"health",a.toISOString()),kind:"metric",name:"health.up",value:M.status==="running"?1:0,unit:"boolean"}),u.push({...J,id:jr(M.id,"restarts",a.toISOString()),kind:"metric",name:"saturation.restarts",value:M.restartCount??0,unit:"count"}),M.resources?.memoryBytes!=null)u.push({...J,id:jr(M.id,"memory",a.toISOString()),kind:"metric",name:"runtime.memory.used",value:M.resources.memoryBytes,unit:"bytes"});if(!M.capabilities.logs.supported)continue;try{let Z=await O.logs(M.id,{limit:100,since:new Date(a.getTime()-300000)});for(let oe of Z.lines)u.push(...AS({...h,resourceId:z,source:`runtime:${M.provider}`,name:`${M.links.service??M.name}.log`,timestamp:oe.timestamp,message:oe.message,workloadId:M.id}))}catch(Z){f.push({source:`runtime:${M.provider}`,message:Z instanceof Error?Z.message:String(Z)})}}for(let M of D.sources.filter((z)=>z.status!=="fresh"))f.push({source:M.id,message:M.message??`Runtime source is ${M.status}.`})}catch(D){f.push({source:"runtime",message:D instanceof Error?D.message:String(D)})}if(!e.lightweight)for(let D of e.controlPlane.listEvents({projectId:e.projectId,limit:1000})){let O=D.payload;u.push({...h,id:`telemetry:event:${D.id}`,resourceId:D.resourceId,kind:"event",source:"control-plane",name:D.type,timestamp:D.createdAt,level:D.level,message:D.type,deploymentId:D.operationId,releaseId:typeof O.releaseId==="string"?O.releaseId:void 0,traceId:D.correlationId,attributes:O})}let S=u.filter((D)=>T_(D,r)).map((D)=>({...D,sampled:r.samplingRate<1&&(D.kind==="log"||D.kind==="trace"||D.kind==="request"||D.name.startsWith("request."))})),y=t.appendMany(S).length;if(C_.shouldRun(e.projectId,__,!e.lightweight))t.enforceRetention(r,e.projectId);let k=t.status(e.projectId,e.environmentId,r.rawDays,r.samplingRate);for(let D of f)if(!k.some((O)=>O.source===D.source))k.push({source:D.source,freshness:"unavailable",samplingRate:r.samplingRate,retentionDays:r.rawDays,estimatedDailyBytes:0,message:D.message});let R=a.toISOString();return e.controlPlane.setSetting(`telemetry.collection:${e.projectId}:${e.environmentId??"all"}`,{generatedAt:R,errors:f,statuses:k,policy:r}),{collected:y,cached:!1,generatedAt:R,statuses:k,errors:f,policy:r}}async function bm(e){let r=`${`${e.projectId}:${e.environmentId??"all"}:${e.environment}`}:${e.lightweight?"lightweight":"full"}`,a=K(e.config)==="serverless"?300000:60000,u=await xS.getOrCreate(r,a,!!e.force,()=>D_(e));return{...u.value,cached:u.cached}}function DS(e){xS.invalidate(`${e}:`)}function OS(e,t={}){let r=t.shell||(process.platform==="win32"?"powershell.exe":"bash"),a=Bun.spawn([r,"-i"],{stdin:"pipe",stdout:"pipe",stderr:"pipe",cwd:t.cwd,env:{...process.env,TERM:"xterm-256color",PS1:"\\w $ "}}),u=new TextDecoder,f=async(h)=>{if(!h)return;let b=h.getReader();try{for(;;){let{done:S,value:y}=await b.read();if(S)break;if(y)e(u.decode(y))}}catch{}};if(f(a.stdout),f(a.stderr),t.onExit)a.exited.then((h)=>t.onExit(h)).catch(()=>{});return{write(h){try{a.stdin.write(h),a.stdin.flush()}catch{}},close(){try{a.stdin.end()}catch{}try{a.kill()}catch{}}}}var F_="127.0.0.1",z_=7676,BS=65536,cw="ts-cloud-dashboard-",Fs=$_(L_(import.meta.url));function U_(e){try{return process.kill(e,0),!0}catch(t){return t?.code!=="ESRCH"}}function q_(e=yl(),t=U_){let r=0;for(let a of NS(e,{withFileTypes:!0})){if(!a.isDirectory()||!a.name.startsWith(cw))continue;let u=Tt(e,a.name),f=a.name.match(/^ts-cloud-dashboard-(\d+)-/);if(f){let h=Number(f[1]);if(h===process.pid||t(h))continue}else if(NS(u).length>0)continue;Po(u,{recursive:!0,force:!0}),r+=1}return r}var V_={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".ico":"image/x-icon"};function C(e,t=200,r={}){return new Response(JSON.stringify(e,null,2),{status:t,headers:{"content-type":"application/json; charset=utf-8",...r}})}function W_(e,t,r,a){let u=new TextEncoder,f=Math.max(0,Math.floor(r)),h,b,S=!1,y=new ReadableStream({start(k){let R=()=>{if(S)return;if(S=!0,h?.(),b)clearInterval(b);a.removeEventListener("abort",R);try{k.close()}catch{}},D=(M)=>{if(S)return;if(M.reset)k.enqueue(u.encode(`event: reset
659
659
  data: ${JSON.stringify({cursor:M.cursor,droppedBytes:M.droppedBytes})}
660
660
 
661
661
  `));for(let z of M.chunks.filter((J)=>J.cursor>f))f=z.cursor,k.enqueue(u.encode(`id: ${z.cursor}
@@ -668,18 +668,18 @@ data: ${JSON.stringify({state:M.state,error:M.error,cursor:M.cursor})}
668
668
  `)),R()};h=e.subscribe(t.id,t.workloadId,(M)=>D(e.read(M.id,M.workloadId,f)??M));let O=e.read(t.id,t.workloadId,f);if(!O)return R();if(D(O),S)return;b=setInterval(()=>{if(!S)k.enqueue(u.encode(`event: heartbeat
669
669
  data: ${JSON.stringify({cursor:f,at:new Date().toISOString()})}
670
670
 
671
- `))},15000),b.unref?.(),a.addEventListener("abort",R,{once:!0})},cancel(){if(S=!0,h?.(),b)clearInterval(b)}});return new Response(y,{headers:{"cache-control":"no-cache, no-transform",connection:"keep-alive","content-type":"text/event-stream; charset=utf-8","x-accel-buffering":"no"}})}var H_=new Set(["action","operation","site","name","username","database","secretId","port","key","resourceId","environmentId"]);function K_(e,t,r,a,u){let f={};if(r&&typeof r==="object"&&!Array.isArray(r))for(let[b,S]of Object.entries(r)){if(!H_.has(b)||!["string","number","boolean"].includes(typeof S))continue;f[b]=typeof S==="string"?S.slice(0,256):S}let h=String(f.resourceId||f.site||f.secretId||f.database||f.name||t);return{method:e.toUpperCase(),path:t,target:h,status:a,outcome:a<400?"succeeded":"failed",durationMs:Math.max(0,Math.round(u)),input:f}}var J_=Ji("ts-cloud-dummy-password");function vl(e,t=200){return new Response(e,{status:t,headers:{"content-type":"text/plain; charset=utf-8"}})}function G_(e,t,r=process.env){let a=r.TS_CLOUD_DASHBOARD_ORIGIN?.trim()||(r.TS_CLOUD_UI_DOMAIN?.trim()?`https://${r.TS_CLOUD_UI_DOMAIN.trim().replace(/^https?:\/\//,"")}`:""),u=["0.0.0.0","::"].includes(e)?void 0:e,f=a||(u&&["127.0.0.1","localhost","::1"].includes(u)?`http://${u.includes(":")?`[${u}]`:u}:${t}`:"");if(!f)return;try{let h=new URL(f),b=["127.0.0.1","localhost","::1"].includes(h.hostname);if(h.protocol!=="https:"&&!(h.protocol==="http:"&&b)||h.username||h.password||h.search||h.hash||h.pathname!=="/"&&h.pathname!=="")return;return h.origin}catch{return}}function Q_(e,t){if(t&&Object.hasOwn(e.environments??{},t))return t;return Object.keys(e.environments??{})[0]??"production"}function Y_(e,t,r){return r&&e.includes(r)?r:t}function ZS(e,t,r){return e==null||t-e>=r}async function Z_(e){let t=[Tt(Fs,"..","..","..","..",".env"),Tt(e,".env"),Tt(e,".env.local"),Tt(e,".env.production")];for(let r of t){if(!Si(r))continue;let a=await ni(r,"utf8").catch(()=>"");for(let u of a.split(`
672
- `)){let f=u.trim();if(!f||f.startsWith("#")||!f.includes("="))continue;let h=f.indexOf("="),b=f.slice(0,h).trim(),S=f.slice(h+1).trim();if(!/^[A-Z_][A-Z0-9_]*$/i.test(b)||process.env[b]!=null)continue;if(S.startsWith('"')&&S.endsWith('"')||S.startsWith("'")&&S.endsWith("'"))S=S.slice(1,-1);process.env[b]=S}}}function X_(e){return[Tt(e,"config","cloud.ts"),Tt(e,"config","cloud.js"),Tt(e,"cloud.config.ts"),Tt(e,"cloud.config.js")].find((r)=>Si(r))??null}function zs(e){return e.infrastructure?.compute?.sshKeys??[]}function XS(e,t){let r=e.infrastructure??(e.infrastructure={}),a=r.compute??(r.compute={});a.sshKeys=t}function eT(e,t,r){let a=e.sites??(e.sites={});a[t]=r}function Sm(e){return Ro(e.infrastructure?.compute?.firewall?.allowedPorts??[])}function ew(e,t){let r=e.infrastructure??(e.infrastructure={}),a=r.compute??(r.compute={}),u=a.firewall??(a.firewall={});u.allowedPorts=t}async function X(e){return await e.json().catch(()=>({}))}function Ls(e,t){let r=String(e.scopeType??"environment");if(!["project","environment","service","function","preview"].includes(r))throw Error("Configuration scopeType must be project, environment, service, function, or preview.");let a=String(e.scopeId??(r==="project"?t.projectId:r==="environment"?t.environmentId??"":""));if(!a)throw Error("Configuration scopeId is required.");if(r==="project")return{type:r,id:a};if(r==="environment")return{type:r,id:a,environmentId:a};if(r==="service"||r==="function")return{type:r,id:a,environmentId:String(e.environmentId??t.environmentId??"")||void 0,resourceId:a};return{type:r,id:a,environmentId:String(e.environmentId??t.environmentId??"")||void 0,resourceId:String(e.resourceId??"")||void 0,previewId:a}}function tT(e){if(["GET","HEAD","OPTIONS"].includes(e.method.toUpperCase()))return!0;let t=e.headers.get("sec-fetch-site");if(t==="cross-site")return!1;let r=e.headers.get("origin");if(!r)return!0;let a=new URL(e.url);if(r===a.origin)return!0;if(t!=="same-origin")return!1;try{let u=new URL(r),f=(e.headers.get("x-forwarded-host")??e.headers.get("host")??a.host).split(",")[0].trim(),h=e.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();if(!/^[A-Za-z0-9.-]+(?::\d{1,5})?$/.test(f)||u.host!==f)return!1;return!h||u.protocol===`${h}:`}catch{return!1}}var rT=new Set(["owner","admin","deployer","operator","viewer","auditor"]),nT=new Set(["organization","project","environment","resource"]),iT=new Set(["POST /api/organization/invitations","DELETE /api/organization/invitations","POST /api/organization/invitations/resend","PATCH /api/organization/memberships","DELETE /api/organization/memberships","POST /api/organization/grants","DELETE /api/organization/grants","POST /api/auth/oidc/providers","PATCH /api/auth/oidc/providers","POST /api/automation/service-accounts","PATCH /api/automation/service-accounts","POST /api/automation/tokens","POST /api/automation/tokens/rotate","DELETE /api/automation/tokens","POST /api/security/policies","PATCH /api/security/policies","POST /api/security/waivers","DELETE /api/security/waivers","POST /api/sources/connections","PATCH /api/sources/connections","DELETE /api/sources/connections","POST /api/sources/deploy-keys","DELETE /api/sources/deploy-keys","PATCH /api/telemetry/settings","POST /api/health/checks","PATCH /api/health/checks","POST /api/alerts/rules","PATCH /api/alerts/rules","POST /api/alerts/silences","POST /api/spend/budgets","PATCH /api/spend/budgets","DELETE /api/spend/budgets","POST /api/spend/check","POST /api/spend/release","POST /api/spend/anomalies/acknowledge","POST /api/protection/attack-mode","POST /api/protection/pause","POST /api/protection/ip-rules","DELETE /api/protection/ip-rules","POST /api/notifications/channels","PATCH /api/notifications/channels","POST /api/notifications/routes","PATCH /api/notifications/routes","POST /api/jobs","PATCH /api/jobs","POST /api/jobs/reconcile","POST /api/workers/action","POST /api/data-services","POST /api/data-services/action","POST /api/data-services/dependencies","POST /api/data-services/management","POST /api/data-services/reveal","POST /api/backups/destinations","POST /api/backups/destinations/test","POST /api/backups/policies","POST /api/backups/run","POST /api/backups/verify","POST /api/backups/restore","POST /api/backups/recovery-points","POST /api/backups/retention","POST /api/configuration/reveal","POST /api/configuration/transfer","POST /api/configuration/bulk","DELETE /api/configuration","POST /api/volumes","POST /api/volumes/attach","POST /api/volumes/detach","POST /api/volumes/resize","POST /api/volumes/snapshot","POST /api/volumes/restore","POST /api/volumes/adopt","POST /api/volumes/discover","DELETE /api/volumes","POST /api/fleet","POST /api/fleet/action","POST /api/capacity","POST /api/capacity/member","POST /api/capacity/action","POST /api/capacity/explain","POST /api/regions","POST /api/regions/action","POST /api/maintenance/cleanup-preview","POST /api/maintenance/cleanup-apply","POST /api/maintenance/drill","POST /api/maintenance/drill-run","POST /api/sources/webhooks","PATCH /api/sources/webhooks","DELETE /api/sources/webhooks","POST /api/onboarding/registries","PATCH /api/onboarding/registries","DELETE /api/onboarding/registries","POST /api/runtime/exec-sessions","POST /api/runtime/files/read","POST /api/runtime/files/write","POST /api/onboarding/apply","PATCH /api/queue/settings","DELETE /api/queue/history","POST /api/serverless/secrets","DELETE /api/serverless/secrets"]);function pl(e){let t=String(e??"");return rT.has(t)?t:void 0}function kc(e){let t=String(e.scopeType??"organization");if(!nT.has(t))return;if(t==="organization")return{type:"organization"};let r=String(e.scopeId??"").trim();return r?{type:t,id:r}:void 0}async function Co(e,t,r={}){let a=K(e),u={mode:a,environment:t,environments:Object.keys(e.environments??{}),project:{name:e.project.name,slug:e.project.slug,region:e.project.region}};try{return{...(a==="serverless"?await Bn(e,t):await Hd(e,t,{includeSiteHealth:r.includeSiteHealth}))??{},...u}}catch{return{...u}}}function oT(e,t){if(!e)return t;let r={...t,...Array.isArray(e.sites)?{sites:e.sites}:{},...Array.isArray(e.sitesDetail)?{sitesDetail:e.sitesDetail}:{},...Array.isArray(e.siteHealth)?{siteHealth:e.siteHealth}:{}};if(r.mode!=="serverless"&&Array.isArray(r.sites))r.topology=Ft(r,{project:r.project?.name,environment:r.environment});return r}function sT(e){let t=[Tt(e,"packages","ui"),Tt(Fs,"..","..","..","ui"),Tt(Fs,"..","..","ui"),Tt(Fs,"..","ui-src"),Tt(Fs,"..","..","ui-src"),Tt(Fs,"..","..","dist","ui-src")];for(let r of t)if(Si(Tt(r,"pages"))&&Si(Tt(r,"package.json")))return r;return null}async function aT(e,t){let r=sT(e);if(!r)return null;let a;try{a=km(Tt(yl(),`${cw}${process.pid}-`));let u=Tt(r,"node_modules",".bin","stx"),f=Si(u)?[u,"build","--pages","pages","--out",a,"--no-sitemap","--no-cache"]:["bunx","--bun","@stacksjs/stx","build","--pages","pages","--out",a,"--no-sitemap","--no-cache"],h=Bun.spawn(f,{cwd:r,stdout:"pipe",stderr:"pipe",env:{...process.env,TSCLOUD_DASHBOARD_DATA:tS(t)}}),[b,S,y]=await Promise.all([new Response(h.stdout).text(),new Response(h.stderr).text(),h.exited]);if(y!==0){if(Po(a,{recursive:!0,force:!0}),process.env.TSCLOUD_DASHBOARD_VERBOSE)console.warn(`ts-cloud dashboard: live UI build failed; serving the pre-built UI.
671
+ `))},15000),b.unref?.(),a.addEventListener("abort",R,{once:!0})},cancel(){if(S=!0,h?.(),b)clearInterval(b)}});return new Response(y,{headers:{"cache-control":"no-cache, no-transform",connection:"keep-alive","content-type":"text/event-stream; charset=utf-8","x-accel-buffering":"no"}})}var H_=new Set(["action","operation","site","name","username","database","secretId","port","key","resourceId","environmentId"]);function K_(e,t,r,a,u){let f={};if(r&&typeof r==="object"&&!Array.isArray(r))for(let[b,S]of Object.entries(r)){if(!H_.has(b)||!["string","number","boolean"].includes(typeof S))continue;f[b]=typeof S==="string"?S.slice(0,256):S}let h=String(f.resourceId||f.site||f.secretId||f.database||f.name||t);return{method:e.toUpperCase(),path:t,target:h,status:a,outcome:a<400?"succeeded":"failed",durationMs:Math.max(0,Math.round(u)),input:f}}var J_=Ji("ts-cloud-dummy-password");function vl(e,t=200){return new Response(e,{status:t,headers:{"content-type":"text/plain; charset=utf-8"}})}function G_(e,t,r=process.env){let a=r.TS_CLOUD_DASHBOARD_ORIGIN?.trim()||(r.TS_CLOUD_UI_DOMAIN?.trim()?`https://${r.TS_CLOUD_UI_DOMAIN.trim().replace(/^https?:\/\//,"")}`:""),u=["0.0.0.0","::"].includes(e)?void 0:e,f=a||(u&&["127.0.0.1","localhost","::1"].includes(u)?`http://${u.includes(":")?`[${u}]`:u}:${t}`:"");if(!f)return;try{let h=new URL(f),b=["127.0.0.1","localhost","::1"].includes(h.hostname);if(h.protocol!=="https:"&&!(h.protocol==="http:"&&b)||h.username||h.password||h.search||h.hash||h.pathname!=="/"&&h.pathname!=="")return;return h.origin}catch{return}}function Q_(e,t){if(t&&Object.hasOwn(e.environments??{},t))return t;return Object.keys(e.environments??{})[0]??"production"}function Y_(e,t,r){return r&&e.includes(r)?r:t}function YS(e,t,r){return e==null||t-e>=r}async function Z_(e){let t=[Tt(Fs,"..","..","..","..",".env"),Tt(e,".env"),Tt(e,".env.local"),Tt(e,".env.production")];for(let r of t){if(!Si(r))continue;let a=await ni(r,"utf8").catch(()=>"");for(let u of a.split(`
672
+ `)){let f=u.trim();if(!f||f.startsWith("#")||!f.includes("="))continue;let h=f.indexOf("="),b=f.slice(0,h).trim(),S=f.slice(h+1).trim();if(!/^[A-Z_][A-Z0-9_]*$/i.test(b)||process.env[b]!=null)continue;if(S.startsWith('"')&&S.endsWith('"')||S.startsWith("'")&&S.endsWith("'"))S=S.slice(1,-1);process.env[b]=S}}}function X_(e){return[Tt(e,"config","cloud.ts"),Tt(e,"config","cloud.js"),Tt(e,"cloud.config.ts"),Tt(e,"cloud.config.js")].find((r)=>Si(r))??null}function zs(e){return e.infrastructure?.compute?.sshKeys??[]}function ZS(e,t){let r=e.infrastructure??(e.infrastructure={}),a=r.compute??(r.compute={});a.sshKeys=t}function eT(e,t,r){let a=e.sites??(e.sites={});a[t]=r}function Sm(e){return Ro(e.infrastructure?.compute?.firewall?.allowedPorts??[])}function ew(e,t){let r=e.infrastructure??(e.infrastructure={}),a=r.compute??(r.compute={}),u=a.firewall??(a.firewall={});u.allowedPorts=t}async function X(e){return await e.json().catch(()=>({}))}function Ls(e,t){let r=String(e.scopeType??"environment");if(!["project","environment","service","function","preview"].includes(r))throw Error("Configuration scopeType must be project, environment, service, function, or preview.");let a=String(e.scopeId??(r==="project"?t.projectId:r==="environment"?t.environmentId??"":""));if(!a)throw Error("Configuration scopeId is required.");if(r==="project")return{type:r,id:a};if(r==="environment")return{type:r,id:a,environmentId:a};if(r==="service"||r==="function")return{type:r,id:a,environmentId:String(e.environmentId??t.environmentId??"")||void 0,resourceId:a};return{type:r,id:a,environmentId:String(e.environmentId??t.environmentId??"")||void 0,resourceId:String(e.resourceId??"")||void 0,previewId:a}}function tT(e){if(["GET","HEAD","OPTIONS"].includes(e.method.toUpperCase()))return!0;let t=e.headers.get("sec-fetch-site");if(t==="cross-site")return!1;let r=e.headers.get("origin");if(!r)return!0;let a=new URL(e.url);if(r===a.origin)return!0;if(t!=="same-origin")return!1;try{let u=new URL(r),f=(e.headers.get("x-forwarded-host")??e.headers.get("host")??a.host).split(",")[0].trim(),h=e.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();if(!/^[A-Za-z0-9.-]+(?::\d{1,5})?$/.test(f)||u.host!==f)return!1;return!h||u.protocol===`${h}:`}catch{return!1}}var rT=new Set(["owner","admin","deployer","operator","viewer","auditor"]),nT=new Set(["organization","project","environment","resource"]),iT=new Set(["POST /api/organization/invitations","DELETE /api/organization/invitations","POST /api/organization/invitations/resend","PATCH /api/organization/memberships","DELETE /api/organization/memberships","POST /api/organization/grants","DELETE /api/organization/grants","POST /api/auth/oidc/providers","PATCH /api/auth/oidc/providers","POST /api/automation/service-accounts","PATCH /api/automation/service-accounts","POST /api/automation/tokens","POST /api/automation/tokens/rotate","DELETE /api/automation/tokens","POST /api/security/policies","PATCH /api/security/policies","POST /api/security/waivers","DELETE /api/security/waivers","POST /api/sources/connections","PATCH /api/sources/connections","DELETE /api/sources/connections","POST /api/sources/deploy-keys","DELETE /api/sources/deploy-keys","PATCH /api/telemetry/settings","POST /api/health/checks","PATCH /api/health/checks","POST /api/alerts/rules","PATCH /api/alerts/rules","POST /api/alerts/silences","POST /api/spend/budgets","PATCH /api/spend/budgets","DELETE /api/spend/budgets","POST /api/spend/check","POST /api/spend/release","POST /api/spend/anomalies/acknowledge","POST /api/protection/attack-mode","POST /api/protection/pause","POST /api/protection/ip-rules","DELETE /api/protection/ip-rules","POST /api/notifications/channels","PATCH /api/notifications/channels","POST /api/notifications/routes","PATCH /api/notifications/routes","POST /api/jobs","PATCH /api/jobs","POST /api/jobs/reconcile","POST /api/workers/action","POST /api/data-services","POST /api/data-services/action","POST /api/data-services/dependencies","POST /api/data-services/management","POST /api/data-services/reveal","POST /api/backups/destinations","POST /api/backups/destinations/test","POST /api/backups/policies","POST /api/backups/run","POST /api/backups/verify","POST /api/backups/restore","POST /api/backups/recovery-points","POST /api/backups/retention","POST /api/configuration/reveal","POST /api/configuration/transfer","POST /api/configuration/bulk","DELETE /api/configuration","POST /api/volumes","POST /api/volumes/attach","POST /api/volumes/detach","POST /api/volumes/resize","POST /api/volumes/snapshot","POST /api/volumes/restore","POST /api/volumes/adopt","POST /api/volumes/discover","DELETE /api/volumes","POST /api/fleet","POST /api/fleet/action","POST /api/capacity","POST /api/capacity/member","POST /api/capacity/action","POST /api/capacity/explain","POST /api/regions","POST /api/regions/action","POST /api/maintenance/cleanup-preview","POST /api/maintenance/cleanup-apply","POST /api/maintenance/drill","POST /api/maintenance/drill-run","POST /api/sources/webhooks","PATCH /api/sources/webhooks","DELETE /api/sources/webhooks","POST /api/onboarding/registries","PATCH /api/onboarding/registries","DELETE /api/onboarding/registries","POST /api/runtime/exec-sessions","POST /api/runtime/files/read","POST /api/runtime/files/write","POST /api/onboarding/apply","PATCH /api/queue/settings","DELETE /api/queue/history","POST /api/serverless/secrets","DELETE /api/serverless/secrets"]);function pl(e){let t=String(e??"");return rT.has(t)?t:void 0}function kc(e){let t=String(e.scopeType??"organization");if(!nT.has(t))return;if(t==="organization")return{type:"organization"};let r=String(e.scopeId??"").trim();return r?{type:t,id:r}:void 0}async function Co(e,t,r={}){let a=K(e),u={mode:a,environment:t,environments:Object.keys(e.environments??{}),project:{name:e.project.name,slug:e.project.slug,region:e.project.region}};try{return{...(a==="serverless"?await Bn(e,t):await Hd(e,t,{includeSiteHealth:r.includeSiteHealth}))??{},...u}}catch{return{...u}}}function oT(e,t){if(!e)return t;let r={...t,...Array.isArray(e.sites)?{sites:e.sites}:{},...Array.isArray(e.sitesDetail)?{sitesDetail:e.sitesDetail}:{},...Array.isArray(e.siteHealth)?{siteHealth:e.siteHealth}:{}};if(r.mode!=="serverless"&&Array.isArray(r.sites))r.topology=Ft(r,{project:r.project?.name,environment:r.environment});return r}function sT(e){let t=[Tt(e,"packages","ui"),Tt(Fs,"..","..","..","ui"),Tt(Fs,"..","..","ui"),Tt(Fs,"..","ui-src"),Tt(Fs,"..","..","ui-src"),Tt(Fs,"..","..","dist","ui-src")];for(let r of t)if(Si(Tt(r,"pages"))&&Si(Tt(r,"package.json")))return r;return null}async function aT(e,t){let r=sT(e);if(!r)return null;let a;try{a=km(Tt(yl(),`${cw}${process.pid}-`));let u=Tt(r,"node_modules",".bin","stx"),f=Si(u)?[u,"build","--pages","pages","--out",a,"--no-sitemap","--no-cache"]:["bunx","--bun","@stacksjs/stx","build","--pages","pages","--out",a,"--no-sitemap","--no-cache"],h=Bun.spawn(f,{cwd:r,stdout:"pipe",stderr:"pipe",env:{...process.env,TSCLOUD_DASHBOARD_DATA:tS(t)}}),[b,S,y]=await Promise.all([new Response(h.stdout).text(),new Response(h.stderr).text(),h.exited]);if(y!==0){if(Po(a,{recursive:!0,force:!0}),process.env.TSCLOUD_DASHBOARD_VERBOSE)console.warn(`ts-cloud dashboard: live UI build failed; serving the pre-built UI.
673
673
  ${b}
674
- ${S}`);return null}return a}catch(u){if(a)Po(a,{recursive:!0,force:!0});if(process.env.TSCLOUD_DASHBOARD_VERBOSE)console.warn(`ts-cloud dashboard: live UI build errored; serving the pre-built UI. ${u.message}`);return null}}function ws(e){let t=e.infrastructure?.compute?.managedServices?JSON.parse(JSON.stringify(e.infrastructure.compute.managedServices)):void 0;if(t?.vitess?.password)t.vitess.password="";return{project:{name:e.project?.name,slug:e.project?.slug,region:e.project?.region},provider:e.provider,environments:Object.keys(e.environments??{}),compute:e.infrastructure?.compute?{provider:e.infrastructure.compute.provider,runtime:e.infrastructure.compute.runtime,webServer:e.infrastructure.compute.webServer,proxy:e.infrastructure.compute.proxy?{engine:e.infrastructure.compute.proxy.engine,onDemandTls:e.infrastructure.compute.proxy.onDemandTls,cdn:!!e.infrastructure.compute.proxy.cdn}:void 0,managedServices:t,sshKeys:Qi(zs(e)).map((r)=>({name:r.name,type:r.type,fingerprint:r.fingerprint,added:r.added}))}:void 0,sites:Object.fromEntries(Object.entries(e.sites??{}).map(([r,a])=>[r,{domain:a.domain,path:a.path,type:a.type,deploy:a.deploy,root:a.root,port:a.port,ssl:a.ssl}]))}}function On(e){return[{id:"status",label:"Refresh Cloud Status",description:"Runs the local ts-cloud status checks against configured providers.",command:["status","--env",e],mutates:!1},{id:"doctor",label:"Run Doctor",description:"Checks local tooling, credentials, and provider access.",command:["doctor"],mutates:!1},{id:"security-scan",label:"Security Scan",description:"Runs the pre-deploy scanner from this checkout.",command:["deploy:security-scan","--source",".","--fail-on","critical"],mutates:!1},{id:"deploy",label:"Deploy Environment",description:"Deploys the selected environment from the local checkout.",command:["deploy","--env",e,"--yes"],mutates:!0,confirm:"deploy"}]}function Rs(e,t){return On(t).find((r)=>r.id===e)}function tw(e){if(e.length<=YS)return e;return`${e.slice(0,YS)}
674
+ ${S}`);return null}return a}catch(u){if(a)Po(a,{recursive:!0,force:!0});if(process.env.TSCLOUD_DASHBOARD_VERBOSE)console.warn(`ts-cloud dashboard: live UI build errored; serving the pre-built UI. ${u.message}`);return null}}function ws(e){let t=e.infrastructure?.compute?.managedServices?JSON.parse(JSON.stringify(e.infrastructure.compute.managedServices)):void 0;if(t?.vitess?.password)t.vitess.password="";return{project:{name:e.project?.name,slug:e.project?.slug,region:e.project?.region},provider:e.provider,environments:Object.keys(e.environments??{}),compute:e.infrastructure?.compute?{provider:e.infrastructure.compute.provider,runtime:e.infrastructure.compute.runtime,webServer:e.infrastructure.compute.webServer,proxy:e.infrastructure.compute.proxy?{engine:e.infrastructure.compute.proxy.engine,onDemandTls:e.infrastructure.compute.proxy.onDemandTls,cdn:!!e.infrastructure.compute.proxy.cdn}:void 0,managedServices:t,sshKeys:Qi(zs(e)).map((r)=>({name:r.name,type:r.type,fingerprint:r.fingerprint,added:r.added}))}:void 0,sites:Object.fromEntries(Object.entries(e.sites??{}).map(([r,a])=>[r,{domain:a.domain,path:a.path,type:a.type,deploy:a.deploy,root:a.root,port:a.port,ssl:a.ssl}]))}}function On(e){return[{id:"status",label:"Refresh Cloud Status",description:"Runs the local ts-cloud status checks against configured providers.",command:["status","--env",e],mutates:!1},{id:"doctor",label:"Run Doctor",description:"Checks local tooling, credentials, and provider access.",command:["doctor"],mutates:!1},{id:"security-scan",label:"Security Scan",description:"Runs the pre-deploy scanner from this checkout.",command:["deploy:security-scan","--source",".","--fail-on","critical"],mutates:!1},{id:"deploy",label:"Deploy Environment",description:"Deploys the selected environment from the local checkout.",command:["deploy","--env",e,"--yes"],mutates:!0,confirm:"deploy"}]}function Rs(e,t){return On(t).find((r)=>r.id===e)}function tw(e){if(e.length<=BS)return e;return`${e.slice(0,BS)}
675
675
 
676
- [output truncated]`}async function rw(e,t,r){let a=e.getReader(),u=new TextDecoder,f="";while(!0){let{done:b,value:S}=await a.read();if(b)break;let y=u.decode(S,{stream:!0});if(f+=y,y)r?.(t,y)}let h=u.decode();if(h)f+=h,r?.(t,h);return f}async function wm(e,t){let r=Bun.spawn([process.execPath,t.cliEntry,...e.command],{cwd:t.cwd,stdout:"pipe",stderr:"pipe",env:{...process.env,...t.env}}),a=()=>{try{r.kill()}catch{}};if(t.signal?.aborted)a();else t.signal?.addEventListener("abort",a,{once:!0});try{let[u,f,h]=await Promise.all([rw(r.stdout,"stdout",t.onOutput),rw(r.stderr,"stderr",t.onOutput),r.exited]);return{action:e.id,command:["cloud",...e.command].join(" "),exitCode:h,ok:h===0,stdout:tw(u),stderr:tw(f)}}finally{t.signal?.removeEventListener("abort",a)}}function cT(){return Object.entries(process.env).filter(([e,t])=>!!t&&t.length>=8&&/(?:secret|token|password|passwd|private|credential|api.?key|access.?key)/i.test(e)).map(([,e])=>e)}var dT=new Set(["/server/sites","/server/deployments","/server/logs","/integrations","/applications/new","/applications/compose","/operations/queue","/operations/previews","/operations/releases","/operations/workloads","/operations/observability","/operations/alerts","/operations/jobs","/data/backups","/account/security","/security","/access-denied"]);function lT(e){let t=Ic(e);if(t&&t!==".html")return!1;let r=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(r==="/")return!1;return!dT.has(r)}var uT={"/":"runtime:read","/server/activity":"audit:read","/server/sites":"project:read","/server/deployments":"deployments:read","/server/logs":"runtime:logs","/server/metrics":"runtime:read","/server/services":"runtime:read","/data/backups":"backups:read","/data/volumes":"data:read","/server/fleet":"fleet:read","/server/capacity":"fleet:read","/server/actions":"runtime:restart","/server/database":"data:read","/server/firewall":"fleet:read","/infrastructure/topology":"fleet:read","/server/security":"security:read","/security":"security:read","/integrations":"sources:read","/applications/new":"applications:read","/applications/compose":"applications:read","/operations/queue":"deployments:read","/operations/previews":"deployments:read","/operations/releases":"deployments:read","/operations/regions":"deployments:read","/operations/maintenance":"deployments:read","/operations/workloads":"runtime:read","/operations/observability":"runtime:logs","/operations/alerts":"runtime:read","/operations/jobs":"automation:read","/operations/configuration":"config:read","/server/ssh-keys":"fleet:read","/server/terminal":"runtime:terminal","/server/team":"users:read","/account/security":"project:read","/account/automation":"users:read","/serverless":"project:read","/serverless/deployments":"deployments:read","/serverless/logs":"runtime:logs","/serverless/metrics":"runtime:read","/serverless/traces":"runtime:read","/serverless/functions":"config:read","/serverless/queues":"data:read","/serverless/data":"data:read","/serverless/assets":"project:read","/serverless/secrets":"secrets:read","/serverless/firewall":"fleet:read","/serverless/alarms":"runtime:read","/serverless/cost":"project:read"};function nw(e,t){if(t.role==="admin")return!0;let r=Ic(e);if(r&&r!==".html")return!0;if(t.organizationSource==="legacy")return!lT(e);let a=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(a==="/access-denied")return!0;let u=uT[a];return!!u&&!!t.capabilities?.includes(u)}function pT(e,t){let r=decodeURIComponent(t).replace(/^\/+/,""),u=N_(r===""?"index.html":r);if(u.startsWith("..")||u.includes("/../"))return null;let f=Tt(e,u);if(Si(f)&&!aw(f).isDirectory())return f;if(!Ic(f)&&Si(`${f}.html`))return`${f}.html`;if(!Ic(f)&&Si(Tt(f,"index.html")))return Tt(f,"index.html");return null}async function iw(e,t){let r=pT(e,t);if(!r){let f=Tt(e,"404.html");if(Si(f))return new Response(await ni(f),{status:404,headers:{"content-type":"text/html; charset=utf-8"}});return vl("Not found",404)}if(aw(r).isDirectory())return vl("Not found",404);let a=await ni(r),u=V_[Ic(r)]??"application/octet-stream";return new Response(a,{headers:{"content-type":u}})}var ml=["observe","backup","restore","restart","resize","version","rotate","expose","delete","logs","slow_queries","users","databases"],ow=new WeakMap;async function sw(e){let t=ow.get(e);if(t)return t;let r=await import("./spend/index.js"),a=new r.SpendStore(e),u={store:a,service:new r.SpendService(a),gate:new r.SpendGate(e)};return ow.set(e,u),u}async function gc(e={}){q_();let t=e.cwd??process.cwd(),r=e.host??F_,a=e.port??z_,u=e.cliEntry??process.argv[1];if(e.box)process.env.TS_CLOUD_DASHBOARD_BOX="1";await Z_(t);let f=e.config??await ru(),h=process.env.TS_CLOUD_DASHBOARD_DB_PASSWORD,b=g(f);if(h&&b&&!b.password)b.password=h;let S=f.infrastructure?.compute?.managedServices?.vitess;if(h&&S&&typeof S==="object"&&!S.password)S.password=h;let y=ng(t,f);if(y.reconciliation.failed>0)console.warn(` ts-cloud dashboard: marked ${y.reconciliation.failed} orphaned operation(s) as failed after restart.`);let k=Object.keys(f.environments??{}),R=Q_(f,e.environment),D=X_(t),O=await Co(f,R),M=new Map([[R,O]]),z=new Map([[R,Date.now()]]),J=new Map([[R,Date.now()]]),Z=new Map,oe=Math.min(300000,Math.max(5000,Number(process.env.TS_CLOUD_DASHBOARD_REFRESH_MS)||30000)),G=Math.min(1800000,Math.max(60000,Number(process.env.TS_CLOUD_DASHBOARD_SITE_REFRESH_MS)||300000)),te=K(f)!=="serverless",he=(_)=>{let Ne=M.get(_);if(Ne&&!ZS(z.get(_),Date.now(),oe))return Promise.resolve(Ne);let ze=Z.get(_);if(ze)return ze;let Oe=!te||ZS(J.get(_),Date.now(),G),Qe=Co(f,_,{includeSiteHealth:Oe}).then((bt)=>{let B=M.get(_),Mr=Oe?bt:oT(B,bt);if(M.set(_,Mr),z.set(_,Date.now()),Oe)J.set(_,Date.now());if(B?._serverReachable!==Mr._serverReachable||B?._metricsStatus!==Mr._metricsStatus||(B?.sitesDetail?.length??0)!==(Mr.sitesDetail?.length??0))Ze();return Mr}).finally(()=>Z.delete(_));return Z.set(_,Qe),Qe},ye=er(t),ie=process.env.TS_CLOUD_DASHBOARD_TELEMETRY?.trim();if(e.box&&ie!=="0"&&(ie==="1"||!f.cloud?.attachTo)){let _=!1,Ne=Date.now()+300000,ze=async()=>{if(_)return;_=!0;try{let Qe=Date.now(),bt=Qe>=Ne;if(bt)Ne=Qe+300000;let B=y.environments.get(R);await bm({controlPlane:y.store,projectId:y.project.id,environmentId:B?.id,config:f,environment:R,force:!0,lightweight:!0,includeSiteHealth:bt})}catch(Qe){if(e.verbose)console.warn(` ts-cloud dashboard: background telemetry collection failed: ${Qe instanceof Error?Qe.message:String(Qe)}`)}finally{_=!1}};ze(),setInterval(()=>void ze(),60000).unref?.()}let ee=new Map,De=new Map,Ge=new Set,pt=0;function Bt(_,Ne){if(_.role==="admin"&&!y.store.getActorByExternalId("user",`dashboard:${_.username.toLowerCase()}`))return _;let ze=y.store.getActorByExternalId("user",`dashboard:${_.username.toLowerCase()}`),Oe=ze?y.store.getMembershipForActor(y.organization.id,ze.id):void 0;if(!Oe||Oe.status!=="active")return{..._,role:"member",sites:{},capabilities:[]};let Qe=y.store.listGrants(Oe.id),bt=y.store.resolveAuthorizationTarget(y.organization.id,Oe.scope)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),B=nr({membership:Oe,grants:Qe,target:bt});if(Oe.roleTemplate==="owner"||Oe.roleTemplate==="admin")return{..._,role:"admin",sites:{},organizationRole:Oe.roleTemplate,organizationSource:Oe.source,capabilities:B};let Mr=y.environments.get(Ne),tr={};for(let et of y.store.listResources(y.project.id,Mr?.id).filter((lt)=>lt.kind==="application")){let lt=y.store.resolveAuthorizationTarget(y.organization.id,{type:"resource",id:et.id});if(!lt||!x({membership:Oe,grants:Qe,capability:"project:read",target:lt}).allowed)continue;tr[et.slug]=x({membership:Oe,grants:Qe,capability:"config:write",target:lt}).allowed?"owner":"collaborator"}return{..._,role:"member",sites:tr,organizationRole:Oe.roleTemplate,organizationSource:Oe.source,capabilities:B}}function Ze(){pt+=1,ee.clear();for(let _ of Ge)Po(_,{recursive:!0,force:!0});Ge.clear()}let wt=(_,Ne)=>`${Ne}:${_.role==="admin"?"admin":`member:${Object.entries(_.sites).sort(([ze],[Oe])=>ze.localeCompare(Oe)).map(([ze,Oe])=>`${ze}=${Oe}`).join(",")}`}:${[..._.capabilities??[]].sort().join(",")}`;async function zt(_,Ne){let ze=Bt(_,Ne),Oe=wt(ze,Ne),Qe=ee.get(Oe);if(Qe)return Qe;let bt=De.get(Oe);if(bt)return bt;let B=pt,Mr=(async()=>{let tr=M.get(Ne)??await Co(f,Ne);M.set(Ne,tr);let et={...lm(tr,{user:ze,slug:f.project.slug}),viewer:{role:ze.role,organizationRole:ze.organizationRole,organizationSource:ze.organizationSource,capabilities:ze.capabilities??[]}},lt=await aT(t,et);if(lt&&B!==pt)return Po(lt,{recursive:!0,force:!0}),ye?.uiRoot;if(lt)Ge.add(lt);let Pr=lt??ye?.uiRoot;if(Pr)ee.set(Oe,Pr);return Pr})();De.set(Oe,Mr);try{return await Mr}finally{De.delete(Oe)}}let rt=await zt({username:"",passwordHash:"",role:"admin",sites:{}},R);if(!rt)throw Error("ts-cloud dashboard UI not found. Run `bun run build` in ts-cloud or reinstall the package.");let W=new WeakMap,se=process.env.TS_CLOUD_DASHBOARD_TERMINAL!=="0",le=process.env.TS_CLOUD_DASHBOARD_AUTH==="0";if(le&&e.box)throw Error("TS_CLOUD_DASHBOARD_AUTH=0 is refused in box mode: the dashboard is internet-facing there, and disabling auth would expose a root shell.");let Ce=!le,gt=$b(t),kt=Ce?Mb(t,process.env.TS_CLOUD_UI_USERNAME?.trim()||"admin"):void 0,_e=new ds(y.store,{encryptionKey:st(t)}),ht=new ls(y.store),nt=new bn(y.store),Ke=new ha(y.store,{encryptionKey:st(t)}),Br=new Pp(y.store),_o=new Dp(y.store,{cwd:t}),Qn=new Tp(y.store,{encryptionKey:st(t)}),Dt=new c(y.store,{workerId:`dashboard:${process.pid}`}),qt=new ka(y.store),ii=new Fa(y.store,st(t)),wi=new ac(y.store),Ec=new ys(qt,Dt,ii),ki=f.project?.region??"us-east-1",Im=st(t),tn=new uc(wi,{encryptionKey:Im,backends:[new xn(y.store,Im),new cc(new re(ki),ki),new dc(new Be(ki),ki),new lc]});await Sg(tn,y,f);let bl=new ne(ki),dw={aws_rds:new Na(new La(bl)),aws_aurora:new Ba(new $a(bl)),aws_elasticache:new xa(new Ma(new ut(ki))),server:new Oa(new Sr),container:new _a(new Sr)},Em=(_)=>dw[_.provider],or=new Za(y.store),Yi=new Ts(or,Dt),Rm=new ec(ii),lw={managed_database:new tc(qt,bl),logical_database:new nc(qt,ii),volume:new ic,files:new rc(t),control_plane:new sc(y.store,t),infrastructure:new oc(new Er(ki))},uw=(_)=>lw[_.resourceKind],pw=(_)=>_.provider==="aws_backup"?void 0:Rm,Sl=new ir(y.store),wl=[new Xr,new vo(l(t,"volumes"))],oi=new Eo(Sl,wl,Dt),Us=new Ua(y.store),Yn=new Qa(Us,[new wn("aws"),new wn("hetzner"),new wn("ssh")],Dt),Ii=new Ha(y.store),Am=new Ga(Ii,Us),Zi=new Va(y.store),Cm=new qa(Zi,Dt),si=new za(y.store),kl=new Ka(si,Dt),Pm=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((_)=>new Wa(_,y.store,y.project.id,y.organization.id)),kr=new Pa(y.store),_m=new Da(kr,{queue:Dt}),Zt=new Jr(y.store),Ei=new Yr(y.store),un=new xt(y.store),Xe=new Gi(y.store,{encryptionKey:st(t)}),gw=()=>sw(y.store);for(let _ of y.environments.values())Ra(kr,f,{organization:y.organization,project:y.project,environment:_,resources:y.store.listResources(y.project.id,_.id)});let gn=new Vi(Xe,{emailImpl:async(_)=>{let{email:Ne}=await import("./chunk-v34tdcwv.js");return Ne.send(_)}}),Tm=async(_)=>{let Ne=$o(Xe,y.project.id,_),ze=[];for(let Oe of Ne.filter((Qe)=>Qe.notify&&Qe.alert))ze.push(...await gn.deliverAll(gn.enqueue(y.organization.id,Oe.alert,Oe.transition)));return ze.push(...await gn.deliverAll(gn.enqueueRemindersAndEscalations(y.organization.id,Xe.listAlerts(y.project.id,{environmentId:_,states:["firing"]})))),ze.push(...await gn.retryDue()),{evaluations:Ne,deliveries:ze}},Il=!1,mw=async()=>{if(Il)return;Il=!0;try{for(let _ of y.environments.values())for(let Ne of Xe.listHealthChecks(y.project.id,_.id).filter((ze)=>ze.enabled)){let ze=Xe.listHealthResults(Ne.id,1)[0];if(ze&&Date.now()-new Date(ze.checkedAt).getTime()<Ne.intervalSeconds*1000)continue;let Oe=await new Je(Xe).runAndEvaluate(Ne);for(let Qe of Oe.evaluations.filter((bt)=>bt.notify&&bt.alert))await gn.deliverAll(gn.enqueue(y.organization.id,Qe.alert,Qe.transition))}}finally{Il=!1}},xm=setInterval(()=>{for(let _ of y.environments.values())Tm(_.id).catch((Ne)=>console.error("ts-cloud alert evaluation failed:",Ne))},60000);xm.unref?.();let Dm=setInterval(()=>{mw().catch((_)=>console.error("ts-cloud health check evaluation failed:",_))},30000);Dm.unref?.();let Om=setInterval(()=>{try{_m.tick()}catch(_){console.error("ts-cloud scheduled job evaluation failed:",_)}},30000);Om.unref?.();let $m=setInterval(()=>{try{Yi.enqueueDue(),Yi.enqueueRetention()}catch(_){console.error("ts-cloud backup policy evaluation failed:",_)}},30000);$m.unref?.(),Zt.cleanup();let Nm=setInterval(()=>{try{Zt.cleanup()}catch(_){console.error("ts-cloud preview cleanup failed:",_)}},3600000);Nm.unref?.();let fw=e.queueWorker??!0,hw=cT(),yw=async(_,Ne)=>{let Oe=(_.environmentId?y.store.listEnvironments(_.projectId).find((Qe)=>Qe.id===_.environmentId):void 0)?.slug??String(R);if(Ne.kind==="dashboard_operation"&&Ne.operationId){let Qe=M.get(Oe)??O,bt=dm(Ne.operationId,f,Qe);if(!bt||bt.danger||!["scheduler","backup","worker"].includes(bt.group))return{ok:!1,stderr:"The allowlisted dashboard operation is no longer available."};let B=await dl(f,Oe,bt);return{ok:B.ok,stdout:B.stdout,stderr:B.stderr??B.error,retryable:/temporar|unavailable|timeout|network/i.test(B.stderr??B.error??""),output:{command:B.command??null,operation:B.operation}}}if(Ne.kind==="serverless_scheduler"){let Qe=await vm(f,Oe,"run");return{ok:Qe.ok,stdout:Qe.stdout,stderr:Qe.error,retryable:/temporar|unavailable|timeout|network/i.test(Qe.error??""),output:{command:Qe.command??null,operation:"serverless_scheduler"}}}return{ok:!1,stderr:`No safe executor is configured for ${Ne.kind}.`}},Rc=fw?new bo(Dt,{...Rd({store:y.store,execute:async(_,Ne)=>{let ze=Ne.operation.input&&typeof Ne.operation.input==="object"&&!Array.isArray(Ne.operation.input)?Ne.operation.input:{},Oe=ze.source&&typeof ze.source==="object"?ze.source:void 0,Qe=t,bt,B,Mr;try{if(Oe?.bindingId&&Oe?.connectionId&&Oe?.commitSha){let et=Ke.getBinding(String(Oe.bindingId)),lt=Ke.getConnection(String(Oe.connectionId));if(!et||!lt||et.connectionId!==lt.id)throw Error("Queued source binding is no longer available");let mr=(et.repositoryId?Ke.getRepository(et.repositoryId):Ke.listRepositories(lt.id).find((Do)=>Do.fullName.toLowerCase()===et.repositoryFullName.toLowerCase()))?.cloneUrl;if(!mr&&lt.provider==="generic_ssh")mr=`git@${new URL(lt.host).hostname}:${et.repositoryFullName}.git`;if(!mr)mr=new URL(`/${et.repositoryFullName}.git`,lt.host.endsWith("/")?lt.host:`${lt.host}/`).href;let Se=et.deployKeyId?Ke.getDeployKey(et.deployKeyId):void 0,Vt=Se&&et.deployKeyId?{...Se,privateKey:Ke.getDeployPrivateKey(et.deployKeyId)}:void 0;if(["github","gitlab","bitbucket","gitea"].includes(lt.provider)&&_.target.previewId){let Do=ot(lt,Ke.getCredential(lt.id)),ce=Zt.previews.getInstance(_.target.previewId);Mr=async(mn,Tc)=>{try{await Do.setCommitStatus(et.repositoryFullName,String(Oe.commitSha),{state:mn,url:ce?.url,description:Tc})}catch(Oo){Ne.log(`Could not publish source status: ${Oo instanceof Error?Oo.message:String(Oo)}`,{stream:"stderr"})}},await Mr("pending",`Preview deployment started for ${String(Oe.commitSha).slice(0,12)}`)}bt=km(Tt(yl(),"ts-cloud-queued-source-")),Ne.log(`Checking out immutable source commit ${Oe.commitSha}.`,{stream:"system"}),Qe=(await ya({remote:mr,binding:et,destination:Tt(bt,"checkout"),ref:String(Oe.branch??et.defaultBranch),commitSha:String(Oe.commitSha)},{credential:Ke.getCredential(lt.id),deployKey:Vt})).directory}if(Ne.operation.kind!=="preview.destroy"){let et=_.target.previewId?Zt.previews.getInstance(_.target.previewId):void 0,lt=et?Zt.previews.getDefinition(et.definitionId):void 0,Pr=Ne.operation.resourceId?y.store.getResource(Ne.operation.resourceId):void 0;if(B=await tn.resolve({projectId:y.project.id,environmentId:Ne.operation.environmentId,resourceId:Ne.operation.resourceId,functionId:Pr?.kind==="function"?Pr.id:void 0,previewId:et?.id,trustedPreview:!!et&&!et.fork,allowedPreviewSecrets:lt?.inheritedSecrets}),B.warnings.some((mr)=>mr.code==="missing_required"))throw Error(`Required deployment configuration is unavailable: ${B.warnings.filter((mr)=>mr.code==="missing_required").map((mr)=>mr.key).join(", ")}`);if(Ne.operation.resourceId)for(let mr of Object.values(B.entries))wi.setDependency({entryId:mr.id,resourceId:Ne.operation.resourceId,injectionTarget:"environment",required:mr.required,requiresRedeploy:!0});Ne.log(`Resolved configuration ${B.configurationHash.slice(0,18)} for ${Object.keys(B.values).length} keys.`,{stream:"system"})}let tr=await wm(_,{cwd:Qe,cliEntry:u,signal:Ne.signal,env:B?.values,onOutput:(et,lt)=>Ne.log(lt,{stream:et,step:"execute",secrets:[...hw,...Object.entries(B?.entries??{}).filter(([,Pr])=>Pr.kind==="secret").map(([Pr])=>B.values[Pr]).filter(Boolean)]})});if(tr.ok&&Ne.operation.resourceId&&B)for(let et of Object.values(B.entries))wi.setDependency({entryId:et.id,resourceId:Ne.operation.resourceId,injectionTarget:"environment",required:et.required,requiresRedeploy:!1,lastDeployedVersion:et.version});return await Mr?.(tr.ok?"success":"failure",tr.ok?`Preview is ready at ${String(Oe?.commitSha).slice(0,12)}`:`Preview deployment failed at ${String(Oe?.commitSha).slice(0,12)}`),tr}catch(tr){throw await Mr?.("error",`Preview deployment could not complete at ${String(Oe?.commitSha).slice(0,12)}`),tr}finally{if(bt)Po(bt,{recursive:!0,force:!0})}}}),...$u({store:kr,executor:yw}),...Fu({store:qt,secrets:ii,resolveAdapter:Em}),...Hu(Us,Yn.drivers),...Vu(Zi,[new ja("aws","AWS regional execution requires an injected AwsRegionalTransport; topology and plans were preserved without provider mutation.")]),...Wu({store:si,cleanup:Pm}),...Dd(Sl,wl),...mg({store:or,queue:Dt,resolveSource:uw,resolveDestination:pw,validateHealth:async(_,Ne)=>{if(!_.healthCheckId)return{healthy:!0,mode:"adapter"};let ze=Xe.getHealthCheck(_.healthCheckId);if(!ze||ze.projectId!==_.projectId)return{healthy:!1,error:"Configured restore health check was not found."};let Oe=await new Je(Xe).runAndEvaluate(ze);return{healthy:Oe.result.status==="healthy",healthCheckId:ze.id,healthResultId:Oe.result.id,target:Ne}}}),...fu({store:y.store,resolveDriver:e.releaseDriver??((_)=>({name:`${y.store.getResource(_.resourceId)?.provider??"provider"} release driver`,capability:()=>({strategy:_.strategy,supported:!1,explanation:"This dashboard process has no immutable activation driver configured for the target provider.",capacityMultiplier:1,costImpact:"none",rollback:"The previous release remains preserved; configure a release driver before retrying."}),activate:async()=>{throw Error("Immutable activation driver is not configured")},rollback:async()=>{throw Error("Immutable rollback driver is not configured")}})),resolveHealthGate:async(_,Ne)=>{let ze=Xe.listHealthChecks(Ne.projectId,Ne.environmentId).find((Qe)=>Qe.enabled&&Qe.name===_&&(!Qe.resourceId||Qe.resourceId===Ne.resourceId));if(!ze)return{healthy:!1,message:`Named health gate ${_} was not found for this release.`};let Oe=await new Je(Xe).runAndEvaluate(ze);return{healthy:Oe.result.status==="healthy",evidence:{healthCheckId:ze.id,healthResultId:Oe.result.id,status:Oe.result.status,timings:Oe.result.timings},message:Oe.result.message}}})},{parallelism:e.queueParallelism??(Number(process.env.TS_CLOUD_QUEUE_PARALLELISM)||8),onError:(_)=>console.error("ts-cloud deployment queue worker failed:",_)}):void 0;if(Du(y),fs(nt,ue(y,String(R)),O),kt)Cs(y,kt.users),zb(_e,y,kt.users);let Ht=Lb({cwd:t,enabled:Ce,secret:gt,authentication:_e,authorization:{store:y.store,organizationId:y.organization.id,projectId:y.project.id,defaultEnvironment:String(R)}}),sr=new wa,jm=setInterval(()=>sr.sweep(),60000);jm.unref?.();let Ac=new bc,El=new bc(3,900000,900000),Cc=new bc(8,900000,900000),Bm=setInterval(()=>Ac.prune(),300000),Mm=setInterval(()=>El.prune(),300000),Lm=setInterval(()=>Cc.prune(),300000);if(Bm.unref?.(),Mm.unref?.(),Lm.unref?.(),Ce){if(kt?.generated)console.warn(`
676
+ [output truncated]`}async function rw(e,t,r){let a=e.getReader(),u=new TextDecoder,f="";while(!0){let{done:b,value:S}=await a.read();if(b)break;let y=u.decode(S,{stream:!0});if(f+=y,y)r?.(t,y)}let h=u.decode();if(h)f+=h,r?.(t,h);return f}async function wm(e,t){let r=Bun.spawn([process.execPath,t.cliEntry,...e.command],{cwd:t.cwd,stdout:"pipe",stderr:"pipe",env:{...process.env,...t.env}}),a=()=>{try{r.kill()}catch{}};if(t.signal?.aborted)a();else t.signal?.addEventListener("abort",a,{once:!0});try{let[u,f,h]=await Promise.all([rw(r.stdout,"stdout",t.onOutput),rw(r.stderr,"stderr",t.onOutput),r.exited]);return{action:e.id,command:["cloud",...e.command].join(" "),exitCode:h,ok:h===0,stdout:tw(u),stderr:tw(f)}}finally{t.signal?.removeEventListener("abort",a)}}function cT(){return Object.entries(process.env).filter(([e,t])=>!!t&&t.length>=8&&/(?:secret|token|password|passwd|private|credential|api.?key|access.?key)/i.test(e)).map(([,e])=>e)}var dT=new Set(["/server/sites","/server/deployments","/server/logs","/integrations","/applications/new","/applications/compose","/operations/queue","/operations/previews","/operations/releases","/operations/workloads","/operations/observability","/operations/alerts","/operations/jobs","/data/backups","/account/security","/security","/access-denied"]);function lT(e){let t=Ic(e);if(t&&t!==".html")return!1;let r=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(r==="/")return!1;return!dT.has(r)}var uT={"/":"runtime:read","/server/activity":"audit:read","/server/sites":"project:read","/server/deployments":"deployments:read","/server/logs":"runtime:logs","/server/metrics":"runtime:read","/server/services":"runtime:read","/data/backups":"backups:read","/data/volumes":"data:read","/server/fleet":"fleet:read","/server/capacity":"fleet:read","/server/actions":"runtime:restart","/server/database":"data:read","/server/firewall":"fleet:read","/infrastructure/topology":"fleet:read","/server/security":"security:read","/security":"security:read","/integrations":"sources:read","/applications/new":"applications:read","/applications/compose":"applications:read","/operations/queue":"deployments:read","/operations/previews":"deployments:read","/operations/releases":"deployments:read","/operations/regions":"deployments:read","/operations/maintenance":"deployments:read","/operations/workloads":"runtime:read","/operations/observability":"runtime:logs","/operations/alerts":"runtime:read","/operations/jobs":"automation:read","/operations/configuration":"config:read","/server/ssh-keys":"fleet:read","/server/terminal":"runtime:terminal","/server/team":"users:read","/account/security":"project:read","/account/automation":"users:read","/serverless":"project:read","/serverless/deployments":"deployments:read","/serverless/logs":"runtime:logs","/serverless/metrics":"runtime:read","/serverless/traces":"runtime:read","/serverless/functions":"config:read","/serverless/queues":"data:read","/serverless/data":"data:read","/serverless/assets":"project:read","/serverless/secrets":"secrets:read","/serverless/firewall":"fleet:read","/serverless/alarms":"runtime:read","/serverless/cost":"project:read"};function nw(e,t){if(t.role==="admin")return!0;let r=Ic(e);if(r&&r!==".html")return!0;if(t.organizationSource==="legacy")return!lT(e);let a=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(a==="/access-denied")return!0;let u=uT[a];return!!u&&!!t.capabilities?.includes(u)}function pT(e,t){let r=decodeURIComponent(t).replace(/^\/+/,""),u=N_(r===""?"index.html":r);if(u.startsWith("..")||u.includes("/../"))return null;let f=Tt(e,u);if(Si(f)&&!aw(f).isDirectory())return f;if(!Ic(f)&&Si(`${f}.html`))return`${f}.html`;if(!Ic(f)&&Si(Tt(f,"index.html")))return Tt(f,"index.html");return null}async function iw(e,t){let r=pT(e,t);if(!r){let f=Tt(e,"404.html");if(Si(f))return new Response(await ni(f),{status:404,headers:{"content-type":"text/html; charset=utf-8"}});return vl("Not found",404)}if(aw(r).isDirectory())return vl("Not found",404);let a=await ni(r),u=V_[Ic(r)]??"application/octet-stream";return new Response(a,{headers:{"content-type":u}})}var ml=["observe","backup","restore","restart","resize","version","rotate","expose","delete","logs","slow_queries","users","databases"],ow=new WeakMap;async function sw(e){let t=ow.get(e);if(t)return t;let r=await import("./spend/index.js"),a=new r.SpendStore(e),u={store:a,service:new r.SpendService(a),gate:new r.SpendGate(e)};return ow.set(e,u),u}async function gc(e={}){q_();let t=e.cwd??process.cwd(),r=e.host??F_,a=e.port??z_,u=e.cliEntry??process.argv[1];if(e.box)process.env.TS_CLOUD_DASHBOARD_BOX="1";await Z_(t);let f=e.config??await ru(),h=process.env.TS_CLOUD_DASHBOARD_DB_PASSWORD,b=g(f);if(h&&b&&!b.password)b.password=h;let S=f.infrastructure?.compute?.managedServices?.vitess;if(h&&S&&typeof S==="object"&&!S.password)S.password=h;let y=ng(t,f);if(y.reconciliation.failed>0)console.warn(` ts-cloud dashboard: marked ${y.reconciliation.failed} orphaned operation(s) as failed after restart.`);let k=Object.keys(f.environments??{}),R=Q_(f,e.environment),D=X_(t),O=await Co(f,R),M=new Map([[R,O]]),z=new Map([[R,Date.now()]]),J=new Map([[R,Date.now()]]),Z=new Map,oe=Math.min(300000,Math.max(5000,Number(process.env.TS_CLOUD_DASHBOARD_REFRESH_MS)||30000)),G=Math.min(1800000,Math.max(60000,Number(process.env.TS_CLOUD_DASHBOARD_SITE_REFRESH_MS)||300000)),te=K(f)!=="serverless",he=(_)=>{let Ne=M.get(_);if(Ne&&!YS(z.get(_),Date.now(),oe))return Promise.resolve(Ne);let ze=Z.get(_);if(ze)return ze;let Oe=!te||YS(J.get(_),Date.now(),G),Qe=Co(f,_,{includeSiteHealth:Oe}).then((bt)=>{let B=M.get(_),Mr=Oe?bt:oT(B,bt);if(M.set(_,Mr),z.set(_,Date.now()),Oe)J.set(_,Date.now());if(B?._serverReachable!==Mr._serverReachable||B?._metricsStatus!==Mr._metricsStatus||(B?.sitesDetail?.length??0)!==(Mr.sitesDetail?.length??0))Ze();return Mr}).finally(()=>Z.delete(_));return Z.set(_,Qe),Qe},ye=er(t),ie=process.env.TS_CLOUD_DASHBOARD_TELEMETRY?.trim();if(e.box&&ie!=="0"&&(ie==="1"||!f.cloud?.attachTo)){let _=!1,Ne=Date.now()+300000,ze=async()=>{if(_)return;_=!0;try{let Qe=Date.now(),bt=Qe>=Ne;if(bt)Ne=Qe+300000;let B=y.environments.get(R);await bm({controlPlane:y.store,projectId:y.project.id,environmentId:B?.id,config:f,environment:R,force:!0,lightweight:!0,includeSiteHealth:bt})}catch(Qe){if(e.verbose)console.warn(` ts-cloud dashboard: background telemetry collection failed: ${Qe instanceof Error?Qe.message:String(Qe)}`)}finally{_=!1}};ze(),setInterval(()=>void ze(),60000).unref?.()}let ee=new Map,De=new Map,Ge=new Set,pt=0;function Bt(_,Ne){if(_.role==="admin"&&!y.store.getActorByExternalId("user",`dashboard:${_.username.toLowerCase()}`))return _;let ze=y.store.getActorByExternalId("user",`dashboard:${_.username.toLowerCase()}`),Oe=ze?y.store.getMembershipForActor(y.organization.id,ze.id):void 0;if(!Oe||Oe.status!=="active")return{..._,role:"member",sites:{},capabilities:[]};let Qe=y.store.listGrants(Oe.id),bt=y.store.resolveAuthorizationTarget(y.organization.id,Oe.scope)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),B=nr({membership:Oe,grants:Qe,target:bt});if(Oe.roleTemplate==="owner"||Oe.roleTemplate==="admin")return{..._,role:"admin",sites:{},organizationRole:Oe.roleTemplate,organizationSource:Oe.source,capabilities:B};let Mr=y.environments.get(Ne),tr={};for(let et of y.store.listResources(y.project.id,Mr?.id).filter((lt)=>lt.kind==="application")){let lt=y.store.resolveAuthorizationTarget(y.organization.id,{type:"resource",id:et.id});if(!lt||!x({membership:Oe,grants:Qe,capability:"project:read",target:lt}).allowed)continue;tr[et.slug]=x({membership:Oe,grants:Qe,capability:"config:write",target:lt}).allowed?"owner":"collaborator"}return{..._,role:"member",sites:tr,organizationRole:Oe.roleTemplate,organizationSource:Oe.source,capabilities:B}}function Ze(){pt+=1,ee.clear();for(let _ of Ge)Po(_,{recursive:!0,force:!0});Ge.clear()}let wt=(_,Ne)=>`${Ne}:${_.role==="admin"?"admin":`member:${Object.entries(_.sites).sort(([ze],[Oe])=>ze.localeCompare(Oe)).map(([ze,Oe])=>`${ze}=${Oe}`).join(",")}`}:${[..._.capabilities??[]].sort().join(",")}`;async function zt(_,Ne){let ze=Bt(_,Ne),Oe=wt(ze,Ne),Qe=ee.get(Oe);if(Qe)return Qe;let bt=De.get(Oe);if(bt)return bt;let B=pt,Mr=(async()=>{let tr=M.get(Ne)??await Co(f,Ne);M.set(Ne,tr);let et={...lm(tr,{user:ze,slug:f.project.slug}),viewer:{role:ze.role,organizationRole:ze.organizationRole,organizationSource:ze.organizationSource,capabilities:ze.capabilities??[]}},lt=await aT(t,et);if(lt&&B!==pt)return Po(lt,{recursive:!0,force:!0}),ye?.uiRoot;if(lt)Ge.add(lt);let Pr=lt??ye?.uiRoot;if(Pr)ee.set(Oe,Pr);return Pr})();De.set(Oe,Mr);try{return await Mr}finally{De.delete(Oe)}}let rt=await zt({username:"",passwordHash:"",role:"admin",sites:{}},R);if(!rt)throw Error("ts-cloud dashboard UI not found. Run `bun run build` in ts-cloud or reinstall the package.");let W=new WeakMap,se=process.env.TS_CLOUD_DASHBOARD_TERMINAL!=="0",le=process.env.TS_CLOUD_DASHBOARD_AUTH==="0";if(le&&e.box)throw Error("TS_CLOUD_DASHBOARD_AUTH=0 is refused in box mode: the dashboard is internet-facing there, and disabling auth would expose a root shell.");let Ce=!le,gt=$b(t),kt=Ce?Mb(t,process.env.TS_CLOUD_UI_USERNAME?.trim()||"admin"):void 0,_e=new ds(y.store,{encryptionKey:st(t)}),ht=new ls(y.store),nt=new bn(y.store),Ke=new ha(y.store,{encryptionKey:st(t)}),Br=new Pp(y.store),_o=new Dp(y.store,{cwd:t}),Qn=new Tp(y.store,{encryptionKey:st(t)}),Dt=new c(y.store,{workerId:`dashboard:${process.pid}`}),qt=new ka(y.store),ii=new Fa(y.store,st(t)),wi=new ac(y.store),Ec=new ys(qt,Dt,ii),ki=f.project?.region??"us-east-1",Im=st(t),tn=new uc(wi,{encryptionKey:Im,backends:[new xn(y.store,Im),new cc(new re(ki),ki),new dc(new Be(ki),ki),new lc]});await Sg(tn,y,f);let bl=new ne(ki),dw={aws_rds:new Na(new La(bl)),aws_aurora:new Ba(new $a(bl)),aws_elasticache:new xa(new Ma(new ut(ki))),server:new Oa(new Sr),container:new _a(new Sr)},Em=(_)=>dw[_.provider],or=new Za(y.store),Yi=new Ts(or,Dt),Rm=new ec(ii),lw={managed_database:new tc(qt,bl),logical_database:new nc(qt,ii),volume:new ic,files:new rc(t),control_plane:new sc(y.store,t),infrastructure:new oc(new Er(ki))},uw=(_)=>lw[_.resourceKind],pw=(_)=>_.provider==="aws_backup"?void 0:Rm,Sl=new ir(y.store),wl=[new Xr,new vo(l(t,"volumes"))],oi=new Eo(Sl,wl,Dt),Us=new Ua(y.store),Yn=new Qa(Us,[new wn("aws"),new wn("hetzner"),new wn("ssh")],Dt),Ii=new Ha(y.store),Am=new Ga(Ii,Us),Zi=new Va(y.store),Cm=new qa(Zi,Dt),si=new za(y.store),kl=new Ka(si,Dt),Pm=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((_)=>new Wa(_,y.store,y.project.id,y.organization.id)),kr=new Pa(y.store),_m=new Da(kr,{queue:Dt}),Zt=new Jr(y.store),Ei=new Yr(y.store),un=new xt(y.store),Xe=new Gi(y.store,{encryptionKey:st(t)}),gw=()=>sw(y.store);for(let _ of y.environments.values())Ra(kr,f,{organization:y.organization,project:y.project,environment:_,resources:y.store.listResources(y.project.id,_.id)});let gn=new Vi(Xe,{emailImpl:async(_)=>{let{email:Ne}=await import("./chunk-s3pe89wj.js");return Ne.send(_)}}),Tm=async(_)=>{let Ne=$o(Xe,y.project.id,_),ze=[];for(let Oe of Ne.filter((Qe)=>Qe.notify&&Qe.alert))ze.push(...await gn.deliverAll(gn.enqueue(y.organization.id,Oe.alert,Oe.transition)));return ze.push(...await gn.deliverAll(gn.enqueueRemindersAndEscalations(y.organization.id,Xe.listAlerts(y.project.id,{environmentId:_,states:["firing"]})))),ze.push(...await gn.retryDue()),{evaluations:Ne,deliveries:ze}},Il=!1,mw=async()=>{if(Il)return;Il=!0;try{for(let _ of y.environments.values())for(let Ne of Xe.listHealthChecks(y.project.id,_.id).filter((ze)=>ze.enabled)){let ze=Xe.listHealthResults(Ne.id,1)[0];if(ze&&Date.now()-new Date(ze.checkedAt).getTime()<Ne.intervalSeconds*1000)continue;let Oe=await new Je(Xe).runAndEvaluate(Ne);for(let Qe of Oe.evaluations.filter((bt)=>bt.notify&&bt.alert))await gn.deliverAll(gn.enqueue(y.organization.id,Qe.alert,Qe.transition))}}finally{Il=!1}},xm=setInterval(()=>{for(let _ of y.environments.values())Tm(_.id).catch((Ne)=>console.error("ts-cloud alert evaluation failed:",Ne))},60000);xm.unref?.();let Dm=setInterval(()=>{mw().catch((_)=>console.error("ts-cloud health check evaluation failed:",_))},30000);Dm.unref?.();let Om=setInterval(()=>{try{_m.tick()}catch(_){console.error("ts-cloud scheduled job evaluation failed:",_)}},30000);Om.unref?.();let $m=setInterval(()=>{try{Yi.enqueueDue(),Yi.enqueueRetention()}catch(_){console.error("ts-cloud backup policy evaluation failed:",_)}},30000);$m.unref?.(),Zt.cleanup();let Nm=setInterval(()=>{try{Zt.cleanup()}catch(_){console.error("ts-cloud preview cleanup failed:",_)}},3600000);Nm.unref?.();let fw=e.queueWorker??!0,hw=cT(),yw=async(_,Ne)=>{let Oe=(_.environmentId?y.store.listEnvironments(_.projectId).find((Qe)=>Qe.id===_.environmentId):void 0)?.slug??String(R);if(Ne.kind==="dashboard_operation"&&Ne.operationId){let Qe=M.get(Oe)??O,bt=dm(Ne.operationId,f,Qe);if(!bt||bt.danger||!["scheduler","backup","worker"].includes(bt.group))return{ok:!1,stderr:"The allowlisted dashboard operation is no longer available."};let B=await dl(f,Oe,bt);return{ok:B.ok,stdout:B.stdout,stderr:B.stderr??B.error,retryable:/temporar|unavailable|timeout|network/i.test(B.stderr??B.error??""),output:{command:B.command??null,operation:B.operation}}}if(Ne.kind==="serverless_scheduler"){let Qe=await vm(f,Oe,"run");return{ok:Qe.ok,stdout:Qe.stdout,stderr:Qe.error,retryable:/temporar|unavailable|timeout|network/i.test(Qe.error??""),output:{command:Qe.command??null,operation:"serverless_scheduler"}}}return{ok:!1,stderr:`No safe executor is configured for ${Ne.kind}.`}},Rc=fw?new bo(Dt,{...Rd({store:y.store,execute:async(_,Ne)=>{let ze=Ne.operation.input&&typeof Ne.operation.input==="object"&&!Array.isArray(Ne.operation.input)?Ne.operation.input:{},Oe=ze.source&&typeof ze.source==="object"?ze.source:void 0,Qe=t,bt,B,Mr;try{if(Oe?.bindingId&&Oe?.connectionId&&Oe?.commitSha){let et=Ke.getBinding(String(Oe.bindingId)),lt=Ke.getConnection(String(Oe.connectionId));if(!et||!lt||et.connectionId!==lt.id)throw Error("Queued source binding is no longer available");let mr=(et.repositoryId?Ke.getRepository(et.repositoryId):Ke.listRepositories(lt.id).find((Do)=>Do.fullName.toLowerCase()===et.repositoryFullName.toLowerCase()))?.cloneUrl;if(!mr&&lt.provider==="generic_ssh")mr=`git@${new URL(lt.host).hostname}:${et.repositoryFullName}.git`;if(!mr)mr=new URL(`/${et.repositoryFullName}.git`,lt.host.endsWith("/")?lt.host:`${lt.host}/`).href;let Se=et.deployKeyId?Ke.getDeployKey(et.deployKeyId):void 0,Vt=Se&&et.deployKeyId?{...Se,privateKey:Ke.getDeployPrivateKey(et.deployKeyId)}:void 0;if(["github","gitlab","bitbucket","gitea"].includes(lt.provider)&&_.target.previewId){let Do=ot(lt,Ke.getCredential(lt.id)),ce=Zt.previews.getInstance(_.target.previewId);Mr=async(mn,Tc)=>{try{await Do.setCommitStatus(et.repositoryFullName,String(Oe.commitSha),{state:mn,url:ce?.url,description:Tc})}catch(Oo){Ne.log(`Could not publish source status: ${Oo instanceof Error?Oo.message:String(Oo)}`,{stream:"stderr"})}},await Mr("pending",`Preview deployment started for ${String(Oe.commitSha).slice(0,12)}`)}bt=km(Tt(yl(),"ts-cloud-queued-source-")),Ne.log(`Checking out immutable source commit ${Oe.commitSha}.`,{stream:"system"}),Qe=(await ya({remote:mr,binding:et,destination:Tt(bt,"checkout"),ref:String(Oe.branch??et.defaultBranch),commitSha:String(Oe.commitSha)},{credential:Ke.getCredential(lt.id),deployKey:Vt})).directory}if(Ne.operation.kind!=="preview.destroy"){let et=_.target.previewId?Zt.previews.getInstance(_.target.previewId):void 0,lt=et?Zt.previews.getDefinition(et.definitionId):void 0,Pr=Ne.operation.resourceId?y.store.getResource(Ne.operation.resourceId):void 0;if(B=await tn.resolve({projectId:y.project.id,environmentId:Ne.operation.environmentId,resourceId:Ne.operation.resourceId,functionId:Pr?.kind==="function"?Pr.id:void 0,previewId:et?.id,trustedPreview:!!et&&!et.fork,allowedPreviewSecrets:lt?.inheritedSecrets}),B.warnings.some((mr)=>mr.code==="missing_required"))throw Error(`Required deployment configuration is unavailable: ${B.warnings.filter((mr)=>mr.code==="missing_required").map((mr)=>mr.key).join(", ")}`);if(Ne.operation.resourceId)for(let mr of Object.values(B.entries))wi.setDependency({entryId:mr.id,resourceId:Ne.operation.resourceId,injectionTarget:"environment",required:mr.required,requiresRedeploy:!0});Ne.log(`Resolved configuration ${B.configurationHash.slice(0,18)} for ${Object.keys(B.values).length} keys.`,{stream:"system"})}let tr=await wm(_,{cwd:Qe,cliEntry:u,signal:Ne.signal,env:B?.values,onOutput:(et,lt)=>Ne.log(lt,{stream:et,step:"execute",secrets:[...hw,...Object.entries(B?.entries??{}).filter(([,Pr])=>Pr.kind==="secret").map(([Pr])=>B.values[Pr]).filter(Boolean)]})});if(tr.ok&&Ne.operation.resourceId&&B)for(let et of Object.values(B.entries))wi.setDependency({entryId:et.id,resourceId:Ne.operation.resourceId,injectionTarget:"environment",required:et.required,requiresRedeploy:!1,lastDeployedVersion:et.version});return await Mr?.(tr.ok?"success":"failure",tr.ok?`Preview is ready at ${String(Oe?.commitSha).slice(0,12)}`:`Preview deployment failed at ${String(Oe?.commitSha).slice(0,12)}`),tr}catch(tr){throw await Mr?.("error",`Preview deployment could not complete at ${String(Oe?.commitSha).slice(0,12)}`),tr}finally{if(bt)Po(bt,{recursive:!0,force:!0})}}}),...$u({store:kr,executor:yw}),...Fu({store:qt,secrets:ii,resolveAdapter:Em}),...Hu(Us,Yn.drivers),...Vu(Zi,[new ja("aws","AWS regional execution requires an injected AwsRegionalTransport; topology and plans were preserved without provider mutation.")]),...Wu({store:si,cleanup:Pm}),...Dd(Sl,wl),...mg({store:or,queue:Dt,resolveSource:uw,resolveDestination:pw,validateHealth:async(_,Ne)=>{if(!_.healthCheckId)return{healthy:!0,mode:"adapter"};let ze=Xe.getHealthCheck(_.healthCheckId);if(!ze||ze.projectId!==_.projectId)return{healthy:!1,error:"Configured restore health check was not found."};let Oe=await new Je(Xe).runAndEvaluate(ze);return{healthy:Oe.result.status==="healthy",healthCheckId:ze.id,healthResultId:Oe.result.id,target:Ne}}}),...fu({store:y.store,resolveDriver:e.releaseDriver??((_)=>({name:`${y.store.getResource(_.resourceId)?.provider??"provider"} release driver`,capability:()=>({strategy:_.strategy,supported:!1,explanation:"This dashboard process has no immutable activation driver configured for the target provider.",capacityMultiplier:1,costImpact:"none",rollback:"The previous release remains preserved; configure a release driver before retrying."}),activate:async()=>{throw Error("Immutable activation driver is not configured")},rollback:async()=>{throw Error("Immutable rollback driver is not configured")}})),resolveHealthGate:async(_,Ne)=>{let ze=Xe.listHealthChecks(Ne.projectId,Ne.environmentId).find((Qe)=>Qe.enabled&&Qe.name===_&&(!Qe.resourceId||Qe.resourceId===Ne.resourceId));if(!ze)return{healthy:!1,message:`Named health gate ${_} was not found for this release.`};let Oe=await new Je(Xe).runAndEvaluate(ze);return{healthy:Oe.result.status==="healthy",evidence:{healthCheckId:ze.id,healthResultId:Oe.result.id,status:Oe.result.status,timings:Oe.result.timings},message:Oe.result.message}}})},{parallelism:e.queueParallelism??(Number(process.env.TS_CLOUD_QUEUE_PARALLELISM)||8),onError:(_)=>console.error("ts-cloud deployment queue worker failed:",_)}):void 0;if(Du(y),fs(nt,ue(y,String(R)),O),kt)Cs(y,kt.users),zb(_e,y,kt.users);let Ht=Lb({cwd:t,enabled:Ce,secret:gt,authentication:_e,authorization:{store:y.store,organizationId:y.organization.id,projectId:y.project.id,defaultEnvironment:String(R)}}),sr=new wa,jm=setInterval(()=>sr.sweep(),60000);jm.unref?.();let Ac=new bc,El=new bc(3,900000,900000),Cc=new bc(8,900000,900000),Bm=setInterval(()=>Ac.prune(),300000),Mm=setInterval(()=>El.prune(),300000),Lm=setInterval(()=>Cc.prune(),300000);if(Bm.unref?.(),Mm.unref?.(),Lm.unref?.(),Ce){if(kt?.generated)console.warn(`
677
677
  ts-cloud dashboard: created the first admin.
678
678
  username: ${kt.generated.username}
679
679
  password: ${kt.generated.password}
680
680
  Saved (hashed) to ${jb()}. This password is shown once.
681
681
  `)}else console.warn(" ts-cloud dashboard: authentication is DISABLED (TS_CLOUD_DASHBOARD_AUTH=0). Every request runs as an admin.");let Ri=r!=="127.0.0.1"&&r!=="localhost",Rl=(_)=>O_("sha256").update(`${gt}:${_}`).digest("hex").slice(0,16),vw=ba({controlPlane:y.store,identities:ht,sources:Ke,applications:{drafts:Br,artifacts:_o,registries:Qn}}),Fm=(_)=>_.headers.get("user-agent")?.trim().slice(0,256)||void 0,Pc=(_,Ne,ze,Oe="local")=>_e.createSession({identityId:_,authMethod:Oe,userAgent:Fm(Ne),networkHint:Rl(ze)}),Ue=(_)=>{let Ne=y.store.getActorByExternalId("user",`dashboard:${_.username.toLowerCase()}`),ze=Ne?y.store.getMembershipForActor(y.organization.id,Ne.id):void 0;return{actor:Ne,membership:ze,grants:ze?y.store.listGrants(ze.id):[]}},To=(_,Ne,ze)=>{if(_.role==="admin")return!0;let Oe=y.store.getOperation(Ne),Qe=Ue(_);if(!Oe||!Qe.membership)return!1;let bt=Oe.resourceId?{type:"resource",id:Oe.resourceId}:Oe.environmentId?{type:"environment",id:Oe.environmentId}:Oe.projectId?{type:"project",id:Oe.projectId}:{type:"organization"},B=y.store.resolveAuthorizationTarget(y.organization.id,bt);return!!B&&x({membership:Qe.membership,grants:Qe.grants,capability:ze,target:B}).allowed},Rr=(_,Ne,ze)=>{if(_.role==="admin")return!0;let Oe=Ue(_);if(!Oe.membership)return!1;let Qe=y.store.resolveAuthorizationTarget(y.organization.id,{type:"resource",id:Ne});return!!Qe&&x({membership:Oe.membership,grants:Oe.grants,capability:ze,target:Qe}).allowed},qs=(_,Ne,ze)=>{if(_.role==="admin")return!0;let Oe=Ue(_);if(!Oe.membership)return!1;let Qe=y.store.resolveAuthorizationTarget(y.organization.id,{type:"environment",id:Ne});return!!Qe&&x({membership:Oe.membership,grants:Oe.grants,capability:ze,target:Qe}).allowed},_c=(_,Ne)=>{if(_.role==="admin")return!0;let ze=Ue(_);if(!ze.membership)return!1;let Oe=y.store.resolveAuthorizationTarget(y.organization.id,{type:"organization"});return!!Oe&&x({membership:ze.membership,grants:ze.grants,capability:Ne,target:Oe}).allowed},xo=Bun.serve({hostname:r,port:a,idleTimeout:30,websocket:{open(_){if(!se){_.send(`The web terminal is disabled (TS_CLOUD_DASHBOARD_TERMINAL=0).\r
682
- `),_.close();return}let Ne=NS((ze)=>_.send(ze),{cwd:t,onExit:()=>{try{_.close()}catch{}}});W.set(_,Ne),_.send(`Connected to ${r==="127.0.0.1"?"localhost":r} shell. This is a line-oriented shell (no full-screen apps).\r
682
+ `),_.close();return}let Ne=OS((ze)=>_.send(ze),{cwd:t,onExit:()=>{try{_.close()}catch{}}});W.set(_,Ne),_.send(`Connected to ${r==="127.0.0.1"?"localhost":r} shell. This is a line-oriented shell (no full-screen apps).\r
683
683
  `)},message(_,Ne){W.get(_)?.write(typeof Ne==="string"?Ne:new TextDecoder().decode(Ne))},close(_){W.get(_)?.close(),W.delete(_)}},async fetch(_,Ne){let ze=Date.now(),Oe=_.clone(),Qe=_.headers.get("x-request-id")?.slice(0,128)||crypto.randomUUID(),bt=!["GET","HEAD","OPTIONS"].includes(_.method.toUpperCase()),B=new URL(_.url),tr=await(async()=>{let et=Ne??xo,lt=G_(r,et.port??a),Pr=await vw(_,Rl(et.requestIP(_)?.address??"unknown"));if(Pr)return Pr;let mr=B.searchParams.get("env"),Se=Y_(k,R,mr),Vt=M.get(Se);if(!Vt)Vt=await he(Se);try{if(!tT(_))return C({ok:!1,error:"Cross-site requests are not allowed."},403);let eo=/^\/api\/source\/webhooks\/([A-Za-z0-9_-]{16,200})$/.exec(B.pathname);if(eo&&_.method==="POST"){let w=await Iu({sources:Ke,controlPlane:y.store,endpointToken:eo[1],headers:_.headers,rawBody:new Uint8Array(await _.arrayBuffer())});return C({accepted:w.accepted,duplicate:w.duplicate,status:w.status,operationIds:w.operations.map((E)=>E.id),message:w.message},w.accepted?202:404)}let Do=/^\/auth\/oidc\/([a-z0-9-]+)\/(start|callback)$/.exec(B.pathname);if(Do&&_.method==="GET"){let[,w,E]=Do;if(!lt)return new Response(null,{status:302,headers:{location:"/login?sso_error=configuration"}});if(E==="start")try{let N=await ga(_e,w,lt,B.searchParams.get("return")??void 0,e.oidcFetch);return new Response(null,{status:302,headers:{location:N.authorizationUrl,"cache-control":"no-store"}})}catch(N){return y.store.appendEvent({organizationId:y.organization.id,type:"auth.oidc.start_failed",level:"warning",payload:{provider:w,reason:N instanceof Error?N.message.slice(0,200):"unknown"}}),new Response(null,{status:302,headers:{location:"/login?sso_error=start","cache-control":"no-store"}})}try{if(B.searchParams.has("error")){let H=_e.getOidcProviderBySlug(w),V=B.searchParams.get("state");if(H&&V)_e.consumeOidcTransaction(H.id,V);throw Error("OIDC provider returned an authorization error")}let N=await pa(_e,{providerSlug:w,state:B.searchParams.get("state")??"",code:B.searchParams.get("code")??"",origin:lt},e.oidcFetch),j=Ub(_e,y,t,N.identity);_e.recordLogin(j.identity.id);let q=Pc(j.identity.id,_,et.requestIP(_)?.address??"unknown","oidc");return Ze(),y.store.appendEvent({organizationId:y.organization.id,actorId:j.identity.actorId,type:"auth.login.succeeded",payload:{method:"oidc",provider:w,provisioned:j.provisioned}}),new Response(null,{status:302,headers:{location:N.returnPath,"cache-control":"no-store","set-cookie":Ns(q.token,{secure:Ri,maxAgeMs:it})}})}catch(N){return y.store.appendEvent({organizationId:y.organization.id,type:"auth.oidc.callback_failed",level:"warning",payload:{provider:w,reason:N instanceof Error?N.message.slice(0,200):"unknown"}}),new Response(null,{status:302,headers:{location:"/login?sso_error=callback","cache-control":"no-store"}})}}if(B.pathname==="/api/invitations/accept"&&_.method==="POST"){let w=await X(_),E=String(w.token??"").trim(),N=String(w.username??"").trim(),j=String(w.password??"");if(!E||!rl(N)||j.length<12)return C({ok:!1,error:"Invitation token, valid username, and a password of at least 12 characters are required."},422);let q=y.store.inspectInvitationToken(E);if(!q||q.state!=="pending")return C({ok:!1,error:q?`Invitation is ${q.state}`:"Invitation is invalid"},q?409:404);let H=Fn(en(t),N),V=_e.getIdentityByUsername(N);if(H&&!Gn(j,V?.passwordHash??H.passwordHash))return C({ok:!1,error:"That username already exists; enter its current password to continue."},401);let Y=_e.getIdentityByEmail(q.email);if(Y&&Y.id!==V?.id)return C({ok:!1,error:"This invitation belongs to an existing account. Sign in with that account or ask an owner to resend it."},409);let fe=yc(t,{username:N,password:H?void 0:j,name:typeof w.name==="string"?w.name:void 0,email:q.email,sites:H?.sites??{}}),de=v(y.store,fe.user);try{let Ye=y.store.acceptInvitation(E,de.id),ke=V?_e.setVerifiedEmail(V.id,Ye.invitation.email):_e.createIdentity({actorId:de.id,username:fe.user.username,email:Ye.invitation.email,emailVerified:!0,passwordHash:fe.user.passwordHash}),Ve=Pc(ke.id,_,et.requestIP(_)?.address??"unknown");return Ze(),C({ok:!0,user:js(fe.user),organization:y.organization,membership:Ye.membership},200,{"set-cookie":Ns(Ve.token,{secure:Ri,maxAgeMs:it})})}catch(Ye){if(!H)am(t,fe.user.username);let ke=Ye instanceof Error?Ye.message:"Invitation could not be accepted.";return C({ok:!1,error:ke},ke.includes("expired")||ke.includes("revoked")||ke.includes("accepted")?409:404)}}if(B.pathname==="/api/auth/password-reset/request"&&_.method==="POST"){let w=await X(_),E=String(w.identifier??"").trim().toLowerCase(),N=et.requestIP(_)?.address??"unknown",j=El.check(E,N),q=E.includes("@")?_e.getIdentityByEmail(E):_e.getIdentityByUsername(E);if(j.allowed)El.recordFailure(E,N);if(j.allowed&&q?.email&&q.emailVerifiedAt&&!q.disabledAt){_e.revokeActionTokens(q.id,"password_reset");let H=_e.createActionToken(q.id,"password_reset"),V=`${B.origin}/reset-password?token=${encodeURIComponent(H.token)}`,Y=await yn(f,{to:q.email,subject:"Reset your ts-cloud password",text:`Reset your ts-cloud password: ${V}
684
684
 
685
685
  This link expires in one hour and can be used once.`});y.store.appendEvent({organizationId:y.organization.id,actorId:q.actorId,type:"auth.password_reset.requested",payload:{delivered:Y}})}return C({ok:!0,message:"If that account has a verified email, a reset link has been sent."},202)}if(B.pathname==="/api/auth/password-reset/complete"&&_.method==="POST"){let w=await X(_),E=String(w.token??"").trim(),N=String(w.password??"");if(!E||N.length<12)return C({ok:!1,error:"A valid reset token and password of at least 12 characters are required."},422);try{let j=_e.consumeActionToken(E,"password_reset"),q=Ji(N),H=_e.updatePassword(j.identityId,q);return ol(t,H.username,q),y.store.appendEvent({organizationId:y.organization.id,actorId:H.actorId,type:"auth.password_reset.completed"}),C({ok:!0,message:"Password changed. Sign in again."},200,{"set-cookie":tl({secure:Ri})})}catch(j){let q=j instanceof Error?j.message:"Password reset failed.";return C({ok:!1,error:q.replace("Action token","Reset link")},q.includes("consumed")||q.includes("expired")?409:404)}}if(B.pathname==="/api/login"&&_.method==="POST"){let w=await X(_),E=String(w.username??"").trim(),N=String(w.password??""),j=et.requestIP(_)?.address??"unknown",q=Ac.check(E,j);if(!q.allowed)return C({ok:!1,error:`Too many failed attempts. Try again in ${Math.ceil((q.retryAfterSeconds??0)/60)} minute(s).`},429,{"retry-after":String(q.retryAfterSeconds??60)});let H=Fn(en(t),E),V=_e.getIdentityByUsername(E),Y=V?.passwordHash??H?.passwordHash??J_;if(!(Gn(N,Y)&&!!H&&!!V&&!V.disabledAt))return Ac.recordFailure(E,j),C({ok:!1,error:"Incorrect username or password."},401);if(qb(_e,y,V))return C({ok:!1,error:"Single sign-on is required for this account."},403);Ac.recordSuccess(E,j);let de=V,Ye=de.requiresPasswordUpgrade||rb(de.passwordHash);if(Ye){let Ve=Ji(N);de=_e.rehashPassword(de.id,Ve),ol(t,de.username,Ve)}if(_e.recordLogin(de.id),_e.getMfaFactor(de.id)?.state==="active"){let Ve=_e.createMfaChallenge(de.id,"login");return y.store.appendEvent({organizationId:y.organization.id,actorId:de.actorId,type:"auth.mfa.challenge.created",payload:{purpose:"login"}}),C({ok:!0,mfaRequired:!0,challengeToken:Ve.token,passwordUpgraded:Ye})}let ke=Pc(de.id,_,j);return y.store.appendEvent({organizationId:y.organization.id,actorId:de.actorId,type:"auth.login.succeeded",payload:{method:"local"}}),C({ok:!0,user:js(H),passwordUpgraded:Ye},200,{"set-cookie":Ns(ke.token,{secure:Ri,maxAgeMs:it})})}if(B.pathname==="/api/auth/mfa/complete"&&_.method==="POST"){let w=await X(_),E=String(w.challengeToken??"").trim(),N=String(w.code??"").trim(),j=et.requestIP(_)?.address??"unknown",H=_e.inspectMfaChallengeToken(E,"login")?.identityId??"unknown-mfa",V=Cc.check(H,j);if(!V.allowed)return C({ok:!1,error:"Too many MFA attempts. Try again later."},429,{"retry-after":String(V.retryAfterSeconds??60)});try{let Y=_e.completeMfaChallenge(E,N,"login");Cc.recordSuccess(H,j);let fe=new Date().toISOString(),de=_e.createSession({identityId:Y.identity.id,userAgent:Fm(_),networkHint:Rl(j),mfaAt:fe,recentAuthAt:fe});return y.store.appendEvent({organizationId:y.organization.id,actorId:Y.identity.actorId,type:"auth.mfa.succeeded",payload:{purpose:"login",method:Y.method}}),C({ok:!0},200,{"set-cookie":Ns(de.token,{secure:Ri,maxAgeMs:it})})}catch{return Cc.recordFailure(H,j),C({ok:!1,error:"Authenticator or recovery code is incorrect."},401)}}if(B.pathname==="/api/logout"&&_.method==="POST"){let w=Ht.resolveSession(_);if(w)_e.revokeSession(w.identityId,w.id);let E=tl({secure:Ri});if(_.headers.get("accept")?.includes("text/html"))return new Response(null,{status:302,headers:{location:"/login","set-cookie":E}});return C({ok:!0},200,{"set-cookie":E})}if(B.pathname==="/login"){let w=_e.listOidcProviders(y.organization.id).map((E)=>({slug:E.slug,name:E.name}));return new Response(Vb(O?.mode==="serverless",w),{headers:{"content-type":"text/html; charset=utf-8"}})}if(B.pathname==="/forgot-password"||B.pathname==="/reset-password")return new Response(Wb(B.pathname==="/reset-password"?"reset":"request"),{headers:{"content-type":"text/html; charset=utf-8"}});if(B.pathname==="/accept-invitation")return iw(rt,B.pathname);let ce=Ht.resolveUser(_);if(!ce){if(!B.pathname.startsWith("/api/")&&_.headers.get("accept")?.includes("text/html"))return new Response(null,{status:302,headers:{location:"/login"}});return C({ok:!1,error:"Sign in to continue."},401)}let mn=Bt(ce,Se);if(B.pathname==="/api/me"){let w=y.store.getActorByExternalId("user",`dashboard:${ce.username.toLowerCase()}`),E=w?y.store.getMembershipForActor(y.organization.id,w.id):void 0,N=y.store.resolveAuthorizationTarget(y.organization.id,E?.scope??{type:"project",id:y.project.id})??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id});return C({ok:!0,user:js(ce),authEnabled:Ce,organization:y.organization,membership:E,capabilities:nr({membership:E,grants:E?y.store.listGrants(E.id):[],target:N})})}if(B.pathname.startsWith("/api/")){let w=await Fb(_,B.pathname),E=Ht.check(_,B.pathname,ce,w);if(!E.ok)return C({ok:!1,error:E.error},E.status??403);if(Ce&&iT.has(`${_.method.toUpperCase()} ${B.pathname}`)){let N=Ht.resolveSession(_);if(!N||!_e.isRecentlyAuthenticated(N))return C({ok:!1,error:"Recent authentication is required for this change.",stepUpRequired:!0},401)}}if(B.pathname==="/api/auth/security"&&_.method==="GET"){let w=Ue(ce),E=w.actor?_e.getIdentityByActor(w.actor.id):void 0,N=Ht.resolveSession(_);return C({identity:E?{username:E.username,email:E.email,emailVerifiedAt:E.emailVerifiedAt,requiresPasswordUpgrade:E.requiresPasswordUpgrade,lastLoginAt:E.lastLoginAt}:void 0,currentSessionId:N?.id,sessions:E?_e.listSessions(E.id,{includeInactive:!0}):[],mfa:E?{factor:_e.getMfaFactor(E.id),recoveryCodesRemaining:_e.remainingRecoveryCodes(E.id)}:void 0})}if(B.pathname==="/api/auth/oidc/providers"&&_.method==="GET")return C({providers:_e.listOidcProviders(y.organization.id,{includeDisabled:!0}),callbackOrigin:lt,callbackPattern:lt?`${lt}/auth/oidc/{slug}/callback`:void 0,localOwnerRecovery:!0});if(B.pathname==="/api/auth/oidc/providers"&&_.method==="POST"){let w=await X(_),E=Ue(ce),N=E.actor?_e.getIdentityByActor(E.actor.id):void 0,j=w.enforceSso===!0;if(j&&(!N?.emailVerifiedAt||_e.remainingRecoveryCodes(N.id)<1))return C({ok:!1,error:"Verify the owner email and generate MFA recovery codes before enforcing SSO."},409);try{let q=pl(w.defaultRole),H=_e.upsertOidcProvider({id:typeof w.id==="string"?w.id:void 0,organizationId:y.organization.id,slug:String(w.slug??""),name:String(w.name??""),issuer:String(w.issuer??""),clientId:String(w.clientId??""),clientSecret:typeof w.clientSecret==="string"&&w.clientSecret?w.clientSecret:void 0,scopes:Array.isArray(w.scopes)?w.scopes.map(String):void 0,allowedDomains:Array.isArray(w.allowedDomains)?w.allowedDomains.map(String):[],defaultRole:q&&q!=="owner"?q:void 0,enabled:w.enabled!==!1,enforceSso:j});return y.store.appendEvent({organizationId:y.organization.id,actorId:E.actor?.id,type:"auth.oidc.provider.configured",payload:{providerId:H.id,issuer:H.issuer,enabled:H.enabled,enforceSso:H.enforceSso}}),C({ok:!0,provider:H})}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"OIDC provider could not be saved."},422)}}if(B.pathname==="/api/auth/oidc/providers"&&_.method==="PATCH"){let w=await X(_),E=_e.getOidcProvider(String(w.id??""));if(!E||E.organizationId!==y.organization.id)return C({ok:!1,error:"OIDC provider was not found."},404);let N=Ue(ce),j=_e.setOidcProviderEnabled(E.id,w.enabled===!0);return y.store.appendEvent({organizationId:y.organization.id,actorId:N.actor?.id,type:j.enabled?"auth.oidc.provider.enabled":"auth.oidc.provider.disabled",payload:{providerId:E.id}}),C({ok:!0,provider:j})}if(B.pathname==="/api/automation"&&_.method==="GET"){let w=ht.listServiceAccounts(y.organization.id,{includeDisabled:!0}).map((E)=>{let N=y.store.getMembershipForActor(y.organization.id,E.actorId),j=E.createdByActorId?y.store.getActor(E.createdByActorId):void 0,q=ht.listTokens(E.id,{includeInactive:!0}).map((H)=>({...H,createdBy:H.createdByActorId?y.store.getActor(H.createdByActorId):void 0}));return{account:E,createdBy:j,membership:N,tokens:q}});return C({accounts:w,apiBaseUrl:`${B.origin}/api/v1`,openApiUrl:`${B.origin}/api/v1/openapi.json`,tokenEnvironmentVariable:"TS_CLOUD_API_TOKEN"})}if(B.pathname==="/api/automation/service-accounts"&&_.method==="POST"){let w=await X(_),E=Ue(ce),N=pl(w.roleTemplate),j=kc(w);if(!E.actor||!N||N==="owner"||!j)return C({ok:!1,error:"A non-owner role and valid organization scope are required."},422);try{let q=ht.createServiceAccount({organizationId:y.organization.id,slug:String(w.slug??""),name:String(w.name??""),description:typeof w.description==="string"?w.description:void 0,roleTemplate:N,scope:j,createdByActorId:E.actor.id});return C({ok:!0,...q},201)}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"Service account could not be created."},422)}}if(B.pathname==="/api/automation/service-accounts"&&_.method==="PATCH"){let w=await X(_),E=Ue(ce),N=ht.getServiceAccount(String(w.id??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Service account was not found."},404);return C({ok:!0,account:ht.disableServiceAccount(N.id,E.actor?.id)})}if(B.pathname==="/api/automation/tokens"&&_.method==="POST"){let w=await X(_),E=Ue(ce),N=ht.getServiceAccount(String(w.serviceAccountId??"")),j=kc(w);if(!E.actor||!N||N.organizationId!==y.organization.id||!j||!Array.isArray(w.capabilities))return C({ok:!1,error:"Service account, explicit capabilities, and valid scope are required."},422);try{let q=ht.createToken({serviceAccountId:N.id,name:String(w.name??"API token"),capabilities:w.capabilities.map(String),scope:j,expiresAt:typeof w.expiresAt==="string"?w.expiresAt:void 0,createdByActorId:E.actor.id});return C({ok:!0,token:q.token,secret:q.secret,revealOnce:!0},201)}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"API token could not be created."},422)}}if(B.pathname==="/api/automation/tokens/rotate"&&_.method==="POST"){let w=await X(_),E=Ue(ce),N=ht.getToken(String(w.id??"")),j=N?ht.getServiceAccount(N.serviceAccountId):void 0;if(!E.actor||!N||j?.organizationId!==y.organization.id)return C({ok:!1,error:"API token was not found."},404);try{let q=ht.rotateToken(N.id,E.actor.id);return C({ok:!0,token:q.token,secret:q.secret,revealOnce:!0,overlap:!0},201)}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"API token could not be rotated."},409)}}if(B.pathname==="/api/automation/tokens"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce),N=ht.getToken(String(w.id??"")),j=N?ht.getServiceAccount(N.serviceAccountId):void 0;if(!N||j?.organizationId!==y.organization.id)return C({ok:!1,error:"API token was not found."},404);return C({ok:!0,token:ht.revokeToken(N.id,E.actor?.id)})}if(B.pathname==="/api/onboarding"&&_.method==="GET"){let w=Ke.listConnections(y.organization.id);return C({drafts:Br.list(y.project.id),artifacts:_o.list(y.project.id),registries:Qn.list(y.organization.id),sourceConnections:w,repositories:w.flatMap((E)=>Ke.listRepositories(E.id)),project:{id:y.project.id,slug:y.project.slug,name:y.project.name},environments:[...y.environments.values()].map((E)=>({id:E.id,slug:E.slug,name:E.name,kind:E.kind,region:E.region})),resources:y.store.listResources(y.project.id).filter((E)=>E.kind==="application").map((E)=>({id:E.id,slug:E.slug,name:E.name,environmentId:E.environmentId}))})}if(B.pathname==="/api/onboarding/detect"&&_.method==="POST"){let w=await X(_);try{if(w.source?.kind==="git"){let j=Ke.getConnection(String(w.source.connectionId??"")),q=Ke.getRepository(String(w.source.repositoryId??""));if(!j||j.organizationId!==y.organization.id||!q||q.connectionId!==j.id)throw Error("Authorized Git repository was not found");let H=typeof w.source.deployKeyId==="string"?Ke.getDeployKey(w.source.deployKeyId):void 0;if(H&&H.connectionId!==j.id)throw Error("Deploy key does not belong to this connection");let V=km(Tt(yl(),"ts-cloud-onboarding-git-"));try{let Y=await ya({remote:q.cloneUrl,destination:Tt(V,"checkout"),ref:String(w.source.ref??q.defaultBranch),sparsePaths:Array.isArray(w.source.sparsePaths)?w.source.sparsePaths.map(String):void 0,binding:{id:"detection",projectId:y.project.id,connectionId:j.id,repositoryId:q.id,repositoryFullName:q.fullName,defaultBranch:q.defaultBranch,monorepoRoot:String(w.source.monorepoRoot??"."),includePaths:[],excludePaths:[],submodules:w.source.submodules===!0,cloneDepth:1,deployKeyId:H?.id,autoDeploy:!1,pullRequestPreviews:!1,status:"active",version:1,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}},{credential:Ke.getCredential(j.id),deployKey:H?{...H,privateKey:Ke.getDeployPrivateKey(H.id)}:void 0,timeoutMs:120000});return C({ok:!0,commitSha:Y.commitSha,candidates:Yo(Rp(Y.directory))})}finally{Po(V,{recursive:!0,force:!0})}}if(Array.isArray(w.files)){if(w.files.length>1e4)throw Error("Detection file-count limit exceeded");let j=w.files.map((q)=>({path:String(q.path??""),size:Number(q.size??0),content:typeof q.content==="string"?q.content.slice(0,262144):void 0}));return C({ok:!0,candidates:Yo(j)})}let E=B_(t,String(w.root??".")),N=j_(t,E);if(N===".."||N.startsWith(`..${M_}`))throw Error("Detection root must stay inside the project");return C({ok:!0,candidates:Yo(Rp(E))})}catch(E){return C({ok:!1,error:E instanceof Error?E.message:"Application detection failed."},422)}}if(B.pathname==="/api/onboarding/plan"&&_.method==="POST"){let w=await X(_);try{return C({ok:!0,plan:Wn(w.draft,Array.isArray(w.suppliedSecretNames)?w.suppliedSecretNames.map(String):[])})}catch(E){return C({ok:!1,error:E instanceof Error?E.message:"Application plan could not be generated."},422)}}if(B.pathname==="/api/onboarding/drafts"&&_.method==="POST"){let w=await X(_),E=Ue(ce);try{return C({ok:!0,draft:Br.create({organizationId:y.organization.id,projectId:y.project.id,name:String(w.name??w.draft?.name??"Application draft"),draft:{...w.draft,projectId:y.project.id},step:w.step,suppliedSecretNames:Array.isArray(w.suppliedSecretNames)?w.suppliedSecretNames.map(String):[],actorId:E.actor?.id})},201)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Application draft could not be saved."},422)}}if(B.pathname==="/api/onboarding/drafts"&&_.method==="PATCH"){let w=await X(_),E=Ue(ce),N=Br.get(String(w.id??""));if(!N||N.projectId!==y.project.id)return C({ok:!1,error:"Application draft was not found."},404);try{return C({ok:!0,draft:Br.update(N.id,Number(w.version),{draft:{...w.draft,projectId:y.project.id},step:w.step,suppliedSecretNames:Array.isArray(w.suppliedSecretNames)?w.suppliedSecretNames.map(String):void 0,actorId:E.actor?.id})})}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Application draft could not be updated."},409)}}if(B.pathname==="/api/onboarding/artifacts"&&_.method==="POST"){let w=Ue(ce);if(Number(_.headers.get("content-length")??0)>104857600)return C({ok:!1,error:"Artifact exceeds the 100 MB upload limit."},413);try{let N=new Uint8Array(await _.arrayBuffer());return C({ok:!0,artifact:_o.create({organizationId:y.organization.id,projectId:y.project.id,filename:_.headers.get("x-artifact-filename")??"application.zip",bytes:N,actorId:w.actor?.id})},201)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Artifact could not be inspected."},422)}}if(B.pathname==="/api/onboarding/registries"&&_.method==="POST"){let w=await X(_),E=Ue(ce);try{return C({ok:!0,registry:Qn.create({organizationId:y.organization.id,provider:w.provider,name:String(w.name??"Container registry"),host:String(w.host??""),credential:w.token||w.password?{username:typeof w.username==="string"?w.username:void 0,password:typeof w.password==="string"?w.password:void 0,token:typeof w.token==="string"?w.token:void 0}:void 0,credentialExpiresAt:typeof w.credentialExpiresAt==="string"?w.credentialExpiresAt:void 0,actorId:E.actor?.id})},201)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Registry connection could not be created."},422)}}if(B.pathname==="/api/onboarding/registries"&&_.method==="PATCH"){let w=await X(_),E=Ue(ce),N=Qn.get(String(w.id??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Registry connection was not found."},404);try{if(w.action==="test")return C({ok:!0,registry:await Qn.test(N.id,{image:typeof w.image==="string"?w.image:void 0})});if(w.action==="rotate")return C({ok:!0,registry:Qn.rotate(N.id,{username:typeof w.username==="string"?w.username:void 0,password:typeof w.password==="string"?w.password:void 0,token:typeof w.token==="string"?w.token:void 0},{expiresAt:typeof w.expiresAt==="string"?w.expiresAt:void 0,actorId:E.actor?.id})});return C({ok:!1,error:"Registry action must be test or rotate."},422)}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Registry connection could not be updated."},422)}}if(B.pathname==="/api/onboarding/registries"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce),N=Qn.get(String(w.id??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Registry connection was not found."},404);let j=Br.list(y.project.id).filter((q)=>q.input.source.kind==="image"&&q.input.source.registryConnectionId===N.id||q.input.build.kind==="prebuilt_image"&&q.input.build.registryConnectionId===N.id);if(w.preview===!0)return C({ok:!0,preview:!0,affectedDrafts:j});return C({ok:!0,registry:Qn.disconnect(N.id,E.actor?.id),affectedDrafts:j})}if(B.pathname==="/api/onboarding/apply"&&_.method==="POST"){let w=await X(_),E=Ue(ce);try{let N=hd({controlPlane:y.store,drafts:Br,draftId:String(w.id??""),expectedVersion:Number(w.version),confirmEnvironment:String(w.confirmEnvironment??""),actorId:E.actor?.id});return C({ok:!0,resource:N.resource,operation:N.operation,plan:N.plan},202)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Application plan could not be applied."},422)}}if(B.pathname==="/api/sources"&&_.method==="GET"){let w=Ke.listConnections(y.organization.id);return C({connections:w,bindings:Ke.listBindings({projectId:y.project.id}),repositories:w.flatMap((E)=>Ke.listRepositories(E.id)),deployKeys:w.flatMap((E)=>Ke.listDeployKeys(E.id)),webhooks:w.flatMap((E)=>Ke.listWebhooks(E.id)).map((E)=>({...E,deliveries:Ke.listDeliveries(E.id,20)})),project:{id:y.project.id,slug:y.project.slug},environment:ue(y,String(Se)),resources:y.store.listResources(y.project.id,ue(y,String(Se)).environmentId).filter((E)=>E.kind==="application").map((E)=>({id:E.id,slug:E.slug,name:E.name}))})}if(B.pathname==="/api/sources/connections"&&_.method==="POST"){let w=await X(_),E=Ue(ce),N=String(w.provider??"");if(!["github","gitlab","bitbucket","gitea","generic_https","generic_ssh"].includes(N))return C({ok:!1,error:"A supported Git provider is required."},422);try{let j=N==="github"&&(w.privateKey||w.appId)?{appId:typeof w.appId==="string"?w.appId:void 0,installationId:typeof w.installationId==="string"?w.installationId:void 0,privateKey:typeof w.privateKey==="string"?w.privateKey:void 0}:N!=="generic_ssh"&&w.token?{token:typeof w.token==="string"?w.token:void 0,username:typeof w.username==="string"?w.username:void 0}:void 0,q={github:"https://github.com",gitlab:"https://gitlab.com",bitbucket:"https://bitbucket.org",gitea:"https://gitea.com"},H,V,Y;if(y.store.database.transaction(()=>{if(H=Ke.createConnection({organizationId:y.organization.id,provider:N,name:String(w.name??N),host:String(w.host??q[N]??""),owner:typeof w.owner==="string"?w.owner:void 0,authKind:w.authKind,credential:j,grantedScopes:Array.isArray(w.grantedScopes)?w.grantedScopes.map(String):[],credentialExpiresAt:typeof w.credentialExpiresAt==="string"?w.credentialExpiresAt:void 0,createdByActorId:E.actor?.id}),typeof w.repositoryUrl==="string"&&typeof w.repositoryFullName==="string")V=Ke.upsertRepository({connectionId:H.id,providerRepositoryId:`manual:${w.repositoryFullName}`,fullName:w.repositoryFullName,cloneUrl:w.repositoryUrl,defaultBranch:String(w.defaultBranch??"main"),visibility:"unknown",archived:!1,metadata:{source:"manual"}});if(N==="generic_ssh")Y=Ke.createDeployKey({connectionId:H.id,name:String(w.deployKeyName??"Repository deploy key"),publicKey:String(w.publicKey??""),privateKey:String(w.deployPrivateKey??""),host:String(w.sshHost??""),hostKey:String(w.hostKey??""),actorId:E.actor?.id})})(),w.test===!0)H=await Sa(Ke,H.id,V?.id);return C({ok:!0,connection:H,repository:V,deployKey:Y},201)}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Source connection could not be created."},422)}}if(B.pathname==="/api/sources/connections"&&_.method==="PATCH"){let w=await X(_),E=Ue(ce),N=Ke.getConnection(String(w.id??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Source connection was not found."},404);try{if(w.action==="test")return C({ok:!0,connection:await Sa(Ke,N.id,typeof w.repositoryId==="string"?w.repositoryId:void 0)});if(w.action==="rotate")return C({ok:!0,connection:Ke.rotateCredential(N.id,{token:typeof w.token==="string"?w.token:void 0,username:typeof w.username==="string"?w.username:void 0,appId:typeof w.appId==="string"?w.appId:void 0,installationId:typeof w.installationId==="string"?w.installationId:void 0,privateKey:typeof w.privateKey==="string"?w.privateKey:void 0},{expiresAt:typeof w.expiresAt==="string"?w.expiresAt:void 0,actorId:E.actor?.id})});return C({ok:!1,error:"Connection action must be test or rotate."},422)}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Source connection could not be updated."},422)}}if(B.pathname==="/api/sources/connections"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce),N=Ke.getConnection(String(w.id??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Source connection was not found."},404);let j=Ke.listBindings({connectionId:N.id,status:"active"});if(w.preview===!0)return C({ok:!0,preview:!0,affectedBindings:j});return C({ok:!0,...Ke.disconnectConnection(N.id,E.actor?.id)})}if(B.pathname==="/api/sources/deploy-keys"&&_.method==="POST"){let w=await X(_),E=Ue(ce),N=Ke.getConnection(String(w.connectionId??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Source connection was not found."},404);try{return C({ok:!0,deployKey:Ke.createDeployKey({connectionId:N.id,name:String(w.name??"Repository deploy key"),publicKey:String(w.publicKey??""),privateKey:String(w.privateKey??""),host:String(w.host??""),hostKey:String(w.hostKey??""),actorId:E.actor?.id})},201)}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Deploy key could not be stored."},422)}}if(B.pathname==="/api/sources/deploy-keys"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce),N=Ke.getDeployKey(String(w.id??"")),j=N?Ke.getConnection(N.connectionId):void 0;if(!N||!j||j.organizationId!==y.organization.id)return C({ok:!1,error:"Deploy key was not found."},404);let q=Ke.listBindings({connectionId:j.id}).filter((H)=>H.deployKeyId===N.id);if(w.preview===!0)return C({ok:!0,preview:!0,affectedBindings:q});return C({ok:!0,...Ke.revokeDeployKey(N.id,E.actor?.id)})}if(B.pathname==="/api/sources/repositories/sync"&&_.method==="POST"){let w=await X(_),E=Ke.getConnection(String(w.connectionId??""));if(!E||E.organizationId!==y.organization.id)return C({ok:!1,error:"Source connection was not found."},404);try{return C({ok:!0,repositories:await gs(Ke,String(w.connectionId??""),{search:typeof w.search==="string"?w.search:void 0})})}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Repositories could not be synchronized."},422)}}if(B.pathname==="/api/sources/references"&&_.method==="GET"){let w=Ke.getConnection(String(B.searchParams.get("connectionId")??""));if(!w||w.organizationId!==y.organization.id)return C({ok:!1,error:"Source connection was not found."},404);try{return C(await ps(Ke,{connectionId:String(B.searchParams.get("connectionId")??""),repository:String(B.searchParams.get("repository")??""),repositoryId:B.searchParams.get("repositoryId")??void 0,deployKeyId:B.searchParams.get("deployKeyId")??void 0,type:B.searchParams.get("type")==="tags"?"tags":"branches",cursor:B.searchParams.get("cursor")??void 0}))}catch(E){return C({ok:!1,error:E instanceof Error?E.message:"References could not be listed."},422)}}if(B.pathname==="/api/sources/bindings"&&_.method==="POST"){let w=await X(_),E=Ue(ce),N=ue(y,String(Se)),j=Ke.getConnection(String(w.connectionId??""));if(!j||j.organizationId!==y.organization.id)return C({ok:!1,error:"Source connection was not found."},404);try{return C({ok:!0,binding:Ke.createBinding({projectId:y.project.id,environmentId:N.environmentId,resourceId:typeof w.resourceId==="string"?w.resourceId:void 0,connectionId:String(w.connectionId??""),repositoryId:typeof w.repositoryId==="string"?w.repositoryId:void 0,repositoryFullName:String(w.repositoryFullName??""),defaultBranch:String(w.defaultBranch??"main"),branchRule:typeof w.branchRule==="string"?w.branchRule:void 0,tagRule:typeof w.tagRule==="string"?w.tagRule:void 0,monorepoRoot:String(w.monorepoRoot??"."),includePaths:Array.isArray(w.includePaths)?w.includePaths.map(String):[],excludePaths:Array.isArray(w.excludePaths)?w.excludePaths.map(String):[],submodules:w.submodules===!0,cloneDepth:w.cloneDepth?Number(w.cloneDepth):void 0,deployKeyId:typeof w.deployKeyId==="string"&&w.deployKeyId?w.deployKeyId:void 0,autoDeploy:w.autoDeploy!==!1,pullRequestPreviews:w.pullRequestPreviews!==!1,actorId:E.actor?.id})},201)}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"Source binding could not be created."},422)}}if(B.pathname==="/api/sources/bindings"&&_.method==="PATCH"){let w=await X(_),E=Ue(ce),N=Ke.getBinding(String(w.id??""));if(!N||N.projectId!==y.project.id)return C({ok:!1,error:"Source binding was not found."},404);try{return C({ok:!0,binding:Ke.updateBinding(N.id,Number(w.version),{defaultBranch:w.defaultBranch,branchRule:w.branchRule,tagRule:w.tagRule,monorepoRoot:w.monorepoRoot,includePaths:w.includePaths,excludePaths:w.excludePaths,submodules:w.submodules,cloneDepth:w.cloneDepth,deployKeyId:w.deployKeyId,autoDeploy:w.autoDeploy,pullRequestPreviews:w.pullRequestPreviews,status:w.status,disabledReason:w.disabledReason,actorId:E.actor?.id})})}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Source binding could not be updated."},409)}}if(B.pathname==="/api/sources/webhooks"&&_.method==="POST"){let w=await X(_),E=Ke.getConnection(String(w.connectionId??""));if(!E||E.organizationId!==y.organization.id)return C({ok:!1,error:"Source connection was not found."},404);try{let N=Ke.createWebhook({connectionId:String(w.connectionId??""),repositoryId:typeof w.repositoryId==="string"?w.repositoryId:void 0,repositoryFullName:String(w.repositoryFullName??""),events:Array.isArray(w.events)?w.events.map(String):void 0,secret:typeof w.secret==="string"?w.secret:void 0}),j=process.env.TS_CLOUD_WEBHOOK_BASE_URL?.trim()||lt,q=j?yr(j,N.webhook):void 0,H=w.reconcile!==!1&&j?await In(Ke,N.webhook.id,j):N.webhook;return C({ok:!0,webhook:H,endpoint:q,endpointRevealOnce:!0},201)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Source webhook could not be created."},422)}}if(B.pathname==="/api/sources/webhooks"&&_.method==="PATCH"){let w=await X(_),E=process.env.TS_CLOUD_WEBHOOK_BASE_URL?.trim()||lt,N=Ke.getWebhook(String(w.id??"")),j=N?Ke.getConnection(N.connectionId):void 0;if(!N||!j||j.organizationId!==y.organization.id)return C({ok:!1,error:"Source webhook was not found."},404);if(!E)return C({ok:!1,error:"Set TS_CLOUD_WEBHOOK_BASE_URL to reconcile provider webhooks."},422);try{return C({ok:!0,webhook:await In(Ke,String(w.id??""),E)})}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"Source webhook could not be reconciled."},422)}}if(B.pathname==="/api/sources/webhooks"&&_.method==="DELETE"){let w=await X(_),E=Ke.getWebhook(String(w.id??"")),N=E?Ke.getConnection(E.connectionId):void 0;if(!E||!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Source webhook was not found."},404);try{return C({ok:!0,webhook:await bu(Ke,String(w.id??""))})}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Source webhook could not be removed."},422)}}if(B.pathname==="/api/security/posture"&&_.method==="GET"){let w=ue(y,String(Se)),E=nt.listFindings({...w,limit:500});return C({scope:w,summary:nt.summary(w.organizationId,w.projectId,w.environmentId),findings:E,scans:nt.listScanRuns({...w,limit:100}),policies:nt.listPolicies(w.organizationId).filter((N)=>!N.environmentId||N.environmentId===w.environmentId),waivers:E.flatMap((N)=>nt.listWaivers(N.id)),decisions:nt.listDecisions(w.environmentId,50),actors:y.store.listMemberships(y.organization.id).map((N)=>y.store.getActor(N.actorId)).filter(Boolean)})}if(B.pathname==="/api/security/export"&&_.method==="GET")return C(nt.exportPosture(y.organization.id));if(B.pathname==="/api/security/scan"&&_.method==="POST"){let w=ue(y,String(Se)),E=await new Ot(nt).run(new En,{...w,artifactRoot:t}),N=fs(nt,w,Vt??{});return C({ok:!0,source:E,host:N,summary:nt.summary(w.organizationId,w.projectId,w.environmentId)})}if(B.pathname==="/api/security/review"&&_.method==="POST")try{let w=ue(y,String(Se));return C({ok:!0,...hs(nt,{scope:w,desiredConfigHash:y.project.desiredConfigHash})})}catch(w){return C({ok:!1,error:w instanceof Error?w.message:"Security change review failed."},409)}if(B.pathname==="/api/security/policies"&&_.method==="POST"){let w=await X(_),E=Ue(ce);if(!E.actor)return C({ok:!1,error:"An organization actor is required."},403);try{let N=nt.createPolicy({organizationId:y.organization.id,environmentId:w.environmentId===null?void 0:String(w.environmentId??ue(y,String(Se)).environmentId),name:String(w.name??""),scannerFailMode:w.scannerFailMode==="open"?"open":"closed",requiredScanners:Array.isArray(w.requiredScanners)?w.requiredScanners.map(String):[],rules:Array.isArray(w.rules)?w.rules.map((j)=>({minimumSeverity:String(j.minimumSeverity),action:String(j.action),scannerId:j.scannerId?String(j.scannerId):void 0})):[],actorId:E.actor.id});return C({ok:!0,policy:N},201)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Security policy could not be created."},422)}}if(B.pathname==="/api/security/policies"&&_.method==="PATCH"){let w=await X(_),E=Ue(ce),N=nt.getPolicy(String(w.id??""));if(!E.actor||!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Security policy was not found."},404);try{return C({ok:!0,policy:nt.updatePolicy(N.id,Number(w.version),{name:typeof w.name==="string"?w.name:void 0,scannerFailMode:w.scannerFailMode==="open"||w.scannerFailMode==="closed"?w.scannerFailMode:void 0,requiredScanners:Array.isArray(w.requiredScanners)?w.requiredScanners.map(String):void 0,rules:Array.isArray(w.rules)?w.rules.map((j)=>({minimumSeverity:String(j.minimumSeverity),action:String(j.action),scannerId:j.scannerId?String(j.scannerId):void 0})):void 0,enabled:typeof w.enabled==="boolean"?w.enabled:void 0,actorId:E.actor.id})})}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Security policy could not be updated."},409)}}if(B.pathname==="/api/security/waivers"&&_.method==="POST"){let w=await X(_),E=Ue(ce);if(!E.actor)return C({ok:!1,error:"An organization actor is required."},403);try{return C({ok:!0,waiver:nt.createWaiver({findingId:String(w.findingId??""),policyId:typeof w.policyId==="string"?w.policyId:void 0,reason:String(w.reason??""),referenceUrl:typeof w.referenceUrl==="string"?w.referenceUrl:void 0,expiresAt:String(w.expiresAt??""),actorId:E.actor.id})},201)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Security waiver could not be created."},422)}}if(B.pathname==="/api/security/waivers"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce);if(!E.actor)return C({ok:!1,error:"An organization actor is required."},403);try{return C({ok:!0,waiver:nt.revokeWaiver(String(w.id??""),E.actor.id)})}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Security waiver could not be revoked."},404)}}if(B.pathname==="/api/security/findings"&&_.method==="PATCH"){let w=await X(_),E=Ue(ce),N=nt.getFinding(String(w.id??""));if(!E.actor||!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Security finding was not found."},404);try{let j=w.action==="acknowledge"?nt.acknowledgeFinding(N.id,E.actor.id):nt.assignFinding(N.id,typeof w.ownerActorId==="string"&&w.ownerActorId?w.ownerActorId:void 0,E.actor.id);return C({ok:!0,finding:j})}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Security finding could not be updated."},422)}}if(B.pathname==="/api/security/comments"&&_.method==="POST"){let w=await X(_),E=Ue(ce);if(!E.actor)return C({ok:!1,error:"An organization actor is required."},403);try{return C({ok:!0,comment:nt.addComment({findingId:String(w.findingId??""),actorId:E.actor.id,body:String(w.body??""),referenceUrl:typeof w.referenceUrl==="string"?w.referenceUrl:void 0})},201)}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Comment could not be saved."},422)}}if(B.pathname==="/api/auth/sessions"&&_.method==="GET"){let w=Ht.resolveSession(_);return C({currentSessionId:w?.id,sessions:w?_e.listSessions(w.identityId,{includeInactive:!0}):[]})}if(B.pathname==="/api/auth/sessions"&&_.method==="DELETE"){let w=await X(_),E=Ht.resolveSession(_);if(!E)return C({ok:!1,error:"Sign in again to manage sessions."},401);let N=String(w.id??""),j=_e.revokeSession(E.identityId,N),q=N===E.id&&j?{"set-cookie":tl({secure:Ri})}:void 0;return C({ok:j,signedOut:N===E.id&&j},j?200:404,q)}if(B.pathname==="/api/auth/sessions/revoke-others"&&_.method==="POST"){let w=Ht.resolveSession(_);if(!w)return C({ok:!1,error:"Sign in again to manage sessions."},401);return C({ok:!0,revoked:_e.revokeOtherSessions(w.identityId,w.id)})}if(B.pathname==="/api/auth/password/change"&&_.method==="POST"){let w=await X(_),E=String(w.currentPassword??""),N=String(w.password??""),j=Ue(ce),q=j.actor?_e.getIdentityByActor(j.actor.id):void 0;if(!q||!Gn(E,q.passwordHash))return C({ok:!1,error:"Current password is incorrect."},401);if(N.length<12)return C({ok:!1,error:"New password must be at least 12 characters."},422);if(Gn(N,q.passwordHash))return C({ok:!1,error:"Choose a different password."},409);let H=Ji(N),V=_e.updatePassword(q.id,H);ol(t,V.username,H);let Y=Pc(V.id,_,et.requestIP(_)?.address??"unknown");return y.store.appendEvent({organizationId:y.organization.id,actorId:V.actorId,type:"auth.password.changed"}),C({ok:!0,message:"Password changed and other sessions were signed out."},200,{"set-cookie":Ns(Y.token,{secure:Ri,maxAgeMs:it})})}if(B.pathname==="/api/auth/mfa/enroll"&&_.method==="POST"){let w=await X(_),E=Ht.resolveSession(_),N=Ue(ce),j=N.actor?_e.getIdentityByActor(N.actor.id):void 0;if(!E||!j)return C({ok:!1,error:"Sign in again before enabling MFA."},401);if(!Gn(String(w.password??""),j.passwordHash))return C({ok:!1,error:"Current password is incorrect."},401);try{let q=_e.beginTotpEnrollment(j.id,{issuer:y.organization.name});return y.store.appendEvent({organizationId:y.organization.id,actorId:j.actorId,type:"auth.mfa.enrollment.started"}),C({factor:q.factor,secret:q.secret,uri:q.uri})}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"MFA enrollment failed."},409)}}if(B.pathname==="/api/auth/mfa/verify"&&_.method==="POST"){let w=await X(_),E=Ht.resolveSession(_),N=Ue(ce),j=N.actor?_e.getIdentityByActor(N.actor.id):void 0;if(!E||!j)return C({ok:!1,error:"Sign in again before enabling MFA."},401);try{let q=_e.verifyTotpEnrollment(j.id,String(w.code??""));return _e.markSessionStepUp(E.id,!0),y.store.appendEvent({organizationId:y.organization.id,actorId:j.actorId,type:"auth.mfa.enabled",payload:{recoveryCodeCount:q.recoveryCodes.length}}),C(q)}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"MFA enrollment failed."},422)}}if(B.pathname==="/api/auth/mfa"&&_.method==="DELETE"){let w=await X(_),E=Ht.resolveSession(_),N=Ue(ce),j=N.actor?_e.getIdentityByActor(N.actor.id):void 0;if(!E||!j||!Gn(String(w.password??""),j.passwordHash))return C({ok:!1,error:"Current password is incorrect."},401);let q=_e.verifyMfaCode(j.id,String(w.code??""));if(!q.valid||!q.method)return C({ok:!1,error:"Authenticator or recovery code is incorrect."},401);return _e.disableMfa(j.id),_e.revokeOtherSessions(j.id,E.id),_e.markSessionStepUp(E.id),y.store.appendEvent({organizationId:y.organization.id,actorId:j.actorId,type:"auth.mfa.disabled",payload:{method:q.method}}),C({ok:!0})}if(B.pathname==="/api/auth/step-up"&&_.method==="POST"){let w=await X(_),E=Ht.resolveSession(_),N=Ue(ce),j=N.actor?_e.getIdentityByActor(N.actor.id):void 0;if(!E||!j||!Gn(String(w.password??""),j.passwordHash))return C({ok:!1,error:"Current password is incorrect."},401);let q=_e.getMfaFactor(j.id);if(q?.state==="active"){if(!_e.verifyMfaCode(j.id,String(w.code??"")).valid)return C({ok:!1,error:"Authenticator or recovery code is incorrect."},401)}let H=_e.markSessionStepUp(E.id,q?.state==="active");return y.store.appendEvent({organizationId:y.organization.id,actorId:j.actorId,type:"auth.step_up.succeeded",payload:{mfa:q?.state==="active"}}),C({ok:!0,recentAuthAt:H.recentAuthAt})}if(B.pathname==="/api/terminal"){if(!se)return C({ok:!1,error:"The web terminal is disabled."},403);if(et.upgrade(_))return;return vl("WebSocket upgrade failed",400)}if(B.pathname==="/api/health"){let w=y.store.health();return C({ok:!0,cwd:t,environment:Se,environments:k,uiRoot:await zt(ce,Se),liveData:ee.size>0,terminal:se,localPackage:import.meta.url.includes("/Code/Libraries/ts-cloud/"),controlPlane:{schemaVersion:w.schemaVersion,supportedSchemaVersion:w.supportedSchemaVersion,integrity:w.integrity,pendingRetryableOperations:w.pendingRetryableOperations}})}if(B.pathname==="/api/control-plane/operations"){let w=B.searchParams.get("state"),E=w&&["queued","running","succeeded","failed","cancelled","timed_out"].includes(w)?w:void 0;return C({operations:y.store.listOperations({projectId:y.project.id,state:E,kind:B.searchParams.get("kind")??void 0,limit:Number(B.searchParams.get("limit"))||100})})}if(B.pathname==="/api/queue"&&_.method==="GET"){let w=B.searchParams.get("state"),E=w&&["queued","running","succeeded","failed","cancelled","timed_out"].includes(w)?w:void 0,N=Dt.list({projectId:y.project.id,state:E,limit:Number(B.searchParams.get("limit"))||250}).filter((j)=>To(ce,j.operation.id,"deployments:read")).map((j)=>{let q=j.operation.resourceId?y.store.getResource(j.operation.resourceId):void 0,H=j.operation.environmentId?y.store.listEnvironments(y.project.id).find((fe)=>fe.id===j.operation.environmentId):void 0,V=j.operation.actorId?y.store.getActor(j.operation.actorId):void 0,Y=j.operation.input;return{...j,target:q?{id:q.id,name:q.name,slug:q.slug,kind:q.kind}:H?{id:H.id,name:H.name,slug:H.slug,kind:"environment"}:{id:y.project.id,name:y.project.name,slug:y.project.slug,kind:"project"},actor:V?{id:V.id,name:V.displayName,kind:V.kind}:void 0,commit:Y.revision??Y.source?.commitSha??null}});return C({operations:N,concurrency:Dt.limits})}if(B.pathname==="/api/queue/logs"&&_.method==="GET"){let w=String(B.searchParams.get("id")??"");if(!To(ce,w,"deployments:read"))return C({ok:!1,error:"Operation was not found in this scope."},404);let E=Dt.logs(w,{after:Number(B.searchParams.get("after"))||0,limit:Number(B.searchParams.get("limit"))||500});return C({entries:E,cursor:E.at(-1)?.sequence??(Number(B.searchParams.get("after"))||0),operation:y.store.getOperation(w)})}if(B.pathname==="/api/queue/stream"&&_.method==="GET"){let w=String(B.searchParams.get("id")??"");if(!To(ce,w,"deployments:read"))return C({ok:!1,error:"Operation was not found in this scope."},404);let E=_.headers.get("last-event-id")?.trim(),N=Number(E||B.searchParams.get("after")||0),j=new TextEncoder,q,H=!1,V=new ReadableStream({start(Y){let fe=()=>{if(H)return;let de=Ht.resolveUser(_);if(!de||!To(de,w,"deployments:read")){if(H=!0,q)clearInterval(q);Y.close();return}let Ye=Dt.logs(w,{after:N,limit:500});for(let Ve of Ye)N=Ve.sequence,Y.enqueue(j.encode(`id: ${Ve.sequence}
@@ -693,7 +693,7 @@ data: ${JSON.stringify({state:ke.state,cursor:N})}
693
693
 
694
694
  This link expires ${q.invitation.expiresAt} and can be used once.`});return C({invitation:q.invitation,token:q.token,acceptUrl:H,delivered:V},201)}catch(q){return C({ok:!1,error:q instanceof Error?q.message:"Invitation could not be created."},422)}}if(B.pathname==="/api/organization/invitations"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce);try{return C({invitation:y.store.revokeInvitation(String(w.id??""),E.actor?.id)})}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Invitation could not be revoked."},409)}}if(B.pathname==="/api/organization/invitations/resend"&&_.method==="POST"){let w=await X(_),E=Ue(ce);try{let N=y.store.reissueInvitation(String(w.id??""),E.actor?.id),j=`${B.origin}/accept-invitation?token=${encodeURIComponent(N.token)}`,q=await yn(f,{to:N.invitation.email,subject:"Your ts-cloud organization invitation",text:`Accept your ts-cloud invitation: ${j}
695
695
 
696
- This replacement link expires ${N.invitation.expiresAt} and can be used once.`});return C({invitation:N.invitation,token:N.token,acceptUrl:j,delivered:q})}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Invitation could not be resent."},409)}}if(B.pathname==="/api/organization/memberships"&&_.method==="PATCH"){let w=await X(_),E=y.store.getMembership(String(w.id??"")),N=pl(w.roleTemplate),j=kc(w);if(!E||E.organizationId!==y.organization.id)return C({ok:!1,error:"Membership was not found."},404);if(!N||!j)return C({ok:!1,error:"Choose a valid role template and resource scope."},422);let q=Ue(ce);if((E.roleTemplate==="owner"||N==="owner")&&(!Gn(String(w.password??""),ce.passwordHash)||q.membership?.roleTemplate!=="owner"))return C({ok:!1,error:"Ownership changes require an owner to re-enter their password."},401);let V=y.store.resolveAuthorizationTarget(y.organization.id,j)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),Y=y.store.listGrants(E.id),fe=nr({membership:E,grants:Y,target:V}),de={...E,roleTemplate:N,scope:j},Ye=nr({membership:de,grants:Y,target:V}),ke={gained:Ye.filter((Ve)=>!fe.includes(Ve)),lost:fe.filter((Ve)=>!Ye.includes(Ve))};if(w.preview===!0)return C({membership:E,proposed:{roleTemplate:N,scope:j},accessDiff:ke});if(String(w.confirm??"")!==E.id)return C({ok:!1,error:`Confirm this change with membership ID ${E.id}.`,accessDiff:ke},409);try{return C({membership:y.store.updateMembership({id:E.id,roleTemplate:N,scope:j,actorId:q.actor?.id}),accessDiff:ke})}catch(Ve){return C({ok:!1,error:Ve instanceof Error?Ve.message:"Membership could not be updated."},409)}}if(B.pathname==="/api/organization/memberships"&&_.method==="DELETE"){let w=await X(_),E=y.store.getMembership(String(w.id??""));if(!E||E.organizationId!==y.organization.id)return C({ok:!1,error:"Membership was not found."},404);if(String(w.confirm??"")!==E.id)return C({ok:!1,error:`Confirm removal with membership ID ${E.id}.`},409);let N=Ue(ce);if(E.roleTemplate==="owner"&&(N.membership?.roleTemplate!=="owner"||!Gn(String(w.password??""),ce.passwordHash)))return C({ok:!1,error:"Removing an owner requires an owner to re-enter their current password."},401);try{return C({membership:y.store.revokeMembership(E.id,N.actor?.id)})}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Membership could not be removed."},409)}}if(B.pathname==="/api/organization/grants"&&_.method==="POST"){let w=await X(_),E=String(w.capability??""),N=w.effect==="deny"?"deny":w.effect==="allow"?"allow":void 0,j=kc(w),q=Ue(ce);if(!N||!j||!Ie.includes(E))return C({ok:!1,error:"Choose a valid capability, effect, and resource scope."},422);try{return C({grant:y.store.upsertGrant({organizationId:y.organization.id,membershipId:String(w.membershipId??""),effect:N,capability:E,scope:j,actorId:q.actor?.id})},201)}catch(H){return C({ok:!1,error:H instanceof Error?H.message:"Grant could not be created."},422)}}if(B.pathname==="/api/organization/grants"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce),N=y.store.getGrant(String(w.id??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Grant was not found."},404);return C({ok:y.store.removeGrant(N.id,E.actor?.id)})}if(B.pathname==="/api/tags"&&_.method==="GET")return C({tags:y.store.listTags(y.project.id),assignments:y.store.listResourceTags(y.project.id)});if(B.pathname==="/api/tags"&&_.method==="POST"){let w=await X(_),E=y.store.upsertTag(y.project.id,String(w.name??""),String(w.color??"#5a8be0"));if(w.resourceId)y.store.assignTag(String(w.resourceId),E.id);return C({tag:E},201)}if(B.pathname==="/api/tags"&&_.method==="DELETE"){let w=await X(_);return y.store.removeTag(String(w.resourceId??""),String(w.tagId??"")),C({ok:!0})}if(B.pathname==="/"&&!nw(B.pathname,mn))return new Response(null,{status:302,headers:{location:`/server/sites?env=${encodeURIComponent(Se)}`}});if(B.pathname==="/"&&Vt?.mode==="serverless")return new Response(null,{status:302,headers:{location:`/serverless?env=${encodeURIComponent(Se)}`}});let Tc=sg(B.pathname);if(Tc)return new Response(null,{status:308,headers:{location:`${Tc}?env=${encodeURIComponent(Se)}`}});if(B.pathname==="/api/env"&&_.method==="POST"){let w=await X(_),E=String(w.env??"");if(!k.includes(E))return C({ok:!1,error:`Unknown environment '${E}'.`,environments:k},404);return C({ok:!0,environment:E,environments:k,href:`?env=${encodeURIComponent(E)}`})}if(B.pathname==="/api/config"){let w={...ws(f),environment:Se,environments:k};return C(eS(w,mn))}if(B.pathname==="/api/ssh-keys"&&_.method==="GET")return C({configPath:D,keys:Qi(zs(f))});if(B.pathname==="/api/ssh-keys"&&_.method==="POST"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=await ni(D,"utf8"),N=zs(f),j=ib({configText:E,name:String(w.name??""),publicKey:String(w.publicKey??""),existingKeys:N});return await Ao(D,j),XS(f,[...N,{name:String(w.name??"").trim(),publicKey:String(w.publicKey??"").trim().replace(/\s+/g," ")}]),C({ok:!0,configPath:D,keys:Qi(zs(f))})}if(B.pathname==="/api/ssh-keys"&&_.method==="DELETE"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??B.searchParams.get("name")??""),N=await ni(D,"utf8"),j=zs(f),q=ob({configText:N,name:E,existingKeys:j});return await Ao(D,q),XS(f,j.filter((H)=>H.name!==E.trim())),C({ok:!0,configPath:D,keys:Qi(zs(f))})}if(B.pathname==="/api/firewall"&&_.method==="GET")return C({configPath:D,alwaysOpen:[22,80,443],ports:Sm(f)});if(B.pathname==="/api/firewall"&&_.method==="POST"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=Number(w.port);if(!Sc(E))return C({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let N=Sm(f),j=await ni(D,"utf8");try{await Ao(D,cS(j,E,N))}catch(V){return C({ok:!1,error:V?.message??String(V)},422)}let q=Ro([...N,E]);ew(f,q);let H=w.apply===!1?null:await vc(f,Se,`ufw allow ${E}/tcp`).catch((V)=>({ok:!1,error:String(V?.message??V)}));return C({ok:!0,configPath:D,ports:q,apply:H})}if(B.pathname==="/api/firewall"&&_.method==="DELETE"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=Number(w.port??B.searchParams.get("port"));if(!Sc(E))return C({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let N=Sm(f),j=await ni(D,"utf8");await Ao(D,dS(j,E,N));let q=Ro(N.filter((V)=>V!==E));ew(f,q);let H=w.apply===!1?null:await vc(f,Se,`ufw delete allow ${E}/tcp`).catch((V)=>({ok:!1,error:String(V?.message??V)}));return C({ok:!0,configPath:D,ports:q,apply:H})}if(B.pathname==="/api/sites"&&_.method==="POST"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??"").trim(),N=String(w.root??"").trim();if(!E||!N)return C({ok:!1,error:"Site name and root are required."},422);let j={deploy:w.deploy==="bucket"?"bucket":"server",root:N,path:String(w.path??"").trim()||void 0,domain:String(w.domain??"").trim()||void 0,build:String(w.build??"").trim()||void 0,start:String(w.start??"").trim()||void 0,port:w.port?Number(w.port):void 0,type:String(w.type??"").trim()||void 0};if(j.port!==void 0&&(!Number.isInteger(j.port)||j.port<1||j.port>65535))return C({ok:!1,error:"Port must be a number between 1 and 65535."},422);let q=await ni(D,"utf8"),H=Dn({configText:q,name:E,root:j.root,domain:j.domain,path:j.path,deploy:j.deploy,build:j.build,start:j.start,port:j.port,type:j.type});return await Ao(D,H),eT(f,E,Object.fromEntries(Object.entries(j).filter(([,V])=>V!==void 0))),Vt=await Co(f,Se),M.set(Se,Vt),C({ok:!0,configPath:D,site:E,data:Vt})}if(B.pathname==="/api/sites"&&_.method==="DELETE"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??B.searchParams.get("name")??"").trim();if(!E||!f.sites?.[E])return C({ok:!1,error:`Site '${E}' was not found.`},404);let N=await ni(D,"utf8");return await Ao(D,Pn({configText:N,name:E})),delete f.sites[E],Vt=await Co(f,Se),M.set(Se,Vt),C({ok:!0,configPath:D,site:E,data:Vt})}if(B.pathname==="/api/sites"&&_.method==="PATCH"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??"").trim(),N=f.sites?.[E];if(!E||!N)return C({ok:!1,error:`Site '${E}' was not found.`},404);if(mn.role==="member"){let H=iS(w);if(!H.ok)return C({ok:!1,error:H.error},403);let V=oS({siteName:E,body:w,sites:f.sites??{},ownSites:Object.keys(mn.sites)});if(!V.ok)return C({ok:!1,error:V.error},409)}if(w.port!==void 0&&w.port!==null&&w.port!==""&&(!Number.isInteger(Number(w.port))||Number(w.port)<1||Number(w.port)>65535))return C({ok:!1,error:"Port must be a number between 1 and 65535."},422);if(typeof w.domain==="string"&&w.domain.trim()&&!Ja(w.domain.trim()))return C({ok:!1,error:`Domain '${w.domain.trim()}' is not a valid hostname.`},422);let j=await ni(D,"utf8"),q=(H,V)=>{j=bs({configText:j,siteName:E,key:H,valueText:V})};if(w.ssl!==void 0)q("ssl",Xu(w.ssl)),N.ssl=w.ssl;if(w.env!==void 0&&w.env&&typeof w.env==="object")q("env",Zu(w.env)),N.env=w.env;if(w.aliases!==void 0&&Array.isArray(w.aliases)){let H=w.aliases.map((V)=>String(V));q("aliases",eg(H)),N.aliases=H.map((V)=>V.trim().toLowerCase()).filter(Boolean)}if(w.redirects!==void 0&&w.redirects&&typeof w.redirects==="object")q("redirects",tg(w.redirects)),N.redirects=w.redirects;for(let H of["domain","path","build","start","type","root","php"])if(typeof w[H]==="string"&&w[H].trim())q(H,Yu(String(w[H]).trim())),N[H]=String(w[H]).trim();if(w.port!==void 0&&w.port!==null&&w.port!=="")q("port",String(Number(w.port))),N.port=Number(w.port);return await Ao(D,j),Vt=await Co(f,Se),M.set(Se,Vt),C({ok:!0,configPath:D,site:E,data:Vt})}if(B.pathname==="/api/sites/deploy"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim();if(!E||!f.sites?.[E])return C({ok:!1,error:`Site '${E}' was not found.`},404);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to deploy this site.`},409);let N=ue(y,String(Se));await new Ot(nt).run(new En,{...N,artifactRoot:t}),fs(nt,N,Vt??{});let j=hs(nt,{scope:N,desiredConfigHash:y.project.desiredConfigHash});if(j.decision.outcome==="block")return C({ok:!1,error:`Deployment blocked by security policy: ${j.decision.explanation}`,securityReview:j},409);let q={id:`deploy:${E}`,label:`Deploy ${E}`,description:`Deploy the ${E} site for ${Se}.`,command:["deploy","--env",Se,"--site",E,"--yes"],mutates:!0},H=await Me({controlPlane:y,environment:Se,actor:ce,kind:"dashboard.site.deploy",resourceSlug:E,input:{site:E},execute:()=>wm(q,{cwd:t,cliEntry:u})});return C({...H.result,controlPlaneOperation:H.operation,securityReview:j})}if(B.pathname==="/api/actions")return C(On(Se));if(B.pathname==="/api/server/operations")return C(al(f,Vt));if(B.pathname==="/api/runtime/workloads"&&_.method==="GET"){let w=await ge(f,Se);return C(w)}if(B.pathname==="/api/runtime/logs"&&_.method==="GET"){let w=String(B.searchParams.get("workload")??"");if(!w)return C({ok:!1,error:"A workload query parameter is required."},422);let E=Math.min(1000,Math.max(1,Number(B.searchParams.get("limit"))||200));try{return C(await new ve(f,Se).logs(w,{limit:E}))}catch(N){return C({ok:!1,error:String(N?.message??N)},404)}}if(B.pathname==="/api/runtime/log-sessions"&&_.method==="POST"){let w=await X(_),E=String(w.workloadId??"");if(!E)return C({ok:!1,error:"A workloadId is required."},422);let N=await ge(f,Se),j=N.workloads.find((V)=>V.id===E);if(!j)return C({ok:!1,error:"Workload was not found in the current project and environment."},404);if(!j.capabilities.logs.supported)return C({ok:!1,error:j.capabilities.logs.reason??"Logs are unsupported for this workload."},409);let q=new ve(f,Se,{inventory:async()=>N}),H=sr.create("logs",E);return(async()=>{let V=new Date(Date.now()-Math.min(3600000,Math.max(1000,Number(w.sinceMs)||60000)));try{for(let Y=0;Y<200&&!sr.signal(H.id)?.aborted;Y++){let fe=await q.logs(E,{limit:Math.min(500,Math.max(1,Number(w.limit)||200)),since:V});for(let de of fe.lines)if(sr.append(H.id,`${de.timestamp?`${de.timestamp} `:""}${de.message}
696
+ This replacement link expires ${N.invitation.expiresAt} and can be used once.`});return C({invitation:N.invitation,token:N.token,acceptUrl:j,delivered:q})}catch(N){return C({ok:!1,error:N instanceof Error?N.message:"Invitation could not be resent."},409)}}if(B.pathname==="/api/organization/memberships"&&_.method==="PATCH"){let w=await X(_),E=y.store.getMembership(String(w.id??"")),N=pl(w.roleTemplate),j=kc(w);if(!E||E.organizationId!==y.organization.id)return C({ok:!1,error:"Membership was not found."},404);if(!N||!j)return C({ok:!1,error:"Choose a valid role template and resource scope."},422);let q=Ue(ce);if((E.roleTemplate==="owner"||N==="owner")&&(!Gn(String(w.password??""),ce.passwordHash)||q.membership?.roleTemplate!=="owner"))return C({ok:!1,error:"Ownership changes require an owner to re-enter their password."},401);let V=y.store.resolveAuthorizationTarget(y.organization.id,j)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),Y=y.store.listGrants(E.id),fe=nr({membership:E,grants:Y,target:V}),de={...E,roleTemplate:N,scope:j},Ye=nr({membership:de,grants:Y,target:V}),ke={gained:Ye.filter((Ve)=>!fe.includes(Ve)),lost:fe.filter((Ve)=>!Ye.includes(Ve))};if(w.preview===!0)return C({membership:E,proposed:{roleTemplate:N,scope:j},accessDiff:ke});if(String(w.confirm??"")!==E.id)return C({ok:!1,error:`Confirm this change with membership ID ${E.id}.`,accessDiff:ke},409);try{return C({membership:y.store.updateMembership({id:E.id,roleTemplate:N,scope:j,actorId:q.actor?.id}),accessDiff:ke})}catch(Ve){return C({ok:!1,error:Ve instanceof Error?Ve.message:"Membership could not be updated."},409)}}if(B.pathname==="/api/organization/memberships"&&_.method==="DELETE"){let w=await X(_),E=y.store.getMembership(String(w.id??""));if(!E||E.organizationId!==y.organization.id)return C({ok:!1,error:"Membership was not found."},404);if(String(w.confirm??"")!==E.id)return C({ok:!1,error:`Confirm removal with membership ID ${E.id}.`},409);let N=Ue(ce);if(E.roleTemplate==="owner"&&(N.membership?.roleTemplate!=="owner"||!Gn(String(w.password??""),ce.passwordHash)))return C({ok:!1,error:"Removing an owner requires an owner to re-enter their current password."},401);try{return C({membership:y.store.revokeMembership(E.id,N.actor?.id)})}catch(j){return C({ok:!1,error:j instanceof Error?j.message:"Membership could not be removed."},409)}}if(B.pathname==="/api/organization/grants"&&_.method==="POST"){let w=await X(_),E=String(w.capability??""),N=w.effect==="deny"?"deny":w.effect==="allow"?"allow":void 0,j=kc(w),q=Ue(ce);if(!N||!j||!Ie.includes(E))return C({ok:!1,error:"Choose a valid capability, effect, and resource scope."},422);try{return C({grant:y.store.upsertGrant({organizationId:y.organization.id,membershipId:String(w.membershipId??""),effect:N,capability:E,scope:j,actorId:q.actor?.id})},201)}catch(H){return C({ok:!1,error:H instanceof Error?H.message:"Grant could not be created."},422)}}if(B.pathname==="/api/organization/grants"&&_.method==="DELETE"){let w=await X(_),E=Ue(ce),N=y.store.getGrant(String(w.id??""));if(!N||N.organizationId!==y.organization.id)return C({ok:!1,error:"Grant was not found."},404);return C({ok:y.store.removeGrant(N.id,E.actor?.id)})}if(B.pathname==="/api/tags"&&_.method==="GET")return C({tags:y.store.listTags(y.project.id),assignments:y.store.listResourceTags(y.project.id)});if(B.pathname==="/api/tags"&&_.method==="POST"){let w=await X(_),E=y.store.upsertTag(y.project.id,String(w.name??""),String(w.color??"#5a8be0"));if(w.resourceId)y.store.assignTag(String(w.resourceId),E.id);return C({tag:E},201)}if(B.pathname==="/api/tags"&&_.method==="DELETE"){let w=await X(_);return y.store.removeTag(String(w.resourceId??""),String(w.tagId??"")),C({ok:!0})}if(B.pathname==="/"&&!nw(B.pathname,mn))return new Response(null,{status:302,headers:{location:`/server/sites?env=${encodeURIComponent(Se)}`}});if(B.pathname==="/"&&Vt?.mode==="serverless")return new Response(null,{status:302,headers:{location:`/serverless?env=${encodeURIComponent(Se)}`}});let Tc=sg(B.pathname);if(Tc)return new Response(null,{status:308,headers:{location:`${Tc}?env=${encodeURIComponent(Se)}`}});if(B.pathname==="/api/env"&&_.method==="POST"){let w=await X(_),E=String(w.env??"");if(!k.includes(E))return C({ok:!1,error:`Unknown environment '${E}'.`,environments:k},404);return C({ok:!0,environment:E,environments:k,href:`?env=${encodeURIComponent(E)}`})}if(B.pathname==="/api/config"){let w={...ws(f),environment:Se,environments:k};return C(eS(w,mn))}if(B.pathname==="/api/ssh-keys"&&_.method==="GET")return C({configPath:D,keys:Qi(zs(f))});if(B.pathname==="/api/ssh-keys"&&_.method==="POST"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=await ni(D,"utf8"),N=zs(f),j=ib({configText:E,name:String(w.name??""),publicKey:String(w.publicKey??""),existingKeys:N});return await Ao(D,j),ZS(f,[...N,{name:String(w.name??"").trim(),publicKey:String(w.publicKey??"").trim().replace(/\s+/g," ")}]),C({ok:!0,configPath:D,keys:Qi(zs(f))})}if(B.pathname==="/api/ssh-keys"&&_.method==="DELETE"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??B.searchParams.get("name")??""),N=await ni(D,"utf8"),j=zs(f),q=ob({configText:N,name:E,existingKeys:j});return await Ao(D,q),ZS(f,j.filter((H)=>H.name!==E.trim())),C({ok:!0,configPath:D,keys:Qi(zs(f))})}if(B.pathname==="/api/firewall"&&_.method==="GET")return C({configPath:D,alwaysOpen:[22,80,443],ports:Sm(f)});if(B.pathname==="/api/firewall"&&_.method==="POST"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=Number(w.port);if(!Sc(E))return C({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let N=Sm(f),j=await ni(D,"utf8");try{await Ao(D,cS(j,E,N))}catch(V){return C({ok:!1,error:V?.message??String(V)},422)}let q=Ro([...N,E]);ew(f,q);let H=w.apply===!1?null:await vc(f,Se,`ufw allow ${E}/tcp`).catch((V)=>({ok:!1,error:String(V?.message??V)}));return C({ok:!0,configPath:D,ports:q,apply:H})}if(B.pathname==="/api/firewall"&&_.method==="DELETE"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=Number(w.port??B.searchParams.get("port"));if(!Sc(E))return C({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let N=Sm(f),j=await ni(D,"utf8");await Ao(D,dS(j,E,N));let q=Ro(N.filter((V)=>V!==E));ew(f,q);let H=w.apply===!1?null:await vc(f,Se,`ufw delete allow ${E}/tcp`).catch((V)=>({ok:!1,error:String(V?.message??V)}));return C({ok:!0,configPath:D,ports:q,apply:H})}if(B.pathname==="/api/sites"&&_.method==="POST"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??"").trim(),N=String(w.root??"").trim();if(!E||!N)return C({ok:!1,error:"Site name and root are required."},422);let j={deploy:w.deploy==="bucket"?"bucket":"server",root:N,path:String(w.path??"").trim()||void 0,domain:String(w.domain??"").trim()||void 0,build:String(w.build??"").trim()||void 0,start:String(w.start??"").trim()||void 0,port:w.port?Number(w.port):void 0,type:String(w.type??"").trim()||void 0};if(j.port!==void 0&&(!Number.isInteger(j.port)||j.port<1||j.port>65535))return C({ok:!1,error:"Port must be a number between 1 and 65535."},422);let q=await ni(D,"utf8"),H=Dn({configText:q,name:E,root:j.root,domain:j.domain,path:j.path,deploy:j.deploy,build:j.build,start:j.start,port:j.port,type:j.type});return await Ao(D,H),eT(f,E,Object.fromEntries(Object.entries(j).filter(([,V])=>V!==void 0))),Vt=await Co(f,Se),M.set(Se,Vt),C({ok:!0,configPath:D,site:E,data:Vt})}if(B.pathname==="/api/sites"&&_.method==="DELETE"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??B.searchParams.get("name")??"").trim();if(!E||!f.sites?.[E])return C({ok:!1,error:`Site '${E}' was not found.`},404);let N=await ni(D,"utf8");return await Ao(D,Pn({configText:N,name:E})),delete f.sites[E],Vt=await Co(f,Se),M.set(Se,Vt),C({ok:!0,configPath:D,site:E,data:Vt})}if(B.pathname==="/api/sites"&&_.method==="PATCH"){if(!D)return C({ok:!1,error:"No cloud config file was found in this checkout."},404);let w=await X(_),E=String(w.name??"").trim(),N=f.sites?.[E];if(!E||!N)return C({ok:!1,error:`Site '${E}' was not found.`},404);if(mn.role==="member"){let H=iS(w);if(!H.ok)return C({ok:!1,error:H.error},403);let V=oS({siteName:E,body:w,sites:f.sites??{},ownSites:Object.keys(mn.sites)});if(!V.ok)return C({ok:!1,error:V.error},409)}if(w.port!==void 0&&w.port!==null&&w.port!==""&&(!Number.isInteger(Number(w.port))||Number(w.port)<1||Number(w.port)>65535))return C({ok:!1,error:"Port must be a number between 1 and 65535."},422);if(typeof w.domain==="string"&&w.domain.trim()&&!Ja(w.domain.trim()))return C({ok:!1,error:`Domain '${w.domain.trim()}' is not a valid hostname.`},422);let j=await ni(D,"utf8"),q=(H,V)=>{j=bs({configText:j,siteName:E,key:H,valueText:V})};if(w.ssl!==void 0)q("ssl",Xu(w.ssl)),N.ssl=w.ssl;if(w.env!==void 0&&w.env&&typeof w.env==="object")q("env",Zu(w.env)),N.env=w.env;if(w.aliases!==void 0&&Array.isArray(w.aliases)){let H=w.aliases.map((V)=>String(V));q("aliases",eg(H)),N.aliases=H.map((V)=>V.trim().toLowerCase()).filter(Boolean)}if(w.redirects!==void 0&&w.redirects&&typeof w.redirects==="object")q("redirects",tg(w.redirects)),N.redirects=w.redirects;for(let H of["domain","path","build","start","type","root","php"])if(typeof w[H]==="string"&&w[H].trim())q(H,Yu(String(w[H]).trim())),N[H]=String(w[H]).trim();if(w.port!==void 0&&w.port!==null&&w.port!=="")q("port",String(Number(w.port))),N.port=Number(w.port);return await Ao(D,j),Vt=await Co(f,Se),M.set(Se,Vt),C({ok:!0,configPath:D,site:E,data:Vt})}if(B.pathname==="/api/sites/deploy"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim();if(!E||!f.sites?.[E])return C({ok:!1,error:`Site '${E}' was not found.`},404);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to deploy this site.`},409);let N=ue(y,String(Se));await new Ot(nt).run(new En,{...N,artifactRoot:t}),fs(nt,N,Vt??{});let j=hs(nt,{scope:N,desiredConfigHash:y.project.desiredConfigHash});if(j.decision.outcome==="block")return C({ok:!1,error:`Deployment blocked by security policy: ${j.decision.explanation}`,securityReview:j},409);let q={id:`deploy:${E}`,label:`Deploy ${E}`,description:`Deploy the ${E} site for ${Se}.`,command:["deploy","--env",Se,"--site",E,"--yes"],mutates:!0},H=await Me({controlPlane:y,environment:Se,actor:ce,kind:"dashboard.site.deploy",resourceSlug:E,input:{site:E},execute:()=>wm(q,{cwd:t,cliEntry:u})});return C({...H.result,controlPlaneOperation:H.operation,securityReview:j})}if(B.pathname==="/api/actions")return C(On(Se));if(B.pathname==="/api/server/operations")return C(al(f,Vt));if(B.pathname==="/api/runtime/workloads"&&_.method==="GET"){let w=await ge(f,Se);return C(w)}if(B.pathname==="/api/runtime/logs"&&_.method==="GET"){let w=String(B.searchParams.get("workload")??"");if(!w)return C({ok:!1,error:"A workload query parameter is required."},422);let E=Math.min(1000,Math.max(1,Number(B.searchParams.get("limit"))||200));try{return C(await new ve(f,Se).logs(w,{limit:E}))}catch(N){return C({ok:!1,error:String(N?.message??N)},404)}}if(B.pathname==="/api/runtime/log-sessions"&&_.method==="POST"){let w=await X(_),E=String(w.workloadId??"");if(!E)return C({ok:!1,error:"A workloadId is required."},422);let N=await ge(f,Se),j=N.workloads.find((V)=>V.id===E);if(!j)return C({ok:!1,error:"Workload was not found in the current project and environment."},404);if(!j.capabilities.logs.supported)return C({ok:!1,error:j.capabilities.logs.reason??"Logs are unsupported for this workload."},409);let q=new ve(f,Se,{inventory:async()=>N}),H=sr.create("logs",E);return(async()=>{let V=new Date(Date.now()-Math.min(3600000,Math.max(1000,Number(w.sinceMs)||60000)));try{for(let Y=0;Y<200&&!sr.signal(H.id)?.aborted;Y++){let fe=await q.logs(E,{limit:Math.min(500,Math.max(1,Number(w.limit)||200)),since:V});for(let de of fe.lines)if(sr.append(H.id,`${de.timestamp?`${de.timestamp} `:""}${de.message}
697
697
  `),de.timestamp)V=new Date(Math.max(V.getTime(),new Date(de.timestamp).getTime()+1));await Bun.sleep(3000)}if(!sr.signal(H.id)?.aborted)sr.close(H.id,"complete")}catch(Y){sr.append(H.id,Y instanceof Error?Y.message:String(Y),"stderr"),sr.close(H.id,"failed",Y instanceof Error?Y.message:String(Y))}})(),C({ok:!0,session:H,streamUrl:`/api/runtime/log-stream?id=${encodeURIComponent(H.id)}&workload=${encodeURIComponent(E)}`},201)}if((B.pathname==="/api/runtime/log-stream"||B.pathname==="/api/runtime/exec-stream")&&_.method==="GET"){let w=String(B.searchParams.get("id")??""),E=String(B.searchParams.get("workload")??""),N=Number(_.headers.get("last-event-id")??B.searchParams.get("after")??0)||0,j=sr.read(w,E,N),q=B.pathname.includes("exec")?"exec":"logs";if(!j||j.kind!==q)return C({ok:!1,error:"Runtime stream was not found in this workload scope."},404);return W_(sr,j,N,_.signal)}if((B.pathname==="/api/runtime/log-sessions"||B.pathname==="/api/runtime/exec-sessions")&&_.method==="DELETE"){let w=await X(_),E=sr.cancel(String(w.id??""),String(w.workloadId??""));if(!E)return C({ok:!1,error:"Runtime stream was not found in this workload scope."},404);return C({ok:!0,session:E})}if(B.pathname==="/api/runtime/exec-sessions"&&_.method==="POST"){let w=await X(_),E=String(w.workloadId??""),N=await ge(f,Se),j=N.workloads.find((Y)=>Y.id===E);if(!j)return C({ok:!1,error:"Workload was not found in the current project and environment."},404);let q=Ht.resolveSession(_),H=new ve(f,Se,{inventory:async()=>N}),V=sr.create("exec",E);return Me({controlPlane:y,environment:Se,actor:ce,kind:"runtime.exec",resourceSlug:j.links.service,input:{workloadId:E,provider:j.provider,preset:w.preset?String(w.preset):null,freeForm:!!String(w.command??"").trim()},execute:()=>H.exec({workloadId:E,preset:["process","sockets","filesystem"].includes(String(w.preset))?String(w.preset):void 0,command:typeof w.command==="string"?w.command:void 0,confirm:String(w.confirm??""),recentAuth:!Ce||!!q&&_e.isRecentlyAuthenticated(q)})}).then(({result:Y,operation:fe})=>{if(sr.append(V.id,`operation ${fe.id}
698
698
  `,"system"),Y.stdout)sr.append(V.id,Y.stdout,"stdout");if(Y.stderr)sr.append(V.id,Y.stderr,"stderr");sr.close(V.id,Y.ok?"complete":"failed",Y.error)}).catch((Y)=>{let fe=Y instanceof Error?Y.message:String(Y);sr.append(V.id,fe,"stderr"),sr.close(V.id,"failed",fe)}),C({ok:!0,session:V,streamUrl:`/api/runtime/exec-stream?id=${encodeURIComponent(V.id)}&workload=${encodeURIComponent(E)}`},202)}if(B.pathname==="/api/runtime/files/read"&&_.method==="POST"){let w=await X(_),E=await ge(f,Se),N=Ht.resolveSession(_),j=await new ve(f,Se,{inventory:async()=>E}).readFile({workloadId:String(w.workloadId??""),path:String(w.path??""),confirm:String(w.confirm??""),recentAuth:!Ce||!!N&&_e.isRecentlyAuthenticated(N)});return C(j,j.ok?200:409)}if(B.pathname==="/api/runtime/files/write"&&_.method==="POST"){let w=await X(_),E=await ge(f,Se),N=String(w.workloadId??""),j=E.workloads.find((Y)=>Y.id===N);if(!j)return C({ok:!1,error:"Workload was not found in the current project and environment."},404);let q=Ht.resolveSession(_),H=new ve(f,Se,{inventory:async()=>E}),V=await Me({controlPlane:y,environment:Se,actor:ce,kind:"runtime.file.write",resourceSlug:j.links.service,input:{workloadId:N,provider:j.provider,path:String(w.path??""),bytes:Buffer.from(String(w.contentBase64??""),"base64").byteLength},execute:()=>H.writeFile({workloadId:N,path:String(w.path??""),contentBase64:String(w.contentBase64??""),confirm:String(w.confirm??""),recentAuth:!Ce||!!q&&_e.isRecentlyAuthenticated(q)})});return C({...V.result,controlPlaneOperation:V.operation},V.result.ok?200:409)}if(B.pathname==="/api/runtime/operations"&&_.method==="POST"){let w=await X(_),E=String(w.workloadId??""),N=String(w.action??"");if(!E||!["start","stop","restart","redeploy","scale","inspect"].includes(N))return C({ok:!1,error:"A valid workloadId and lifecycle action are required."},422);let j=await ge(f,Se),q=j.workloads.find((fe)=>fe.id===E);if(!q)return C({ok:!1,error:"Workload was not found in the current project and environment."},404);let H=Ht.resolveSession(_),V=new ve(f,Se,{inventory:async()=>j}),Y=await Me({controlPlane:y,environment:Se,actor:ce,kind:`runtime.${N}`,resourceSlug:q.links.service,input:{workloadId:E,provider:q.provider,action:N,replicas:w.replicas==null?null:Number(w.replicas)},execute:()=>V.run({workloadId:E,action:N,replicas:w.replicas==null?void 0:Number(w.replicas),confirm:String(w.confirm??""),recentAuth:!Ce||!!H&&_e.isRecentlyAuthenticated(H)})});return C({...Y.result,controlPlaneOperation:Y.operation},Y.result.ok?200:409)}if(B.pathname.startsWith("/api/protection")){let w=ce.role==="admin"||_c(ce,"security:read"),E=ce.role==="admin"||_c(ce,"security:manage");if(!w)return C({ok:!1,error:"Protection controls require security:read."},403);let{ProtectionControlStore:N,describePosture:j}=await import("./protection/index.js"),q=new N(y.store),H=()=>{if(!E)throw Error("Changing protection controls requires security:manage.")};if(B.pathname==="/api/protection"&&_.method==="GET"){let V=q.current();return C({ok:!0,posture:j(V),controls:V,raw:q.raw()})}if(B.pathname==="/api/protection/attack-mode"&&_.method==="POST"){H();let V=await X(_);if(V.enabled===!1)return C({ok:!0,disabled:q.disableAttackMode()});return C({ok:!0,control:q.enableAttackMode({hours:V.hours==null?void 0:Number(V.hours),reason:String(V.reason??"Enabled from the dashboard."),actorId:Ue(ce).actor?.id})})}if(B.pathname==="/api/protection/pause"&&_.method==="POST"){H();let V=await X(_);if(V.enabled===!1)return C({ok:!0,resumed:q.resumeMitigations()});return C({ok:!0,control:q.pauseMitigations({hours:V.hours==null?void 0:Number(V.hours),reason:String(V.reason??""),actorId:Ue(ce).actor?.id})})}if(B.pathname==="/api/protection/ip-rules"&&_.method==="GET")return C({ok:!0,ipRules:q.current().ipRules});if(B.pathname==="/api/protection/ip-rules"&&(_.method==="POST"||_.method==="DELETE")){H();let V=await X(_),Y=V.list==="allow"?"allow":"block",fe=_.method==="POST"?q.addIpRule(Y,String(V.cidr??"")):q.removeIpRule(Y,String(V.cidr??""));return C({ok:!0,ipRules:fe})}return C({ok:!1,error:"Protection endpoint was not found."},404)}if(B.pathname.startsWith("/api/spend/")||B.pathname==="/api/usage"){let w=await gw(),{store:E,service:N,gate:j}=w,q=ce.role==="admin"||_c(ce,"billing:read"),H=ce.role==="admin"||_c(ce,"billing:manage");if(!q)return C({ok:!1,error:"Spend data requires the billing:read capability."},403);let V=y.environments.get(Se),Y={organizationId:y.organization.id,projectId:y.project.id,environmentId:V?.id},fe=()=>{if(!H)throw Error("Changing a budget requires the billing:manage capability.")};if(B.pathname==="/api/usage"&&_.method==="GET")return C({ok:!0,...N.usageReport({organizationId:Y.organizationId,projectId:Y.projectId,period:B.searchParams.get("period")??"monthly",timezone:B.searchParams.get("timezone")??void 0})});if(B.pathname==="/api/spend/budgets"&&_.method==="GET")return C({ok:!0,budgets:E.listBudgets({organizationId:Y.organizationId,projectId:Y.projectId}).map((de)=>({...de,status:N.status(de)}))});if(B.pathname==="/api/spend/budgets"&&_.method==="POST"){fe();let de=await X(_),Ye=String(de.scope??"project"),ke=E.createBudget({organizationId:Y.organizationId,projectId:Ye==="organization"?void 0:Y.projectId,environmentId:Ye==="environment"?Y.environmentId:void 0,name:String(de.name??"").trim(),period:de.period??"monthly",timezone:de.timezone?String(de.timezone):void 0,softLimitCents:de.softLimitCents==null?void 0:Math.round(Number(de.softLimitCents)),hardLimitCents:de.hardLimitCents==null?void 0:Math.round(Number(de.hardLimitCents)),graceSeconds:de.graceSeconds==null?void 0:Number(de.graceSeconds),dryRun:de.dryRun!==!1});return C({ok:!0,budget:ke})}if(B.pathname==="/api/spend/budgets"&&_.method==="PATCH"){fe();let de=await X(_),Ye=String(de.id??""),ke=E.getBudget(Ye);if(!ke||ke.organizationId!==Y.organizationId)return C({ok:!1,error:"Budget was not found."},404);return C({ok:!0,budget:E.updateBudget(Ye,{softLimitCents:de.softLimitCents==null?ke.softLimitCents:Math.round(Number(de.softLimitCents)),hardLimitCents:de.hardLimitCents==null?ke.hardLimitCents:Math.round(Number(de.hardLimitCents)),enabled:de.enabled==null?ke.enabled:de.enabled===!0,dryRun:de.dryRun==null?ke.dryRun:de.dryRun===!0},de.expectedVersion==null?void 0:Number(de.expectedVersion))})}if(B.pathname==="/api/spend/budgets"&&_.method==="DELETE"){fe();let de=await X(_),Ye=String(de.id??""),ke=E.getBudget(Ye);if(!ke||ke.organizationId!==Y.organizationId)return C({ok:!1,error:"Budget was not found."},404);let Ve=j.closeBudget(Ye);return E.deleteBudget(Ye),C({ok:!0,deleted:!0,lifted:Ve})}if(B.pathname==="/api/spend/check"&&_.method==="POST"){fe();let de=await X(_),{SpendRunner:Ye}=await import("./spend/index.js"),ke=new Ye({controlPlane:y.store,store:E,alerts:Xe});if(de.apply!==!0){let Ae=E.budgetsForScope(Y.organizationId,Y.projectId,Y.environmentId);return C({ok:!0,applied:!1,preview:Ae.map((je)=>N.status(je))})}let Ve=await ke.run({...Y,environmentKind:V?.kind});return C({ok:!0,applied:!0,result:Ve})}if(B.pathname==="/api/spend/enforcement"&&_.method==="GET")return C({ok:!0,enforcement:j.listUnder({organizationId:Y.organizationId})});if(B.pathname==="/api/spend/release"&&_.method==="POST"){fe();let de=await X(_),Ye=j.close(String(de.budgetId??""),de.action);return C({ok:Ye,released:Ye,note:Ye?"The next spend cycle re-applies this if spend is still over the threshold.":"That action was not in force."})}if(B.pathname==="/api/spend/anomalies"&&_.method==="GET")return C({ok:!0,anomalies:E.listAnomalies({organizationId:Y.organizationId,projectId:Y.projectId,unacknowledgedOnly:B.searchParams.get("unacknowledged")==="true"})});if(B.pathname==="/api/spend/anomalies/acknowledge"&&_.method==="POST"){fe();let de=await X(_);return C({ok:!0,acknowledged:E.acknowledgeAnomaly(String(de.id??""))})}return C({ok:!1,error:"Spend endpoint was not found."},404)}if(B.pathname.startsWith("/api/health/")||B.pathname.startsWith("/api/alerts")||B.pathname.startsWith("/api/notifications/")){let w=y.environments.get(Se),E=y.store.listResources(y.project.id,w?.id),N=ce.role==="admin"||!!w&&qs(ce,w.id,"runtime:read")?E:E.filter((V)=>Rr(ce,V.id,"runtime:read")),j=(V)=>!V||N.some((Y)=>Y.id===V),q=(V)=>{if(!V)return;let Y=E.find((fe)=>fe.id===V||fe.slug===V);if(!Y)throw Error("Alert resource was not found.");if(!j(Y.id))throw Error("Alert resource is outside your authorized scope.");return Y.id},H=Ue(ce).actor;if(B.pathname==="/api/health/checks"&&_.method==="GET")return C({ok:!0,checks:Xe.listHealthChecks(y.project.id,w?.id).filter((V)=>j(V.resourceId)).map((V)=>({...V,results:Xe.listHealthResults(V.id,20)}))});if(B.pathname==="/api/health/checks"&&_.method==="POST"){let V=await X(_),Y=String(V.kind??"http");if(Y==="command"&&ce.role!=="admin")return C({ok:!1,error:"Command health checks require an administrator."},403);let fe={method:String(V.config?.method??"GET").toUpperCase().slice(0,10),path:V.config?.path?String(V.config.path).slice(0,500):void 0,port:V.config?.port==null?void 0:Number(V.config.port),command:Array.isArray(V.config?.command)?V.config.command.map(String).slice(0,20):void 0,expectedStatuses:Array.isArray(V.config?.expectedStatuses)?V.config.expectedStatuses.map(Number).filter(Number.isInteger).slice(0,20):void 0,expectedBody:V.config?.expectedBody?String(V.config.expectedBody).slice(0,500):void 0};return C({ok:!0,check:Xe.createHealthCheck({projectId:y.project.id,environmentId:w?.id,resourceId:q(V.resourceId??V.resource),name:String(V.name??""),kind:Y,target:String(V.target??""),config:fe,intervalSeconds:Number(V.intervalSeconds)||60,timeoutSeconds:Number(V.timeoutSeconds)||10,failureThreshold:Number(V.failureThreshold)||3,recoveryThreshold:Number(V.recoveryThreshold)||2,regions:Array.isArray(V.regions)?V.regions.map(String):["local"],enabled:V.enabled!==!1})},201)}if(B.pathname==="/api/health/checks"&&_.method==="PATCH"){let V=await X(_),Y=Xe.getHealthCheck(String(V.id??""));if(!Y||!j(Y.resourceId))return C({ok:!1,error:"Health check was not found."},404);return C({ok:!0,check:Xe.setHealthCheckEnabled(Y.id,V.enabled!==!1)})}if(B.pathname==="/api/health/checks/test"&&_.method==="POST"){let V=await X(_),Y=Xe.getHealthCheck(String(V.id??""));if(!Y||!j(Y.resourceId))return C({ok:!1,error:"Health check was not found."},404);return C({ok:!0,productionIncidentCreated:!1,result:await new Je(Xe).probe(Y)})}if(B.pathname==="/api/health/checks/run"&&_.method==="POST"){let V=await X(_),Y=Xe.getHealthCheck(String(V.id??""));if(!Y||!j(Y.resourceId))return C({ok:!1,error:"Health check was not found."},404);let fe=await new Je(Xe).runAndEvaluate(Y),de=[];for(let Ye of fe.evaluations.filter((ke)=>ke.notify&&ke.alert)){let ke=gn.enqueue(y.organization.id,Ye.alert,Ye.transition);de.push(...await gn.deliverAll(ke))}return C({ok:!0,...fe,deliveries:de})}if(B.pathname==="/api/alerts/rules"&&_.method==="GET")return C({ok:!0,rules:Xe.listRules(y.project.id,w?.id).filter((V)=>j(V.resourceId))});if(B.pathname==="/api/alerts/rules"&&_.method==="POST"){let V=await X(_),Y=V.healthCheckId?Xe.getHealthCheck(String(V.healthCheckId)):void 0;if(V.healthCheckId&&(!Y||!j(Y.resourceId)))return C({ok:!1,error:"Health check was not found."},404);return C({ok:!0,rule:Xe.createRule({projectId:y.project.id,environmentId:w?.id,resourceId:q(V.resourceId??V.resource)??Y?.resourceId,healthCheckId:Y?.id,name:String(V.name??""),signal:String(V.signal??(Y?"health":"")),operator:String(V.operator??(Y?"unhealthy":"gt")),threshold:V.threshold==null?void 0:Number(V.threshold),recoveryThreshold:V.recoveryThreshold==null?void 0:Number(V.recoveryThreshold),windowMs:Number(V.windowMs)||300000,consecutive:Number(V.consecutive)||Y?.failureThreshold||3,recoveryConsecutive:Number(V.recoveryConsecutive)||Y?.recoveryThreshold||2,noDataPolicy:["ignore","pending","firing"].includes(String(V.noDataPolicy))?V.noDataPolicy:"pending",severity:["info","warning","critical"].includes(String(V.severity))?V.severity:"warning",groupBy:Array.isArray(V.groupBy)?V.groupBy.map(String):[],labels:V.labels&&typeof V.labels==="object"?V.labels:{},enabled:V.enabled!==!1})},201)}if(B.pathname==="/api/alerts/rules"&&_.method==="PATCH"){let V=await X(_),Y=Xe.getRule(String(V.id??""));if(!Y||!j(Y.resourceId))return C({ok:!1,error:"Alert rule was not found."},404);return C({ok:!0,rule:Xe.setRuleEnabled(Y.id,V.enabled!==!1)})}if(B.pathname==="/api/alerts/evaluate"&&_.method==="POST")return C({ok:!0,...await Tm(w?.id)});if(B.pathname==="/api/alerts"&&_.method==="GET")return C({ok:!0,alerts:Xe.listAlerts(y.project.id,{environmentId:w?.id,states:B.searchParams.getAll("state").length?B.searchParams.getAll("state"):void 0,limit:Number(B.searchParams.get("limit"))||200}).filter((V)=>j(V.resourceId)).map((V)=>({...V,deliveries:Xe.listDeliveries({alertId:V.id,limit:50})}))});if(B.pathname==="/api/alerts/action"&&_.method==="POST"){let V=await X(_),Y=Xe.getAlert(String(V.id??""));if(!Y||!j(Y.resourceId))return C({ok:!1,error:"Alert was not found."},404);let fe=String(V.action??"");if(fe==="acknowledge")return C({ok:!0,alert:Xe.acknowledge(Y.id,H?.id??"")});if(fe==="assign")return C({ok:!0,alert:Xe.assign(Y.id,V.ownerActorId==="me"?H?.id:V.ownerActorId?String(V.ownerActorId):void 0,H?.id)});if(fe==="silence"){if(ce.role!=="admin")return C({ok:!1,error:"Silencing production alerts requires an administrator."},403);let de=Ht.resolveSession(_);if(Ce&&(!de||!_e.isRecentlyAuthenticated(de)))return C({ok:!1,error:"Recent authentication is required to silence alerts.",stepUpRequired:!0},401);return C({ok:!0,alert:Xe.silenceAlert(Y.id,String(V.until??""),H?.id)})}return C({ok:!1,error:"Action must be acknowledge, assign, or silence."},422)}if(B.pathname==="/api/alerts/silences"&&_.method==="POST"){let V=await X(_);return C({ok:!0,id:Xe.createSilence({projectId:y.project.id,environmentId:w?.id,resourceId:q(V.resourceId??V.resource),matcher:V.matcher,reason:String(V.reason??""),startsAt:String(V.startsAt??new Date().toISOString()),endsAt:String(V.endsAt??""),timezone:String(V.timezone??"UTC"),actorId:H?.id})},201)}if(B.pathname==="/api/notifications/channels"&&_.method==="GET")return C({ok:!0,channels:Xe.listChannels(y.organization.id)});if(B.pathname==="/api/notifications/channels"&&_.method==="POST"){let V=await X(_),Y=String(V.kind??""),fe=Y==="email"?{to:V.config?.to,from:V.config?.from}:Y==="telegram"?{chatId:String(V.config?.chatId??"")}:{};return C({ok:!0,channel:Xe.createChannel({organizationId:y.organization.id,name:String(V.name??""),kind:Y,config:fe,credential:V.credential?String(V.credential):void 0,actorId:H?.id})},201)}if(B.pathname==="/api/notifications/channels"&&_.method==="PATCH"){let V=await X(_),Y=String(V.id??"");if(V.credential)return C({ok:!0,channel:Xe.rotateChannel(Y,String(V.credential))});let fe=String(V.status??"paused");if(!["active","paused","disabled"].includes(fe))return C({ok:!1,error:"Channel status must be active, paused, or disabled."},422);return C({ok:!0,channel:Xe.setChannelStatus(Y,fe)})}if(B.pathname==="/api/notifications/channels/test"&&_.method==="POST"){let V=await X(_);return C({ok:!0,productionIncidentCreated:!1,result:await gn.testChannel(String(V.id??""))})}if(B.pathname==="/api/notifications/routes"&&_.method==="GET")return C({ok:!0,routes:Xe.listRoutes(y.organization.id)});if(B.pathname==="/api/notifications/routes"&&_.method==="POST"){let V=await X(_),Y=Array.isArray(V.channelIds)?V.channelIds.map(String):[];if(Y.some((fe)=>Xe.getChannel(fe)?.organizationId!==y.organization.id))return C({ok:!1,error:"Route contains an unavailable channel."},422);return C({ok:!0,route:Xe.createRoute({organizationId:y.organization.id,name:String(V.name??""),priority:Number(V.priority)||0,matcher:V.matcher&&typeof V.matcher==="object"?V.matcher:{},channelIds:Y,quietHours:V.quietHours,groupWaitSeconds:Number(V.groupWaitSeconds)||30,reminderSeconds:V.reminderSeconds==null?void 0:Number(V.reminderSeconds),escalation:Array.isArray(V.escalation)?V.escalation:[],template:V.template?String(V.template):void 0,rateLimitPerMinute:Number(V.rateLimitPerMinute)||60,enabled:V.enabled!==!1})},201)}if(B.pathname==="/api/notifications/routes"&&_.method==="PATCH"){let V=await X(_),Y=Xe.getRoute(String(V.id??""));if(!Y||Y.organizationId!==y.organization.id)return C({ok:!1,error:"Notification route was not found."},404);return C({ok:!0,route:Xe.setRouteEnabled(Y.id,V.enabled!==!1)})}if(B.pathname==="/api/notifications/routes/preview"&&_.method==="POST"){let V=await X(_),fe=(V.alertId?Xe.getAlert(String(V.alertId)):void 0)??{id:"preview",ruleId:"preview",projectId:y.project.id,environmentId:w?.id,resourceId:q(V.resourceId??V.resource),dedupKey:"preview",groupKey:String(V.groupKey??"default"),state:"firing",severity:["info","warning","critical"].includes(String(V.severity))?V.severity:"warning",title:String(V.title??"Rule preview"),evidence:{},failureCount:1,recoveryCount:0,occurrenceCount:1,firstSeenAt:new Date().toISOString(),lastSeenAt:new Date().toISOString(),firingAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return C({ok:!0,productionIncidentCreated:!1,matches:gn.preview(y.organization.id,fe,String(V.eventType??"firing")).map((de)=>({route:de.route,channels:de.channels,quiet:de.quiet}))})}if(B.pathname==="/api/notifications/deliveries"&&_.method==="GET")return C({ok:!0,deliveries:Xe.listDeliveries({alertId:B.searchParams.get("alertId")??void 0,states:B.searchParams.getAll("state"),limit:Number(B.searchParams.get("limit"))||200})});if(B.pathname==="/api/notifications/deliveries/retry"&&_.method==="POST"){let V=await X(_),Y=Xe.getDelivery(String(V.id??""));if(!Y)return C({ok:!1,error:"Delivery was not found."},404);return Xe.updateDelivery(Y.id,{state:"retrying",attempt:Math.max(0,Y.attempt-1),nextAttemptAt:new Date().toISOString()}),C({ok:!0,delivery:await gn.deliver(Y.id)})}}if(B.pathname.startsWith("/api/jobs")||B.pathname.startsWith("/api/workers")){let w=y.environments.get(Se),E=y.store.listResources(y.project.id,w?.id),j=ce.role==="admin"||!!w&&qs(ce,w.id,"automation:read")?E:E.filter((Ae)=>Rr(ce,Ae.id,"automation:read")),q=(Ae)=>!Ae||j.some((je)=>je.id===Ae),H=Ue(ce).actor,V=M.get(Se)??O,Y=al(f,V),fe=Y.filter((Ae)=>!Ae.danger&&["scheduler","backup","worker"].includes(Ae.group)),de=K(f),Ye=()=>{let Ae=Ht.resolveSession(_);return!Ce||!!Ae&&_e.isRecentlyAuthenticated(Ae)},ke=(Ae)=>{if(!Ae||typeof Ae!=="object"||Array.isArray(Ae))return{};let je=Object.entries(Ae).slice(0,50);if(je.some(([,tt])=>typeof tt!=="string"||!/^(?:secret|ssm|arn|env):\/\//.test(tt)))throw Error("Job payload values must be secret or environment references, never inline values.");return Object.fromEntries(je)},Ve=(Ae,je,tt)=>y.store.appendEvent({organizationId:y.organization.id,projectId:y.project.id,resourceId:tt,actorId:H?.id,type:`job.${Ae}`,payload:je});if(B.pathname==="/api/jobs/preview"&&_.method==="POST"){let Ae=await X(_);try{return C({ok:!0,productionExecutionCreated:!1,preview:Mt(String(Ae.expression??""),String(Ae.timezone??"UTC"),new Date(Ae.from?String(Ae.from):Date.now()),Number(Ae.count)||5)})}catch(je){return C({ok:!1,error:je instanceof Error?je.message:"Schedule preview could not be generated.",productionExecutionCreated:!1},422)}}if(B.pathname==="/api/jobs"&&_.method==="GET")return C({ok:!0,jobs:kr.list(y.project.id,{environmentId:w?.id}).filter((Ae)=>q(Ae.resourceId)).map((Ae)=>({...Ae,preview:Mt(Ae.normalizedExpression,Ae.timezone,new Date,5),capability:vn(Ae),lastExecution:kr.listExecutions(Ae.id,1)[0]}))});if(B.pathname==="/api/jobs"&&_.method==="POST"){let Ae=await X(_),je=String(Ae.provider??(de==="serverless"?"eventbridge":"server")),tt=de==="serverless"?"eventbridge":"server";if(je!==tt)return C({ok:!1,error:`${de} environments accept ${tt} schedules through this adapter.`},422);let ft=Ae.operationId?String(Ae.operationId):void 0;if(je==="server"&&(!ft||!fe.some((lr)=>lr.id===ft)))return C({ok:!1,error:"Server jobs require an allowlisted operation target."},422);let Et=vn({provider:je,expression:String(Ae.expression??""),flexibleMinutes:Number(Ae.flexibleMinutes)||0,missedRunPolicy:Ae.missedRunPolicy==="catch_up"?"catch_up":"skip",overlapPolicy:["allow","forbid","replace"].includes(String(Ae.overlapPolicy))?Ae.overlapPolicy:"forbid"});if(!Et.supported)return C({ok:!1,error:Et.notes.join(" ")},422);let an=Ae.resourceId?E.find((lr)=>lr.id===Ae.resourceId||lr.slug===Ae.resourceId):void 0;if(Ae.resourceId&&(!an||!q(an.id)))return C({ok:!1,error:"Job resource was not found."},404);try{let lr=je==="server"?{kind:"dashboard_operation",operationId:ft}:{kind:"serverless_scheduler",action:"run"},Ai=kr.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:w?.id,resourceId:an?.id,name:String(Ae.name??""),provider:je,expression:String(Ae.expression??""),timezone:String(Ae.timezone??"UTC"),startsAt:Ae.startsAt?String(Ae.startsAt):void 0,endsAt:Ae.endsAt?String(Ae.endsAt):void 0,flexibleMinutes:Number(Ae.flexibleMinutes)||0,target:lr,payloadRefs:ke(Ae.payloadRefs),missedRunPolicy:Ae.missedRunPolicy==="catch_up"?"catch_up":"skip",overlapPolicy:["allow","forbid","replace"].includes(String(Ae.overlapPolicy))?Ae.overlapPolicy:"forbid",retryPolicy:{maxAttempts:Number(Ae.maxAttempts)||3,backoffSeconds:Number(Ae.backoffSeconds)||30,deadLetterRef:Ae.deadLetterRef?String(Ae.deadLetterRef):void 0},timeoutSeconds:Number(Ae.timeoutSeconds)||900,enabled:Ae.enabled!==!1,origin:"managed",ownerActorId:H?.id,observedState:{},reconciliationStatus:"pending"});return Ve("created",{jobId:Ai.id,provider:Ai.provider,expression:Ai.normalizedExpression},Ai.resourceId),C({ok:!0,job:Ai,capability:Et},201)}catch(lr){return C({ok:!1,error:lr instanceof Error?lr.message:"Scheduled job could not be created."},422)}}if(B.pathname==="/api/jobs"&&_.method==="PATCH"){let Ae=await X(_),je=kr.get(String(Ae.id??""));if(!je||!q(je.resourceId))return C({ok:!1,error:"Scheduled job was not found."},404);if(je.origin==="config")return C({ok:!1,error:"Config-defined schedules must be edited in cloud.config.ts and reconciled."},409);let tt=Ae.missedRunPolicy==null?void 0:String(Ae.missedRunPolicy),ft=Ae.overlapPolicy==null?void 0:String(Ae.overlapPolicy);if(tt&&!["skip","catch_up"].includes(tt))return C({ok:!1,error:"Missed-run policy must be skip or catch_up."},422);if(ft&&!["allow","forbid","replace"].includes(ft))return C({ok:!1,error:"Overlap policy must be allow, forbid, or replace."},422);try{let Et=kr.updateSchedule(je.id,{expression:Ae.expression?String(Ae.expression):void 0,timezone:Ae.timezone?String(Ae.timezone):void 0,missedRunPolicy:tt,overlapPolicy:ft,timeoutSeconds:Ae.timeoutSeconds==null?void 0:Number(Ae.timeoutSeconds)});return Ve("updated",{jobId:Et.id,expression:Et.normalizedExpression,version:Et.version},Et.resourceId),C({ok:!0,job:Et})}catch(Et){return C({ok:!1,error:Et instanceof Error?Et.message:"Scheduled job could not be updated."},422)}}if(B.pathname==="/api/jobs/action"&&_.method==="POST"){let Ae=await X(_),je=kr.get(String(Ae.id??""));if(!je||!q(je.resourceId))return C({ok:!1,error:"Scheduled job was not found."},404);let tt=String(Ae.action??"");if(tt==="run"){let ft=_m.enqueue(je,{trigger:"manual",actorId:H?.id});return Ve("run_queued",{jobId:je.id,executionId:ft.id},je.resourceId),C({ok:!0,execution:ft},202)}if(["disable","delete"].includes(tt)&&w?.kind==="production"){if(String(Ae.confirm??"")!==tt)return C({ok:!1,error:`Type "${tt}" to confirm this production change.`},409);if(!Ye())return C({ok:!1,error:"Recent authentication is required for this production change.",stepUpRequired:!0},401)}if(tt==="enable"||tt==="disable"){let ft=kr.setEnabled(je.id,tt==="enable");return Ve(tt==="enable"?"enabled":"disabled",{jobId:je.id},je.resourceId),C({ok:!0,job:ft})}if(tt==="delete")try{return kr.remove(je.id),Ve("deleted",{jobId:je.id,name:je.name},je.resourceId),C({ok:!0,deleted:je.id})}catch(ft){return C({ok:!1,error:ft instanceof Error?ft.message:"Scheduled job could not be deleted."},409)}return C({ok:!1,error:"Action must be run, enable, disable, or delete."},422)}if(B.pathname==="/api/jobs/history"&&_.method==="GET"){let Ae=kr.get(String(B.searchParams.get("jobId")??""));if(!Ae||!q(Ae.resourceId))return C({ok:!1,error:"Scheduled job was not found."},404);return C({ok:!0,executions:kr.listExecutions(Ae.id,Number(B.searchParams.get("limit"))||100).map((je)=>({...je,logs:je.operationId?Dt.logs(je.operationId,{limit:500}):[]}))})}if(B.pathname==="/api/jobs/reconcile"&&_.method==="POST"){if(!w)return C({ok:!1,error:"Environment was not found."},404);let Ae=Ra(kr,f,{organization:y.organization,project:y.project,environment:w,resources:E});return Ve("reconciled",Ae),C({ok:!0,reconciliation:Ae})}if(B.pathname==="/api/workers"&&_.method==="GET"){let Ae=Array.isArray(V.workersDetail??V.workers)?V.workersDetail??V.workers:[];return C({ok:!0,workers:kr.listWorkers(y.project.id,w?.id).filter((je)=>q(je.resourceId)).map((je)=>{let tt=Ae.find((ft)=>ft.name===je.name||ft.site===je.target.site);return tt?{...je,observedState:{...je.observedState,status:tt.status??"configured",currentJob:tt.currentJob??null,failures:Number(tt.failed??tt.failures)||0,processed:Number(tt.processed)||0}}:je})})}if(B.pathname==="/api/workers/action"&&_.method==="POST"){let Ae=await X(_),je=kr.getWorker(String(Ae.id??""));if(!je||!q(je.resourceId))return C({ok:!1,error:"Worker was not found."},404);let tt=String(Ae.action??"");if(tt==="restart"){if(String(Ae.confirm??"")!==je.name)return C({ok:!1,error:`Type "${je.name}" to restart this worker.`},409);let ft=Y.find((lr)=>lr.id===je.target.operationId);if(!ft)return C({ok:!1,error:"The allowlisted worker restart operation is unavailable."},409);let Et=await dl(f,Se,ft),an=kr.reconcileWorker(je.id,Et.ok?"in_sync":"unavailable",{...je.observedState,lastRestartAt:new Date().toISOString(),command:Et.command??null,error:Et.error??Et.stderr??null});return Ve("worker_restarted",{workerId:je.id,ok:Et.ok},je.resourceId),C({...Et,worker:an},Et.ok?200:409)}if(tt==="scale")return C({ok:!1,error:je.provider==="systemd"?"Systemd worker scale is config-managed; edit the worker definition and reconcile.":"This provider does not expose safe worker scaling through the current adapter."},422);return C({ok:!1,error:"Action must be restart or scale."},422)}}if(B.pathname.startsWith("/api/telemetry/")){let w=y.environments.get(Se),E=new Rt(y.store),N=y.store.listResources(y.project.id,w?.id),j=["/api/telemetry/query","/api/telemetry/tail","/api/telemetry/export","/api/telemetry/saved-queries","/api/telemetry/refresh"].includes(B.pathname)?"runtime:logs":"runtime:read",q=ce.role==="admin"||!!w&&qs(ce,w.id,j),H=q?N:N.filter((ke)=>Rr(ce,ke.id,j)),V=(ke)=>RS(H,q,ke),Y=(ke)=>{let Ve=new Date,Ae={"1h":3600000,"6h":21600000,"24h":86400000,"7d":604800000,"30d":2592000000},je=String(ke.to??Ve.toISOString()),tt=String(ke.from??new Date(new Date(je).getTime()-(Ae[String(ke.range??"1h")]??Ae["1h"])).toISOString()),ft=(an)=>{let lr=(Array.isArray(an)?an:String(an??"").split(",")).map(String).filter(Boolean);return lr.length?lr:void 0},Et=ft(ke.kinds)?.filter((an)=>["metric","log","trace","request","event"].includes(an));return{projectId:y.project.id,environmentId:w?.id,resourceIds:V(ke.resources),kinds:Et,names:ft(ke.names),sources:ft(ke.sources),levels:ft(ke.levels),from:tt,to:je,text:String(ke.text??"")||void 0,traceId:String(ke.traceId??"")||void 0,requestId:String(ke.requestId??"")||void 0,deploymentId:String(ke.deploymentId??"")||void 0,releaseId:String(ke.releaseId??"")||void 0,workloadId:String(ke.workloadId??"")||void 0,cursor:String(ke.cursor??"")||void 0,limit:Number(ke.limit)||void 0}},fe=Object.fromEntries(B.searchParams.entries()),de=(ke=!1)=>bm({controlPlane:y.store,projectId:y.project.id,environmentId:w?.id,config:f,environment:Se,force:ke,lightweight:!ke}),Ye=()=>{let ke=y.store.getSetting(`telemetry.collection:${y.project.id}:${w?.id??"all"}`)??{};return{generatedAt:String(ke.generatedAt??new Date().toISOString()),cached:!0,statuses:Array.isArray(ke.statuses)?ke.statuses:[],errors:Array.isArray(ke.errors)?ke.errors:[],policy:ke.policy??cr(y.store,y.project.id)}};if(B.pathname==="/api/telemetry/status"&&_.method==="GET"){de(!1);let ke=Ye(),Ve=q?ke.statuses:E.status(y.project.id,w?.id,ke.policy.rawDays,ke.policy.samplingRate,H.map((je)=>je.id)),Ae=Ve.reduce((je,tt)=>je+tt.estimatedDailyBytes*30,0);return C({ok:!0,generatedAt:ke.generatedAt,cached:ke.cached,sources:Ve,errors:q?ke.errors:[],policy:ke.policy,retention:{rawDays:ke.policy.rawDays,downsampleAfterDays:ke.policy.downsampleAfterDays,downsampleBucketMs:ke.policy.downsampleBucketMs,maxRecords:ke.policy.maxRecords},estimatedMonthlyBytes:Ae,estimatedMonthlyCostUsd:Jd(Ae,ke.policy),costEstimateConfigured:ke.policy.estimatedStorageUsdPerGbMonth>0})}if(B.pathname==="/api/telemetry/settings"&&_.method==="GET")return C({ok:!0,policy:cr(y.store,y.project.id)});if(B.pathname==="/api/telemetry/settings"&&_.method==="PATCH"){let ke=Wd(y.store,y.project.id,await X(_));return DS(y.project.id),C({ok:!0,policy:ke})}if(B.pathname==="/api/telemetry/query"&&_.method==="GET"){de(!1);let ke=Ye();return C({ok:!0,collection:{generatedAt:ke.generatedAt,cached:ke.cached},...E.query(Y(fe))})}if(B.pathname==="/api/telemetry/tail"&&_.method==="GET"){de(!1);let ke=new TextEncoder,Ve=new Date,Ae=Y({...fe,kinds:fe.kinds||"log,request,event,trace",from:fe.from||new Date(Ve.getTime()-120000).toISOString(),to:Ve.toISOString(),limit:Math.min(1000,Number(fe.limit)||200),cursor:void 0}),je=_.headers.get("last-event-id")||String(fe.cursor??"")||void 0,tt,ft=!1,Et=!1,an=new ReadableStream({start(lr){let Ai=()=>{if(ft)return;if(ft=!0,tt)clearInterval(tt);_.signal.removeEventListener("abort",Ai);try{lr.close()}catch{}},Um=async()=>{if(ft||Et)return;Et=!0;try{let to=E.tail({...Ae,to:new Date(Date.now()+1000).toISOString()},je);for(let qm of to.records)je=zi(qm)??je,lr.enqueue(ke.encode(`id: ${je??""}
699
699
  event: record
@@ -706,4 +706,4 @@ data: ${JSON.stringify({message:to instanceof Error?to.message:String(to)})}
706
706
  data: ${JSON.stringify({cursor:je,at:new Date().toISOString()})}
707
707
 
708
708
  `))},5000),tt.unref?.(),_.signal.addEventListener("abort",Ai,{once:!0})},cancel(){if(ft=!0,tt)clearInterval(tt)}});return new Response(an,{headers:{"cache-control":"no-cache, no-transform",connection:"keep-alive","content-type":"text/event-stream; charset=utf-8","x-accel-buffering":"no"}})}if(B.pathname==="/api/telemetry/series"&&_.method==="GET"){de(!1);let ke=Ye(),Ve=["sum","avg","min","max","count","p50","p90","p95","p99"].includes(String(fe.aggregation))?fe.aggregation:"avg",Ae=Y({...fe,kinds:"metric",limit:5000}),je=E.series({...Ae,bucketMs:Number(fe.bucketMs)||60000,aggregation:Ve,timezone:String(fe.timezone??"UTC"),compareFrom:fe.compareFrom,compareTo:fe.compareTo});return C({ok:!0,collection:{generatedAt:ke.generatedAt,cached:ke.cached},query:{aggregation:Ve,bucketMs:Number(fe.bucketMs)||60000,timezone:String(fe.timezone??"UTC")},series:je})}if(B.pathname==="/api/telemetry/refresh"&&_.method==="POST")return C({ok:!0,...await de(!0)});if(B.pathname==="/api/telemetry/export"&&_.method==="POST"){let ke=await X(_);await de(!1);let Ve=E.query({...Y(ke),limit:Math.min(5000,Number(ke.limit)||5000),cursor:void 0});if((ke.format==="csv"?"csv":"json")==="json")return new Response(JSON.stringify({exportedAt:new Date().toISOString(),query:Y(ke),...Ve},null,2),{headers:{"content-disposition":'attachment; filename="ts-cloud-telemetry.json"',"content-type":"application/json; charset=utf-8"}});let je=["timestamp","kind","source","name","level","value","unit","message","traceId","requestId","deploymentId","releaseId","workloadId"],tt=[je.join(","),...Ve.records.map((ft)=>je.map((Et)=>`"${String(ft[Et]??"").replaceAll('"','""')}"`).join(","))].join(`
709
- `);return new Response(tt,{headers:{"content-disposition":'attachment; filename="ts-cloud-telemetry.csv"',"content-type":"text/csv; charset=utf-8"}})}if(B.pathname==="/api/telemetry/saved-queries"&&_.method==="GET"){let ke=Ue(ce);return C({ok:!0,queries:E.listSavedQueries(y.project.id,ke.actor?.id)})}if(B.pathname==="/api/telemetry/saved-queries"&&_.method==="POST"){let ke=await X(_),Ve=Ue(ce);return C({ok:!0,query:E.saveQuery(y.project.id,Ve.actor?.id,String(ke.name??""),Y(ke.query??ke))},201)}if(B.pathname==="/api/telemetry/saved-queries"&&_.method==="DELETE"){let ke=await X(_),Ve=Ue(ce),Ae=E.deleteSavedQuery(y.project.id,Ve.actor?.id,String(ke.id??""));return C({ok:Ae},Ae?200:404)}}if(B.pathname.startsWith("/api/configuration")){let w=y.environments.get(Se),E=ce.role==="admin"||!!mn.capabilities?.includes("secrets:read"),N=ce.role==="admin"||!!mn.capabilities?.includes("secrets:write"),j={projectId:y.project.id,environmentId:w?.id},q={"cache-control":"no-store"};if(B.pathname==="/api/configuration"&&_.method==="GET"){let H=Object.fromEntries(B.searchParams),V=H.scopeType||H.scopeId?Ls(H,j):void 0,Y=["variable","secret"].includes(String(H.kind))?H.kind:void 0,fe=V?.type==="preview"?Zt.previews.getInstance(V.id):void 0,de=fe?Zt.previews.getDefinition(fe.definitionId):void 0,Ye=V?await tn.resolve({projectId:y.project.id,environmentId:V.environmentId,resourceId:V.resourceId,functionId:V.type==="function"?V.id:void 0,previewId:V.previewId,trustedPreview:!!fe&&!fe.fork,allowedPreviewSecrets:de?.inheritedSecrets,nativeReferences:!0,canReadSecretMetadata:E}):void 0,ke=y.store.listResources(y.project.id);return C({ok:!0,entries:tn.list({projectId:y.project.id,scope:V,kind:Y,search:H.search,canReadSecretMetadata:E}),effectiveEntries:Ye?Object.values(Ye.entries).filter((Ve)=>!Y||Ve.kind===Y).filter((Ve)=>!H.search||Ve.key.toLowerCase().includes(String(H.search).toLowerCase())):[],configurationHash:Ye?.configurationHash,warnings:Ye?.warnings??[],scopes:{project:y.project,environments:y.store.listEnvironments(y.project.id),resources:ke.filter((Ve)=>Ve.kind!=="function"),functions:ke.filter((Ve)=>Ve.kind==="function"),previews:Zt.previews.listInstances({projectId:y.project.id}).filter((Ve)=>Ve.status!=="destroyed").map((Ve)=>({id:Ve.id,name:Ve.name,environmentId:Ve.baseEnvironmentId,resourceId:Ve.resourceId,fork:Ve.fork,status:Ve.status}))}},200,q)}if(B.pathname==="/api/configuration/export"&&_.method==="GET"){let H=Ls(Object.fromEntries(B.searchParams),j);return new Response(tn.exportVariables({projectId:y.project.id,scope:H}),{headers:{...q,"content-disposition":'attachment; filename="ts-cloud.env"',"content-type":"text/plain; charset=utf-8"}})}if(B.pathname==="/api/configuration/plan"&&_.method==="POST"){let H=await X(_),V=Ls(H,j),Y=H.values&&typeof H.values==="object"&&!Array.isArray(H.values)?Object.fromEntries(Object.entries(H.values).map(([fe,de])=>[fe,String(de)])):{};return C({ok:!0,plan:tn.plan({projectId:y.project.id,scope:V,values:Y,removeMissing:H.removeMissing===!0})},200,q)}if(B.pathname==="/api/configuration"&&_.method==="POST"){let H=await X(_),V=Ls(H,j),Y=H.kind==="secret"?"secret":"variable",fe=String(H.key??"");if(Y==="secret"&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);try{let de=await tn.set({organizationId:y.organization.id,projectId:y.project.id,scope:V,key:fe,kind:Y,value:H.value==null?void 0:String(H.value),reference:H.reference==null?void 0:String(H.reference),backend:H.backend,required:H.required===!0,expectedVersion:H.expectedVersion==null?void 0:Number(H.expectedVersion),confirmed:String(H.confirm??"")===fe,idempotencyKey:_.headers.get("idempotency-key")??H.idempotencyKey,actorId:Ue(ce).actor?.id});return C({ok:!0,entry:tn.list({projectId:y.project.id,scope:V,canReadSecretMetadata:E}).find((Ye)=>Ye.id===de.entry.id),mutation:de.mutation,warnings:de.warnings},de.mutation.added.length?201:200,q)}catch(de){return C({ok:!1,error:de instanceof Error?de.message:String(de)},409,q)}}if(B.pathname==="/api/configuration/import"&&_.method==="POST"){let H=await X(_),V=Ls(H,j),Y=Array.isArray(H.secretKeys)?H.secretKeys.map(String):[];if(Y.length&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);try{let fe=await tn.importDotenv({organizationId:y.organization.id,projectId:y.project.id,scope:V,source:String(H.source??""),secretKeys:Y,backend:H.backend,confirmed:H.confirm==="import",idempotencyKey:_.headers.get("idempotency-key")??H.idempotencyKey,actorId:Ue(ce).actor?.id});return C({ok:fe.document.valid,diagnostics:fe.document.diagnostics,mutation:fe.mutation,warnings:fe.warnings},fe.document.valid?200:422,q)}catch(fe){return C({ok:!1,error:fe instanceof Error?fe.message:String(fe)},409,q)}}if(B.pathname==="/api/configuration/dependencies"&&_.method==="POST"){let H=await X(_),V=wi.get(String(H.entryId??"")),Y=y.store.getResource(String(H.resourceId??""));if(!V||V.projectId!==y.project.id||!Y||Y.projectId!==y.project.id)return C({ok:!1,error:"Configuration entry or dependent resource was not found."},404,q);return C({ok:!0,dependency:wi.setDependency({entryId:V.id,resourceId:Y.id,injectionTarget:["native_reference","file"].includes(String(H.injectionTarget))?H.injectionTarget:"environment",required:H.required!==!1,requiresRedeploy:H.requiresRedeploy!==!1,lastDeployedVersion:H.lastDeployedVersion==null?void 0:Number(H.lastDeployedVersion)})},200,q)}if(B.pathname==="/api/configuration/transfer"&&_.method==="POST"){let H=await X(_),V=wi.get(String(H.id??"")),Y=Ls({...H,scopeType:H.targetScopeType,scopeId:H.targetScopeId},j);if(!V||V.projectId!==y.project.id)return C({ok:!1,error:"Configuration entry was not found."},404,q);if(V.kind==="secret"&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);try{let fe=await tn.transfer({entryId:V.id,targetScope:Y,mode:H.mode==="move"?"move":"copy",confirmed:H.confirm===V.key,actorId:Ue(ce).actor?.id,idempotencyKey:_.headers.get("idempotency-key")??H.idempotencyKey});return C({ok:!0,entry:tn.list({projectId:y.project.id,scope:Y,canReadSecretMetadata:E}).find((de)=>de.id===fe.entry.id),mutation:fe.mutation},200,q)}catch(fe){return C({ok:!1,error:fe instanceof Error?fe.message:String(fe)},409,q)}}if(B.pathname==="/api/configuration/bulk"&&_.method==="POST"){let H=await X(_),V=Array.isArray(H.ids)?H.ids.map(String).slice(0,500):[],Y=V.map((de)=>wi.get(de)).filter((de)=>!!de&&de.projectId===y.project.id);if(Y.length!==V.length)return C({ok:!1,error:"One or more configuration entries were not found."},404,q);if(Y.some((de)=>de.kind==="secret")&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);if(H.action!=="delete"||H.confirm!=="bulk")return C({ok:!1,error:"Bulk deletion requires action delete and confirm bulk."},409,q);let fe=[];try{for(let de of Y)fe.push(await tn.remove({entryId:de.id,expectedVersion:de.version,confirmed:!0,actorId:Ue(ce).actor?.id}));return C({ok:!0,removed:fe.flatMap((de)=>de.removed),affectedResourceIds:[...new Set(fe.flatMap((de)=>de.affectedResourceIds))].sort()},200,q)}catch(de){return C({ok:!1,error:de instanceof Error?de.message:String(de),partial:fe.flatMap((Ye)=>Ye.removed)},409,q)}}if(B.pathname==="/api/configuration/reveal"&&_.method==="POST"){let H=await X(_),V=Ht.resolveSession(_);try{return C({ok:!0,value:await tn.reveal({entryId:String(H.id??""),canRevealSecrets:E,recentlyAuthenticated:!Ce||!!V&&_e.isRecentlyAuthenticated(V),actorId:Ue(ce).actor?.id})},200,q)}catch(Y){return C({ok:!1,error:Y instanceof Error?Y.message:String(Y)},403,q)}}if(B.pathname==="/api/configuration"&&_.method==="DELETE"){let H=await X(_),V=wi.get(String(H.id??""));if(V?.kind==="secret"&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);if(!V||V.projectId!==y.project.id)return C({ok:!1,error:"Configuration entry was not found."},404,q);try{return C({ok:!0,mutation:await tn.remove({entryId:V.id,expectedVersion:Number(H.expectedVersion),confirmed:String(H.confirm??"")===V.key,actorId:Ue(ce).actor?.id})},200,q)}catch(Y){return C({ok:!1,error:Y instanceof Error?Y.message:String(Y)},409,q)}}}if(B.pathname.startsWith("/api/fleet")){let w=Ue(ce).actor?.id,E=(N,j=409)=>C({ok:!1,error:N instanceof Error?N.message:String(N)},j,{"cache-control":"no-store"});if(B.pathname==="/api/fleet"&&_.method==="GET")return C({ok:!0,servers:Us.list(y.project.id),resources:y.store.listResources(y.project.id),operations:Dt.list({projectId:y.project.id,limit:200}).filter((N)=>N.operation.kind.startsWith("fleet."))},200,{"cache-control":"no-store"});if(B.pathname==="/api/fleet"&&_.method==="POST"){let N=await X(_);try{return C({ok:!0,server:Yn.enroll({organizationId:y.organization.id,projectId:y.project.id,name:String(N.name??""),provider:["aws","hetzner"].includes(String(N.provider))?N.provider:"ssh",providerId:N.providerId?String(N.providerId):void 0,region:N.region?String(N.region):void 0,zone:N.zone?String(N.zone):void 0,endpoint:String(N.endpoint??""),sshUser:String(N.sshUser??"deploy"),sshPort:N.sshPort?Number(N.sshPort):22,credentialRef:String(N.credentialRef??""),roles:Array.isArray(N.roles)?N.roles:[],labels:N.labels&&typeof N.labels==="object"?N.labels:{}})},201)}catch(j){return E(j,422)}}if(B.pathname==="/api/fleet/action"&&_.method==="POST"){let N=await X(_),j=String(N.id??""),q=String(N.action??"");try{if(q==="test")return C({ok:!0,server:await Yn.test(j)});if(q==="validate")return C({ok:!0,server:await Yn.validate(j)});if(q==="review_host_key")return C({ok:!0,server:Yn.reviewHostKey(j,String(N.fingerprint??""))});if(q==="bootstrap")return C({ok:!0,...Yn.bootstrap(j,N.confirmed===!0)},N.confirmed===!0?202:200);if(q==="heartbeat")return C({ok:!0,server:Yn.heartbeat(j,{usage:N.usage&&typeof N.usage==="object"?N.usage:{}})});if(q==="drain")return C({ok:!0,server:Yn.drain(j,N.completed===!0)});if(q==="uncordon")return C({ok:!0,server:Yn.uncordon(j)});if(q==="archive")return C({ok:!0,server:Yn.archive(j,String(N.confirmation??""))});return E("Unsupported fleet action.",422)}catch(H){return E(H)}}}if(B.pathname.startsWith("/api/capacity")){let w=(E,N=409)=>C({ok:!1,error:E instanceof Error?E.message:String(E)},N,{"cache-control":"no-store"});if(B.pathname==="/api/capacity"&&_.method==="GET")return C({ok:!0,pools:Ii.listPools(y.project.id),placements:Ii.listPlacements(y.project.id),servers:Us.list(y.project.id)},200,{"cache-control":"no-store"});if(B.pathname==="/api/capacity"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,pool:Ii.createPool({organizationId:y.organization.id,projectId:y.project.id,name:String(E.name??""),purpose:String(E.purpose??"application"),backend:String(E.backend??"server"),region:E.region?String(E.region):void 0,architecture:E.architecture?String(E.architecture):void 0,labels:E.labels&&typeof E.labels==="object"?E.labels:{},requiredServerLabels:E.requiredServerLabels&&typeof E.requiredServerLabels==="object"?E.requiredServerLabels:{},toleratedTaints:Array.isArray(E.toleratedTaints)?E.toleratedTaints.map(String):[],capacity:E.capacity&&typeof E.capacity==="object"?E.capacity:{},maxWorkloads:Number(E.maxWorkloads??10),costWeight:Number(E.costWeight??1),spreadKey:E.spreadKey?String(E.spreadKey):void 0,concurrency:Number(E.concurrency??1),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"})},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/capacity/member"&&_.method==="POST"){let E=await X(_);try{return Ii.addMember(String(E.poolId??""),String(E.serverId??"")),C({ok:!0,pool:Ii.getPool(String(E.poolId??""))})}catch(N){return w(N,422)}}if(B.pathname==="/api/capacity/explain"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,decisions:Am.explain(y.project.id,{purpose:String(E.purpose??"application"),resources:E.resources&&typeof E.resources==="object"?E.resources:{},region:E.region?String(E.region):void 0,architecture:E.architecture?String(E.architecture):void 0,labels:E.labels&&typeof E.labels==="object"?E.labels:{}})})}catch(N){return w(N,422)}}if(B.pathname==="/api/capacity/action"&&_.method==="POST"){let E=await X(_);try{if(E.action==="drain")return C({ok:!0,...Am.drainPool(String(E.poolId??""))});if(E.action==="enable")return C({ok:!0,pool:Ii.updatePool(String(E.poolId??""),{status:"active"})});if(E.action==="disable")return C({ok:!0,pool:Ii.updatePool(String(E.poolId??""),{status:"disabled"})});return w("Unsupported capacity action.",422)}catch(N){return w(N,422)}}}if(B.pathname.startsWith("/api/regions")){let w=(E,N=409)=>C({ok:!1,error:E instanceof Error?E.message:String(E)},N,{"cache-control":"no-store"});if(B.pathname==="/api/regions"&&_.method==="GET")return C({ok:!0,topologies:Zi.list(y.project.id).map((E)=>({topology:E,targets:Zi.targets(E.id),channels:Zi.channels(E.id),route:Zi.route(E.id),executions:Zi.executions(E.id)}))},200,{"cache-control":"no-store"});if(B.pathname==="/api/regions"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,topology:Cm.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:y.environments.get(Se)?.id,name:String(E.name??""),hostname:String(E.hostname??""),regions:Array.isArray(E.regions)?E.regions:[],trafficPolicy:E.trafficPolicy==="weighted"||E.trafficPolicy==="latency"?E.trafficPolicy:"active_passive",dataPolicy:{replicate:Array.isArray(E.replicate)?E.replicate:["s3","dynamodb","secrets"],maxLagSeconds:Number(E.maxLagSeconds??30),retainOnDestroy:E.retainOnDestroy!==!1},dnsProvider:"route53",cdnEnabled:E.cdnEnabled===!0,wafEnabled:E.wafEnabled===!0})},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/regions/action"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,...Cm.enqueue({topologyId:String(E.topologyId??""),kind:String(E.action??""),targetRegion:E.targetRegion?String(E.targetRegion):void 0,revision:E.revision?String(E.revision):void 0,manifest:E.manifest&&typeof E.manifest==="object"?E.manifest:{},confirmation:E.confirmation?String(E.confirmation):void 0,deleteData:E.deleteData===!0})},202)}catch(N){return w(N,422)}}}if(B.pathname.startsWith("/api/maintenance")){let w=(E,N=409)=>C({ok:!1,error:E instanceof Error?E.message:String(E)},N,{"cache-control":"no-store"});if(B.pathname==="/api/maintenance"&&_.method==="GET")return C({ok:!0,manifests:si.manifests(y.organization.id),windows:si.windows(y.project.id),campaigns:si.campaigns(y.project.id).map((E)=>({campaign:E,targets:si.targets(E.id)})),cleanups:si.cleanups(y.project.id),drills:si.drills(y.project.id)},200,{"cache-control":"no-store"});if(B.pathname==="/api/maintenance/cleanup-preview"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,plan:await kl.previewCleanup({projectId:y.project.id,kind:String(E.kind??"operations"),criteria:{olderThanDays:Number(E.olderThanDays??30)}},Pm)},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/maintenance/cleanup-apply"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,...kl.enqueueCleanup(String(E.planId??""),String(E.confirmation??""))},202)}catch(N){return w(N,422)}}if(B.pathname==="/api/maintenance/drill"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,drill:si.createDrill({projectId:y.project.id,scenario:String(E.scenario??"control_plane"),isolatedTarget:String(E.isolatedTarget??""),expectedRpoMinutes:Number(E.expectedRpoMinutes??60),expectedRtoMinutes:Number(E.expectedRtoMinutes??30),recoveryPointId:E.recoveryPointId?String(E.recoveryPointId):void 0,topologyId:E.topologyId?String(E.topologyId):void 0})},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/maintenance/drill-run"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,...kl.enqueueDrill(String(E.drillId??""))},202)}catch(N){return w(N,422)}}}if(B.pathname.startsWith("/api/volumes")){let w=y.environments.get(Se),E=Ue(ce).actor?.id,N=(j,q=409)=>C({ok:!1,error:j instanceof Error?j.message:String(j)},q,{"cache-control":"no-store"});if(B.pathname==="/api/volumes"&&_.method==="GET"){let j=Sl.inventory(y.project.id,w?.id),q=y.store.listResources(y.project.id,w?.id).map((H)=>({id:H.id,name:H.name,slug:H.slug,kind:H.kind,provider:H.provider,providerId:H.providerId}));return C({ok:!0,volumes:j,resources:q,operations:Dt.list({projectId:y.project.id,limit:100}).filter((H)=>H.operation.kind.startsWith("volume.")),recoveryPoints:or.listRecoveryPoints(y.project.id).filter((H)=>H.kind==="volume"),providers:wl.map((H)=>({provider:H.provider,type:H.type,capabilities:H.capabilities()}))},200,{"cache-control":"no-store"})}if(B.pathname==="/api/volumes"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:w?.id,resourceId:j.resourceId?String(j.resourceId):void 0,name:String(j.name??""),provider:String(j.provider??"docker"),type:j.type==="docker"?"docker":j.type,capacityBytes:j.capacityBytes==null?void 0:Number(j.capacityBytes),filesystem:j.filesystem?String(j.filesystem):void 0,encrypted:j.encrypted===!0,desiredState:j.desiredState&&typeof j.desiredState==="object"?j.desiredState:{},actorId:E})},202,{"cache-control":"no-store"})}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/attach"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.attach(String(j.volumeId??""),{resourceId:String(j.resourceId??""),targetPath:String(j.targetPath??""),readOnly:j.readOnly===!0,uid:j.uid==null?void 0:Number(j.uid),gid:j.gid==null?void 0:Number(j.gid),mode:j.mode?String(j.mode):void 0,propagation:j.propagation,driverOptions:j.driverOptions&&typeof j.driverOptions==="object"?j.driverOptions:{},actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/detach"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.detach(String(j.volumeId??""),String(j.attachmentId??""),{force:j.force===!0,drained:j.drained===!0,unmounted:j.unmounted===!0,confirmation:j.confirmation?String(j.confirmation):void 0,actorId:E})},202)}catch(q){return N(q)}}if(B.pathname==="/api/volumes/resize"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.resize(String(j.volumeId??""),Number(j.capacityBytes),{drained:j.drained===!0,actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/snapshot"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.snapshot(String(j.volumeId??""),{name:j.name?String(j.name):void 0,actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/restore"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.restore(String(j.snapshotId??""),{name:String(j.name??""),actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/discover"&&_.method==="POST")try{return C({ok:!0,volumes:await oi.discover({organizationId:y.organization.id,projectId:y.project.id,environmentId:w?.id,actorId:E})})}catch(j){return N(j,502)}if(B.pathname==="/api/volumes/adopt"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,volume:oi.adopt(String(j.volumeId??""),{name:String(j.name??""),actorId:E})})}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes"&&_.method==="DELETE"){let j=await X(_),q=Ht.resolveSession(_);try{return C({ok:!0,...oi.delete(String(j.volumeId??""),{recentAuthAt:!Ce||q&&_e.isRecentlyAuthenticated(q)?new Date().toISOString():void 0,confirmation:j.confirmation?String(j.confirmation):void 0,backupOverride:j.backupOverride===!0,backupOverrideConfirmation:j.backupOverrideConfirmation?String(j.backupOverrideConfirmation):void 0,actorId:E})},202)}catch(H){return N(H)}}}if(B.pathname==="/api/backups"&&_.method==="GET"){let w=y.environments.get(Se),E=or.listPolicies(y.project.id,w?.id),N=new Set(E.map((Y)=>Y.id)),j=or.listRecoveryPoints(y.project.id).filter((Y)=>!Y.policyId||N.has(Y.policyId)),q=or.listJobs(y.project.id).filter((Y)=>!Y.policyId||N.has(Y.policyId)),H=(Y)=>({...Y,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!Y.credentialRef,clientEncryptionConfigured:!!Y.encryptionKeyRef}),V=await Promise.all(or.listDestinations(y.project.id).map(async(Y)=>({...H(Y),credentialStatus:await pg(Y,ii)})));return C({ok:!0,destinations:V,policies:E,recoveryPoints:j,jobs:q,coverage:or.coverage(y.project.id).filter((Y)=>N.has(Y.policy.id)),resources:w?y.store.listResources(y.project.id,w.id).map((Y)=>({id:Y.id,name:Y.name,slug:Y.slug,kind:Y.kind})):[]})}if(B.pathname==="/api/backups/destinations"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim(),N=String(w.provider??""),j=String(w.encryption??"provider"),q=`secret://data-services/backups/${y.project.id}/${E}`,H=[];if(!["aws_s3","s3_compatible","aws_backup"].includes(N))return C({ok:!1,error:"A supported backup destination provider is required."},422);if(!["provider","client_side","both"].includes(j))return C({ok:!1,error:"Encryption must be provider, client_side, or both."},422);try{let V,Y;if(w.credentials&&typeof w.credentials==="object"&&!Array.isArray(w.credentials))V=`${q}/credentials`,await ii.put(V,JSON.stringify(w.credentials)),H.push(V);if(j!=="provider"){let de=String(w.encryptionKey??"");if(de.length<32)throw Error("Client-side encryption keys must contain at least 32 characters.");Y=`${q}/encryption-key`,await ii.put(Y,de),H.push(Y)}let fe=or.createDestination({organizationId:y.organization.id,projectId:y.project.id,name:E,provider:N,endpoint:w.endpoint?String(w.endpoint):void 0,endpointPolicy:w.endpointPolicy==="allow_private"?"allow_private":"public_https",bucket:w.bucket?String(w.bucket):void 0,prefix:String(w.prefix??""),region:w.region?String(w.region):ki,forcePathStyle:w.forcePathStyle===!0,credentialRef:V,encryption:j,encryptionKeyRef:Y,immutability:w.immutability&&typeof w.immutability==="object"&&!Array.isArray(w.immutability)?w.immutability:{},status:"untested"});return C({ok:!0,destination:{...fe,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!V,clientEncryptionConfigured:!!Y}},201)}catch(V){for(let Y of H)await ii.remove(Y).catch(()=>{});return C({ok:!1,error:V instanceof Error?V.message:String(V)},422)}}if(B.pathname==="/api/backups/destinations/test"&&_.method==="POST"){let w=await X(_),E=or.getDestination(String(w.id??""));if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Backup destination was not found."},404);if(E.provider==="aws_backup")return C({ok:!1,error:"AWS Backup destinations are verified by creating a provider recovery point."},422);try{return await Rm.test(E),C({ok:!0,destination:or.recordDestinationTest(E.id,{ok:!0})})}catch(N){let j=N instanceof Error?N.message:String(N);return or.recordDestinationTest(E.id,{ok:!1,error:j}),C({ok:!1,error:j},502)}}if(B.pathname==="/api/backups/policies"&&_.method==="POST"){let w=await X(_),E=y.environments.get(Se),N=or.getDestination(String(w.destinationId??"")),j=String(w.resourceKind??""),q=w.dataServiceId?String(w.dataServiceId):void 0,H=q?qt.get(q):void 0,V=w.resourceId?String(w.resourceId):void 0,Y=V?y.store.getResource(V):void 0;if(!E)return C({ok:!1,error:"Environment was not found."},404);if(!N||N.projectId!==y.project.id)return C({ok:!1,error:"Backup destination was not found."},404);if(!["managed_database","logical_database","volume","files","control_plane","infrastructure"].includes(j))return C({ok:!1,error:"A supported backup resource kind is required."},422);if(q&&(!H||H.projectId!==y.project.id||H.environmentId!==E.id))return C({ok:!1,error:"Data service was not found in this environment."},404);if(V&&(!Y||Y.projectId!==y.project.id||Y.environmentId!==E.id))return C({ok:!1,error:"Resource was not found in this environment."},404);if(j==="managed_database"&&!H)return C({ok:!1,error:"Managed database policies require a data service."},422);if(j==="logical_database"&&(!H||!["container","server"].includes(H.provider)))return C({ok:!1,error:"Logical database policies require an on-box data service."},422);if(j==="volume"&&(!Y||!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(String(w.volumeName??""))))return C({ok:!1,error:"Volume policies require a scoped resource and valid volumeName."},422);let fe=Array.isArray(w.includePatterns)?w.includePatterns.map(String).filter(Boolean):[];if(j==="files"&&(!Y||!fe.length))return C({ok:!1,error:"File policies require a scoped resource and at least one project-relative include path."},422);if(j==="control_plane"&&N.encryption==="provider")return C({ok:!1,error:"Control-plane policies require a destination with client-side encryption."},422);if(j==="infrastructure"&&(N.provider!=="aws_backup"||!fe.some((de)=>de.startsWith("resource:arn:"))||!fe.some((de)=>de.startsWith("role:arn:"))))return C({ok:!1,error:"Infrastructure policies require an AWS Backup destination plus resource:<arn> and role:<arn> include values."},422);try{let de=or.createPolicy({organizationId:y.organization.id,projectId:y.project.id,environmentId:E.id,resourceId:V,dataServiceId:q,destinationId:N.id,name:String(w.name??"").trim(),resourceKind:j,schedule:String(w.schedule??"daily"),timezone:String(w.timezone??"UTC"),retention:w.retention&&typeof w.retention==="object"&&!Array.isArray(w.retention)?w.retention:{keepLast:7,expireAfterDays:30},compression:["none","gzip","zstd"].includes(String(w.compression))?w.compression:"gzip",encryption:["destination","client_side","both"].includes(String(w.encryption))?w.encryption:"destination",includePatterns:j==="volume"?[String(w.volumeName),...fe]:fe,excludePatterns:Array.isArray(w.excludePatterns)?w.excludePatterns.map(String):[],expectedRpoMinutes:Math.max(1,Number(w.expectedRpoMinutes)||1440),expectedRtoMinutes:Math.max(1,Number(w.expectedRtoMinutes)||120),healthCheckId:w.healthCheckId?String(w.healthCheckId):void 0,enabled:w.enabled!==!1});return C({ok:!0,policy:de},201)}catch(de){return C({ok:!1,error:de instanceof Error?de.message:String(de)},422)}}if(B.pathname==="/api/backups/run"&&_.method==="POST"){let w=await X(_),E=or.getPolicy(String(w.policyId??"")),N=y.environments.get(Se);if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Backup policy was not found in this environment."},404);try{let j=Yi.enqueueBackup(E,new Date().toISOString(),Ue(ce).actor?.id);return C({ok:!0,job:j},202)}catch(j){return C({ok:!1,error:j instanceof Error?j.message:String(j)},409)}}if(B.pathname==="/api/backups/verify"&&_.method==="POST"){let w=await X(_),E=or.getRecoveryPoint(String(w.recoveryPointId??""));if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Recovery point was not found."},404);return C({ok:!0,job:Yi.enqueueVerification(E)},202)}if(B.pathname==="/api/backups/restore"&&_.method==="POST"){let w=await X(_),E=or.getRecoveryPoint(String(w.recoveryPointId??"")),N=w.mode==="in_place"?"in_place":"isolated",j=w.target&&typeof w.target==="object"&&!Array.isArray(w.target)?{...w.target,inPlace:N==="in_place"}:{inPlace:N==="in_place"},q=Ht.resolveSession(_),H={mode:N,target:j,targetName:String(w.targetName??""),confirm:w.confirm?String(w.confirm):void 0,recentAuth:!Ce||!!q&&_e.isRecentlyAuthenticated(q),downtimeAcknowledged:w.downtimeAcknowledged===!0,safetyBackupId:w.safetyBackupId?String(w.safetyBackupId):void 0};if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Recovery point was not found."},404);if(w.drill===!0&&N!=="isolated")return C({ok:!1,error:"Recovery drills must use an isolated target."},422);try{let V=Yi.planRestore(E,H);if(w.execute!==!0)return C({ok:!0,plan:V,executionCreated:!1});let Y=Yi.enqueueRestore(E,{...H,drill:w.drill===!0,actorId:Ue(ce).actor?.id});return C({ok:!0,plan:V,job:Y},202)}catch(V){return C({ok:!1,error:V instanceof Error?V.message:String(V)},409)}}if(B.pathname==="/api/backups/recovery-points"&&_.method==="POST"){let w=await X(_),E=or.getRecoveryPoint(String(w.id??""));if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Recovery point was not found."},404);if(w.held==null&&w.pinned==null)return C({ok:!1,error:"held or pinned must be provided."},422);return C({ok:!0,recoveryPoint:or.updateRecoveryPoint(E.id,{held:w.held==null?E.held:w.held===!0,pinned:w.pinned==null?E.pinned:w.pinned===!0})})}if(B.pathname==="/api/backups/retention"&&_.method==="POST")return C({ok:!0,jobs:Yi.enqueueRetention()},202);if(B.pathname==="/api/data-services/capabilities"&&_.method==="GET"){let w=String(B.searchParams.get("engine")??""),E=String(B.searchParams.get("provider")??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(w)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(E))return C({ok:!1,error:"A supported engine and provider are required."},422);return C({ok:!0,engine:w,provider:E,capabilities:Tn(w,E)})}if(B.pathname==="/api/data-services"&&_.method==="GET"){let w=y.environments.get(Se),E=qt.list(y.project.id,w?.id).map((N)=>{let j=qt.credential(N.id);return{...N,credentialRef:void 0,credential:j?{configured:!0,username:j.username,version:j.version,rotatedAt:j.rotatedAt}:void 0,dependencies:qt.dependencies(N.id).map((q)=>({resourceId:q.resourceId,requiresRedeploy:q.requiresRedeploy}))}});return C({ok:!0,services:E})}if(B.pathname==="/api/data-services/preview"&&_.method==="POST"){let w=await X(_);if(w.id){let j=qt.get(String(w.id)),q=y.environments.get(Se),H=String(w.action??"");if(!j||j.projectId!==y.project.id||j.environmentId!==q?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!ml.includes(H))return C({ok:!1,error:`Action must be one of: ${ml.join(", ")}.`},422);try{return C({ok:!0,plan:Ec.plan(j,H,w.changes??{})})}catch(V){return C({ok:!1,error:V instanceof Error?V.message:String(V)},422)}}let E=String(w.engine??""),N=String(w.provider??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(E)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(N))return C({ok:!1,error:"A supported engine and provider are required."},422);return C({ok:!0,capabilities:Tn(E,N),defaults:{publicExposure:!1,backupRetentionDays:7,deletionProtection:!0},productionExecutionCreated:!1})}if(B.pathname==="/api/data-services"&&_.method==="POST"){let w=await X(_),E=String(w.engine??""),N=String(w.provider??""),j=y.environments.get(Se),q=Ue(ce);if(!j)return C({ok:!1,error:"Environment was not found."},404);if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(E)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(N))return C({ok:!1,error:"A supported engine and provider are required."},422);let H={organizationId:y.organization.id,projectId:y.project.id,environmentId:j.id,resourceId:w.resourceId?String(w.resourceId):void 0,name:String(w.name??"").trim(),engine:E,provider:N,placement:String(w.placement??w.name??"").trim(),engineVersion:w.engineVersion?String(w.engineVersion):void 0,plan:String(w.plan??(N==="aws_elasticache"?"cache.t4g.micro":N==="aws_aurora"?"db.serverless":"db.t4g.micro")),storageGb:w.storageGb==null?void 0:Number(w.storageGb),highAvailability:w.highAvailability===!0,publicExposure:w.publicExposure===!0,allowedCidrs:Array.isArray(w.allowedCidrs)?w.allowedCidrs.map(String):[],desiredState:w.desiredState&&typeof w.desiredState==="object"&&!Array.isArray(w.desiredState)?w.desiredState:{},observedState:{},origin:w.adopt===!0?"adopted":"managed",managementEnabled:w.adopt!==!0,ownerActorId:q.actor?.id,username:w.username?String(w.username):void 0};try{if(w.adopt===!0){let Y=qt.create({...H,status:"adopted",credentialRef:void 0});return C({ok:!0,service:Y,readOnly:!0},201)}if(!Em({provider:N,engine:E}))return C({ok:!1,error:`No ${N}/${E} provisioning adapter is configured; adopt it read-only or choose a supported provider.`},422);let V=await Ec.create(H);return C({ok:!0,service:V.service,operationId:V.operationId,oneTimeCredential:V.credential},201)}catch(V){return C({ok:!1,error:V instanceof Error?V.message:String(V)},422)}}if(B.pathname==="/api/data-services/connections"&&_.method==="GET"){let w=qt.get(String(B.searchParams.get("id")??"")),E=y.environments.get(Se);if(!w||w.projectId!==y.project.id||w.environmentId!==E?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);let N=typeof w.observedState.endpoint==="string"?w.observedState.endpoint:void 0,j=typeof w.observedState.readerEndpoint==="string"?w.observedState.readerEndpoint:void 0,q=Number(w.observedState.port)||(w.engine==="postgres"?5432:w.engine==="redis"?6379:w.engine==="mongodb"?27017:w.engine==="libsql"?8080:3306),H=typeof w.observedState.database==="string"?w.observedState.database:void 0,V=typeof w.observedState.tls==="boolean"?w.observedState.tls:w.provider.startsWith("aws_"),Y=[...N?[{type:w.publicExposure?"external":"internal",host:N,port:q,database:H,tls:V}]:[],...j?[{type:"internal",host:j,port:q,database:H,tls:V}]:[],{type:"tunnel",host:N??w.placement,port:q,database:H,tls:V}];return C({ok:!0,serviceId:w.id,guidance:Mu(w,Y)})}if(B.pathname==="/api/data-services/action"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se),j=String(w.action??"");if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!ml.includes(j))return C({ok:!1,error:`Action must be one of: ${ml.join(", ")}.`},422);let q=w.changes&&typeof w.changes==="object"&&!Array.isArray(w.changes)?w.changes:{};try{let H=Ec.plan(E,j,q);if(w.execute!==!0)return C({ok:!0,plan:H,productionExecutionCreated:!1});let V=Ec.enqueue(E,j,q,Ue(ce).actor?.id);return C({ok:!0,plan:H,operationId:V},202)}catch(H){return C({ok:!1,error:H instanceof Error?H.message:String(H)},409)}}if(B.pathname==="/api/data-services/dependencies"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se),j=y.store.getResource(String(w.resourceId??""));if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!j||j.projectId!==y.project.id||j.environmentId!==N?.id)return C({ok:!1,error:"Dependent resource was not found in this environment."},404);if(w.remove===!0)return C({ok:qt.removeDependency(E.id,j.id)});return qt.addDependency({serviceId:E.id,resourceId:j.id,secretRef:E.credentialRef??`secret://data-services/${E.projectId}/${E.name}`,requiresRedeploy:w.requiresRedeploy!==!1}),C({ok:!0,dependencies:qt.dependencies(E.id).map((q)=>({resourceId:q.resourceId,requiresRedeploy:q.requiresRedeploy}))})}if(B.pathname==="/api/data-services/management"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se);if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(E.origin!=="adopted"||w.reviewed!==!0||w.confirm!==E.name)return C({ok:!1,error:`Enabling management requires reviewed=true and typing ${E.name}.`},409);return C({ok:!0,service:qt.update(E.id,E.version,{managementEnabled:!0})})}if(B.pathname==="/api/data-services/reveal"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se),j=E?qt.credential(E.id):void 0;if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!j)return C({ok:!1,error:"No managed credential is configured."},404);return C({ok:!0,credential:{username:j.username,password:await ii.resolve(j.secretRef),version:j.version}},200,{"cache-control":"no-store"})}if(B.pathname==="/api/databases"&&_.method==="GET")return C(await yb(f,Se));if(B.pathname==="/api/databases"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim();if(!bi(E))return C({ok:!1,error:"Database name must be a valid identifier (letters, numbers, underscore; not starting with a digit)."},422);return C({...await vb(f,Se,E),name:E})}if(B.pathname==="/api/databases/vitess"&&_.method==="GET"){let w=await kb(f,Se);return C({...w,unhealthy:Ib(w.tablets),missingPrimary:Eb(w)})}if(B.pathname==="/api/databases/vitess/provision"&&_.method==="POST"){let w=await X(_);try{return C(await Ob(f,Se,{keyspace:String(w.keyspace??""),username:String(w.username??""),password:String(w.password??""),sharded:w.sharded===!0,confirm:String(w.confirm??"")}))}catch(E){return C({ok:!1,error:E instanceof Error?E.message:String(E)},422)}}if(B.pathname==="/api/databases/vitess/migrations"&&_.method==="GET"){let w=B.searchParams.get("keyspace")??void 0;return C(await xb(f,Se,w))}if(B.pathname==="/api/databases/vitess/migrations/action"&&_.method==="POST"){let w=await X(_),E=String(w.uuid??"").trim(),N=String(w.action??"");if(!["retry","cancel","cleanup","complete"].includes(N))return C({ok:!1,error:"Unknown migration action."},422);return C(await Db(f,Se,E,N))}if(B.pathname==="/api/databases/vitess/keyspaces"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim(),N=w.sharded===!0;return C(await Pb(f,Se,E,{sharded:N}))}if(B.pathname==="/api/databases/vitess/vschema"&&_.method==="POST"){let w=await X(_),E=String(w.keyspace??"").trim(),N=typeof w.vschema==="string"?w.vschema:JSON.stringify(w.vschema??null);return C(await _b(f,Se,E,N))}if(B.pathname==="/api/databases/vitess/schema"&&_.method==="POST"){let w=await X(_),E=String(w.sql??"");return C(await Tb(f,Se,E))}if(B.pathname==="/api/databases/vitess/install-client"&&_.method==="POST")return C(await Cb(f,Se));if(B.pathname==="/api/databases/backups"&&_.method==="GET")return C(await wb(f,Se));if(B.pathname==="/api/databases/backup"&&_.method==="POST"){let w=await X(_),E=String(w.database??"").trim();if(!bi(E))return C({ok:!1,error:"Database name must be a valid identifier."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to back up this database.`},409);return C(await Sb(f,Se,E))}if(B.pathname==="/api/databases/users"&&_.method==="POST"){let w=await X(_),E=String(w.username??"").trim(),N=String(w.password??""),j=String(w.database??"").trim()||void 0,q=w.access==="readonly"?"readonly":"all";if(!bi(E))return C({ok:!1,error:"Username must be a valid identifier."},422);if(!N)return C({ok:!1,error:"Password is required."},422);if(j&&!bi(j))return C({ok:!1,error:"Database must be a valid identifier."},422);return C({...await bb(f,Se,{username:E,password:N,database:j,access:q}),username:E})}if(B.pathname==="/api/dashboard-data")return Vt=M.get(Se)??await he(Se),he(Se),C(lm(Vt,{user:mn,slug:f.project.slug}));if(B.pathname==="/api/users"&&_.method==="GET")return C({ok:!0,users:en(t).map(js)});if(B.pathname==="/api/users"&&_.method==="POST"){let w=await X(_),E=String(w.username??"").trim();if(!rl(E))return C({ok:!1,error:"Username must be 2-32 characters: letters, numbers, dot, dash or underscore."},422);let N=w.sites&&typeof w.sites==="object"?w.sites:{},j=new Set(Object.keys(f.sites??{})),q={};for(let[Y,fe]of Object.entries(N)){if(!j.has(Y))return C({ok:!1,error:`Site '${Y}' was not found.`},404);if(fe!=="owner"&&fe!=="collaborator")return C({ok:!1,error:`Unknown site role '${fe}'. Use 'owner' or 'collaborator'.`},422);q[Y]=fe}let H=typeof w.password==="string"&&w.password.trim()?w.password.trim():void 0;if(H&&H.length<12)return C({ok:!1,error:"Password must be at least 12 characters."},422);let V=yc(t,{username:E,password:H,name:typeof w.name==="string"?w.name:void 0,sites:q});return Cs(y,en(t)),Ze(),C({ok:!0,user:js(V.user),password:V.password})}if(B.pathname==="/api/users"&&_.method==="DELETE"){let w=await X(_),E=String(w.username??"").trim();if(E.toLowerCase()===ce.username.toLowerCase())return C({ok:!1,error:"You cannot remove your own account."},409);let N=Fn(en(t),E),j=N?y.store.getActorByExternalId("user",`dashboard:${N.username.toLowerCase()}`):void 0,q=j?y.store.getMembershipForActor(y.organization.id,j.id):void 0;if(q&&q.source!=="legacy")return C({ok:!1,error:"Organization members must be removed from Organization access."},409);let H=am(t,E);if(!H.ok)return C(H,409);return Cs(y,en(t)),ee.clear(),C({ok:!0,username:E})}if(B.pathname==="/api/actions/run"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=w.action?Rs(w.action,Se):void 0;if(!E)return C({ok:!1,error:"Unknown dashboard action."},404);if(E.mutates&&w.confirm!==E.confirm)return C({ok:!1,error:`Type "${E.confirm}" to run this action.`},409);let N=await Me({controlPlane:y,environment:Se,actor:ce,kind:`dashboard.action.${E.id}`,input:{action:E.id},execute:()=>wm(E,{cwd:t,cliEntry:u})});return C({...N.result,controlPlaneOperation:N.operation})}if(B.pathname==="/api/server/operations/run"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=w.operation?dm(w.operation,f,Vt):void 0;if(!E)return C({ok:!1,error:"Unknown or unavailable server operation."},404);if(E.mutates&&w.confirm!==E.confirm)return C({ok:!1,error:`Type "${E.confirm}" to run this operation.`},409);let N=ue(y,String(Se));await new Ot(nt).run(new En,{...N,artifactRoot:t});let j=hs(nt,{scope:N,desiredConfigHash:y.project.desiredConfigHash});if(j.decision.outcome==="block")return C({ok:!1,error:`Operation blocked by security policy: ${j.decision.explanation}`,securityReview:j},409);let q=await Me({controlPlane:y,environment:Se,actor:ce,kind:`dashboard.server.${E.id}`,resourceSlug:E.target,input:{operation:E.id,target:E.target,to:w.to??null},execute:()=>dl(f,Se,E,{to:w.to})});return C({...q.result,controlPlaneOperation:q.operation,securityReview:j})}if(B.pathname==="/api/server/command"&&_.method==="POST"){let w=await _.json().catch(()=>({}));if(w.confirm!=="run")return C({ok:!1,error:'Type "run" to execute this command on the server.'},409);let E=await Me({controlPlane:y,environment:Se,actor:ce,kind:"dashboard.server.command",input:{source:"interactive-command"},execute:()=>vc(f,Se,String(w.command??""))});return C({...E.result,controlPlaneOperation:E.operation})}if(B.pathname==="/api/serverless/operations")return C(fm(f,Se,Vt));if(B.pathname==="/api/serverless/operations/run"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=w.operation?pS(w.operation,f,Se,Vt):void 0;if(!E)return C({ok:!1,error:"Unknown or unavailable serverless operation."},404);if(E.mutates&&w.confirm!==E.confirm)return C({ok:!1,error:`Type "${E.confirm}" to run this operation.`},409);let N=await Me({controlPlane:y,environment:Se,actor:ce,kind:`dashboard.serverless.${E.id}`,input:{operation:E.id,min:w.min??null,max:w.max??null},execute:()=>gS(f,Se,E,{min:w.min,max:w.max})});return Vt=await Co(f,Se),M.set(Se,Vt),C({...N.result,controlPlaneOperation:N.operation})}if(B.pathname==="/api/serverless/command"&&_.method==="POST"){let w=await _.json().catch(()=>({}));if(w.confirm!=="run")return C({ok:!1,error:'Type "run" to execute this command.'},409);return C(await mS(f,Se,String(w.command??"")))}if(B.pathname==="/api/serverless/dlq"&&_.method==="GET"){let w=Number(B.searchParams.get("max"))||10;return C(await fS(f,Se,w))}if(B.pathname==="/api/serverless/dlq/redrive"&&_.method==="POST"){let w=await _.json().catch(()=>({}));if(w.confirm!=="redrive")return C({ok:!1,error:'Type "redrive" to move messages back onto a source queue.'},409);return C(await hS(f,Se,{max:w.max,targetQueue:w.targetQueue}))}if(B.pathname==="/api/serverless/dlq/purge"&&_.method==="POST"){if((await _.json().catch(()=>({}))).confirm!=="purge")return C({ok:!1,error:'Type "purge" to permanently discard every DLQ message.'},409);return C(await yS(f,Se))}if(B.pathname==="/api/serverless/secrets"&&_.method==="GET")return C({secrets:vS(f,Se)});if(B.pathname==="/api/serverless/secrets"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.secretId??"").trim();if(!E)return C({ok:!1,error:"A secret id is required."},422);if(typeof w.value!=="string"||w.value==="")return C({ok:!1,error:"A non-empty value is required."},422);return C(await bS(f,Se,E,w.value))}if(B.pathname==="/api/serverless/secrets"&&_.method==="DELETE"){let w=await _.json().catch(()=>({})),E=String(w.secretId??"").trim();if(!E)return C({ok:!1,error:"A secret id is required."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to delete this secret.`},409);return C(await SS(f,Se,E))}if(B.pathname==="/api/serverless/functions/config"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.mode??"").trim();if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to update this function.`},409);return C(await wS(f,Se,E,{memory:w.memory,timeout:w.timeout}))}if(B.pathname==="/api/serverless/alarms"&&_.method==="GET")return C(await kS(f,Se));if(B.pathname==="/api/serverless/alarms"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.preset??"").trim(),N=Number(w.threshold);if(!E)return C({ok:!1,error:"An alarm metric is required."},422);if(!Number.isFinite(N))return C({ok:!1,error:"A numeric threshold is required."},422);return C(await IS(f,Se,E,N))}if(B.pathname==="/api/serverless/alarms"&&_.method==="DELETE"){let w=await _.json().catch(()=>({})),E=String(w.name??"").trim();if(!E)return C({ok:!1,error:"An alarm name is required."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to delete this alarm.`},409);return C(await ES(f,Se,E))}if(B.pathname==="/api/serverless/traces"&&_.method==="GET"){let w=Number(B.searchParams.get("minutes"))||30;return C(await ul(f,Se,w))}if(B.pathname==="/api/serverless/scheduler"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.action??"").trim();if(E!=="enable"&&E!=="disable"&&E!=="run")return C({ok:!1,error:"Unknown scheduler action."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to ${E} the scheduler.`},409);return C(await vm(f,Se,E))}if(!nw(B.pathname,mn))return new Response(null,{status:302,headers:{location:`/access-denied?env=${encodeURIComponent(Se)}`}});let Oo=await zt(ce,Se);if(!Oo)return vl("ts-cloud dashboard UI is unavailable.",503);return iw(Oo,B.pathname)}catch(eo){if(e.verbose)console.error(eo);return C({ok:!1,error:eo?.message??String(eo)},500)}})();if(!tr)return tr;if(bt&&(B.pathname.startsWith("/api/")||B.pathname.startsWith("/auth/"))){let et;if((Oe.headers.get("content-type")||"").includes("application/json"))et=await Oe.json().catch(()=>{return});let Pr=Ht.resolveUser(_),mr=Pr?Ue(Pr).actor:void 0;y.store.appendEvent({organizationId:y.organization.id,projectId:y.project.id,actorId:mr?.id,correlationId:Qe,type:tr.status<400?"dashboard.mutation.succeeded":"dashboard.mutation.failed",level:tr.status<400?"info":"warning",payload:K_(_.method,B.pathname,et,tr.status,Date.now()-ze)})}return tr.headers.set("x-request-id",Qe),tr}});Rc?.start();let bw=e.spendLoop??!0,zm;if(bw)(async()=>{let{SpendRunner:_,SpendLoopLease:Ne,startSpendLoop:ze}=await import("./spend/index.js"),{store:Oe}=await sw(y.store),Qe=new _({controlPlane:y.store,store:Oe,alerts:Xe});zm=ze(Qe,{lease:new Ne(y.store,{owner:`dashboard:${process.pid}`}),onError:(bt)=>console.error(`[ts-cloud] spend cycle failed: ${bt instanceof Error?bt.message:String(bt)}`)})})();let Sw=xo.stop.bind(xo);return xo.stop=(_)=>{clearInterval(Bm),clearInterval(Mm),clearInterval(Lm),clearInterval(jm),clearInterval(Nm),clearInterval(xm),clearInterval(Dm),clearInterval(Om),clearInterval($m),Ze(),sr.clear(),Rc?.stop(),zm?.();let Ne=Sw(_);if(Rc)Rc.settled().finally(()=>y.store.close());else y.store.close();return Ne},{server:xo,url:`http://${r}:${xo.port}/`}}export{ca,Gf,ru,OS,cs,nu,da,Vf,qf,An,la,iu,it,su,ou,au,ds,yn,jf,st,cu,ua,ga,pa,du,lu,uu,ls,ma,gu,Sn,us,fa,xt,zf,pu,mu,Kf,fu,ha,Ar,hu,Au,yu,Su,ot,Wf,Iu,yr,Aa,ya,Sa,gs,ps,In,bu,ms,Ia,ba,bn,Cu,Cn,Jf,Xf,Ot,En,Ca,Yf,Eu,vu,Ea,Tu,wu,Ru,_S,ue,Du,LS,$S,fs,hs,MS,Ee,Zf,_t,Le,$e,Lt,Pu,ku,Nu,Bu,eh,th,va,rh,nh,Ta,xu,Ou,ih,ge,sh,_u,ve,wa,at,$t,Mt,vn,As,Lu,FS,oh,ah,ch,dh,Ra,Da,$u,Pa,Tn,ka,Mu,ys,Fu,Na,Ba,xa,Oa,_a,La,$a,Ma,Uu,Sr,Fa,Qu,wn,Hu,Ua,Qa,Gu,Ir,Ha,Ga,lh,US,Ss,QS,HS,GS,Va,qa,Vu,uh,ja,Rn,qu,Is,ju,zu,Ku,za,gh,Ka,Wu,ph,Wa,mh,Dn,Pn,Ju,bs,Xu,Yu,Zu,Ja,eg,tg,fh,rg,v,ng,Cs,Me,ig,sg,VS,og,ag,cg,dg,lg,hh,qS,jS,zS,Ah,yh,KS,WS,Sh,Ih,JS,Es,br,Xa,kn,Nn,Cr,ct,Ft,vs,bh,Bn,ug,gg,Ya,Ch,Za,Eh,vh,pg,ec,Ts,mg,tc,Ut,Fe,fg,rc,nc,hg,ic,sc,oc,ac,Ag,yg,xn,cc,dc,lc,uc,Sg,ws,On,Rs,gc};
709
+ `);return new Response(tt,{headers:{"content-disposition":'attachment; filename="ts-cloud-telemetry.csv"',"content-type":"text/csv; charset=utf-8"}})}if(B.pathname==="/api/telemetry/saved-queries"&&_.method==="GET"){let ke=Ue(ce);return C({ok:!0,queries:E.listSavedQueries(y.project.id,ke.actor?.id)})}if(B.pathname==="/api/telemetry/saved-queries"&&_.method==="POST"){let ke=await X(_),Ve=Ue(ce);return C({ok:!0,query:E.saveQuery(y.project.id,Ve.actor?.id,String(ke.name??""),Y(ke.query??ke))},201)}if(B.pathname==="/api/telemetry/saved-queries"&&_.method==="DELETE"){let ke=await X(_),Ve=Ue(ce),Ae=E.deleteSavedQuery(y.project.id,Ve.actor?.id,String(ke.id??""));return C({ok:Ae},Ae?200:404)}}if(B.pathname.startsWith("/api/configuration")){let w=y.environments.get(Se),E=ce.role==="admin"||!!mn.capabilities?.includes("secrets:read"),N=ce.role==="admin"||!!mn.capabilities?.includes("secrets:write"),j={projectId:y.project.id,environmentId:w?.id},q={"cache-control":"no-store"};if(B.pathname==="/api/configuration"&&_.method==="GET"){let H=Object.fromEntries(B.searchParams),V=H.scopeType||H.scopeId?Ls(H,j):void 0,Y=["variable","secret"].includes(String(H.kind))?H.kind:void 0,fe=V?.type==="preview"?Zt.previews.getInstance(V.id):void 0,de=fe?Zt.previews.getDefinition(fe.definitionId):void 0,Ye=V?await tn.resolve({projectId:y.project.id,environmentId:V.environmentId,resourceId:V.resourceId,functionId:V.type==="function"?V.id:void 0,previewId:V.previewId,trustedPreview:!!fe&&!fe.fork,allowedPreviewSecrets:de?.inheritedSecrets,nativeReferences:!0,canReadSecretMetadata:E}):void 0,ke=y.store.listResources(y.project.id);return C({ok:!0,entries:tn.list({projectId:y.project.id,scope:V,kind:Y,search:H.search,canReadSecretMetadata:E}),effectiveEntries:Ye?Object.values(Ye.entries).filter((Ve)=>!Y||Ve.kind===Y).filter((Ve)=>!H.search||Ve.key.toLowerCase().includes(String(H.search).toLowerCase())):[],configurationHash:Ye?.configurationHash,warnings:Ye?.warnings??[],scopes:{project:y.project,environments:y.store.listEnvironments(y.project.id),resources:ke.filter((Ve)=>Ve.kind!=="function"),functions:ke.filter((Ve)=>Ve.kind==="function"),previews:Zt.previews.listInstances({projectId:y.project.id}).filter((Ve)=>Ve.status!=="destroyed").map((Ve)=>({id:Ve.id,name:Ve.name,environmentId:Ve.baseEnvironmentId,resourceId:Ve.resourceId,fork:Ve.fork,status:Ve.status}))}},200,q)}if(B.pathname==="/api/configuration/export"&&_.method==="GET"){let H=Ls(Object.fromEntries(B.searchParams),j);return new Response(tn.exportVariables({projectId:y.project.id,scope:H}),{headers:{...q,"content-disposition":'attachment; filename="ts-cloud.env"',"content-type":"text/plain; charset=utf-8"}})}if(B.pathname==="/api/configuration/plan"&&_.method==="POST"){let H=await X(_),V=Ls(H,j),Y=H.values&&typeof H.values==="object"&&!Array.isArray(H.values)?Object.fromEntries(Object.entries(H.values).map(([fe,de])=>[fe,String(de)])):{};return C({ok:!0,plan:tn.plan({projectId:y.project.id,scope:V,values:Y,removeMissing:H.removeMissing===!0})},200,q)}if(B.pathname==="/api/configuration"&&_.method==="POST"){let H=await X(_),V=Ls(H,j),Y=H.kind==="secret"?"secret":"variable",fe=String(H.key??"");if(Y==="secret"&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);try{let de=await tn.set({organizationId:y.organization.id,projectId:y.project.id,scope:V,key:fe,kind:Y,value:H.value==null?void 0:String(H.value),reference:H.reference==null?void 0:String(H.reference),backend:H.backend,required:H.required===!0,expectedVersion:H.expectedVersion==null?void 0:Number(H.expectedVersion),confirmed:String(H.confirm??"")===fe,idempotencyKey:_.headers.get("idempotency-key")??H.idempotencyKey,actorId:Ue(ce).actor?.id});return C({ok:!0,entry:tn.list({projectId:y.project.id,scope:V,canReadSecretMetadata:E}).find((Ye)=>Ye.id===de.entry.id),mutation:de.mutation,warnings:de.warnings},de.mutation.added.length?201:200,q)}catch(de){return C({ok:!1,error:de instanceof Error?de.message:String(de)},409,q)}}if(B.pathname==="/api/configuration/import"&&_.method==="POST"){let H=await X(_),V=Ls(H,j),Y=Array.isArray(H.secretKeys)?H.secretKeys.map(String):[];if(Y.length&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);try{let fe=await tn.importDotenv({organizationId:y.organization.id,projectId:y.project.id,scope:V,source:String(H.source??""),secretKeys:Y,backend:H.backend,confirmed:H.confirm==="import",idempotencyKey:_.headers.get("idempotency-key")??H.idempotencyKey,actorId:Ue(ce).actor?.id});return C({ok:fe.document.valid,diagnostics:fe.document.diagnostics,mutation:fe.mutation,warnings:fe.warnings},fe.document.valid?200:422,q)}catch(fe){return C({ok:!1,error:fe instanceof Error?fe.message:String(fe)},409,q)}}if(B.pathname==="/api/configuration/dependencies"&&_.method==="POST"){let H=await X(_),V=wi.get(String(H.entryId??"")),Y=y.store.getResource(String(H.resourceId??""));if(!V||V.projectId!==y.project.id||!Y||Y.projectId!==y.project.id)return C({ok:!1,error:"Configuration entry or dependent resource was not found."},404,q);return C({ok:!0,dependency:wi.setDependency({entryId:V.id,resourceId:Y.id,injectionTarget:["native_reference","file"].includes(String(H.injectionTarget))?H.injectionTarget:"environment",required:H.required!==!1,requiresRedeploy:H.requiresRedeploy!==!1,lastDeployedVersion:H.lastDeployedVersion==null?void 0:Number(H.lastDeployedVersion)})},200,q)}if(B.pathname==="/api/configuration/transfer"&&_.method==="POST"){let H=await X(_),V=wi.get(String(H.id??"")),Y=Ls({...H,scopeType:H.targetScopeType,scopeId:H.targetScopeId},j);if(!V||V.projectId!==y.project.id)return C({ok:!1,error:"Configuration entry was not found."},404,q);if(V.kind==="secret"&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);try{let fe=await tn.transfer({entryId:V.id,targetScope:Y,mode:H.mode==="move"?"move":"copy",confirmed:H.confirm===V.key,actorId:Ue(ce).actor?.id,idempotencyKey:_.headers.get("idempotency-key")??H.idempotencyKey});return C({ok:!0,entry:tn.list({projectId:y.project.id,scope:Y,canReadSecretMetadata:E}).find((de)=>de.id===fe.entry.id),mutation:fe.mutation},200,q)}catch(fe){return C({ok:!1,error:fe instanceof Error?fe.message:String(fe)},409,q)}}if(B.pathname==="/api/configuration/bulk"&&_.method==="POST"){let H=await X(_),V=Array.isArray(H.ids)?H.ids.map(String).slice(0,500):[],Y=V.map((de)=>wi.get(de)).filter((de)=>!!de&&de.projectId===y.project.id);if(Y.length!==V.length)return C({ok:!1,error:"One or more configuration entries were not found."},404,q);if(Y.some((de)=>de.kind==="secret")&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);if(H.action!=="delete"||H.confirm!=="bulk")return C({ok:!1,error:"Bulk deletion requires action delete and confirm bulk."},409,q);let fe=[];try{for(let de of Y)fe.push(await tn.remove({entryId:de.id,expectedVersion:de.version,confirmed:!0,actorId:Ue(ce).actor?.id}));return C({ok:!0,removed:fe.flatMap((de)=>de.removed),affectedResourceIds:[...new Set(fe.flatMap((de)=>de.affectedResourceIds))].sort()},200,q)}catch(de){return C({ok:!1,error:de instanceof Error?de.message:String(de),partial:fe.flatMap((Ye)=>Ye.removed)},409,q)}}if(B.pathname==="/api/configuration/reveal"&&_.method==="POST"){let H=await X(_),V=Ht.resolveSession(_);try{return C({ok:!0,value:await tn.reveal({entryId:String(H.id??""),canRevealSecrets:E,recentlyAuthenticated:!Ce||!!V&&_e.isRecentlyAuthenticated(V),actorId:Ue(ce).actor?.id})},200,q)}catch(Y){return C({ok:!1,error:Y instanceof Error?Y.message:String(Y)},403,q)}}if(B.pathname==="/api/configuration"&&_.method==="DELETE"){let H=await X(_),V=wi.get(String(H.id??""));if(V?.kind==="secret"&&!N)return C({ok:!1,error:"Secret write permission is required."},403,q);if(!V||V.projectId!==y.project.id)return C({ok:!1,error:"Configuration entry was not found."},404,q);try{return C({ok:!0,mutation:await tn.remove({entryId:V.id,expectedVersion:Number(H.expectedVersion),confirmed:String(H.confirm??"")===V.key,actorId:Ue(ce).actor?.id})},200,q)}catch(Y){return C({ok:!1,error:Y instanceof Error?Y.message:String(Y)},409,q)}}}if(B.pathname.startsWith("/api/fleet")){let w=Ue(ce).actor?.id,E=(N,j=409)=>C({ok:!1,error:N instanceof Error?N.message:String(N)},j,{"cache-control":"no-store"});if(B.pathname==="/api/fleet"&&_.method==="GET")return C({ok:!0,servers:Us.list(y.project.id),resources:y.store.listResources(y.project.id),operations:Dt.list({projectId:y.project.id,limit:200}).filter((N)=>N.operation.kind.startsWith("fleet."))},200,{"cache-control":"no-store"});if(B.pathname==="/api/fleet"&&_.method==="POST"){let N=await X(_);try{return C({ok:!0,server:Yn.enroll({organizationId:y.organization.id,projectId:y.project.id,name:String(N.name??""),provider:["aws","hetzner"].includes(String(N.provider))?N.provider:"ssh",providerId:N.providerId?String(N.providerId):void 0,region:N.region?String(N.region):void 0,zone:N.zone?String(N.zone):void 0,endpoint:String(N.endpoint??""),sshUser:String(N.sshUser??"deploy"),sshPort:N.sshPort?Number(N.sshPort):22,credentialRef:String(N.credentialRef??""),roles:Array.isArray(N.roles)?N.roles:[],labels:N.labels&&typeof N.labels==="object"?N.labels:{}})},201)}catch(j){return E(j,422)}}if(B.pathname==="/api/fleet/action"&&_.method==="POST"){let N=await X(_),j=String(N.id??""),q=String(N.action??"");try{if(q==="test")return C({ok:!0,server:await Yn.test(j)});if(q==="validate")return C({ok:!0,server:await Yn.validate(j)});if(q==="review_host_key")return C({ok:!0,server:Yn.reviewHostKey(j,String(N.fingerprint??""))});if(q==="bootstrap")return C({ok:!0,...Yn.bootstrap(j,N.confirmed===!0)},N.confirmed===!0?202:200);if(q==="heartbeat")return C({ok:!0,server:Yn.heartbeat(j,{usage:N.usage&&typeof N.usage==="object"?N.usage:{}})});if(q==="drain")return C({ok:!0,server:Yn.drain(j,N.completed===!0)});if(q==="uncordon")return C({ok:!0,server:Yn.uncordon(j)});if(q==="archive")return C({ok:!0,server:Yn.archive(j,String(N.confirmation??""))});return E("Unsupported fleet action.",422)}catch(H){return E(H)}}}if(B.pathname.startsWith("/api/capacity")){let w=(E,N=409)=>C({ok:!1,error:E instanceof Error?E.message:String(E)},N,{"cache-control":"no-store"});if(B.pathname==="/api/capacity"&&_.method==="GET")return C({ok:!0,pools:Ii.listPools(y.project.id),placements:Ii.listPlacements(y.project.id),servers:Us.list(y.project.id)},200,{"cache-control":"no-store"});if(B.pathname==="/api/capacity"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,pool:Ii.createPool({organizationId:y.organization.id,projectId:y.project.id,name:String(E.name??""),purpose:String(E.purpose??"application"),backend:String(E.backend??"server"),region:E.region?String(E.region):void 0,architecture:E.architecture?String(E.architecture):void 0,labels:E.labels&&typeof E.labels==="object"?E.labels:{},requiredServerLabels:E.requiredServerLabels&&typeof E.requiredServerLabels==="object"?E.requiredServerLabels:{},toleratedTaints:Array.isArray(E.toleratedTaints)?E.toleratedTaints.map(String):[],capacity:E.capacity&&typeof E.capacity==="object"?E.capacity:{},maxWorkloads:Number(E.maxWorkloads??10),costWeight:Number(E.costWeight??1),spreadKey:E.spreadKey?String(E.spreadKey):void 0,concurrency:Number(E.concurrency??1),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"})},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/capacity/member"&&_.method==="POST"){let E=await X(_);try{return Ii.addMember(String(E.poolId??""),String(E.serverId??"")),C({ok:!0,pool:Ii.getPool(String(E.poolId??""))})}catch(N){return w(N,422)}}if(B.pathname==="/api/capacity/explain"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,decisions:Am.explain(y.project.id,{purpose:String(E.purpose??"application"),resources:E.resources&&typeof E.resources==="object"?E.resources:{},region:E.region?String(E.region):void 0,architecture:E.architecture?String(E.architecture):void 0,labels:E.labels&&typeof E.labels==="object"?E.labels:{}})})}catch(N){return w(N,422)}}if(B.pathname==="/api/capacity/action"&&_.method==="POST"){let E=await X(_);try{if(E.action==="drain")return C({ok:!0,...Am.drainPool(String(E.poolId??""))});if(E.action==="enable")return C({ok:!0,pool:Ii.updatePool(String(E.poolId??""),{status:"active"})});if(E.action==="disable")return C({ok:!0,pool:Ii.updatePool(String(E.poolId??""),{status:"disabled"})});return w("Unsupported capacity action.",422)}catch(N){return w(N,422)}}}if(B.pathname.startsWith("/api/regions")){let w=(E,N=409)=>C({ok:!1,error:E instanceof Error?E.message:String(E)},N,{"cache-control":"no-store"});if(B.pathname==="/api/regions"&&_.method==="GET")return C({ok:!0,topologies:Zi.list(y.project.id).map((E)=>({topology:E,targets:Zi.targets(E.id),channels:Zi.channels(E.id),route:Zi.route(E.id),executions:Zi.executions(E.id)}))},200,{"cache-control":"no-store"});if(B.pathname==="/api/regions"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,topology:Cm.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:y.environments.get(Se)?.id,name:String(E.name??""),hostname:String(E.hostname??""),regions:Array.isArray(E.regions)?E.regions:[],trafficPolicy:E.trafficPolicy==="weighted"||E.trafficPolicy==="latency"?E.trafficPolicy:"active_passive",dataPolicy:{replicate:Array.isArray(E.replicate)?E.replicate:["s3","dynamodb","secrets"],maxLagSeconds:Number(E.maxLagSeconds??30),retainOnDestroy:E.retainOnDestroy!==!1},dnsProvider:"route53",cdnEnabled:E.cdnEnabled===!0,wafEnabled:E.wafEnabled===!0})},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/regions/action"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,...Cm.enqueue({topologyId:String(E.topologyId??""),kind:String(E.action??""),targetRegion:E.targetRegion?String(E.targetRegion):void 0,revision:E.revision?String(E.revision):void 0,manifest:E.manifest&&typeof E.manifest==="object"?E.manifest:{},confirmation:E.confirmation?String(E.confirmation):void 0,deleteData:E.deleteData===!0})},202)}catch(N){return w(N,422)}}}if(B.pathname.startsWith("/api/maintenance")){let w=(E,N=409)=>C({ok:!1,error:E instanceof Error?E.message:String(E)},N,{"cache-control":"no-store"});if(B.pathname==="/api/maintenance"&&_.method==="GET")return C({ok:!0,manifests:si.manifests(y.organization.id),windows:si.windows(y.project.id),campaigns:si.campaigns(y.project.id).map((E)=>({campaign:E,targets:si.targets(E.id)})),cleanups:si.cleanups(y.project.id),drills:si.drills(y.project.id)},200,{"cache-control":"no-store"});if(B.pathname==="/api/maintenance/cleanup-preview"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,plan:await kl.previewCleanup({projectId:y.project.id,kind:String(E.kind??"operations"),criteria:{olderThanDays:Number(E.olderThanDays??30)}},Pm)},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/maintenance/cleanup-apply"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,...kl.enqueueCleanup(String(E.planId??""),String(E.confirmation??""))},202)}catch(N){return w(N,422)}}if(B.pathname==="/api/maintenance/drill"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,drill:si.createDrill({projectId:y.project.id,scenario:String(E.scenario??"control_plane"),isolatedTarget:String(E.isolatedTarget??""),expectedRpoMinutes:Number(E.expectedRpoMinutes??60),expectedRtoMinutes:Number(E.expectedRtoMinutes??30),recoveryPointId:E.recoveryPointId?String(E.recoveryPointId):void 0,topologyId:E.topologyId?String(E.topologyId):void 0})},201)}catch(N){return w(N,422)}}if(B.pathname==="/api/maintenance/drill-run"&&_.method==="POST"){let E=await X(_);try{return C({ok:!0,...kl.enqueueDrill(String(E.drillId??""))},202)}catch(N){return w(N,422)}}}if(B.pathname.startsWith("/api/volumes")){let w=y.environments.get(Se),E=Ue(ce).actor?.id,N=(j,q=409)=>C({ok:!1,error:j instanceof Error?j.message:String(j)},q,{"cache-control":"no-store"});if(B.pathname==="/api/volumes"&&_.method==="GET"){let j=Sl.inventory(y.project.id,w?.id),q=y.store.listResources(y.project.id,w?.id).map((H)=>({id:H.id,name:H.name,slug:H.slug,kind:H.kind,provider:H.provider,providerId:H.providerId}));return C({ok:!0,volumes:j,resources:q,operations:Dt.list({projectId:y.project.id,limit:100}).filter((H)=>H.operation.kind.startsWith("volume.")),recoveryPoints:or.listRecoveryPoints(y.project.id).filter((H)=>H.kind==="volume"),providers:wl.map((H)=>({provider:H.provider,type:H.type,capabilities:H.capabilities()}))},200,{"cache-control":"no-store"})}if(B.pathname==="/api/volumes"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:w?.id,resourceId:j.resourceId?String(j.resourceId):void 0,name:String(j.name??""),provider:String(j.provider??"docker"),type:j.type==="docker"?"docker":j.type,capacityBytes:j.capacityBytes==null?void 0:Number(j.capacityBytes),filesystem:j.filesystem?String(j.filesystem):void 0,encrypted:j.encrypted===!0,desiredState:j.desiredState&&typeof j.desiredState==="object"?j.desiredState:{},actorId:E})},202,{"cache-control":"no-store"})}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/attach"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.attach(String(j.volumeId??""),{resourceId:String(j.resourceId??""),targetPath:String(j.targetPath??""),readOnly:j.readOnly===!0,uid:j.uid==null?void 0:Number(j.uid),gid:j.gid==null?void 0:Number(j.gid),mode:j.mode?String(j.mode):void 0,propagation:j.propagation,driverOptions:j.driverOptions&&typeof j.driverOptions==="object"?j.driverOptions:{},actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/detach"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.detach(String(j.volumeId??""),String(j.attachmentId??""),{force:j.force===!0,drained:j.drained===!0,unmounted:j.unmounted===!0,confirmation:j.confirmation?String(j.confirmation):void 0,actorId:E})},202)}catch(q){return N(q)}}if(B.pathname==="/api/volumes/resize"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.resize(String(j.volumeId??""),Number(j.capacityBytes),{drained:j.drained===!0,actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/snapshot"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.snapshot(String(j.volumeId??""),{name:j.name?String(j.name):void 0,actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/restore"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,...oi.restore(String(j.snapshotId??""),{name:String(j.name??""),actorId:E})},202)}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes/discover"&&_.method==="POST")try{return C({ok:!0,volumes:await oi.discover({organizationId:y.organization.id,projectId:y.project.id,environmentId:w?.id,actorId:E})})}catch(j){return N(j,502)}if(B.pathname==="/api/volumes/adopt"&&_.method==="POST"){let j=await X(_);try{return C({ok:!0,volume:oi.adopt(String(j.volumeId??""),{name:String(j.name??""),actorId:E})})}catch(q){return N(q,422)}}if(B.pathname==="/api/volumes"&&_.method==="DELETE"){let j=await X(_),q=Ht.resolveSession(_);try{return C({ok:!0,...oi.delete(String(j.volumeId??""),{recentAuthAt:!Ce||q&&_e.isRecentlyAuthenticated(q)?new Date().toISOString():void 0,confirmation:j.confirmation?String(j.confirmation):void 0,backupOverride:j.backupOverride===!0,backupOverrideConfirmation:j.backupOverrideConfirmation?String(j.backupOverrideConfirmation):void 0,actorId:E})},202)}catch(H){return N(H)}}}if(B.pathname==="/api/backups"&&_.method==="GET"){let w=y.environments.get(Se),E=or.listPolicies(y.project.id,w?.id),N=new Set(E.map((Y)=>Y.id)),j=or.listRecoveryPoints(y.project.id).filter((Y)=>!Y.policyId||N.has(Y.policyId)),q=or.listJobs(y.project.id).filter((Y)=>!Y.policyId||N.has(Y.policyId)),H=(Y)=>({...Y,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!Y.credentialRef,clientEncryptionConfigured:!!Y.encryptionKeyRef}),V=await Promise.all(or.listDestinations(y.project.id).map(async(Y)=>({...H(Y),credentialStatus:await pg(Y,ii)})));return C({ok:!0,destinations:V,policies:E,recoveryPoints:j,jobs:q,coverage:or.coverage(y.project.id).filter((Y)=>N.has(Y.policy.id)),resources:w?y.store.listResources(y.project.id,w.id).map((Y)=>({id:Y.id,name:Y.name,slug:Y.slug,kind:Y.kind})):[]})}if(B.pathname==="/api/backups/destinations"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim(),N=String(w.provider??""),j=String(w.encryption??"provider"),q=`secret://data-services/backups/${y.project.id}/${E}`,H=[];if(!["aws_s3","s3_compatible","aws_backup"].includes(N))return C({ok:!1,error:"A supported backup destination provider is required."},422);if(!["provider","client_side","both"].includes(j))return C({ok:!1,error:"Encryption must be provider, client_side, or both."},422);try{let V,Y;if(w.credentials&&typeof w.credentials==="object"&&!Array.isArray(w.credentials))V=`${q}/credentials`,await ii.put(V,JSON.stringify(w.credentials)),H.push(V);if(j!=="provider"){let de=String(w.encryptionKey??"");if(de.length<32)throw Error("Client-side encryption keys must contain at least 32 characters.");Y=`${q}/encryption-key`,await ii.put(Y,de),H.push(Y)}let fe=or.createDestination({organizationId:y.organization.id,projectId:y.project.id,name:E,provider:N,endpoint:w.endpoint?String(w.endpoint):void 0,endpointPolicy:w.endpointPolicy==="allow_private"?"allow_private":"public_https",bucket:w.bucket?String(w.bucket):void 0,prefix:String(w.prefix??""),region:w.region?String(w.region):ki,forcePathStyle:w.forcePathStyle===!0,credentialRef:V,encryption:j,encryptionKeyRef:Y,immutability:w.immutability&&typeof w.immutability==="object"&&!Array.isArray(w.immutability)?w.immutability:{},status:"untested"});return C({ok:!0,destination:{...fe,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!V,clientEncryptionConfigured:!!Y}},201)}catch(V){for(let Y of H)await ii.remove(Y).catch(()=>{});return C({ok:!1,error:V instanceof Error?V.message:String(V)},422)}}if(B.pathname==="/api/backups/destinations/test"&&_.method==="POST"){let w=await X(_),E=or.getDestination(String(w.id??""));if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Backup destination was not found."},404);if(E.provider==="aws_backup")return C({ok:!1,error:"AWS Backup destinations are verified by creating a provider recovery point."},422);try{return await Rm.test(E),C({ok:!0,destination:or.recordDestinationTest(E.id,{ok:!0})})}catch(N){let j=N instanceof Error?N.message:String(N);return or.recordDestinationTest(E.id,{ok:!1,error:j}),C({ok:!1,error:j},502)}}if(B.pathname==="/api/backups/policies"&&_.method==="POST"){let w=await X(_),E=y.environments.get(Se),N=or.getDestination(String(w.destinationId??"")),j=String(w.resourceKind??""),q=w.dataServiceId?String(w.dataServiceId):void 0,H=q?qt.get(q):void 0,V=w.resourceId?String(w.resourceId):void 0,Y=V?y.store.getResource(V):void 0;if(!E)return C({ok:!1,error:"Environment was not found."},404);if(!N||N.projectId!==y.project.id)return C({ok:!1,error:"Backup destination was not found."},404);if(!["managed_database","logical_database","volume","files","control_plane","infrastructure"].includes(j))return C({ok:!1,error:"A supported backup resource kind is required."},422);if(q&&(!H||H.projectId!==y.project.id||H.environmentId!==E.id))return C({ok:!1,error:"Data service was not found in this environment."},404);if(V&&(!Y||Y.projectId!==y.project.id||Y.environmentId!==E.id))return C({ok:!1,error:"Resource was not found in this environment."},404);if(j==="managed_database"&&!H)return C({ok:!1,error:"Managed database policies require a data service."},422);if(j==="logical_database"&&(!H||!["container","server"].includes(H.provider)))return C({ok:!1,error:"Logical database policies require an on-box data service."},422);if(j==="volume"&&(!Y||!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(String(w.volumeName??""))))return C({ok:!1,error:"Volume policies require a scoped resource and valid volumeName."},422);let fe=Array.isArray(w.includePatterns)?w.includePatterns.map(String).filter(Boolean):[];if(j==="files"&&(!Y||!fe.length))return C({ok:!1,error:"File policies require a scoped resource and at least one project-relative include path."},422);if(j==="control_plane"&&N.encryption==="provider")return C({ok:!1,error:"Control-plane policies require a destination with client-side encryption."},422);if(j==="infrastructure"&&(N.provider!=="aws_backup"||!fe.some((de)=>de.startsWith("resource:arn:"))||!fe.some((de)=>de.startsWith("role:arn:"))))return C({ok:!1,error:"Infrastructure policies require an AWS Backup destination plus resource:<arn> and role:<arn> include values."},422);try{let de=or.createPolicy({organizationId:y.organization.id,projectId:y.project.id,environmentId:E.id,resourceId:V,dataServiceId:q,destinationId:N.id,name:String(w.name??"").trim(),resourceKind:j,schedule:String(w.schedule??"daily"),timezone:String(w.timezone??"UTC"),retention:w.retention&&typeof w.retention==="object"&&!Array.isArray(w.retention)?w.retention:{keepLast:7,expireAfterDays:30},compression:["none","gzip","zstd"].includes(String(w.compression))?w.compression:"gzip",encryption:["destination","client_side","both"].includes(String(w.encryption))?w.encryption:"destination",includePatterns:j==="volume"?[String(w.volumeName),...fe]:fe,excludePatterns:Array.isArray(w.excludePatterns)?w.excludePatterns.map(String):[],expectedRpoMinutes:Math.max(1,Number(w.expectedRpoMinutes)||1440),expectedRtoMinutes:Math.max(1,Number(w.expectedRtoMinutes)||120),healthCheckId:w.healthCheckId?String(w.healthCheckId):void 0,enabled:w.enabled!==!1});return C({ok:!0,policy:de},201)}catch(de){return C({ok:!1,error:de instanceof Error?de.message:String(de)},422)}}if(B.pathname==="/api/backups/run"&&_.method==="POST"){let w=await X(_),E=or.getPolicy(String(w.policyId??"")),N=y.environments.get(Se);if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Backup policy was not found in this environment."},404);try{let j=Yi.enqueueBackup(E,new Date().toISOString(),Ue(ce).actor?.id);return C({ok:!0,job:j},202)}catch(j){return C({ok:!1,error:j instanceof Error?j.message:String(j)},409)}}if(B.pathname==="/api/backups/verify"&&_.method==="POST"){let w=await X(_),E=or.getRecoveryPoint(String(w.recoveryPointId??""));if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Recovery point was not found."},404);return C({ok:!0,job:Yi.enqueueVerification(E)},202)}if(B.pathname==="/api/backups/restore"&&_.method==="POST"){let w=await X(_),E=or.getRecoveryPoint(String(w.recoveryPointId??"")),N=w.mode==="in_place"?"in_place":"isolated",j=w.target&&typeof w.target==="object"&&!Array.isArray(w.target)?{...w.target,inPlace:N==="in_place"}:{inPlace:N==="in_place"},q=Ht.resolveSession(_),H={mode:N,target:j,targetName:String(w.targetName??""),confirm:w.confirm?String(w.confirm):void 0,recentAuth:!Ce||!!q&&_e.isRecentlyAuthenticated(q),downtimeAcknowledged:w.downtimeAcknowledged===!0,safetyBackupId:w.safetyBackupId?String(w.safetyBackupId):void 0};if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Recovery point was not found."},404);if(w.drill===!0&&N!=="isolated")return C({ok:!1,error:"Recovery drills must use an isolated target."},422);try{let V=Yi.planRestore(E,H);if(w.execute!==!0)return C({ok:!0,plan:V,executionCreated:!1});let Y=Yi.enqueueRestore(E,{...H,drill:w.drill===!0,actorId:Ue(ce).actor?.id});return C({ok:!0,plan:V,job:Y},202)}catch(V){return C({ok:!1,error:V instanceof Error?V.message:String(V)},409)}}if(B.pathname==="/api/backups/recovery-points"&&_.method==="POST"){let w=await X(_),E=or.getRecoveryPoint(String(w.id??""));if(!E||E.projectId!==y.project.id)return C({ok:!1,error:"Recovery point was not found."},404);if(w.held==null&&w.pinned==null)return C({ok:!1,error:"held or pinned must be provided."},422);return C({ok:!0,recoveryPoint:or.updateRecoveryPoint(E.id,{held:w.held==null?E.held:w.held===!0,pinned:w.pinned==null?E.pinned:w.pinned===!0})})}if(B.pathname==="/api/backups/retention"&&_.method==="POST")return C({ok:!0,jobs:Yi.enqueueRetention()},202);if(B.pathname==="/api/data-services/capabilities"&&_.method==="GET"){let w=String(B.searchParams.get("engine")??""),E=String(B.searchParams.get("provider")??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(w)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(E))return C({ok:!1,error:"A supported engine and provider are required."},422);return C({ok:!0,engine:w,provider:E,capabilities:Tn(w,E)})}if(B.pathname==="/api/data-services"&&_.method==="GET"){let w=y.environments.get(Se),E=qt.list(y.project.id,w?.id).map((N)=>{let j=qt.credential(N.id);return{...N,credentialRef:void 0,credential:j?{configured:!0,username:j.username,version:j.version,rotatedAt:j.rotatedAt}:void 0,dependencies:qt.dependencies(N.id).map((q)=>({resourceId:q.resourceId,requiresRedeploy:q.requiresRedeploy}))}});return C({ok:!0,services:E})}if(B.pathname==="/api/data-services/preview"&&_.method==="POST"){let w=await X(_);if(w.id){let j=qt.get(String(w.id)),q=y.environments.get(Se),H=String(w.action??"");if(!j||j.projectId!==y.project.id||j.environmentId!==q?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!ml.includes(H))return C({ok:!1,error:`Action must be one of: ${ml.join(", ")}.`},422);try{return C({ok:!0,plan:Ec.plan(j,H,w.changes??{})})}catch(V){return C({ok:!1,error:V instanceof Error?V.message:String(V)},422)}}let E=String(w.engine??""),N=String(w.provider??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(E)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(N))return C({ok:!1,error:"A supported engine and provider are required."},422);return C({ok:!0,capabilities:Tn(E,N),defaults:{publicExposure:!1,backupRetentionDays:7,deletionProtection:!0},productionExecutionCreated:!1})}if(B.pathname==="/api/data-services"&&_.method==="POST"){let w=await X(_),E=String(w.engine??""),N=String(w.provider??""),j=y.environments.get(Se),q=Ue(ce);if(!j)return C({ok:!1,error:"Environment was not found."},404);if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(E)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(N))return C({ok:!1,error:"A supported engine and provider are required."},422);let H={organizationId:y.organization.id,projectId:y.project.id,environmentId:j.id,resourceId:w.resourceId?String(w.resourceId):void 0,name:String(w.name??"").trim(),engine:E,provider:N,placement:String(w.placement??w.name??"").trim(),engineVersion:w.engineVersion?String(w.engineVersion):void 0,plan:String(w.plan??(N==="aws_elasticache"?"cache.t4g.micro":N==="aws_aurora"?"db.serverless":"db.t4g.micro")),storageGb:w.storageGb==null?void 0:Number(w.storageGb),highAvailability:w.highAvailability===!0,publicExposure:w.publicExposure===!0,allowedCidrs:Array.isArray(w.allowedCidrs)?w.allowedCidrs.map(String):[],desiredState:w.desiredState&&typeof w.desiredState==="object"&&!Array.isArray(w.desiredState)?w.desiredState:{},observedState:{},origin:w.adopt===!0?"adopted":"managed",managementEnabled:w.adopt!==!0,ownerActorId:q.actor?.id,username:w.username?String(w.username):void 0};try{if(w.adopt===!0){let Y=qt.create({...H,status:"adopted",credentialRef:void 0});return C({ok:!0,service:Y,readOnly:!0},201)}if(!Em({provider:N,engine:E}))return C({ok:!1,error:`No ${N}/${E} provisioning adapter is configured; adopt it read-only or choose a supported provider.`},422);let V=await Ec.create(H);return C({ok:!0,service:V.service,operationId:V.operationId,oneTimeCredential:V.credential},201)}catch(V){return C({ok:!1,error:V instanceof Error?V.message:String(V)},422)}}if(B.pathname==="/api/data-services/connections"&&_.method==="GET"){let w=qt.get(String(B.searchParams.get("id")??"")),E=y.environments.get(Se);if(!w||w.projectId!==y.project.id||w.environmentId!==E?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);let N=typeof w.observedState.endpoint==="string"?w.observedState.endpoint:void 0,j=typeof w.observedState.readerEndpoint==="string"?w.observedState.readerEndpoint:void 0,q=Number(w.observedState.port)||(w.engine==="postgres"?5432:w.engine==="redis"?6379:w.engine==="mongodb"?27017:w.engine==="libsql"?8080:3306),H=typeof w.observedState.database==="string"?w.observedState.database:void 0,V=typeof w.observedState.tls==="boolean"?w.observedState.tls:w.provider.startsWith("aws_"),Y=[...N?[{type:w.publicExposure?"external":"internal",host:N,port:q,database:H,tls:V}]:[],...j?[{type:"internal",host:j,port:q,database:H,tls:V}]:[],{type:"tunnel",host:N??w.placement,port:q,database:H,tls:V}];return C({ok:!0,serviceId:w.id,guidance:Mu(w,Y)})}if(B.pathname==="/api/data-services/action"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se),j=String(w.action??"");if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!ml.includes(j))return C({ok:!1,error:`Action must be one of: ${ml.join(", ")}.`},422);let q=w.changes&&typeof w.changes==="object"&&!Array.isArray(w.changes)?w.changes:{};try{let H=Ec.plan(E,j,q);if(w.execute!==!0)return C({ok:!0,plan:H,productionExecutionCreated:!1});let V=Ec.enqueue(E,j,q,Ue(ce).actor?.id);return C({ok:!0,plan:H,operationId:V},202)}catch(H){return C({ok:!1,error:H instanceof Error?H.message:String(H)},409)}}if(B.pathname==="/api/data-services/dependencies"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se),j=y.store.getResource(String(w.resourceId??""));if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!j||j.projectId!==y.project.id||j.environmentId!==N?.id)return C({ok:!1,error:"Dependent resource was not found in this environment."},404);if(w.remove===!0)return C({ok:qt.removeDependency(E.id,j.id)});return qt.addDependency({serviceId:E.id,resourceId:j.id,secretRef:E.credentialRef??`secret://data-services/${E.projectId}/${E.name}`,requiresRedeploy:w.requiresRedeploy!==!1}),C({ok:!0,dependencies:qt.dependencies(E.id).map((q)=>({resourceId:q.resourceId,requiresRedeploy:q.requiresRedeploy}))})}if(B.pathname==="/api/data-services/management"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se);if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(E.origin!=="adopted"||w.reviewed!==!0||w.confirm!==E.name)return C({ok:!1,error:`Enabling management requires reviewed=true and typing ${E.name}.`},409);return C({ok:!0,service:qt.update(E.id,E.version,{managementEnabled:!0})})}if(B.pathname==="/api/data-services/reveal"&&_.method==="POST"){let w=await X(_),E=qt.get(String(w.id??"")),N=y.environments.get(Se),j=E?qt.credential(E.id):void 0;if(!E||E.projectId!==y.project.id||E.environmentId!==N?.id)return C({ok:!1,error:"Data service was not found in this environment."},404);if(!j)return C({ok:!1,error:"No managed credential is configured."},404);return C({ok:!0,credential:{username:j.username,password:await ii.resolve(j.secretRef),version:j.version}},200,{"cache-control":"no-store"})}if(B.pathname==="/api/databases"&&_.method==="GET")return C(await yb(f,Se));if(B.pathname==="/api/databases"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim();if(!bi(E))return C({ok:!1,error:"Database name must be a valid identifier (letters, numbers, underscore; not starting with a digit)."},422);return C({...await vb(f,Se,E),name:E})}if(B.pathname==="/api/databases/vitess"&&_.method==="GET"){let w=await kb(f,Se);return C({...w,unhealthy:Ib(w.tablets),missingPrimary:Eb(w)})}if(B.pathname==="/api/databases/vitess/provision"&&_.method==="POST"){let w=await X(_);try{return C(await Ob(f,Se,{keyspace:String(w.keyspace??""),username:String(w.username??""),password:String(w.password??""),sharded:w.sharded===!0,confirm:String(w.confirm??"")}))}catch(E){return C({ok:!1,error:E instanceof Error?E.message:String(E)},422)}}if(B.pathname==="/api/databases/vitess/migrations"&&_.method==="GET"){let w=B.searchParams.get("keyspace")??void 0;return C(await xb(f,Se,w))}if(B.pathname==="/api/databases/vitess/migrations/action"&&_.method==="POST"){let w=await X(_),E=String(w.uuid??"").trim(),N=String(w.action??"");if(!["retry","cancel","cleanup","complete"].includes(N))return C({ok:!1,error:"Unknown migration action."},422);return C(await Db(f,Se,E,N))}if(B.pathname==="/api/databases/vitess/keyspaces"&&_.method==="POST"){let w=await X(_),E=String(w.name??"").trim(),N=w.sharded===!0;return C(await Pb(f,Se,E,{sharded:N}))}if(B.pathname==="/api/databases/vitess/vschema"&&_.method==="POST"){let w=await X(_),E=String(w.keyspace??"").trim(),N=typeof w.vschema==="string"?w.vschema:JSON.stringify(w.vschema??null);return C(await _b(f,Se,E,N))}if(B.pathname==="/api/databases/vitess/schema"&&_.method==="POST"){let w=await X(_),E=String(w.sql??"");return C(await Tb(f,Se,E))}if(B.pathname==="/api/databases/vitess/install-client"&&_.method==="POST")return C(await Cb(f,Se));if(B.pathname==="/api/databases/backups"&&_.method==="GET")return C(await wb(f,Se));if(B.pathname==="/api/databases/backup"&&_.method==="POST"){let w=await X(_),E=String(w.database??"").trim();if(!bi(E))return C({ok:!1,error:"Database name must be a valid identifier."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to back up this database.`},409);return C(await Sb(f,Se,E))}if(B.pathname==="/api/databases/users"&&_.method==="POST"){let w=await X(_),E=String(w.username??"").trim(),N=String(w.password??""),j=String(w.database??"").trim()||void 0,q=w.access==="readonly"?"readonly":"all";if(!bi(E))return C({ok:!1,error:"Username must be a valid identifier."},422);if(!N)return C({ok:!1,error:"Password is required."},422);if(j&&!bi(j))return C({ok:!1,error:"Database must be a valid identifier."},422);return C({...await bb(f,Se,{username:E,password:N,database:j,access:q}),username:E})}if(B.pathname==="/api/dashboard-data")return Vt=M.get(Se)??await he(Se),he(Se),C(lm(Vt,{user:mn,slug:f.project.slug}));if(B.pathname==="/api/users"&&_.method==="GET")return C({ok:!0,users:en(t).map(js)});if(B.pathname==="/api/users"&&_.method==="POST"){let w=await X(_),E=String(w.username??"").trim();if(!rl(E))return C({ok:!1,error:"Username must be 2-32 characters: letters, numbers, dot, dash or underscore."},422);let N=w.sites&&typeof w.sites==="object"?w.sites:{},j=new Set(Object.keys(f.sites??{})),q={};for(let[Y,fe]of Object.entries(N)){if(!j.has(Y))return C({ok:!1,error:`Site '${Y}' was not found.`},404);if(fe!=="owner"&&fe!=="collaborator")return C({ok:!1,error:`Unknown site role '${fe}'. Use 'owner' or 'collaborator'.`},422);q[Y]=fe}let H=typeof w.password==="string"&&w.password.trim()?w.password.trim():void 0;if(H&&H.length<12)return C({ok:!1,error:"Password must be at least 12 characters."},422);let V=yc(t,{username:E,password:H,name:typeof w.name==="string"?w.name:void 0,sites:q});return Cs(y,en(t)),Ze(),C({ok:!0,user:js(V.user),password:V.password})}if(B.pathname==="/api/users"&&_.method==="DELETE"){let w=await X(_),E=String(w.username??"").trim();if(E.toLowerCase()===ce.username.toLowerCase())return C({ok:!1,error:"You cannot remove your own account."},409);let N=Fn(en(t),E),j=N?y.store.getActorByExternalId("user",`dashboard:${N.username.toLowerCase()}`):void 0,q=j?y.store.getMembershipForActor(y.organization.id,j.id):void 0;if(q&&q.source!=="legacy")return C({ok:!1,error:"Organization members must be removed from Organization access."},409);let H=am(t,E);if(!H.ok)return C(H,409);return Cs(y,en(t)),ee.clear(),C({ok:!0,username:E})}if(B.pathname==="/api/actions/run"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=w.action?Rs(w.action,Se):void 0;if(!E)return C({ok:!1,error:"Unknown dashboard action."},404);if(E.mutates&&w.confirm!==E.confirm)return C({ok:!1,error:`Type "${E.confirm}" to run this action.`},409);let N=await Me({controlPlane:y,environment:Se,actor:ce,kind:`dashboard.action.${E.id}`,input:{action:E.id},execute:()=>wm(E,{cwd:t,cliEntry:u})});return C({...N.result,controlPlaneOperation:N.operation})}if(B.pathname==="/api/server/operations/run"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=w.operation?dm(w.operation,f,Vt):void 0;if(!E)return C({ok:!1,error:"Unknown or unavailable server operation."},404);if(E.mutates&&w.confirm!==E.confirm)return C({ok:!1,error:`Type "${E.confirm}" to run this operation.`},409);let N=ue(y,String(Se));await new Ot(nt).run(new En,{...N,artifactRoot:t});let j=hs(nt,{scope:N,desiredConfigHash:y.project.desiredConfigHash});if(j.decision.outcome==="block")return C({ok:!1,error:`Operation blocked by security policy: ${j.decision.explanation}`,securityReview:j},409);let q=await Me({controlPlane:y,environment:Se,actor:ce,kind:`dashboard.server.${E.id}`,resourceSlug:E.target,input:{operation:E.id,target:E.target,to:w.to??null},execute:()=>dl(f,Se,E,{to:w.to})});return C({...q.result,controlPlaneOperation:q.operation,securityReview:j})}if(B.pathname==="/api/server/command"&&_.method==="POST"){let w=await _.json().catch(()=>({}));if(w.confirm!=="run")return C({ok:!1,error:'Type "run" to execute this command on the server.'},409);let E=await Me({controlPlane:y,environment:Se,actor:ce,kind:"dashboard.server.command",input:{source:"interactive-command"},execute:()=>vc(f,Se,String(w.command??""))});return C({...E.result,controlPlaneOperation:E.operation})}if(B.pathname==="/api/serverless/operations")return C(fm(f,Se,Vt));if(B.pathname==="/api/serverless/operations/run"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=w.operation?pS(w.operation,f,Se,Vt):void 0;if(!E)return C({ok:!1,error:"Unknown or unavailable serverless operation."},404);if(E.mutates&&w.confirm!==E.confirm)return C({ok:!1,error:`Type "${E.confirm}" to run this operation.`},409);let N=await Me({controlPlane:y,environment:Se,actor:ce,kind:`dashboard.serverless.${E.id}`,input:{operation:E.id,min:w.min??null,max:w.max??null},execute:()=>gS(f,Se,E,{min:w.min,max:w.max})});return Vt=await Co(f,Se),M.set(Se,Vt),C({...N.result,controlPlaneOperation:N.operation})}if(B.pathname==="/api/serverless/command"&&_.method==="POST"){let w=await _.json().catch(()=>({}));if(w.confirm!=="run")return C({ok:!1,error:'Type "run" to execute this command.'},409);return C(await mS(f,Se,String(w.command??"")))}if(B.pathname==="/api/serverless/dlq"&&_.method==="GET"){let w=Number(B.searchParams.get("max"))||10;return C(await fS(f,Se,w))}if(B.pathname==="/api/serverless/dlq/redrive"&&_.method==="POST"){let w=await _.json().catch(()=>({}));if(w.confirm!=="redrive")return C({ok:!1,error:'Type "redrive" to move messages back onto a source queue.'},409);return C(await hS(f,Se,{max:w.max,targetQueue:w.targetQueue}))}if(B.pathname==="/api/serverless/dlq/purge"&&_.method==="POST"){if((await _.json().catch(()=>({}))).confirm!=="purge")return C({ok:!1,error:'Type "purge" to permanently discard every DLQ message.'},409);return C(await yS(f,Se))}if(B.pathname==="/api/serverless/secrets"&&_.method==="GET")return C({secrets:vS(f,Se)});if(B.pathname==="/api/serverless/secrets"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.secretId??"").trim();if(!E)return C({ok:!1,error:"A secret id is required."},422);if(typeof w.value!=="string"||w.value==="")return C({ok:!1,error:"A non-empty value is required."},422);return C(await bS(f,Se,E,w.value))}if(B.pathname==="/api/serverless/secrets"&&_.method==="DELETE"){let w=await _.json().catch(()=>({})),E=String(w.secretId??"").trim();if(!E)return C({ok:!1,error:"A secret id is required."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to delete this secret.`},409);return C(await SS(f,Se,E))}if(B.pathname==="/api/serverless/functions/config"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.mode??"").trim();if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to update this function.`},409);return C(await wS(f,Se,E,{memory:w.memory,timeout:w.timeout}))}if(B.pathname==="/api/serverless/alarms"&&_.method==="GET")return C(await kS(f,Se));if(B.pathname==="/api/serverless/alarms"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.preset??"").trim(),N=Number(w.threshold);if(!E)return C({ok:!1,error:"An alarm metric is required."},422);if(!Number.isFinite(N))return C({ok:!1,error:"A numeric threshold is required."},422);return C(await IS(f,Se,E,N))}if(B.pathname==="/api/serverless/alarms"&&_.method==="DELETE"){let w=await _.json().catch(()=>({})),E=String(w.name??"").trim();if(!E)return C({ok:!1,error:"An alarm name is required."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to delete this alarm.`},409);return C(await ES(f,Se,E))}if(B.pathname==="/api/serverless/traces"&&_.method==="GET"){let w=Number(B.searchParams.get("minutes"))||30;return C(await ul(f,Se,w))}if(B.pathname==="/api/serverless/scheduler"&&_.method==="POST"){let w=await _.json().catch(()=>({})),E=String(w.action??"").trim();if(E!=="enable"&&E!=="disable"&&E!=="run")return C({ok:!1,error:"Unknown scheduler action."},422);if(w.confirm!==E)return C({ok:!1,error:`Type "${E}" to ${E} the scheduler.`},409);return C(await vm(f,Se,E))}if(!nw(B.pathname,mn))return new Response(null,{status:302,headers:{location:`/access-denied?env=${encodeURIComponent(Se)}`}});let Oo=await zt(ce,Se);if(!Oo)return vl("ts-cloud dashboard UI is unavailable.",503);return iw(Oo,B.pathname)}catch(eo){if(e.verbose)console.error(eo);return C({ok:!1,error:eo?.message??String(eo)},500)}})();if(!tr)return tr;if(bt&&(B.pathname.startsWith("/api/")||B.pathname.startsWith("/auth/"))){let et;if((Oe.headers.get("content-type")||"").includes("application/json"))et=await Oe.json().catch(()=>{return});let Pr=Ht.resolveUser(_),mr=Pr?Ue(Pr).actor:void 0;y.store.appendEvent({organizationId:y.organization.id,projectId:y.project.id,actorId:mr?.id,correlationId:Qe,type:tr.status<400?"dashboard.mutation.succeeded":"dashboard.mutation.failed",level:tr.status<400?"info":"warning",payload:K_(_.method,B.pathname,et,tr.status,Date.now()-ze)})}return tr.headers.set("x-request-id",Qe),tr}});Rc?.start();let bw=e.spendLoop??!0,zm;if(bw)(async()=>{let{SpendRunner:_,SpendLoopLease:Ne,startSpendLoop:ze}=await import("./spend/index.js"),{store:Oe}=await sw(y.store),Qe=new _({controlPlane:y.store,store:Oe,alerts:Xe});zm=ze(Qe,{lease:new Ne(y.store,{owner:`dashboard:${process.pid}`}),onError:(bt)=>console.error(`[ts-cloud] spend cycle failed: ${bt instanceof Error?bt.message:String(bt)}`)})})();let Sw=xo.stop.bind(xo);return xo.stop=(_)=>{clearInterval(Bm),clearInterval(Mm),clearInterval(Lm),clearInterval(jm),clearInterval(Nm),clearInterval(xm),clearInterval(Dm),clearInterval(Om),clearInterval($m),Ze(),sr.clear(),Rc?.stop(),zm?.();let Ne=Sw(_);if(Rc)Rc.settled().finally(()=>y.store.close());else y.store.close();return Ne},{server:xo,url:`http://${r}:${xo.port}/`}}export{ca,Vf,ru,_S,cs,nu,da,qf,jf,An,la,iu,it,su,ou,au,ds,yn,zf,st,cu,ua,ga,pa,du,lu,uu,ls,ma,gu,Sn,us,fa,xt,Kf,pu,mu,Wf,fu,ha,Ar,hu,Au,yu,Su,ot,Jf,Iu,yr,Aa,ya,Sa,gs,ps,In,bu,ms,Ia,ba,bn,Cu,Cn,Xf,Yf,Ot,En,Ca,Zf,Eu,vu,Ea,Tu,wu,Ru,LS,ue,Du,$S,MS,fs,hs,FS,Ee,eh,_t,Le,$e,Lt,Pu,ku,Nu,Bu,th,rh,va,nh,ih,Ta,xu,Ou,sh,ge,oh,_u,ve,wa,at,$t,Mt,vn,As,Lu,US,ah,ch,dh,lh,Ra,Da,$u,Pa,Tn,ka,Mu,ys,Fu,Na,Ba,xa,Oa,_a,La,$a,Ma,Uu,Sr,Fa,Qu,wn,Hu,Ua,Qa,Gu,Ir,Ha,Ga,uh,QS,Ss,HS,GS,VS,Va,qa,Vu,gh,ja,Rn,qu,Is,ju,zu,Ku,za,ph,Ka,Wu,mh,Wa,fh,Dn,Pn,Ju,bs,Xu,Yu,Zu,Ja,eg,tg,hh,rg,v,ng,Cs,Me,ig,sg,qS,og,ag,cg,dg,lg,Ah,jS,zS,KS,yh,Sh,WS,JS,Ih,bh,XS,Es,br,Xa,kn,Nn,Cr,ct,Ft,vs,Ch,Bn,ug,gg,Ya,Eh,Za,vh,Th,pg,ec,Ts,mg,tc,Ut,Fe,fg,rc,nc,hg,ic,sc,oc,ac,Ag,yg,xn,cc,dc,lc,uc,Sg,ws,On,Rs,gc};