@stacksjs/ts-cloud 0.11.3 → 0.11.5

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 (106) hide show
  1. package/dist/aws/index.js +1 -1
  2. package/dist/bin/{chunk-m189194f.js → chunk-6wxxe560.js} +1 -1
  3. package/dist/bin/{chunk-81hmza39.js → chunk-7zhgmp1s.js} +1 -1
  4. package/dist/bin/{chunk-b0e39tpv.js → chunk-ayhqt80q.js} +1 -1
  5. package/dist/bin/{chunk-104xrc2w.js → chunk-dkf4qsp2.js} +1 -1
  6. package/dist/bin/{chunk-cq9mca3h.js → chunk-fdrbeb7p.js} +1 -1
  7. package/dist/bin/{chunk-56wvjysz.js → chunk-x6f61g36.js} +9 -9
  8. package/dist/bin/cli.js +7 -7
  9. package/dist/bin/dashboard-server.js +1 -1
  10. package/dist/{chunk-vz95qy3n.js → chunk-1qdne0bf.js} +1 -1
  11. package/dist/chunk-5vt93kxx.js +1 -0
  12. package/dist/{chunk-ky5c6t5y.js → chunk-73ztr55z.js} +1 -1
  13. package/dist/chunk-95e6aeqz.js +1 -0
  14. package/dist/{chunk-7pff0rv9.js → chunk-9pa96r7f.js} +5 -5
  15. package/dist/{chunk-hbhxk5a0.js → chunk-aj025v2s.js} +2 -2
  16. package/dist/{chunk-s3rpd72x.js → chunk-aw0cgv5w.js} +2 -2
  17. package/dist/{chunk-q2njk4hx.js → chunk-by2bwzk6.js} +1 -1
  18. package/dist/{chunk-1ypkh8g6.js → chunk-dr4pj8hp.js} +1 -1
  19. package/dist/{chunk-r5natbed.js → chunk-hn40z11p.js} +1 -1
  20. package/dist/{chunk-nnqxmh7f.js → chunk-kasdm9tx.js} +1 -1
  21. package/dist/{chunk-gk58959n.js → chunk-mz0dk78z.js} +1 -1
  22. package/dist/{chunk-p6vszgc2.js → chunk-nk7sav4r.js} +2 -2
  23. package/dist/chunk-p10xt3jb.js +1 -0
  24. package/dist/{chunk-h1rc94df.js → chunk-q0rc1ax9.js} +1 -1
  25. package/dist/chunk-q9q6cmt0.js +1 -0
  26. package/dist/chunk-rd38qdnf.js +1 -0
  27. package/dist/{chunk-7xpxzbkr.js → chunk-t2a6r38z.js} +48 -45
  28. package/dist/{chunk-hwan3cev.js → chunk-tz9myq9a.js} +1 -1
  29. package/dist/{chunk-8e0az001.js → chunk-wavjkdb8.js} +2 -2
  30. package/dist/{chunk-b10cbk8z.js → chunk-x3hay61c.js} +1 -1
  31. package/dist/{chunk-t0kh8haz.js → chunk-xcj8zfmg.js} +1 -1
  32. package/dist/{chunk-qjk1v1gs.js → chunk-y4xkj2f1.js} +1 -1
  33. package/dist/{chunk-spx89gaw.js → chunk-z2qqwy7e.js} +1 -1
  34. package/dist/{chunk-6v4k9ekm.js → chunk-zam6ecam.js} +2 -2
  35. package/dist/{chunk-0hj552t7.js → chunk-zz52xje8.js} +2 -2
  36. package/dist/deploy/index.js +1 -1
  37. package/dist/dns/index.js +1 -1
  38. package/dist/drivers/index.js +1 -1
  39. package/dist/drivers/shared/mail-provision.d.ts +1 -1
  40. package/dist/drivers/shared/mta-sts.d.ts +89 -0
  41. package/dist/drivers/shared/mta-sts.test.d.ts +1 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +5 -5
  44. package/dist/protection/index.js +1 -1
  45. package/dist/push/index.js +1 -1
  46. package/dist/spend/index.js +1 -1
  47. package/dist/ui/404.html +1 -1
  48. package/dist/ui/accept-invitation.html +1 -1
  49. package/dist/ui/access-denied.html +1 -1
  50. package/dist/ui/account/automation.html +5 -5
  51. package/dist/ui/account/security.html +2 -2
  52. package/dist/ui/applications/compose.html +5 -5
  53. package/dist/ui/applications/new.html +1 -1
  54. package/dist/ui/data/backups.html +6 -6
  55. package/dist/ui/data/services.html +5 -5
  56. package/dist/ui/data/volumes.html +5 -5
  57. package/dist/ui/index.html +6 -6
  58. package/dist/ui/infrastructure/topology.html +5 -5
  59. package/dist/ui/integrations.html +1 -1
  60. package/dist/ui/operations/alerts.html +5 -5
  61. package/dist/ui/operations/configuration.html +5 -5
  62. package/dist/ui/operations/jobs.html +5 -5
  63. package/dist/ui/operations/maintenance.html +5 -5
  64. package/dist/ui/operations/observability.html +6 -6
  65. package/dist/ui/operations/previews.html +6 -6
  66. package/dist/ui/operations/queue.html +6 -6
  67. package/dist/ui/operations/regions.html +5 -5
  68. package/dist/ui/operations/releases.html +6 -6
  69. package/dist/ui/operations/spend.html +6 -6
  70. package/dist/ui/operations/workloads.html +6 -6
  71. package/dist/ui/security.html +1 -1
  72. package/dist/ui/server/actions.html +6 -6
  73. package/dist/ui/server/activity.html +1 -1
  74. package/dist/ui/server/capacity.html +6 -6
  75. package/dist/ui/server/database.html +6 -6
  76. package/dist/ui/server/deployments.html +5 -5
  77. package/dist/ui/server/diagnostics.html +2 -2
  78. package/dist/ui/server/firewall.html +6 -6
  79. package/dist/ui/server/fleet.html +6 -6
  80. package/dist/ui/server/logs.html +6 -6
  81. package/dist/ui/server/metrics.html +5 -5
  82. package/dist/ui/server/security.html +2 -2
  83. package/dist/ui/server/services.html +2 -2
  84. package/dist/ui/server/sites.html +6 -6
  85. package/dist/ui/server/ssh-keys.html +6 -6
  86. package/dist/ui/server/team.html +6 -6
  87. package/dist/ui/server/terminal.html +2 -2
  88. package/dist/ui/serverless/alarms.html +6 -6
  89. package/dist/ui/serverless/assets.html +2 -2
  90. package/dist/ui/serverless/cost.html +2 -2
  91. package/dist/ui/serverless/data.html +6 -6
  92. package/dist/ui/serverless/deployments.html +2 -2
  93. package/dist/ui/serverless/firewall.html +1 -1
  94. package/dist/ui/serverless/functions.html +6 -6
  95. package/dist/ui/serverless/logs.html +6 -6
  96. package/dist/ui/serverless/metrics.html +2 -2
  97. package/dist/ui/serverless/queues.html +6 -6
  98. package/dist/ui/serverless/secrets.html +6 -6
  99. package/dist/ui/serverless/traces.html +6 -6
  100. package/dist/ui/serverless.html +5 -5
  101. package/package.json +3 -3
  102. package/dist/chunk-7fkyfh65.js +0 -1
  103. package/dist/chunk-hz7k9ymh.js +0 -1
  104. package/dist/chunk-kj7gzdj6.js +0 -1
  105. package/dist/chunk-m4vqpkpp.js +0 -1
  106. package/dist/chunk-n04a3bgf.js +0 -1
@@ -1,4 +1,4 @@
1
- import{Yh as g}from"./chunk-gk58959n.js";class l{client;region;constructor(e="us-east-1"){this.region=e,this.client=new g}async describeInstances(e){let t={Action:"DescribeInstances",Version:"2016-11-15"};if(e?.InstanceIds)e.InstanceIds.forEach((s,n)=>{t[`InstanceId.${n+1}`]=s});if(e?.Filters)e.Filters.forEach((s,n)=>{t[`Filter.${n+1}.Name`]=s.Name,s.Values.forEach((i,o)=>{t[`Filter.${n+1}.Value.${o+1}`]=i})});if(e?.MaxResults)t.MaxResults=String(e.MaxResults);if(e?.NextToken)t.NextToken=e.NextToken;let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()}),r=a.DescribeInstancesResponse||a;return{Reservations:this.parseReservations(r.reservationSet?.item),NextToken:r.nextToken}}async getInstance(e){return(await this.describeInstances({InstanceIds:[e]})).Reservations?.[0]?.Instances?.[0]}async getConsoleOutput(e,t){let a={Action:"GetConsoleOutput",Version:"2016-11-15",InstanceId:e};if(t)a.Latest="true";let r=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(a).toString()}),s=r.GetConsoleOutputResponse||r;return{InstanceId:s.instanceId,Output:s.output,Timestamp:s.timestamp}}async getConsoleOutputDecoded(e,t){let a=await this.getConsoleOutput(e,t?.latest);if(!a.Output)return"No console output available yet";let r=Buffer.from(a.Output,"base64").toString("utf-8");if(t?.tailLines)return r.split(`
1
+ import{$h as g}from"./chunk-mz0dk78z.js";class l{client;region;constructor(e="us-east-1"){this.region=e,this.client=new g}async describeInstances(e){let t={Action:"DescribeInstances",Version:"2016-11-15"};if(e?.InstanceIds)e.InstanceIds.forEach((s,n)=>{t[`InstanceId.${n+1}`]=s});if(e?.Filters)e.Filters.forEach((s,n)=>{t[`Filter.${n+1}.Name`]=s.Name,s.Values.forEach((i,o)=>{t[`Filter.${n+1}.Value.${o+1}`]=i})});if(e?.MaxResults)t.MaxResults=String(e.MaxResults);if(e?.NextToken)t.NextToken=e.NextToken;let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()}),r=a.DescribeInstancesResponse||a;return{Reservations:this.parseReservations(r.reservationSet?.item),NextToken:r.nextToken}}async getInstance(e){return(await this.describeInstances({InstanceIds:[e]})).Reservations?.[0]?.Instances?.[0]}async getConsoleOutput(e,t){let a={Action:"GetConsoleOutput",Version:"2016-11-15",InstanceId:e};if(t)a.Latest="true";let r=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(a).toString()}),s=r.GetConsoleOutputResponse||r;return{InstanceId:s.instanceId,Output:s.output,Timestamp:s.timestamp}}async getConsoleOutputDecoded(e,t){let a=await this.getConsoleOutput(e,t?.latest);if(!a.Output)return"No console output available yet";let r=Buffer.from(a.Output,"base64").toString("utf-8");if(t?.tailLines)return r.split(`
2
2
  `).slice(-t.tailLines).join(`
3
3
  `);return r}async describeInstanceStatus(e){let t={Action:"DescribeInstanceStatus",Version:"2016-11-15"};if(e?.InstanceIds)e.InstanceIds.forEach((r,s)=>{t[`InstanceId.${s+1}`]=r});if(e?.IncludeAllInstances)t.IncludeAllInstances="true";if(e?.Filters)e.Filters.forEach((r,s)=>{t[`Filter.${s+1}.Name`]=r.Name,r.Values.forEach((n,i)=>{t[`Filter.${s+1}.Value.${i+1}`]=n})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{InstanceStatuses:this.parseArray(a.instanceStatusSet?.item).map((r)=>({InstanceId:r.instanceId,InstanceState:r.instanceState?{Code:Number.parseInt(r.instanceState.code),Name:r.instanceState.name}:void 0,InstanceStatus:r.instanceStatus?{Status:r.instanceStatus.status,Details:this.parseArray(r.instanceStatus.details?.item).map((s)=>({Name:s.name,Status:s.status}))}:void 0,SystemStatus:r.systemStatus?{Status:r.systemStatus.status,Details:this.parseArray(r.systemStatus.details?.item).map((s)=>({Name:s.name,Status:s.status}))}:void 0}))}}async startInstances(e){let t={Action:"StartInstances",Version:"2016-11-15"};e.forEach((r,s)=>{t[`InstanceId.${s+1}`]=r});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{StartingInstances:this.parseArray(a.instancesSet?.item).map((r)=>({InstanceId:r.instanceId,CurrentState:r.currentState?{Name:r.currentState.name}:void 0,PreviousState:r.previousState?{Name:r.previousState.name}:void 0}))}}async stopInstances(e,t){let a={Action:"StopInstances",Version:"2016-11-15"};if(e.forEach((s,n)=>{a[`InstanceId.${n+1}`]=s}),t)a.Force="true";let r=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(a).toString()});return{StoppingInstances:this.parseArray(r.instancesSet?.item).map((s)=>({InstanceId:s.instanceId,CurrentState:s.currentState?{Name:s.currentState.name}:void 0,PreviousState:s.previousState?{Name:s.previousState.name}:void 0}))}}async rebootInstances(e){let t={Action:"RebootInstances",Version:"2016-11-15"};e.forEach((a,r)=>{t[`InstanceId.${r+1}`]=a}),await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async terminateInstances(e){let t={Action:"TerminateInstances",Version:"2016-11-15"};e.forEach((r,s)=>{t[`InstanceId.${s+1}`]=r});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{TerminatingInstances:this.parseArray(a.instancesSet?.item).map((r)=>({InstanceId:r.instanceId,CurrentState:r.currentState?{Name:r.currentState.name}:void 0,PreviousState:r.previousState?{Name:r.previousState.name}:void 0}))}}async createImage(e){let t={Action:"CreateImage",Version:"2016-11-15",InstanceId:e.InstanceId,Name:e.Name};if(e.Description)t.Description=e.Description;if(e.NoReboot!==void 0)t.NoReboot=String(e.NoReboot);if(e.TagSpecifications)e.TagSpecifications.forEach((s,n)=>{t[`TagSpecification.${n+1}.ResourceType`]=s.ResourceType,s.Tags.forEach((i,o)=>{t[`TagSpecification.${n+1}.Tag.${o+1}.Key`]=i.Key,t[`TagSpecification.${n+1}.Tag.${o+1}.Value`]=i.Value})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{ImageId:(a.CreateImageResponse||a).imageId}}async deregisterImage(e){await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({Action:"DeregisterImage",Version:"2016-11-15",ImageId:e}).toString()})}async describeVpcs(e){let t={Action:"DescribeVpcs",Version:"2016-11-15"};if(e?.VpcIds)e.VpcIds.forEach((r,s)=>{t[`VpcId.${s+1}`]=r});if(e?.Filters)e.Filters.forEach((r,s)=>{t[`Filter.${s+1}.Name`]=r.Name,r.Values.forEach((n,i)=>{t[`Filter.${s+1}.Value.${i+1}`]=n})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{Vpcs:this.parseArray(a.vpcSet?.item).map((r)=>({VpcId:r.vpcId,CidrBlock:r.cidrBlock,State:r.state,DhcpOptionsId:r.dhcpOptionsId,InstanceTenancy:r.instanceTenancy,IsDefault:r.isDefault==="true",Tags:this.parseTags(r.tagSet?.item)}))}}async describeSubnets(e){let t={Action:"DescribeSubnets",Version:"2016-11-15"};if(e?.SubnetIds)e.SubnetIds.forEach((r,s)=>{t[`SubnetId.${s+1}`]=r});if(e?.Filters)e.Filters.forEach((r,s)=>{t[`Filter.${s+1}.Name`]=r.Name,r.Values.forEach((n,i)=>{t[`Filter.${s+1}.Value.${i+1}`]=n})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{Subnets:this.parseArray(a.subnetSet?.item).map((r)=>({SubnetId:r.subnetId,VpcId:r.vpcId,CidrBlock:r.cidrBlock,AvailabilityZone:r.availabilityZone,AvailableIpAddressCount:Number.parseInt(r.availableIpAddressCount),State:r.state,MapPublicIpOnLaunch:r.mapPublicIpOnLaunch==="true",Tags:this.parseTags(r.tagSet?.item)}))}}async describeSecurityGroups(e){let t={Action:"DescribeSecurityGroups",Version:"2016-11-15"};if(e?.GroupIds)e.GroupIds.forEach((r,s)=>{t[`GroupId.${s+1}`]=r});if(e?.GroupNames)e.GroupNames.forEach((r,s)=>{t[`GroupName.${s+1}`]=r});if(e?.Filters)e.Filters.forEach((r,s)=>{t[`Filter.${s+1}.Name`]=r.Name,r.Values.forEach((n,i)=>{t[`Filter.${s+1}.Value.${i+1}`]=n})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{SecurityGroups:this.parseArray(a.securityGroupInfo?.item).map((r)=>({GroupId:r.groupId,GroupName:r.groupName,Description:r.groupDescription,VpcId:r.vpcId,IpPermissions:this.parseIpPermissions(r.ipPermissions?.item),IpPermissionsEgress:this.parseIpPermissions(r.ipPermissionsEgress?.item),Tags:this.parseTags(r.tagSet?.item)}))}}async describeInternetGateways(e){let t={Action:"DescribeInternetGateways",Version:"2016-11-15"};if(e?.InternetGatewayIds)e.InternetGatewayIds.forEach((r,s)=>{t[`InternetGatewayId.${s+1}`]=r});if(e?.Filters)e.Filters.forEach((r,s)=>{t[`Filter.${s+1}.Name`]=r.Name,r.Values.forEach((n,i)=>{t[`Filter.${s+1}.Value.${i+1}`]=n})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{InternetGateways:this.parseArray(a.internetGatewaySet?.item).map((r)=>({InternetGatewayId:r.internetGatewayId,Attachments:this.parseArray(r.attachmentSet?.item).map((s)=>({VpcId:s.vpcId,State:s.state})),Tags:this.parseTags(r.tagSet?.item)}))}}async describeAddresses(e){let t={Action:"DescribeAddresses",Version:"2016-11-15"};if(e?.AllocationIds)e.AllocationIds.forEach((r,s)=>{t[`AllocationId.${s+1}`]=r});if(e?.PublicIps)e.PublicIps.forEach((r,s)=>{t[`PublicIp.${s+1}`]=r});if(e?.Filters)e.Filters.forEach((r,s)=>{t[`Filter.${s+1}.Name`]=r.Name,r.Values.forEach((n,i)=>{t[`Filter.${s+1}.Value.${i+1}`]=n})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{Addresses:this.parseArray(a.addressesSet?.item).map((r)=>({PublicIp:r.publicIp,AllocationId:r.allocationId,AssociationId:r.associationId,InstanceId:r.instanceId,NetworkInterfaceId:r.networkInterfaceId,PrivateIpAddress:r.privateIpAddress,Domain:r.domain,Tags:this.parseTags(r.tagSet?.item)}))}}async allocateAddress(e){let t={Action:"AllocateAddress",Version:"2016-11-15"};if(e?.Domain)t.Domain=e.Domain;if(e?.TagSpecifications)e.TagSpecifications.forEach((r,s)=>{t[`TagSpecification.${s+1}.ResourceType`]=r.ResourceType,r.Tags.forEach((n,i)=>{t[`TagSpecification.${s+1}.Tag.${i+1}.Key`]=n.Key,t[`TagSpecification.${s+1}.Tag.${i+1}.Value`]=n.Value})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{AllocationId:a.allocationId,PublicIp:a.publicIp,Domain:a.domain}}async associateAddress(e){let t={Action:"AssociateAddress",Version:"2016-11-15"};if(e.AllocationId)t.AllocationId=e.AllocationId;if(e.PublicIp)t.PublicIp=e.PublicIp;if(e.InstanceId)t.InstanceId=e.InstanceId;if(e.NetworkInterfaceId)t.NetworkInterfaceId=e.NetworkInterfaceId;if(e.PrivateIpAddress)t.PrivateIpAddress=e.PrivateIpAddress;if(e.AllowReassociation)t.AllowReassociation="true";return{AssociationId:(await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})).associationId}}async createTags(e){let t={Action:"CreateTags",Version:"2016-11-15"};e.Resources.forEach((a,r)=>{t[`ResourceId.${r+1}`]=a}),e.Tags.forEach((a,r)=>{t[`Tag.${r+1}.Key`]=a.Key,t[`Tag.${r+1}.Value`]=a.Value}),await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async waitForInstanceState(e,t,a){let r=a?.maxWaitMs||300000,s=a?.pollIntervalMs||5000,n=Date.now();while(Date.now()-n<r){let i;try{i=await this.getInstance(e)}catch{i=void 0}if(i?.State?.Name===t)return i;await new Promise((o)=>setTimeout(o,s))}return}async createVpc(e){let t={Action:"CreateVpc",Version:"2016-11-15",CidrBlock:e.CidrBlock};if(e.InstanceTenancy)t.InstanceTenancy=e.InstanceTenancy;if(e.TagSpecifications)e.TagSpecifications.forEach((n,i)=>{t[`TagSpecification.${i+1}.ResourceType`]=n.ResourceType,n.Tags.forEach((o,c)=>{t[`TagSpecification.${i+1}.Tag.${c+1}.Key`]=o.Key,t[`TagSpecification.${i+1}.Tag.${c+1}.Value`]=o.Value})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()}),s=(a.CreateVpcResponse||a).vpc;return{Vpc:s?{VpcId:s.vpcId,CidrBlock:s.cidrBlock,State:s.state,DhcpOptionsId:s.dhcpOptionsId,InstanceTenancy:s.instanceTenancy,IsDefault:s.isDefault==="true",Tags:this.parseTags(s.tagSet?.item)}:void 0}}async createSubnet(e){let t={Action:"CreateSubnet",Version:"2016-11-15",VpcId:e.VpcId,CidrBlock:e.CidrBlock};if(e.AvailabilityZone)t.AvailabilityZone=e.AvailabilityZone;if(e.TagSpecifications)e.TagSpecifications.forEach((n,i)=>{t[`TagSpecification.${i+1}.ResourceType`]=n.ResourceType,n.Tags.forEach((o,c)=>{t[`TagSpecification.${i+1}.Tag.${c+1}.Key`]=o.Key,t[`TagSpecification.${i+1}.Tag.${c+1}.Value`]=o.Value})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()}),s=(a.CreateSubnetResponse||a).subnet;return{Subnet:s?{SubnetId:s.subnetId,VpcId:s.vpcId,CidrBlock:s.cidrBlock,AvailabilityZone:s.availabilityZone,AvailableIpAddressCount:s.availableIpAddressCount?Number.parseInt(s.availableIpAddressCount):void 0,State:s.state,MapPublicIpOnLaunch:s.mapPublicIpOnLaunch==="true",Tags:this.parseTags(s.tagSet?.item)}:void 0}}async modifySubnetAttribute(e){let t={Action:"ModifySubnetAttribute",Version:"2016-11-15",SubnetId:e.SubnetId};if(e.MapPublicIpOnLaunch!==void 0)t["MapPublicIpOnLaunch.Value"]=String(e.MapPublicIpOnLaunch.Value);await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async createSecurityGroup(e){let t={Action:"CreateSecurityGroup",Version:"2016-11-15",GroupName:e.GroupName,GroupDescription:e.Description};if(e.VpcId)t.VpcId=e.VpcId;if(e.TagSpecifications)e.TagSpecifications.forEach((s,n)=>{t[`TagSpecification.${n+1}.ResourceType`]=s.ResourceType,s.Tags.forEach((i,o)=>{t[`TagSpecification.${n+1}.Tag.${o+1}.Key`]=i.Key,t[`TagSpecification.${n+1}.Tag.${o+1}.Value`]=i.Value})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()});return{GroupId:(a.CreateSecurityGroupResponse||a).groupId}}async authorizeSecurityGroupIngress(e){let t={Action:"AuthorizeSecurityGroupIngress",Version:"2016-11-15",GroupId:e.GroupId};this.encodeIpPermissions(t,e.IpPermissions),await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async authorizeSecurityGroupEgress(e){let t={Action:"AuthorizeSecurityGroupEgress",Version:"2016-11-15",GroupId:e.GroupId};this.encodeIpPermissions(t,e.IpPermissions),await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async describeRouteTables(e){let t={Action:"DescribeRouteTables",Version:"2016-11-15"};if(e?.RouteTableIds)e.RouteTableIds.forEach((s,n)=>{t[`RouteTableId.${n+1}`]=s});if(e?.Filters)e.Filters.forEach((s,n)=>{t[`Filter.${n+1}.Name`]=s.Name,s.Values.forEach((i,o)=>{t[`Filter.${n+1}.Value.${o+1}`]=i})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()}),r=a.DescribeRouteTablesResponse||a;return{RouteTables:this.parseArray(r.routeTableSet?.item).map((s)=>({RouteTableId:s.routeTableId,VpcId:s.vpcId,Routes:this.parseArray(s.routeSet?.item).map((n)=>({DestinationCidrBlock:n.destinationCidrBlock,GatewayId:n.gatewayId,NatGatewayId:n.natGatewayId,State:n.state})),Associations:this.parseArray(s.associationSet?.item).map((n)=>({RouteTableAssociationId:n.routeTableAssociationId,SubnetId:n.subnetId,Main:n.main==="true"||n.main===!0})),Tags:this.parseTags(s.tagSet?.item)}))}}async deleteVpc(e){let t={Action:"DeleteVpc",Version:"2016-11-15",VpcId:e};await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async deleteSubnet(e){let t={Action:"DeleteSubnet",Version:"2016-11-15",SubnetId:e};await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async deleteSecurityGroup(e){await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({Action:"DeleteSecurityGroup",Version:"2016-11-15",GroupId:e}).toString()})}async describeNetworkInterfaces(e){let t={Action:"DescribeNetworkInterfaces",Version:"2016-11-15"};if(e?.NetworkInterfaceIds)e.NetworkInterfaceIds.forEach((s,n)=>{t[`NetworkInterfaceId.${n+1}`]=s});if(e?.Filters)e.Filters.forEach((s,n)=>{t[`Filter.${n+1}.Name`]=s.Name,s.Values.forEach((i,o)=>{t[`Filter.${n+1}.Value.${o+1}`]=i})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()}),r=a.DescribeNetworkInterfacesResponse||a;return{NetworkInterfaces:this.parseArray(r.networkInterfaceSet?.item).map((s)=>({NetworkInterfaceId:s.networkInterfaceId,SubnetId:s.subnetId,VpcId:s.vpcId,Status:s.status,Attachment:s.attachment?{AttachmentId:s.attachment.attachmentId,InstanceId:s.attachment.instanceId,Status:s.attachment.status}:void 0}))}}async detachNetworkInterface(e,t){let a={Action:"DetachNetworkInterface",Version:"2016-11-15",AttachmentId:e};if(t)a.Force="true";await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(a).toString()})}async deleteNetworkInterface(e){let t={Action:"DeleteNetworkInterface",Version:"2016-11-15",NetworkInterfaceId:e};await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()})}async describeRegions(){let e={Action:"DescribeRegions",Version:"2016-11-15"},t=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(e).toString()}),a=t.DescribeRegionsResponse||t;return{Regions:this.parseArray(a.regionInfo?.item).map((r)=>({RegionName:r.regionName,Endpoint:r.regionEndpoint}))}}async runInstances(e){let t={Action:"RunInstances",Version:"2016-11-15",ImageId:e.ImageId,InstanceType:e.InstanceType,MinCount:String(e.MinCount),MaxCount:String(e.MaxCount)};if(e.SecurityGroupIds)e.SecurityGroupIds.forEach((s,n)=>{t[`SecurityGroupId.${n+1}`]=s});if(e.SubnetId)t.SubnetId=e.SubnetId;if(e.UserData)t.UserData=e.UserData;if(e.IamInstanceProfile){if(e.IamInstanceProfile.Name)t["IamInstanceProfile.Name"]=e.IamInstanceProfile.Name;if(e.IamInstanceProfile.Arn)t["IamInstanceProfile.Arn"]=e.IamInstanceProfile.Arn}if(e.TagSpecifications)e.TagSpecifications.forEach((s,n)=>{t[`TagSpecification.${n+1}.ResourceType`]=s.ResourceType,s.Tags.forEach((i,o)=>{t[`TagSpecification.${n+1}.Tag.${o+1}.Key`]=i.Key,t[`TagSpecification.${n+1}.Tag.${o+1}.Value`]=i.Value})});let a=await this.client.request({service:"ec2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams(t).toString()}),r=a.RunInstancesResponse||a;return{Instances:this.parseInstances(r.instancesSet?.item||r.instancesSet)}}encodeIpPermissions(e,t){t.forEach((a,r)=>{let s=`IpPermissions.${r+1}`;if(a.IpProtocol!==void 0)e[`${s}.IpProtocol`]=a.IpProtocol;if(a.FromPort!==void 0)e[`${s}.FromPort`]=String(a.FromPort);if(a.ToPort!==void 0)e[`${s}.ToPort`]=String(a.ToPort);if(a.IpRanges)a.IpRanges.forEach((n,i)=>{if(n.CidrIp)e[`${s}.IpRanges.${i+1}.CidrIp`]=n.CidrIp;if(n.Description)e[`${s}.IpRanges.${i+1}.Description`]=n.Description});if(a.Ipv6Ranges)a.Ipv6Ranges.forEach((n,i)=>{if(n.CidrIpv6)e[`${s}.Ipv6Ranges.${i+1}.CidrIpv6`]=n.CidrIpv6;if(n.Description)e[`${s}.Ipv6Ranges.${i+1}.Description`]=n.Description});if(a.UserIdGroupPairs)a.UserIdGroupPairs.forEach((n,i)=>{if(n.GroupId)e[`${s}.Groups.${i+1}.GroupId`]=n.GroupId;if(n.UserId)e[`${s}.Groups.${i+1}.UserId`]=n.UserId;if(n.Description)e[`${s}.Groups.${i+1}.Description`]=n.Description})})}parseArray(e){if(!e)return[];return Array.isArray(e)?e:[e]}parseFirstIpv6Address(e){for(let t of this.parseArray(e))for(let a of this.parseArray(t?.ipv6AddressesSet?.item))if(a?.ipv6Address)return a.ipv6Address;return}parseTags(e){return this.parseArray(e).map((t)=>({Key:t.key,Value:t.value}))}parseReservations(e){return this.parseArray(e).map((t)=>({ReservationId:t.reservationId,Instances:this.parseInstances(t.instancesSet?.item||t.instancesSet)}))}parseInstances(e){return this.parseArray(e).map((t)=>({InstanceId:t.instanceId,ImageId:t.imageId,InstanceType:t.instanceType,State:t.instanceState?{Code:Number.parseInt(t.instanceState.code),Name:t.instanceState.name}:void 0,PrivateIpAddress:t.privateIpAddress,PublicIpAddress:t.ipAddress,Ipv6Address:this.parseFirstIpv6Address(t.networkInterfaceSet?.item),SubnetId:t.subnetId,VpcId:t.vpcId,SecurityGroups:this.parseArray(t.groupSet?.item).map((a)=>({GroupId:a.groupId,GroupName:a.groupName})),Tags:this.parseTags(t.tagSet?.item),LaunchTime:t.launchTime,Placement:t.placement?{AvailabilityZone:t.placement.availabilityZone,Tenancy:t.placement.tenancy}:void 0,Architecture:t.architecture,RootDeviceType:t.rootDeviceType,RootDeviceName:t.rootDeviceName,BlockDeviceMappings:this.parseArray(t.blockDeviceMapping?.item).map((a)=>({DeviceName:a.deviceName,Ebs:a.ebs?{VolumeId:a.ebs.volumeId,Status:a.ebs.status,AttachTime:a.ebs.attachTime,DeleteOnTermination:a.ebs.deleteOnTermination==="true"}:void 0})),IamInstanceProfile:t.iamInstanceProfile?{Arn:t.iamInstanceProfile.arn,Id:t.iamInstanceProfile.id}:void 0}))}parseIpPermissions(e){return this.parseArray(e).map((t)=>({IpProtocol:t.ipProtocol,FromPort:t.fromPort?Number.parseInt(t.fromPort):void 0,ToPort:t.toPort?Number.parseInt(t.toPort):void 0,IpRanges:this.parseArray(t.ipRanges?.item).map((a)=>({CidrIp:a.cidrIp,Description:a.description})),Ipv6Ranges:this.parseArray(t.ipv6Ranges?.item).map((a)=>({CidrIpv6:a.cidrIpv6,Description:a.description})),UserIdGroupPairs:this.parseArray(t.groups?.item).map((a)=>({GroupId:a.groupId,UserId:a.userId,Description:a.description}))}))}}class p{client;region;constructor(e="us-east-1",t){this.region=e,this.client=new g}async putParameter(e){let t={Name:e.Name,Value:e.Value};if(e.Type)t.Type=e.Type;if(e.Description)t.Description=e.Description;if(e.KeyId)t.KeyId=e.KeyId;if(e.Overwrite!==void 0)t.Overwrite=e.Overwrite;if(e.AllowedPattern)t.AllowedPattern=e.AllowedPattern;if(e.Tags&&e.Tags.length>0)t.Tags=e.Tags;if(e.Tier)t.Tier=e.Tier;if(e.DataType)t.DataType=e.DataType;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.PutParameter","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{Version:a.Version,Tier:a.Tier}}async getParameter(e){let t={Name:e.Name};if(e.WithDecryption!==void 0)t.WithDecryption=e.WithDecryption;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.GetParameter","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{Parameter:a.Parameter?this.parseParameter(a.Parameter):void 0}}async getParameters(e){let t={Names:e.Names};if(e.WithDecryption!==void 0)t.WithDecryption=e.WithDecryption;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.GetParameters","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{Parameters:a.Parameters?.map((r)=>this.parseParameter(r)),InvalidParameters:a.InvalidParameters}}async getParametersByPath(e){let t={Path:e.Path};if(e.Recursive!==void 0)t.Recursive=e.Recursive;if(e.WithDecryption!==void 0)t.WithDecryption=e.WithDecryption;if(e.MaxResults)t.MaxResults=e.MaxResults;if(e.NextToken)t.NextToken=e.NextToken;if(e.ParameterFilters&&e.ParameterFilters.length>0)t.ParameterFilters=e.ParameterFilters;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.GetParametersByPath","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{Parameters:a.Parameters?.map((r)=>this.parseParameter(r)),NextToken:a.NextToken}}async deleteParameter(e){let t={Name:e.Name};await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.DeleteParameter","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)})}async deleteParameters(e){let t={Names:e},a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.DeleteParameters","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{DeletedParameters:a.DeletedParameters,InvalidParameters:a.InvalidParameters}}async describeParameters(e){let t={};if(e?.Filters&&e.Filters.length>0)t.Filters=e.Filters;if(e?.ParameterFilters&&e.ParameterFilters.length>0)t.ParameterFilters=e.ParameterFilters;if(e?.MaxResults)t.MaxResults=e.MaxResults;if(e?.NextToken)t.NextToken=e.NextToken;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.DescribeParameters","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{Parameters:a.Parameters?.map((r)=>this.parseParameter(r)),NextToken:a.NextToken}}async getParameterHistory(e){let t={Name:e.Name};if(e.WithDecryption!==void 0)t.WithDecryption=e.WithDecryption;if(e.MaxResults)t.MaxResults=e.MaxResults;if(e.NextToken)t.NextToken=e.NextToken;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.GetParameterHistory","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{Parameters:a.Parameters?.map((r)=>({Name:r.Name,Type:r.Type,KeyId:r.KeyId,LastModifiedDate:r.LastModifiedDate,LastModifiedUser:r.LastModifiedUser,Description:r.Description,Value:r.Value,Version:r.Version,Labels:r.Labels,Tier:r.Tier})),NextToken:a.NextToken}}async labelParameterVersion(e){let t={Name:e.Name,Labels:e.Labels};if(e.ParameterVersion!==void 0)t.ParameterVersion=e.ParameterVersion;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.LabelParameterVersion","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{InvalidLabels:a.InvalidLabels,ParameterVersion:a.ParameterVersion}}async addTagsToResource(e){let t={ResourceType:e.ResourceType,ResourceId:e.ResourceId,Tags:e.Tags};await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.AddTagsToResource","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)})}async removeTagsFromResource(e){let t={ResourceType:e.ResourceType,ResourceId:e.ResourceId,TagKeys:e.TagKeys};await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.RemoveTagsFromResource","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)})}async listTagsForResource(e){let t={ResourceType:e.ResourceType,ResourceId:e.ResourceId};return{TagList:(await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.ListTagsForResource","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)})).TagList}}async setString(e,t,a){return this.putParameter({Name:e,Value:t,Type:"String",Description:a?.description,Overwrite:a?.overwrite??!0,Tags:a?.tags})}async setSecureString(e,t,a){return this.putParameter({Name:e,Value:t,Type:"SecureString",Description:a?.description,Overwrite:a?.overwrite??!0,KeyId:a?.kmsKeyId,Tags:a?.tags})}async getValue(e){return(await this.getParameter({Name:e,WithDecryption:!0})).Parameter?.Value}async getAllByPath(e,t=!0){let a=[],r;do{let s=await this.getParametersByPath({Path:e,Recursive:t,WithDecryption:!0,NextToken:r});if(s.Parameters)a.push(...s.Parameters);r=s.NextToken}while(r);return a}parseParameter(e){return{Name:e.Name,Type:e.Type,Value:e.Value,Version:e.Version,LastModifiedDate:e.LastModifiedDate,ARN:e.ARN,DataType:e.DataType,Description:e.Description,AllowedPattern:e.AllowedPattern,KeyId:e.KeyId,Tier:e.Tier}}async sendCommand(e){if(!e.InstanceIds&&!e.Targets)throw Error("SendCommand requires either InstanceIds or Targets");let t={DocumentName:e.DocumentName};if(e.InstanceIds)t.InstanceIds=e.InstanceIds;if(e.Targets)t.Targets=e.Targets;if(e.Parameters)t.Parameters=e.Parameters;if(e.TimeoutSeconds)t.TimeoutSeconds=e.TimeoutSeconds;if(e.Comment)t.Comment=e.Comment;if(e.OutputS3BucketName)t.OutputS3BucketName=e.OutputS3BucketName;if(e.OutputS3KeyPrefix)t.OutputS3KeyPrefix=e.OutputS3KeyPrefix;let a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.SendCommand","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{CommandId:a.Command?.CommandId,Status:a.Command?.Status,StatusDetails:a.Command?.StatusDetails}}async getCommandInvocation(e){let t={CommandId:e.CommandId,InstanceId:e.InstanceId},a=await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.GetCommandInvocation","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)});return{Status:a.Status,StatusDetails:a.StatusDetails,StandardOutputContent:a.StandardOutputContent,StandardErrorContent:a.StandardErrorContent,ResponseCode:a.ResponseCode}}async runShellCommand(e,t,a){let r=await this.sendCommand({InstanceIds:[e],DocumentName:"AWS-RunShellScript",Parameters:{commands:t},TimeoutSeconds:a?.timeoutSeconds||600});if(!r.CommandId)return{success:!1,error:"Failed to send command"};if(a?.waitForCompletion===!1)return{success:!0,status:"Pending"};let s=a?.pollIntervalMs||2000,n=a?.maxWaitMs||300000,i=Date.now();while(Date.now()-i<n){await new Promise((o)=>setTimeout(o,s));try{let o=await this.getCommandInvocation({CommandId:r.CommandId,InstanceId:e});if(o.Status==="Success")return{success:!0,output:o.StandardOutputContent,error:o.StandardErrorContent,status:o.Status};if(o.Status==="Failed"||o.Status==="Cancelled"||o.Status==="TimedOut")return{success:!1,output:o.StandardOutputContent,error:o.StandardErrorContent||o.StatusDetails,status:o.Status}}catch(o){if(!o.message?.includes("InvocationDoesNotExist"))return{success:!1,error:o.message}}}return{success:!1,error:"Command timed out waiting for completion"}}async listCommandInvocations(e){let t={CommandId:e.CommandId};if(e.Details)t.Details=!0;return((await this.client.request({service:"ssm",region:this.region,method:"POST",path:"/",headers:{"X-Amz-Target":"AmazonSSM.ListCommandInvocations","Content-Type":"application/x-amz-json-1.1"},body:JSON.stringify(t)})).CommandInvocations||[]).map((s)=>({InstanceId:s.InstanceId,Status:s.Status,StatusDetails:s.StatusDetails,StandardOutputContent:s.CommandPlugins?.[0]?.Output,StandardErrorContent:s.CommandPlugins?.[0]?.StandardErrorUrl}))}async sendCommandByTags(e){let t=Object.entries(e.tags).map(([c,u])=>({Key:`tag:${c}`,Values:[u]})),a=await this.sendCommand({Targets:t,DocumentName:"AWS-RunShellScript",Parameters:{commands:e.commands},TimeoutSeconds:e.timeoutSeconds||600,Comment:e.comment});if(!a.CommandId)return{success:!1,instanceCount:0,perInstance:[],error:"Failed to send command"};let r=e.pollIntervalMs||3000,s=e.maxWaitMs||600000,n=Date.now(),i=new Set(["Success","Failed","Cancelled","TimedOut"]),o=[];while(Date.now()-n<s){await new Promise((c)=>setTimeout(c,r));try{if(o=await this.listCommandInvocations({CommandId:a.CommandId,Details:!0}),o.length===0)continue;if(o.every((u)=>i.has(u.Status||""))){let u=o.map((d)=>({instanceId:d.InstanceId,status:d.Status||"Unknown",output:d.StandardOutputContent,error:d.StandardErrorContent||d.StatusDetails})),m=o.every((d)=>d.Status==="Success");return{success:m,instanceCount:o.length,perInstance:u,error:m?void 0:"One or more instances reported a non-success status"}}}catch(c){if(!c.message?.includes("InvocationDoesNotExist"))return{success:!1,instanceCount:0,perInstance:[],error:c.message}}}return{success:!1,instanceCount:o.length,perInstance:o.map((c)=>({instanceId:c.InstanceId,status:c.Status||"Unknown"})),error:"Command timed out waiting for all instances to complete"}}}
4
- export{l as Sh,p as Th};
4
+ export{l as Vh,p as Wh};
@@ -1,4 +1,4 @@
1
- import{xl as $t}from"./chunk-b10cbk8z.js";import{Sl as yr,Tl as Lr}from"./chunk-0hj552t7.js";var Es=["edge.requests","edge.egress_gb","function.invocations","function.gb_seconds","build.minutes","compute.instance_hours","storage.gb_hours","object.egress_gb","object.requests","database.gb_hours","database.io_requests","telemetry.ingest_gb","image.transformations"],ut={"edge.requests":{key:"edge.requests",unit:"requests",label:"Edge requests",precision:0},"edge.egress_gb":{key:"edge.egress_gb",unit:"gb",label:"Edge egress",precision:3},"function.invocations":{key:"function.invocations",unit:"invocations",label:"Function invocations",precision:0},"function.gb_seconds":{key:"function.gb_seconds",unit:"gb_seconds",label:"Function compute",precision:2},"build.minutes":{key:"build.minutes",unit:"minutes",label:"Build minutes",precision:2},"compute.instance_hours":{key:"compute.instance_hours",unit:"hours",label:"Instance hours",precision:2},"storage.gb_hours":{key:"storage.gb_hours",unit:"gb_hours",label:"Block storage",precision:2},"object.egress_gb":{key:"object.egress_gb",unit:"gb",label:"Object storage egress",precision:3},"object.requests":{key:"object.requests",unit:"requests",label:"Object storage requests",precision:0},"database.gb_hours":{key:"database.gb_hours",unit:"gb_hours",label:"Database storage",precision:2},"database.io_requests":{key:"database.io_requests",unit:"requests",label:"Database I/O",precision:0},"telemetry.ingest_gb":{key:"telemetry.ingest_gb",unit:"gb",label:"Telemetry ingest",precision:3},"image.transformations":{key:"image.transformations",unit:"count",label:"Image transformations",precision:0}},ms=["notify","block_builds","block_deployments","throttle_requests","suspend_functions","serve_static","suspend_project"],k={notify:0,block_builds:1,block_deployments:2,throttle_requests:3,suspend_functions:4,serve_static:5,suspend_project:6};var gs=1e6;function Un(e){if(e.tiers&&e.tiers.length>0)return e.tiers;return[{upToQuantity:null,microCentsPerUnit:e.microCentsPerUnit??0}]}function lr(e,t){if(!(e>0))return 0;let r=[...t].sort((s,a)=>{if(s.upToQuantity===null)return 1;if(a.upToQuantity===null)return-1;return s.upToQuantity-a.upToQuantity}),n=e,i=0,o=0;for(let s of r){if(n<=0)break;let d=(s.upToQuantity===null?1/0:s.upToQuantity)-i;if(d<=0)continue;let c=Math.min(n,d);o+=c*s.microCentsPerUnit,n-=c,i+=c}if(n>0){let s=r.reduce((a,d)=>Math.max(a,d.microCentsPerUnit),0);o+=n*s}return o}function Dn(e,t,r,n){let i=e.entries.filter((a)=>a.meter===t);if(i.length===0)return;let o=i.filter((a)=>a.provider===r),s=o.length>0?o:i.filter((a)=>a.provider==="*");return s.find((a)=>a.region===n)??s.find((a)=>a.region==null)}function pt(e,t,r=0){let n=Dn(e,t.meter,t.provider,t.region),i=Math.max(0,t.quantity);if(!n)return{meter:t.meter,provider:t.provider??"unknown",region:t.region,quantity:i,includedQuantity:0,billableQuantity:i,costCents:0,unpriced:!0};let o=Math.max(0,n.includedQuantity??0),s=Math.max(0,r-o),a=Math.max(0,o-Math.max(0,r)),d=Math.min(i,a),c=i-d,p=Un(n),l=lr(s+c,p)-lr(s,p);return{meter:t.meter,provider:n.provider,region:n.region??t.region,quantity:i,includedQuantity:d,billableQuantity:c,costCents:l/1e6,unpriced:!1}}function _s(e,t){let r=new Map,n=[];for(let i of t){let o=`${i.meter}\x00${i.provider??""}\x00${i.region??""}`,s=r.get(o)??0,a=pt(e,i,s);r.set(o,s+a.quantity),n.push(a)}return{currency:e.currency,totalCents:n.reduce((i,o)=>i+o.costCents,0),lines:n,unpricedMeters:[...new Set(n.filter((i)=>i.unpriced).map((i)=>String(i.meter)))]}}function hs(e){return Math.round(e*100)/100}function Ns(e,...t){let r=new Map,n=(o)=>`${o.meter}\x00${o.provider}\x00${o.region??""}`;for(let o of e.entries)r.set(n(o),o);let i=e.currency;for(let o of t){i=o.currency||i;for(let s of o.entries)r.set(n(s),s)}return{currency:i,entries:[...r.values()]}}var K=(e)=>Math.round(e*1e6),j=(e)=>Math.round(e*1e6),ur={currency:"USD",entries:[{meter:"edge.requests",provider:"aws",microCentsPerUnit:j(0.00075)},{meter:"edge.egress_gb",provider:"aws",includedQuantity:100,tiers:[{upToQuantity:10240,microCentsPerUnit:K(8.5)},{upToQuantity:51200,microCentsPerUnit:K(8)},{upToQuantity:null,microCentsPerUnit:K(6)}]},{meter:"function.invocations",provider:"aws",includedQuantity:1e6,microCentsPerUnit:j(0.002)},{meter:"function.gb_seconds",provider:"aws",includedQuantity:400000,microCentsPerUnit:j(0.00166667)},{meter:"storage.gb_hours",provider:"aws",microCentsPerUnit:j(0.010958904109589041)},{meter:"object.egress_gb",provider:"aws",includedQuantity:100,microCentsPerUnit:K(9)},{meter:"object.requests",provider:"aws",microCentsPerUnit:j(0.000039999999999999996)},{meter:"database.gb_hours",provider:"aws",microCentsPerUnit:j(0.015753424657534248)},{meter:"compute.instance_hours",provider:"aws",microCentsPerUnit:j(4.16)},{meter:"edge.egress_gb",provider:"hetzner",includedQuantity:20480,microCentsPerUnit:K(0.108)},{meter:"object.egress_gb",provider:"hetzner",includedQuantity:1024,microCentsPerUnit:K(0.108)},{meter:"compute.instance_hours",provider:"hetzner",microCentsPerUnit:j(0.95)},{meter:"storage.gb_hours",provider:"hetzner",microCentsPerUnit:j(0.006027397260273972)},{meter:"edge.requests",provider:"hetzner",microCentsPerUnit:0},{meter:"edge.requests",provider:"local",microCentsPerUnit:0},{meter:"edge.egress_gb",provider:"local",microCentsPerUnit:0},{meter:"function.invocations",provider:"local",microCentsPerUnit:0},{meter:"function.gb_seconds",provider:"local",microCentsPerUnit:0},{meter:"build.minutes",provider:"*",includedQuantity:6000,microCentsPerUnit:j(0.8)},{meter:"telemetry.ingest_gb",provider:"*",includedQuantity:5,microCentsPerUnit:K(50)},{meter:"image.transformations",provider:"*",includedQuantity:5000,microCentsPerUnit:j(0.05)}]};var pr=new Map;function mr(e){let t=pr.get(e);if(!t)t=new Intl.DateTimeFormat("en-US",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",weekday:"short",hourCycle:"h23"}),pr.set(e,t);return t}var wn={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};function Ue(e){try{return mr(e),!0}catch{return!1}}function Et(e,t){let r=mr(t).formatToParts(e),n=(i)=>r.find((o)=>o.type===i)?.value??"0";return{year:Number(n("year")),month:Number(n("month")),day:Number(n("day")),hour:Number(n("hour")),minute:Number(n("minute")),second:Number(n("second")),weekday:wn[n("weekday")]??0}}function Er(e,t){let r=Et(e,t);return Date.UTC(r.year,r.month-1,r.day,r.hour,r.minute,r.second)-Math.floor(e.getTime()/1000)*1000}function te(e,t,r,n,i=0){let o=Date.UTC(t,r-1,n,i),s=new Date(o-Er(new Date(o),e));return new Date(o-Er(s,e))}function kn(e,t){return new Date(Date.UTC(e,t-1,1)).toLocaleString("en-US",{month:"long",year:"numeric",timeZone:"UTC"})}function Q(e,t,r=new Date){let n=Ue(t)?t:"UTC",i=Et(r,n),o,s,a;if(e==="daily")o=te(n,i.year,i.month,i.day),s=te(n,i.year,i.month,i.day+1),a=`${i.year}-${String(i.month).padStart(2,"0")}-${String(i.day).padStart(2,"0")}`;else if(e==="weekly"){let p=(i.weekday+6)%7;o=te(n,i.year,i.month,i.day-p),s=te(n,i.year,i.month,i.day-p+7);let l=Et(o,n);a=`week of ${l.year}-${String(l.month).padStart(2,"0")}-${String(l.day).padStart(2,"0")}`}else o=te(n,i.year,i.month,1),s=te(n,i.year,i.month+1,1),a=kn(i.year,i.month);let d=s.getTime()-o.getTime(),c=Math.max(0,Math.min(d,r.getTime()-o.getTime()));return{start:o.toISOString(),end:s.toISOString(),elapsedMs:c,totalMs:d,label:a}}function ys(e,t,r=new Date){let n=Q(e,t,r),i=new Date(new Date(n.start).getTime()-1),o=Q(e,t,i);return{...o,elapsedMs:o.totalMs}}function ue(e){let r=(typeof e==="string"?new Date(e):e).getTime();if(!Number.isFinite(r))throw Error("hourBucket requires a valid date");return new Date(Math.floor(r/3600000)*3600000).toISOString()}function Ls(e,t,r=9600){let n=Math.floor(new Date(e).getTime()/3600000)*3600000,i=new Date(t).getTime();if(!Number.isFinite(n)||!Number.isFinite(i))throw Error("hourBucketsBetween requires valid dates");let o=[];for(let s=n;s<i&&o.length<r;s+=3600000)o.push(new Date(s).toISOString());return o}import{createHash as Xn}from"node:crypto";var De=1073741824,gr=[{match:"request.count",meter:"edge.requests"},{match:"traffic.requests",meter:"edge.requests"},{match:"http.request",meter:"edge.requests",field:"count"},{match:"traffic.bytes_out",meter:"edge.egress_gb",scale:1/De},{match:"storage.egress.day",meter:"object.egress_gb",scale:1/De},{match:"storage.egress.month",meter:"object.egress_gb",scale:1/De,cumulative:!0},{match:"storage.egress.day_downloads",meter:"object.requests"},{match:"function.invocation",meter:"function.invocations",field:"count"},{match:"function.duration_ms",meter:"function.gb_seconds",scale:0.001},{match:"build.duration_ms",meter:"build.minutes",scale:0.000016666666666666667},{match:"telemetry.ingest_bytes",meter:"telemetry.ingest_gb",scale:1/De},{match:"image.transform",meter:"image.transformations",field:"count"}];function Pn(e,t){return e.match.endsWith("*")?t.startsWith(e.match.slice(0,-1)):e.match===t}function xn(e,t=gr){return t.find((r)=>!r.match.endsWith("*")&&r.match===e)??t.find((r)=>Pn(r,e))}function jn(e,t){let r=t.field??"value",n=r==="count"?1:r==="bytesOut"?e.bytesOut:r==="bytesIn"?e.bytesIn:r==="durationMs"?e.durationMs:e.value;if(n==null||!Number.isFinite(n))return;return n*(t.scale??1)}function Fn(e,t){return Xn("sha256").update([t,e.meter,e.organizationId,e.projectId??"",e.environmentId??"",e.resourceId??"",e.timestamp].join("\x00")).digest("hex").slice(0,32)}class mt{resetToleranceRatio;last=new Map;constructor(e=0.999){this.resetToleranceRatio=e}delta(e,t,r=new Date){if(!Number.isFinite(t)||t<0)return;let n=new Date(r).getTime(),i=this.last.get(e);if(!i)return this.last.set(e,{value:t,at:n}),t>0?t:void 0;if(n<i.at)return;if(t<i.value&&t>=i.value*this.resetToleranceRatio)return;if(this.last.set(e,{value:t,at:n}),t>=i.value){let o=t-i.value;return o>0?o:void 0}return t>0?t:void 0}prune(e){let t=e.getTime(),r=0;for(let[n,i]of this.last)if(i.at<t)this.last.delete(n),r++;return r}get size(){return this.last.size}}function Tr(e,t){let r=e[t];return typeof r==="string"&&r.length>0?r:void 0}function _r(e,t,r={}){let n=r.mappings??gr,i=r.counters,o=[];for(let s of t){let a=xn(s.name,n);if(!a)continue;let d=jn(s,a);if(d==null)continue;if(a.cumulative){if(!i)continue;let p=[s.projectId,s.environmentId??"",s.resourceId??"",s.name,s.source].join("\x00"),l=i.delta(p,d,s.timestamp);if(l==null)continue;d=l}if(!(d>0))continue;let c={organizationId:e,projectId:s.projectId,environmentId:s.environmentId,resourceId:s.resourceId,provider:Tr(s.attributes,"provider")??r.defaultProvider,region:s.region??Tr(s.attributes,"region"),meter:a.meter,quantity:d,timestamp:s.timestamp,attributes:{source:s.source,signal:s.name}};o.push({...c,key:Fn(c,s.id)})}return o}function hr(e){let t=new Map;for(let r of e){let n=new Date(Math.floor(new Date(r.timestamp).getTime()/3600000)*3600000).toISOString(),i=[r.organizationId,r.projectId??"",r.environmentId??"",r.resourceId??"",r.provider??"",r.region??"",r.meter,n].join("\x00"),o=t.get(i);if(o)o.quantity+=r.quantity;else t.set(i,{...r,timestamp:n})}return[...t.values()]}import{createHash as ti}from"node:crypto";var q=40,Tt=[{version:1,name:"core_control_plane",sql:`
1
+ import{Al as $t}from"./chunk-x3hay61c.js";import{Vl as yr,Wl as Lr}from"./chunk-zz52xje8.js";var Es=["edge.requests","edge.egress_gb","function.invocations","function.gb_seconds","build.minutes","compute.instance_hours","storage.gb_hours","object.egress_gb","object.requests","database.gb_hours","database.io_requests","telemetry.ingest_gb","image.transformations"],ut={"edge.requests":{key:"edge.requests",unit:"requests",label:"Edge requests",precision:0},"edge.egress_gb":{key:"edge.egress_gb",unit:"gb",label:"Edge egress",precision:3},"function.invocations":{key:"function.invocations",unit:"invocations",label:"Function invocations",precision:0},"function.gb_seconds":{key:"function.gb_seconds",unit:"gb_seconds",label:"Function compute",precision:2},"build.minutes":{key:"build.minutes",unit:"minutes",label:"Build minutes",precision:2},"compute.instance_hours":{key:"compute.instance_hours",unit:"hours",label:"Instance hours",precision:2},"storage.gb_hours":{key:"storage.gb_hours",unit:"gb_hours",label:"Block storage",precision:2},"object.egress_gb":{key:"object.egress_gb",unit:"gb",label:"Object storage egress",precision:3},"object.requests":{key:"object.requests",unit:"requests",label:"Object storage requests",precision:0},"database.gb_hours":{key:"database.gb_hours",unit:"gb_hours",label:"Database storage",precision:2},"database.io_requests":{key:"database.io_requests",unit:"requests",label:"Database I/O",precision:0},"telemetry.ingest_gb":{key:"telemetry.ingest_gb",unit:"gb",label:"Telemetry ingest",precision:3},"image.transformations":{key:"image.transformations",unit:"count",label:"Image transformations",precision:0}},ms=["notify","block_builds","block_deployments","throttle_requests","suspend_functions","serve_static","suspend_project"],k={notify:0,block_builds:1,block_deployments:2,throttle_requests:3,suspend_functions:4,serve_static:5,suspend_project:6};var gs=1e6;function Un(e){if(e.tiers&&e.tiers.length>0)return e.tiers;return[{upToQuantity:null,microCentsPerUnit:e.microCentsPerUnit??0}]}function lr(e,t){if(!(e>0))return 0;let r=[...t].sort((s,a)=>{if(s.upToQuantity===null)return 1;if(a.upToQuantity===null)return-1;return s.upToQuantity-a.upToQuantity}),n=e,i=0,o=0;for(let s of r){if(n<=0)break;let d=(s.upToQuantity===null?1/0:s.upToQuantity)-i;if(d<=0)continue;let c=Math.min(n,d);o+=c*s.microCentsPerUnit,n-=c,i+=c}if(n>0){let s=r.reduce((a,d)=>Math.max(a,d.microCentsPerUnit),0);o+=n*s}return o}function Dn(e,t,r,n){let i=e.entries.filter((a)=>a.meter===t);if(i.length===0)return;let o=i.filter((a)=>a.provider===r),s=o.length>0?o:i.filter((a)=>a.provider==="*");return s.find((a)=>a.region===n)??s.find((a)=>a.region==null)}function pt(e,t,r=0){let n=Dn(e,t.meter,t.provider,t.region),i=Math.max(0,t.quantity);if(!n)return{meter:t.meter,provider:t.provider??"unknown",region:t.region,quantity:i,includedQuantity:0,billableQuantity:i,costCents:0,unpriced:!0};let o=Math.max(0,n.includedQuantity??0),s=Math.max(0,r-o),a=Math.max(0,o-Math.max(0,r)),d=Math.min(i,a),c=i-d,p=Un(n),l=lr(s+c,p)-lr(s,p);return{meter:t.meter,provider:n.provider,region:n.region??t.region,quantity:i,includedQuantity:d,billableQuantity:c,costCents:l/1e6,unpriced:!1}}function _s(e,t){let r=new Map,n=[];for(let i of t){let o=`${i.meter}\x00${i.provider??""}\x00${i.region??""}`,s=r.get(o)??0,a=pt(e,i,s);r.set(o,s+a.quantity),n.push(a)}return{currency:e.currency,totalCents:n.reduce((i,o)=>i+o.costCents,0),lines:n,unpricedMeters:[...new Set(n.filter((i)=>i.unpriced).map((i)=>String(i.meter)))]}}function hs(e){return Math.round(e*100)/100}function Ns(e,...t){let r=new Map,n=(o)=>`${o.meter}\x00${o.provider}\x00${o.region??""}`;for(let o of e.entries)r.set(n(o),o);let i=e.currency;for(let o of t){i=o.currency||i;for(let s of o.entries)r.set(n(s),s)}return{currency:i,entries:[...r.values()]}}var K=(e)=>Math.round(e*1e6),j=(e)=>Math.round(e*1e6),ur={currency:"USD",entries:[{meter:"edge.requests",provider:"aws",microCentsPerUnit:j(0.00075)},{meter:"edge.egress_gb",provider:"aws",includedQuantity:100,tiers:[{upToQuantity:10240,microCentsPerUnit:K(8.5)},{upToQuantity:51200,microCentsPerUnit:K(8)},{upToQuantity:null,microCentsPerUnit:K(6)}]},{meter:"function.invocations",provider:"aws",includedQuantity:1e6,microCentsPerUnit:j(0.002)},{meter:"function.gb_seconds",provider:"aws",includedQuantity:400000,microCentsPerUnit:j(0.00166667)},{meter:"storage.gb_hours",provider:"aws",microCentsPerUnit:j(0.010958904109589041)},{meter:"object.egress_gb",provider:"aws",includedQuantity:100,microCentsPerUnit:K(9)},{meter:"object.requests",provider:"aws",microCentsPerUnit:j(0.000039999999999999996)},{meter:"database.gb_hours",provider:"aws",microCentsPerUnit:j(0.015753424657534248)},{meter:"compute.instance_hours",provider:"aws",microCentsPerUnit:j(4.16)},{meter:"edge.egress_gb",provider:"hetzner",includedQuantity:20480,microCentsPerUnit:K(0.108)},{meter:"object.egress_gb",provider:"hetzner",includedQuantity:1024,microCentsPerUnit:K(0.108)},{meter:"compute.instance_hours",provider:"hetzner",microCentsPerUnit:j(0.95)},{meter:"storage.gb_hours",provider:"hetzner",microCentsPerUnit:j(0.006027397260273972)},{meter:"edge.requests",provider:"hetzner",microCentsPerUnit:0},{meter:"edge.requests",provider:"local",microCentsPerUnit:0},{meter:"edge.egress_gb",provider:"local",microCentsPerUnit:0},{meter:"function.invocations",provider:"local",microCentsPerUnit:0},{meter:"function.gb_seconds",provider:"local",microCentsPerUnit:0},{meter:"build.minutes",provider:"*",includedQuantity:6000,microCentsPerUnit:j(0.8)},{meter:"telemetry.ingest_gb",provider:"*",includedQuantity:5,microCentsPerUnit:K(50)},{meter:"image.transformations",provider:"*",includedQuantity:5000,microCentsPerUnit:j(0.05)}]};var pr=new Map;function mr(e){let t=pr.get(e);if(!t)t=new Intl.DateTimeFormat("en-US",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",weekday:"short",hourCycle:"h23"}),pr.set(e,t);return t}var wn={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};function Ue(e){try{return mr(e),!0}catch{return!1}}function Et(e,t){let r=mr(t).formatToParts(e),n=(i)=>r.find((o)=>o.type===i)?.value??"0";return{year:Number(n("year")),month:Number(n("month")),day:Number(n("day")),hour:Number(n("hour")),minute:Number(n("minute")),second:Number(n("second")),weekday:wn[n("weekday")]??0}}function Er(e,t){let r=Et(e,t);return Date.UTC(r.year,r.month-1,r.day,r.hour,r.minute,r.second)-Math.floor(e.getTime()/1000)*1000}function te(e,t,r,n,i=0){let o=Date.UTC(t,r-1,n,i),s=new Date(o-Er(new Date(o),e));return new Date(o-Er(s,e))}function kn(e,t){return new Date(Date.UTC(e,t-1,1)).toLocaleString("en-US",{month:"long",year:"numeric",timeZone:"UTC"})}function Q(e,t,r=new Date){let n=Ue(t)?t:"UTC",i=Et(r,n),o,s,a;if(e==="daily")o=te(n,i.year,i.month,i.day),s=te(n,i.year,i.month,i.day+1),a=`${i.year}-${String(i.month).padStart(2,"0")}-${String(i.day).padStart(2,"0")}`;else if(e==="weekly"){let p=(i.weekday+6)%7;o=te(n,i.year,i.month,i.day-p),s=te(n,i.year,i.month,i.day-p+7);let l=Et(o,n);a=`week of ${l.year}-${String(l.month).padStart(2,"0")}-${String(l.day).padStart(2,"0")}`}else o=te(n,i.year,i.month,1),s=te(n,i.year,i.month+1,1),a=kn(i.year,i.month);let d=s.getTime()-o.getTime(),c=Math.max(0,Math.min(d,r.getTime()-o.getTime()));return{start:o.toISOString(),end:s.toISOString(),elapsedMs:c,totalMs:d,label:a}}function ys(e,t,r=new Date){let n=Q(e,t,r),i=new Date(new Date(n.start).getTime()-1),o=Q(e,t,i);return{...o,elapsedMs:o.totalMs}}function ue(e){let r=(typeof e==="string"?new Date(e):e).getTime();if(!Number.isFinite(r))throw Error("hourBucket requires a valid date");return new Date(Math.floor(r/3600000)*3600000).toISOString()}function Ls(e,t,r=9600){let n=Math.floor(new Date(e).getTime()/3600000)*3600000,i=new Date(t).getTime();if(!Number.isFinite(n)||!Number.isFinite(i))throw Error("hourBucketsBetween requires valid dates");let o=[];for(let s=n;s<i&&o.length<r;s+=3600000)o.push(new Date(s).toISOString());return o}import{createHash as Xn}from"node:crypto";var De=1073741824,gr=[{match:"request.count",meter:"edge.requests"},{match:"traffic.requests",meter:"edge.requests"},{match:"http.request",meter:"edge.requests",field:"count"},{match:"traffic.bytes_out",meter:"edge.egress_gb",scale:1/De},{match:"storage.egress.day",meter:"object.egress_gb",scale:1/De},{match:"storage.egress.month",meter:"object.egress_gb",scale:1/De,cumulative:!0},{match:"storage.egress.day_downloads",meter:"object.requests"},{match:"function.invocation",meter:"function.invocations",field:"count"},{match:"function.duration_ms",meter:"function.gb_seconds",scale:0.001},{match:"build.duration_ms",meter:"build.minutes",scale:0.000016666666666666667},{match:"telemetry.ingest_bytes",meter:"telemetry.ingest_gb",scale:1/De},{match:"image.transform",meter:"image.transformations",field:"count"}];function Pn(e,t){return e.match.endsWith("*")?t.startsWith(e.match.slice(0,-1)):e.match===t}function xn(e,t=gr){return t.find((r)=>!r.match.endsWith("*")&&r.match===e)??t.find((r)=>Pn(r,e))}function jn(e,t){let r=t.field??"value",n=r==="count"?1:r==="bytesOut"?e.bytesOut:r==="bytesIn"?e.bytesIn:r==="durationMs"?e.durationMs:e.value;if(n==null||!Number.isFinite(n))return;return n*(t.scale??1)}function Fn(e,t){return Xn("sha256").update([t,e.meter,e.organizationId,e.projectId??"",e.environmentId??"",e.resourceId??"",e.timestamp].join("\x00")).digest("hex").slice(0,32)}class mt{resetToleranceRatio;last=new Map;constructor(e=0.999){this.resetToleranceRatio=e}delta(e,t,r=new Date){if(!Number.isFinite(t)||t<0)return;let n=new Date(r).getTime(),i=this.last.get(e);if(!i)return this.last.set(e,{value:t,at:n}),t>0?t:void 0;if(n<i.at)return;if(t<i.value&&t>=i.value*this.resetToleranceRatio)return;if(this.last.set(e,{value:t,at:n}),t>=i.value){let o=t-i.value;return o>0?o:void 0}return t>0?t:void 0}prune(e){let t=e.getTime(),r=0;for(let[n,i]of this.last)if(i.at<t)this.last.delete(n),r++;return r}get size(){return this.last.size}}function Tr(e,t){let r=e[t];return typeof r==="string"&&r.length>0?r:void 0}function _r(e,t,r={}){let n=r.mappings??gr,i=r.counters,o=[];for(let s of t){let a=xn(s.name,n);if(!a)continue;let d=jn(s,a);if(d==null)continue;if(a.cumulative){if(!i)continue;let p=[s.projectId,s.environmentId??"",s.resourceId??"",s.name,s.source].join("\x00"),l=i.delta(p,d,s.timestamp);if(l==null)continue;d=l}if(!(d>0))continue;let c={organizationId:e,projectId:s.projectId,environmentId:s.environmentId,resourceId:s.resourceId,provider:Tr(s.attributes,"provider")??r.defaultProvider,region:s.region??Tr(s.attributes,"region"),meter:a.meter,quantity:d,timestamp:s.timestamp,attributes:{source:s.source,signal:s.name}};o.push({...c,key:Fn(c,s.id)})}return o}function hr(e){let t=new Map;for(let r of e){let n=new Date(Math.floor(new Date(r.timestamp).getTime()/3600000)*3600000).toISOString(),i=[r.organizationId,r.projectId??"",r.environmentId??"",r.resourceId??"",r.provider??"",r.region??"",r.meter,n].join("\x00"),o=t.get(i);if(o)o.quantity+=r.quantity;else t.set(i,{...r,timestamp:n})}return[...t.values()]}import{createHash as ti}from"node:crypto";var q=40,Tt=[{version:1,name:"core_control_plane",sql:`
2
2
  CREATE TABLE projects (
3
3
  id TEXT PRIMARY KEY,
4
4
  slug TEXT NOT NULL UNIQUE,
@@ -1614,4 +1614,4 @@ volumes:
1614
1614
  `).map((o)=>o.trim()).filter(oe.test.bind(oe))){let o=await this.inspect(i);if(o)n.push(o)}return n}async create(e){let t=typeof e.desiredState.nativeName==="string"?e.desiredState.nativeName:e.name;if(!oe.test(t))throw Error("Docker volume name is invalid.");return await this.run(["volume","create","--label",`ts-cloud.volume=${e.id}`,"--label",`ts-cloud.project=${e.projectId}`,t]),await this.inspect(t)??{providerId:t}}async attach(e,t){}async detach(e,t){}async resize(){throw Error(this.capabilities().resize.reason)}async snapshot(){throw Error(this.capabilities().snapshot.reason)}async restore(e,t,r){throw Error(this.capabilities().restore.reason)}async delete(e){if(!e.providerId||!oe.test(e.providerId))throw Error("Docker volume provider identity is missing or invalid.");await this.run(["volume","rm",e.providerId])}async usage(e){let t=await this.run(["system","df","-v","--format","{{json .}}"],!0),r=t.split(`
1615
1615
  `).find((n)=>n.includes(`"Name":"${e.providerId}"`));if(!r)return{};try{let n=JSON.parse(r);return{usedBytes:typeof n.Size==="number"?n.Size:void 0}}catch{return{}}}}class Jo{provider="server";type="server_path";root;constructor(e){this.root=In(e)}capabilities(){return ot(["create","attach","detach","delete","adopt","usage"],{resize:{supported:!1,reason:"Server paths use the capacity of their containing filesystem."},snapshot:{supported:!1,reason:"Attach a filesystem backup policy for verified recovery points."},restore:{supported:!1,reason:"Restore a filesystem recovery point into a new managed path."}})}path(e){if(!oe.test(e))throw Error("Server path volume name is invalid.");let t=In(this.root,e);if(!t.startsWith(`${this.root}${Go}`)||Yo(t)!==e)throw Error("Server path escaped the managed volume root.");return t}async discover(e,t){return await tr(this.root,{recursive:!0,mode:488}),(await Ko(this.root,{withFileTypes:!0})).filter((n)=>n.isDirectory()&&oe.test(n.name)).map((n)=>({providerId:n.name,raw:{path:this.path(n.name)}}))}async create(e){let t=typeof e.desiredState.nativeName==="string"?e.desiredState.nativeName:e.name,r=this.path(t);return await tr(this.root,{recursive:!0,mode:488}),await tr(r,{recursive:!1,mode:488}),{providerId:t,filesystem:"host",raw:{path:r}}}async attach(e,t){}async detach(e,t){}async resize(){throw Error(this.capabilities().resize.reason)}async snapshot(){throw Error(this.capabilities().snapshot.reason)}async restore(e,t,r){throw Error(this.capabilities().restore.reason)}async delete(e){if(!e.providerId)throw Error("Server path provider identity is unavailable.");await $o(this.path(e.providerId),{recursive:!0,force:!1})}async usage(e){if(!e.providerId)return{};return{usedBytes:(await Qo(this.path(e.providerId))).size}}}class Zo{provider;transport;type="ebs";constructor(e,t){this.provider=e;this.transport=t}capabilities(){return ot(["create","attach","detach","resize","snapshot","restore","delete","adopt","usage"],{resize:{supported:!0,online:!0,minimumBytes:1073741824}})}discover(e,t){return this.transport.list(e,t)}create(e){return this.transport.create({name:e.name,projectId:e.projectId,environmentId:e.environmentId,capacityBytes:e.capacityBytes,encrypted:e.encrypted,filesystem:e.filesystem})}resource(e,t){let r=e.resourceId===t.resourceId?e.observedState.resourceProviderId:void 0,n=typeof r==="string"?r:t.driverOptions.resourceProviderId;if(typeof n!=="string"||!n)throw Error("Cloud attachment requires a reviewed resourceProviderId driver option.");return n}attach(e,t){return this.transport.attach(e.providerId,this.resource(e,t),t.targetPath,t.readOnly)}detach(e,t,r){return this.transport.detach(e.providerId,this.resource(e,t),r.force)}resize(e,t){return this.transport.resize(e.providerId,t)}snapshot(e,t){return this.transport.snapshot(e.providerId,t.name)}restore(e,t,r){if(!t.providerId)throw Error("Cloud snapshot provider identity is unavailable.");return this.transport.restore(e.providerId,t.providerId,r.name)}delete(e){return this.transport.delete(e.providerId)}usage(e){return this.transport.usage(e.providerId)}}var w=(e)=>e==null?void 0:String(e),Ae=(e,t)=>{try{return JSON.parse(String(e))}catch{return t}},ir=(e)=>Number(e)===1,se=(e)=>e().toISOString();function Sn(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:w(e.environment_id),resourceId:w(e.resource_id),name:String(e.name),provider:String(e.provider),providerId:w(e.provider_id),type:String(e.type),status:String(e.status),capacityBytes:e.capacity_bytes==null?void 0:Number(e.capacity_bytes),usedBytes:e.used_bytes==null?void 0:Number(e.used_bytes),filesystem:w(e.filesystem),encrypted:ir(e.encrypted),capabilities:Ae(e.capabilities,{}),desiredState:Ae(e.desired_state,{}),observedState:Ae(e.observed_state,{}),backupPolicyId:w(e.backup_policy_id),lastBackupAt:w(e.last_backup_at),orphanedAt:w(e.orphaned_at),adoptedAt:w(e.adopted_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at),deletedAt:w(e.deleted_at)}}function nr(e){return{id:String(e.id),volumeId:String(e.volume_id),resourceId:String(e.resource_id),targetPath:String(e.target_path),readOnly:ir(e.read_only),uid:e.uid==null?void 0:Number(e.uid),gid:e.gid==null?void 0:Number(e.gid),mode:w(e.mode),propagation:String(e.propagation),driverOptions:Ae(e.driver_options,{}),desiredState:String(e.desired_state),observedState:String(e.observed_state),operationId:w(e.operation_id),lastError:w(e.last_error),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function bn(e){return{id:String(e.id),volumeId:String(e.volume_id),recoveryPointId:w(e.recovery_point_id),providerId:w(e.provider_id),name:String(e.name),status:String(e.status),sizeBytes:e.size_bytes==null?void 0:Number(e.size_bytes),encrypted:ir(e.encrypted),checksum:w(e.checksum),metadata:Ae(e.metadata,{}),createdAt:String(e.created_at),updatedAt:String(e.updated_at),deletedAt:w(e.deleted_at)}}class st{controlPlane;now;id;constructor(e,t=()=>new Date,r=()=>crypto.randomUUID()){this.controlPlane=e;this.now=t;this.id=r}get(e){let t=this.controlPlane.database.query("SELECT * FROM persistent_volumes WHERE id=?").get(e);return t?Sn(t):void 0}list(e){let t=["project_id=?"],r=[e.projectId];if(e.environmentId)t.push("environment_id=?"),r.push(e.environmentId);if(!e.includeDeleted)t.push("deleted_at IS NULL");return this.controlPlane.database.query(`SELECT * FROM persistent_volumes WHERE ${t.join(" AND ")} ORDER BY name`).all(...r).map(Sn)}create(e){let t=se(this.now),r=e.id??this.id();return this.controlPlane.database.run("INSERT INTO persistent_volumes (id,organization_id,project_id,environment_id,resource_id,name,provider,provider_id,type,status,capacity_bytes,used_bytes,filesystem,encrypted,capabilities,desired_state,observed_state,backup_policy_id,last_backup_at,orphaned_at,adopted_at,created_at,updated_at,deleted_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[r,e.organizationId,e.projectId,e.environmentId??null,e.resourceId??null,e.name,e.provider,e.providerId??null,e.type,e.status,e.capacityBytes??null,e.usedBytes??null,e.filesystem??null,e.encrypted?1:0,JSON.stringify(e.capabilities),JSON.stringify(e.desiredState),JSON.stringify(e.observedState),e.backupPolicyId??null,e.lastBackupAt??null,e.orphanedAt??null,e.adoptedAt??null,t,t,e.deletedAt??null]),this.get(r)}update(e,t,r){let n=this.get(e);if(!n||n.version!==t)throw Error("Volume changed before this operation could be applied.");let i={...n,...r,updatedAt:se(this.now)};if(this.controlPlane.database.run("UPDATE persistent_volumes SET environment_id=?,resource_id=?,name=?,provider=?,provider_id=?,type=?,status=?,capacity_bytes=?,used_bytes=?,filesystem=?,encrypted=?,capabilities=?,desired_state=?,observed_state=?,backup_policy_id=?,last_backup_at=?,orphaned_at=?,adopted_at=?,deleted_at=?,version=version+1,updated_at=? WHERE id=? AND version=?",[i.environmentId??null,i.resourceId??null,i.name,i.provider,i.providerId??null,i.type,i.status,i.capacityBytes??null,i.usedBytes??null,i.filesystem??null,i.encrypted?1:0,JSON.stringify(i.capabilities),JSON.stringify(i.desiredState),JSON.stringify(i.observedState),i.backupPolicyId??null,i.lastBackupAt??null,i.orphanedAt??null,i.adoptedAt??null,i.deletedAt??null,i.updatedAt,e,t]).changes!==1)throw Error("Volume changed before this operation could be applied.");return this.get(e)}attachments(e){return this.controlPlane.database.query("SELECT * FROM volume_attachments WHERE volume_id=? ORDER BY target_path").all(e).map(nr)}attachment(e){let t=this.controlPlane.database.query("SELECT * FROM volume_attachments WHERE id=?").get(e);return t?nr(t):void 0}upsertAttachment(e){let t=this.controlPlane.database.query("SELECT * FROM volume_attachments WHERE volume_id=? AND resource_id=? AND target_path=?").get(e.volumeId,e.resourceId,e.targetPath),r=se(this.now);if(t){let i=nr(t);return this.controlPlane.database.run("UPDATE volume_attachments SET read_only=?,uid=?,gid=?,mode=?,propagation=?,driver_options=?,desired_state=?,observed_state=?,operation_id=?,last_error=?,version=version+1,updated_at=? WHERE id=?",[e.readOnly?1:0,e.uid??null,e.gid??null,e.mode??null,e.propagation,JSON.stringify(e.driverOptions),e.desiredState,e.observedState,e.operationId??null,e.lastError??null,r,i.id]),this.attachment(i.id)}let n=e.id??this.id();return this.controlPlane.database.run("INSERT INTO volume_attachments (id,volume_id,resource_id,target_path,read_only,uid,gid,mode,propagation,driver_options,desired_state,observed_state,operation_id,last_error,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[n,e.volumeId,e.resourceId,e.targetPath,e.readOnly?1:0,e.uid??null,e.gid??null,e.mode??null,e.propagation,JSON.stringify(e.driverOptions),e.desiredState,e.observedState,e.operationId??null,e.lastError??null,r,r]),this.attachment(n)}updateAttachment(e,t){let r=this.attachment(e);if(!r)throw Error("Volume attachment was not found.");let n={...r,...t};return this.controlPlane.database.run("UPDATE volume_attachments SET desired_state=?,observed_state=?,operation_id=?,last_error=?,version=version+1,updated_at=? WHERE id=?",[n.desiredState,n.observedState,n.operationId??null,n.lastError??null,se(this.now),e]),this.attachment(e)}snapshots(e){return this.controlPlane.database.query("SELECT * FROM volume_snapshots WHERE volume_id=? AND deleted_at IS NULL ORDER BY created_at DESC").all(e).map(bn)}snapshot(e){let t=this.controlPlane.database.query("SELECT * FROM volume_snapshots WHERE id=?").get(e);return t?bn(t):void 0}createSnapshot(e){let t=e.id??this.id(),r=se(this.now);return this.controlPlane.database.run("INSERT INTO volume_snapshots (id,volume_id,recovery_point_id,provider_id,name,status,size_bytes,encrypted,checksum,metadata,created_at,updated_at,deleted_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.volumeId,e.recoveryPointId??null,e.providerId??null,e.name,e.status,e.sizeBytes??null,e.encrypted?1:0,e.checksum??null,JSON.stringify(e.metadata),r,r,e.deletedAt??null]),this.snapshot(t)}updateSnapshot(e,t){let r=this.snapshot(e);if(!r)throw Error("Volume snapshot was not found.");let n={...r,...t};return this.controlPlane.database.run("UPDATE volume_snapshots SET recovery_point_id=?,provider_id=?,name=?,status=?,size_bytes=?,encrypted=?,checksum=?,metadata=?,deleted_at=?,updated_at=? WHERE id=?",[n.recoveryPointId??null,n.providerId??null,n.name,n.status,n.sizeBytes??null,n.encrypted?1:0,n.checksum??null,JSON.stringify(n.metadata),n.deletedAt??null,se(this.now),e]),this.snapshot(e)}inventory(e,t){return this.list({projectId:e,environmentId:t}).map((r)=>{let n=this.attachments(r.id),i=this.snapshots(r.id),o=r.lastBackupAt?Date.now()-new Date(r.lastBackupAt).getTime():1/0;return{...r,attachments:n,snapshots:i,orphaned:r.status==="orphaned",usagePercent:r.capacityBytes&&r.usedBytes!=null?Math.round(r.usedBytes/r.capacityBytes*1000)/10:void 0,backupState:r.backupPolicyId?o<=86400000?"protected":"stale":"unprotected"}})}audit(e){this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,resourceId:this.get(e.volumeId)?.resourceId,actorId:e.actorId,type:e.type,level:"warning",payload:{volumeId:e.volumeId,environmentId:e.environmentId??null,...e.payload}})}}function or(e,t){let r=e.getProject(t.projectId);if(!r?.organizationId)return;let n=new st(e),i=new rr,o=new Set(t.manifest.spec.volumes),s=new Set;for(let a of o){let d=`${t.slug}-${a}`.toLowerCase().replace(/[^a-z0-9_.-]/g,"-").slice(0,63),c=n.list({projectId:t.projectId,environmentId:t.environmentId,includeDeleted:!0}).find((m)=>m.name===d);if(c?.deletedAt)throw Error(`Compose volume ${d} was permanently deleted; rename it before redeploying.`);let p=c?.resourceId?e.getResource(c.resourceId):e.createResource({projectId:t.projectId,environmentId:t.environmentId,kind:"volume",slug:d,name:d,provider:"docker",providerId:d,desiredState:{composeApplicationId:t.id,composeVolume:a}}),l=c??n.create({organizationId:r.organizationId,projectId:t.projectId,environmentId:t.environmentId,resourceId:p?.id,name:d,provider:"docker",providerId:d,type:"docker",status:"available",encrypted:!1,capabilities:i.capabilities(),desiredState:{composeApplicationId:t.id,composeVolume:a,nativeName:d},observedState:{}});s.add(l.id);let u=new Map;for(let m of Object.values(t.manifest.spec.services))for(let E of m.volumes.filter((T)=>T.source===a)){let T=u.get(E.target)??[];T.push(m.name),u.set(E.target,T),n.upsertAttachment({volumeId:l.id,resourceId:t.resourceId,targetPath:E.target,readOnly:E.readOnly,propagation:"private",driverOptions:{composeServices:T},desiredState:"attached",observedState:"pending"})}}for(let a of n.list({projectId:t.projectId,environmentId:t.environmentId}).filter((d)=>d.desiredState.composeApplicationId===t.id&&!s.has(d.id)))for(let d of n.attachments(a.id))n.updateAttachment(d.id,{desiredState:"detached"})}function Rn(e,t,r){let n=new st(e);for(let i of n.list({projectId:t.projectId,environmentId:t.environmentId}).filter((o)=>o.desiredState.composeApplicationId===t.id)){for(let o of n.attachments(i.id))n.updateAttachment(o.id,{desiredState:"detached",observedState:"detached"});n.update(i.id,i.version,{status:r?"deleted":"available",deletedAt:r?new Date().toISOString():void 0})}}function ae(e){return typeof e==="string"&&e?e:void 0}function sr(e,t){try{return JSON.parse(String(e))}catch{return t}}function at(e){return{id:String(e.id),resourceId:String(e.resource_id),projectId:String(e.project_id),environmentId:String(e.environment_id),name:String(e.name),slug:String(e.slug),status:String(e.status),sourceKind:String(e.source_kind),sourceHash:String(e.source_hash),redactedSource:String(e.redacted_source),manifest:sr(e.manifest,{}),diagnostics:sr(e.diagnostics,[]),templateId:ae(e.template_id),templateVersion:ae(e.template_version),latestOperationId:ae(e.latest_operation_id),createdByActorId:ae(e.created_by_actor_id),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at),deletedAt:ae(e.deleted_at)}}function es(e){return{applicationId:String(e.application_id),serviceName:String(e.service_name),status:String(e.status),replicas:Number(e.replicas),healthyReplicas:Number(e.healthy_replicas),latestOperationId:ae(e.latest_operation_id),observedState:sr(e.observed_state,{}),updatedAt:String(e.updated_at)}}class ee{controlPlane;now;id;constructor(e,t={}){this.controlPlane=e;this.now=t.now??(()=>new Date),this.id=t.id??(()=>crypto.randomUUID())}persist(e,t){if(!e.valid)throw Error(`Compose definition contains ${e.diagnostics.filter((E)=>E.severity==="error").length} blocking diagnostic(s)`);let{projectId:r,environmentId:n,name:i,slug:o}=e.manifest.metadata;if(!this.controlPlane.listEnvironments(r).find((E)=>E.id===n))throw Error("Compose project and environment scope was not found");let a=this.getBySlug(r,n,o),d=this.now().toISOString(),c=JSON.stringify(e.manifest),p=JSON.stringify(I(e.diagnostics));if(a){if(a.status==="deleted")throw Error("A deleted Compose application cannot be overwritten; choose another slug");let E=this.controlPlane.getResource(a.resourceId);if(!E)throw Error("Compose application resource was not found");this.controlPlane.updateResource(E.id,E.version,{name:i,provider:E.provider,providerId:E.providerId,desiredState:e.manifest,discoveredState:E.discoveredState,metadata:{sourceKind:t.sourceKind,templateId:t.templateId??null,templateVersion:t.templateVersion??null,sourceHash:e.sourceHash}}),this.controlPlane.database.run("UPDATE compose_applications SET name=?, status='ready', source_kind=?, source_hash=?, redacted_source=?, manifest=?, diagnostics=?, template_id=?, template_version=?, version=version+1, updated_at=? WHERE id=?",[i,t.sourceKind,e.sourceHash,e.redactedSource,c,p,t.templateId??null,t.templateVersion??null,d,a.id]);let T=Object.keys(e.manifest.spec.services);if(T.length)this.controlPlane.database.run(`DELETE FROM compose_service_states WHERE application_id=? AND service_name NOT IN (${T.map(()=>"?").join(",")})`,[a.id,...T]);for(let h of Object.values(e.manifest.spec.services))this.controlPlane.database.run("INSERT INTO compose_service_states (application_id, service_name, status, replicas, healthy_replicas, observed_state, updated_at) VALUES (?, ?, 'pending', ?, 0, '{}', ?) ON CONFLICT(application_id, service_name) DO UPDATE SET replicas=excluded.replicas, updated_at=excluded.updated_at",[a.id,h.name,h.replicas,d]);this.controlPlane.appendEvent({projectId:r,resourceId:a.resourceId,actorId:t.createdByActorId,type:"compose.application.updated",payload:{applicationId:a.id,sourceHash:e.sourceHash,diagnosticCount:e.diagnostics.length,templateId:t.templateId??null,templateVersion:t.templateVersion??null}});let _=this.get(a.id);return or(this.controlPlane,_),_}let l=this.controlPlane.createResource({projectId:r,environmentId:n,kind:"compose_application",slug:o,name:i,desiredState:e.manifest,metadata:{sourceKind:t.sourceKind,templateId:t.templateId??null,templateVersion:t.templateVersion??null,sourceHash:e.sourceHash}}),u=this.id();this.controlPlane.database.run("INSERT INTO compose_applications (id, resource_id, project_id, environment_id, name, slug, status, source_kind, source_hash, redacted_source, manifest, diagnostics, template_id, template_version, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, 'ready', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[u,l.id,r,n,i,o,t.sourceKind,e.sourceHash,e.redactedSource,c,p,t.templateId??null,t.templateVersion??null,t.createdByActorId??null,d,d]);for(let E of Object.values(e.manifest.spec.services))this.controlPlane.database.run("INSERT INTO compose_service_states (application_id, service_name, status, replicas, healthy_replicas, observed_state, updated_at) VALUES (?, ?, 'pending', ?, 0, '{}', ?)",[u,E.name,E.replicas,d]);this.controlPlane.appendEvent({projectId:r,resourceId:l.id,actorId:t.createdByActorId,type:"compose.application.created",payload:{applicationId:u,sourceHash:e.sourceHash,serviceNames:Object.keys(e.manifest.spec.services),templateId:t.templateId??null}});let m=this.get(u);return or(this.controlPlane,m),m}import(e,t){let r=ie(e,t);return{application:this.persist(r,{sourceKind:"compose",createdByActorId:t.createdByActorId}),parsed:r}}fromTemplate(e,t,r){let n=Zt(e,t,r,r.version);return{application:this.persist(n,{sourceKind:"template",templateId:e,templateVersion:r.version??"1.0.0",createdByActorId:r.createdByActorId}),parsed:n}}preview(e,t){return ie(e,t)}get(e){let t=this.controlPlane.database.query("SELECT * FROM compose_applications WHERE id=?").get(e);return t?at(t):void 0}getByResource(e){let t=this.controlPlane.database.query("SELECT * FROM compose_applications WHERE resource_id=?").get(e);return t?at(t):void 0}getBySlug(e,t,r){let n=this.controlPlane.database.query("SELECT * FROM compose_applications WHERE project_id=? AND environment_id=? AND slug=?").get(e,t,r);return n?at(n):void 0}list(e={}){return this.controlPlane.database.query("SELECT * FROM compose_applications ORDER BY updated_at DESC").all().map(at).filter((t)=>(!e.projectId||t.projectId===e.projectId)&&(!e.environmentId||t.environmentId===e.environmentId)&&(e.includeDeleted||t.status!=="deleted"))}services(e){return this.controlPlane.database.query("SELECT * FROM compose_service_states WHERE application_id=? ORDER BY service_name").all(e).map(es)}transition(e,t,r={}){let n=this.get(e);if(!n)throw Error(`Compose application ${e} was not found`);let i=this.now().toISOString(),o=t==="deleted"?i:null;this.controlPlane.database.run("UPDATE compose_applications SET status=?, latest_operation_id=COALESCE(?, latest_operation_id), version=version+1, updated_at=?, deleted_at=? WHERE id=?",[t,r.operationId??null,i,o,e]);for(let s of r.services??[])if(n.manifest.spec.services[s.name])this.controlPlane.database.run("INSERT INTO compose_service_states (application_id, service_name, status, replicas, healthy_replicas, latest_operation_id, observed_state, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(application_id, service_name) DO UPDATE SET status=excluded.status, replicas=excluded.replicas, healthy_replicas=excluded.healthy_replicas, latest_operation_id=excluded.latest_operation_id, observed_state=excluded.observed_state, updated_at=excluded.updated_at",[e,s.name,s.status,s.replicas??n.manifest.spec.services[s.name].replicas,s.healthyReplicas??0,r.operationId??null,JSON.stringify(I(s.observedState??{})),i]);return this.controlPlane.appendEvent({projectId:n.projectId,resourceId:n.resourceId,operationId:r.operationId,type:`compose.application.${t}`,level:t==="failed"||t==="degraded"?"error":"info",payload:{applicationId:e,error:r.error??null}}),this.get(e)}}class ts{controlPlane;applications;queue;constructor(e){this.controlPlane=e;this.applications=new ee(e),this.queue=new H(e)}enqueue(e,t,r={}){if(e.status==="deleted")throw Error("Deleted Compose applications cannot be operated");if(r.service&&!e.manifest.spec.services[r.service])throw Error(`Compose service ${r.service} was not found`);if(t==="delete"){let i=r.removeVolumes?`${e.slug} delete volumes`:e.slug;if(r.confirmation!==i)throw Error(`Type ${i} to confirm ${r.removeVolumes?"persistent data removal":"stack deletion"}`)}if(t==="scale"&&(!r.service||!Number.isInteger(r.replicas)||r.replicas<0||r.replicas>100))throw Error("Scale requires a service and 0-100 replicas");let n=this.queue.enqueue({projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:r.actorId,kind:`compose.${t}`,idempotencyKey:`compose:${e.id}:${t}:${r.service??"stack"}:${r.replicas??""}:${e.version}`,correlationId:`compose:${e.id}`,input:{applicationId:e.id,service:r.service??null,replicas:r.replicas??null,removeVolumes:!!r.removeVolumes},lockKey:`compose:${e.id}`,providerKey:this.controlPlane.getResource(e.resourceId)?.provider??"default",buildSlot:t==="deploy"||t==="redeploy",maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return this.applications.transition(e.id,t==="delete"?"deleting":t==="stop"?"stopped":t==="start"?"deploying":t==="scale"?e.status:"deploying",{operationId:n.id}),n}}import{createHash as rs}from"node:crypto";var ns=/^[a-f0-9]{40,64}$/i,is=/^[A-Z][A-Z0-9_]{1,127}$/;function z(e){return typeof e==="string"&&e?e:void 0}function de(e){try{return JSON.parse(String(e))}catch{return{}}}function os(e){let t=de(e);return Array.isArray(t)?t.map(String):[]}function ar(e){return{id:String(e.id),projectId:String(e.project_id),resourceId:String(e.resource_id),baseEnvironmentId:String(e.base_environment_id),enabled:Number(e.enabled)===1,branchRule:z(e.branch_rule),domainPattern:String(e.domain_pattern),ttlHours:Number(e.ttl_hours),keepCount:Number(e.keep_count),publicAccess:Number(e.public_access)===1,authenticationRequired:Number(e.authentication_required)===1,allowForks:Number(e.allow_forks)===1,inheritedSecrets:os(e.inherited_secrets),resourceOverrides:de(e.resource_overrides),databaseStrategy:String(e.database_strategy),maxMonthlyCost:Number(e.max_monthly_cost),maxCpu:Number(e.max_cpu),maxMemoryMb:Number(e.max_memory_mb),cleanupOnClose:Number(e.cleanup_on_close)===1,version:Number(e.version),createdByActorId:z(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Oe(e){return{id:String(e.id),definitionId:String(e.definition_id),projectId:String(e.project_id),resourceId:String(e.resource_id),baseEnvironmentId:String(e.base_environment_id),identityKey:String(e.identity_key),sourceProvider:z(e.source_provider),repository:z(e.repository),branch:String(e.branch),pullRequestNumber:e.pull_request_number==null?void 0:Number(e.pull_request_number),fork:Number(e.fork)===1,commitSha:String(e.commit_sha),name:String(e.name),stackName:String(e.stack_name),url:z(e.url),status:String(e.status),expiresAt:String(e.expires_at),latestOperationId:z(e.latest_operation_id),createdByActorId:z(e.created_by_actor_id),costEstimate:e.cost_estimate==null?void 0:Number(e.cost_estimate),desiredState:de(e.desired_state),observedState:de(e.observed_state),teardownError:z(e.teardown_error),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at),destroyedAt:z(e.destroyed_at)}}function Cn(e){return{id:String(e.id),previewId:String(e.preview_id),provider:String(e.provider),providerResourceId:String(e.provider_resource_id),kind:String(e.kind),tags:de(e.tags),observedState:de(e.observed_state),discoveredAt:String(e.discovered_at),deletedAt:z(e.deleted_at)}}function V(e,t,r,n){return Number.isFinite(e)?Math.min(n,Math.max(r,Math.floor(e))):t}function dt(e,t,r,n){return Number.isFinite(e)?Math.min(n,Math.max(r,e)):t}function dr(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,28)||"preview"}class ce{controlPlane;now;id;constructor(e,t={}){this.controlPlane=e;this.now=t.now??(()=>new Date),this.id=t.id??(()=>crypto.randomUUID())}createDefinition(e){let t=this.controlPlane.getResource(e.resourceId),r=this.controlPlane.listEnvironments(e.projectId).find((c)=>c.id===e.baseEnvironmentId);if(!t||t.projectId!==e.projectId||t.environmentId!==r?.id)throw Error("Preview resource and base environment must belong to the same project scope");if(t.kind!=="application")throw Error("Preview environments currently support application resources only");if(!/^https:\/\//.test(e.domainPattern)||!e.domainPattern.includes("{name}"))throw Error("Preview domainPattern must be HTTPS and include {name}");let n=this.getDefinitionForResource(e.resourceId),i=e.publicAccess??n?.publicAccess??!1,o=e.authenticationRequired??n?.authenticationRequired??!0;if(i&&!o)throw Error("Public preview environments require an authentication policy");let s=[...new Set(e.inheritedSecrets??[])];if(s.some((c)=>!is.test(c)))throw Error("Inherited preview secret names must use uppercase environment-variable identifiers");let a=this.now().toISOString();if(n)return this.controlPlane.database.run("UPDATE preview_definitions SET base_environment_id=?, enabled=1, branch_rule=?, domain_pattern=?, ttl_hours=?, keep_count=?, public_access=?, authentication_required=?, allow_forks=?, inherited_secrets=?, resource_overrides=?, database_strategy=?, max_monthly_cost=?, max_cpu=?, max_memory_mb=?, cleanup_on_close=?, version=version+1, updated_at=? WHERE id=?",[e.baseEnvironmentId,e.branchRule??null,e.domainPattern,V(e.ttlHours,n.ttlHours,1,720),V(e.keepCount,n.keepCount,1,100),i?1:0,o?1:0,e.allowForks??n.allowForks?1:0,JSON.stringify(e.inheritedSecrets===void 0?n.inheritedSecrets:s),JSON.stringify(I(e.resourceOverrides??n.resourceOverrides)),e.databaseStrategy??n.databaseStrategy,dt(e.maxMonthlyCost,n.maxMonthlyCost,0,1e4),dt(e.maxCpu,n.maxCpu,0.1,64),V(e.maxMemoryMb,n.maxMemoryMb,128,131072),e.cleanupOnClose??n.cleanupOnClose?1:0,a,n.id]),this.controlPlane.appendEvent({projectId:e.projectId,resourceId:e.resourceId,actorId:e.createdByActorId,type:"preview.definition.updated",payload:{definitionId:n.id,baseEnvironmentId:e.baseEnvironmentId,version:n.version+1}}),this.getDefinition(n.id);let d=this.id();return this.controlPlane.database.run("INSERT INTO preview_definitions (id, project_id, resource_id, base_environment_id, enabled, branch_rule, domain_pattern, ttl_hours, keep_count, public_access, authentication_required, allow_forks, inherited_secrets, resource_overrides, database_strategy, max_monthly_cost, max_cpu, max_memory_mb, cleanup_on_close, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[d,e.projectId,e.resourceId,e.baseEnvironmentId,e.branchRule??null,e.domainPattern,V(e.ttlHours,24,1,720),V(e.keepCount,10,1,100),e.publicAccess?1:0,e.authenticationRequired===!1?0:1,e.allowForks?1:0,JSON.stringify(s),JSON.stringify(I(e.resourceOverrides??{})),e.databaseStrategy??"disabled",dt(e.maxMonthlyCost,25,0,1e4),dt(e.maxCpu,1,0.1,64),V(e.maxMemoryMb,1024,128,131072),e.cleanupOnClose===!1?0:1,e.createdByActorId??null,a,a]),this.controlPlane.appendEvent({projectId:e.projectId,resourceId:e.resourceId,actorId:e.createdByActorId,type:"preview.definition.created",payload:{definitionId:d,baseEnvironmentId:e.baseEnvironmentId,ttlHours:V(e.ttlHours,24,1,720),inheritedSecretNames:s}}),this.getDefinition(d)}getDefinition(e){let t=this.controlPlane.database.query("SELECT * FROM preview_definitions WHERE id=?").get(e);return t?ar(t):void 0}getDefinitionForResource(e){let t=this.controlPlane.database.query("SELECT * FROM preview_definitions WHERE resource_id=?").get(e);return t?ar(t):void 0}listDefinitions(e){return this.controlPlane.database.query("SELECT * FROM preview_definitions WHERE project_id=? ORDER BY updated_at DESC").all(e).map(ar)}listInstances(e={}){return this.controlPlane.database.query("SELECT * FROM preview_instances ORDER BY created_at DESC").all().map(Oe).filter((r)=>(!e.projectId||r.projectId===e.projectId)&&(!e.definitionId||r.definitionId===e.definitionId)&&(!e.status||r.status===e.status))}getInstance(e){let t=this.controlPlane.database.query("SELECT * FROM preview_instances WHERE id=?").get(e);return t?Oe(t):void 0}findForPullRequest(e,t,r){let n=this.controlPlane.database.query("SELECT * FROM preview_instances WHERE definition_id=? AND identity_key=?").get(e,`pr:${t}:${r}`);return n?Oe(n):void 0}findForBranch(e,t,r){let n=this.controlPlane.database.query("SELECT * FROM preview_instances WHERE definition_id=? AND identity_key=?").get(e,`branch:${t}:${r}`);return n?Oe(n):void 0}upsert(e){let t=this.getDefinition(e.definitionId);if(!t?.enabled)throw Error("Preview environments are not enabled for this application");if(!ns.test(e.commitSha))throw Error("Preview deployment requires an immutable 40-64 character commit SHA");if(e.fork&&!t.allowForks)throw Error("Untrusted fork previews are disabled");let r=e.pullRequestNumber?`pr:${e.repository??"unknown"}:${e.pullRequestNumber}`:`branch:${e.repository??"local"}:${e.branch}`,n=rs("sha256").update(`${t.id}:${r}`).digest("hex").slice(0,8),o=`${(e.pullRequestNumber?`pr-${e.pullRequestNumber}`:dr(e.branch)).slice(0,28)}-${n}`,s=`preview-${o}`.slice(0,63),a=t.domainPattern.replaceAll("{name}",o).replaceAll("{project}",dr(t.projectId)).replaceAll("{branch}",dr(e.branch)).replaceAll("{pr}",String(e.pullRequestNumber??"branch")),d=e.now??this.now(),c=d.toISOString(),p=new Date(d.getTime()+t.ttlHours*60*60*1000).toISOString(),l=this.controlPlane.database.query("SELECT * FROM preview_instances WHERE definition_id=? AND identity_key=?").get(t.id,r);if(l){let E=Oe(l),T=E.commitSha!==e.commitSha||E.status==="destroyed";if(T)this.controlPlane.database.run("UPDATE preview_instances SET commit_sha=?, branch=?, fork=?, status='queued', expires_at=?, url=?, teardown_error=NULL, destroyed_at=NULL, version=version+1, updated_at=? WHERE id=?",[e.commitSha,e.branch,e.fork?1:0,p,a,c,E.id]);return{preview:this.getInstance(E.id),created:!1,changed:T,inheritedSecrets:e.fork?[]:t.inheritedSecrets}}let u=this.id(),m=I({source:{provider:e.sourceProvider??null,repository:e.repository??null,branch:e.branch,commitSha:e.commitSha,pullRequestNumber:e.pullRequestNumber??null,fork:!!e.fork},policy:{databaseStrategy:t.databaseStrategy,resourceOverrides:t.resourceOverrides,maxMonthlyCost:t.maxMonthlyCost,maxCpu:t.maxCpu,maxMemoryMb:t.maxMemoryMb,publicAccess:t.publicAccess,authenticationRequired:t.authenticationRequired},inheritedSecretNames:e.fork?[]:t.inheritedSecrets});return this.controlPlane.database.run("INSERT INTO preview_instances (id, definition_id, project_id, resource_id, base_environment_id, identity_key, source_provider, repository, branch, pull_request_number, fork, commit_sha, name, stack_name, url, status, expires_at, created_by_actor_id, desired_state, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?, ?, ?, ?)",[u,t.id,t.projectId,t.resourceId,t.baseEnvironmentId,r,e.sourceProvider??null,e.repository??null,e.branch,e.pullRequestNumber??null,e.fork?1:0,e.commitSha,o,s,a,p,e.createdByActorId??null,JSON.stringify(m),c,c]),this.controlPlane.appendEvent({projectId:t.projectId,resourceId:t.resourceId,actorId:e.createdByActorId,type:"preview.created",payload:{previewId:u,identityKey:r,commitSha:e.commitSha,expiresAt:p,fork:!!e.fork}}),{preview:this.getInstance(u),created:!0,changed:!0,inheritedSecrets:e.fork?[]:t.inheritedSecrets}}transition(e,t,r={}){let n=this.getInstance(e);if(!n)throw Error(`Preview ${e} was not found`);let i=this.now().toISOString(),o=t==="destroyed"?i:null;return this.controlPlane.database.run("UPDATE preview_instances SET status=?, latest_operation_id=COALESCE(?, latest_operation_id), observed_state=?, teardown_error=?, cost_estimate=COALESCE(?, cost_estimate), destroyed_at=?, version=version+1, updated_at=? WHERE id=?",[t,r.operationId??null,JSON.stringify(I(r.observedState??n.observedState)),r.teardownError??null,r.costEstimate??null,o,i,e]),this.controlPlane.appendEvent({projectId:n.projectId,resourceId:n.resourceId,operationId:r.operationId,type:`preview.${t}`,level:t==="failed"||t==="cleanup_failed"?"error":"info",payload:{previewId:e,commitSha:n.commitSha,teardownError:r.teardownError??null}}),this.getInstance(e)}extend(e,t){let r=this.getInstance(e),n=r?this.getDefinition(r.definitionId):void 0;if(!r||!n)throw Error(`Preview ${e} was not found`);let i=this.now(),o=V(t,n.ttlHours,1,720),s=new Date(Math.max(i.getTime(),new Date(r.expiresAt).getTime())+o*3600000).toISOString();return this.controlPlane.database.run("UPDATE preview_instances SET expires_at=?, version=version+1, updated_at=? WHERE id=?",[s,i.toISOString(),e]),this.getInstance(e)}expired(e=this.now()){return this.listInstances().filter((t)=>["queued","deploying","active","updating","failed","cleanup_failed"].includes(t.status)&&new Date(t.expiresAt)<=e)}recordResource(e){let t=this.getInstance(e.previewId);if(!t)throw Error(`Preview ${e.previewId} was not found`);let r={"ts-cloud:preview":t.id,"ts-cloud:project":t.projectId,"ts-cloud:expires-at":t.expiresAt};for(let[s,a]of Object.entries(r))if(e.tags[s]!==a)throw Error(`Preview resource is missing immutable tag ${s}`);let n=this.id(),i=this.now().toISOString();this.controlPlane.database.run("INSERT INTO preview_resources (id, preview_id, provider, provider_resource_id, kind, tags, observed_state, discovered_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(preview_id, provider, provider_resource_id) DO UPDATE SET kind=excluded.kind, tags=excluded.tags, observed_state=excluded.observed_state, deleted_at=NULL",[n,t.id,e.provider,e.providerResourceId,e.kind,JSON.stringify(e.tags),JSON.stringify(I(e.observedState??{})),i]);let o=this.controlPlane.database.query("SELECT * FROM preview_resources WHERE preview_id=? AND provider=? AND provider_resource_id=?").get(t.id,e.provider,e.providerResourceId);return Cn(o)}listResources(e){return this.controlPlane.database.query("SELECT * FROM preview_resources WHERE preview_id=? ORDER BY kind, provider_resource_id").all(e).map(Cn)}markResourcesDeleted(e){if(!this.getInstance(e))throw Error(`Preview ${e} was not found`);return this.controlPlane.database.run("UPDATE preview_resources SET deleted_at=? WHERE preview_id=? AND deleted_at IS NULL",[this.now().toISOString(),e]).changes}}class ss{controlPlane;previews;queue;constructor(e){this.controlPlane=e;this.previews=new ce(e),this.queue=new H(e)}enqueueDeploy(e,t={}){let r=t.created?"preview.create":"preview.update",n=t.reason==="manual_rebuild"?`:${crypto.randomUUID()}`:"",i=this.queue.enqueue({projectId:e.projectId,environmentId:e.baseEnvironmentId,resourceId:e.resourceId,actorId:t.actorId,kind:r,correlationId:`preview:${e.id}`,idempotencyKey:`preview:${e.id}:${e.commitSha}${n}`,input:{previewId:e.id,reason:t.reason??(t.created?"create":"commit_update"),source:{repository:e.repository??null,branch:e.branch,commitSha:e.commitSha,pullRequestNumber:e.pullRequestNumber??null,fork:e.fork}},lockKey:`preview:${e.id}`,providerKey:"preview",buildSlot:!0,maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return this.previews.transition(e.id,"queued",{operationId:i.id}),i}enqueueDestroy(e,t,r){if(e.status==="destroyed")throw Error("Preview is already destroyed");let n=this.queue.enqueue({projectId:e.projectId,environmentId:e.baseEnvironmentId,resourceId:e.resourceId,actorId:r,kind:"preview.destroy",correlationId:`preview:${e.id}`,idempotencyKey:`preview:${e.id}:destroy:${t}`,input:{previewId:e.id,reason:t},lockKey:`preview:${e.id}`,providerKey:"preview",maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return this.previews.transition(e.id,"queued",{operationId:n.id}),n}cleanup(e={}){let t=e.now??new Date,r=new Map,n=this.previews.listInstances().filter((d)=>!["destroyed","destroying"].includes(d.status)),i=(d,c)=>{let p=r.get(d.id)??{preview:d,reasons:[]};if(!p.reasons.includes(c))p.reasons.push(c);r.set(d.id,p)};for(let d of n){if(new Date(d.expiresAt)<=t)i(d,"ttl_expired");if(e.maxAgeHours&&t.getTime()-new Date(d.createdAt).getTime()>=e.maxAgeHours*3600000)i(d,"max_age")}let o=new Map;for(let d of n)o.set(d.definitionId,[...o.get(d.definitionId)??[],d]);for(let[d,c]of o){let p=this.previews.getDefinition(d),l=e.keepCount??p?.keepCount;if(!l)continue;c.sort((u,m)=>m.createdAt.localeCompare(u.createdAt)).slice(l).forEach((u)=>i(u,"keep_count"))}let s=[...r.values()].sort((d,c)=>d.preview.createdAt.localeCompare(c.preview.createdAt)),a=e.dryRun?[]:s.map((d)=>this.enqueueDestroy(d.preview,d.reasons.sort().join("+"),e.actorId));if(s.length)this.controlPlane.appendEvent({actorId:e.actorId,type:e.dryRun?"preview.cleanup.planned":"preview.cleanup.queued",payload:{previewIds:s.map((d)=>d.preview.id),reasons:Object.fromEntries(s.map((d)=>[d.preview.id,d.reasons])),dryRun:!!e.dryRun}});return{candidates:s,operations:a,dryRun:!!e.dryRun}}reconcile(e){let t=[],r=[],n=[];for(let i of e){let o=i.tags["ts-cloud:preview"],s=i.tags["ts-cloud:project"],a=i.tags["ts-cloud:expires-at"];if(!o||!s||!a){n.push(i.providerResourceId);continue}let d=this.previews.getInstance(o);if(!d||d.projectId!==s||d.expiresAt!==a){r.push(i.providerResourceId);continue}if(this.previews.recordResource({...i,previewId:d.id}),i.estimatedMonthlyCost!==void 0)this.previews.transition(d.id,d.status,{costEstimate:i.estimatedMonthlyCost,observedState:{...d.observedState,lastReconciledAt:new Date().toISOString()}});t.push(i.providerResourceId)}if(r.length)this.controlPlane.appendEvent({type:"preview.reconciliation.leaks",level:"error",payload:{providerResourceIds:r}});return{matched:t,unknownPreviewResources:r,ignoredUntagged:n}}}var as=["deployment.create","deployment.rollback","application.create","deploy.source","deploy.preview","preview.create","preview.update","preview.destroy","compose.deploy","compose.redeploy","compose.start","compose.stop","compose.delete","compose.scale"];function ct(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function ds(e,t){if(!t.projectId||!t.environmentId)throw Error(`Queued ${t.kind} operation is missing its project or environment scope`);let r=e.listEnvironments(t.projectId).find((s)=>s.id===t.environmentId);if(!r)throw Error(`Environment ${t.environmentId} was not found for queued ${t.kind} operation`);let n=t.resourceId?e.getResource(t.resourceId):void 0;if(t.resourceId&&(!n||n.projectId!==t.projectId||n.environmentId!==t.environmentId))throw Error(`Resource ${t.resourceId} was not found in the queued deployment scope`);let i=ct(t.input);if(t.kind.startsWith("compose.")){let s=typeof i.applicationId==="string"?i.applicationId:void 0,a=s?new ee(e).get(s):t.resourceId?new ee(e).getByResource(t.resourceId):void 0;if(!a||a.projectId!==t.projectId||a.environmentId!==t.environmentId||a.resourceId!==t.resourceId)throw Error("Queued Compose application does not match the operation scope");let d=t.kind.slice(8),c=["compose:apply",a.id,"--action",d,"--env",r.slug];if(typeof i.service==="string"&&i.service)c.push("--service",i.service);if(typeof i.replicas==="number")c.push("--replicas",String(i.replicas));if(i.removeVolumes===!0)c.push("--remove-volumes");return{id:`queue:${t.id}`,label:`${d[0].toUpperCase()}${d.slice(1)} Compose application`,description:`${d} ${a.name}.`,command:c,mutates:!0,target:{environment:r.slug,resource:n?.slug,composeId:a.id}}}if(t.kind.startsWith("preview.")){let s=typeof i.previewId==="string"?i.previewId:void 0,a=s?new ce(e).getInstance(s):void 0;if(!a)throw Error(`Preview ${s??"(missing)"} was not found for queued ${t.kind}`);if(a.projectId!==t.projectId||a.resourceId!==t.resourceId)throw Error("Queued preview does not match the operation scope");if(t.kind==="preview.destroy")return{id:`queue:${t.id}`,label:"Destroy preview",description:`Destroy ${a.name}.`,command:["stack:delete",a.stackName,"--yes"],mutates:!0,target:{environment:r.slug,resource:n?.slug,previewId:a.id}};return{id:`queue:${t.id}`,label:t.kind==="preview.create"?"Create preview":"Update preview",description:`Deploy ${a.name} at ${a.commitSha}.`,command:["deploy","--stack",a.stackName,"--env",r.slug,"--yes","--skip-dns-verification",...n?["--site",n.slug]:[]],mutates:!0,target:{environment:r.slug,resource:n?.slug,previewId:a.id}}}if(t.kind==="deployment.rollback"){let s=["deploy:rollback"];if(n)s.push(n.slug);if(s.push("--env",r.slug),typeof i.revision==="string"&&i.revision)s.push("--to",i.revision);return{id:`queue:${t.id}`,label:"Rollback deployment",description:`Roll back ${n?.slug??r.slug}.`,command:s,mutates:!0,target:{environment:r.slug,resource:n?.slug}}}let o=["deploy","--env",r.slug,"--yes"];if(n)o.push("--site",n.slug);return{id:`queue:${t.id}`,label:t.kind==="deploy.preview"?"Deploy preview":"Deploy release",description:`Deploy ${n?.slug??r.slug}.`,command:o,mutates:!0,target:{environment:r.slug,resource:n?.slug}}}function cs(e){let t=e.stderr?.trim()||`Deployment process exited with code ${e.exitCode}`;if(/\b(?:429|rate.?limit|throttl)/i.test(t))return new J(t,"provider_throttled");if(/\b(?:502|503|504|temporar(?:y|ily)|unavailable|provider.?error)/i.test(t))return new J(t,"provider_unavailable");if(/\b(?:network|econn|enotfound|socket|timed?\s*out|fetch failed|dns)\b/i.test(t))return new J(t,"network");return Error(t)}function bc(e){let t=async(r)=>{r.checkpoint("prepare","Resolving the persisted deployment target.");let n=ds(e.store,r.operation),i=n.target.previewId?new ce(e.store):void 0,o=n.target.composeId?new ee(e.store):void 0;if(i&&n.target.previewId)i.transition(n.target.previewId,r.operation.kind==="preview.destroy"?"destroying":r.operation.kind==="preview.update"?"updating":"deploying",{operationId:r.operation.id});if(o&&n.target.composeId)o.transition(n.target.composeId,r.operation.kind==="compose.delete"?"deleting":r.operation.kind==="compose.stop"?"stopped":"deploying",{operationId:r.operation.id});r.log(`Target: ${n.target.resource??"all resources"} in ${n.target.environment}.`,{stream:"system"}),r.throwIfCancellationRequested(),r.checkpoint("execute",`Running cloud ${n.command.join(" ")}.`);let s=await e.execute(n,r);if(!s.ok){if(i&&n.target.previewId)i.transition(n.target.previewId,r.operation.kind==="preview.destroy"?"cleanup_failed":"failed",{operationId:r.operation.id,teardownError:r.operation.kind==="preview.destroy"?s.stderr?.trim()||`Process exited with ${s.exitCode}`:void 0});if(o&&n.target.composeId)o.transition(n.target.composeId,r.operation.kind==="compose.delete"?"degraded":"failed",{operationId:r.operation.id,error:s.stderr?.trim()||`Process exited with ${s.exitCode}`});throw cs(s)}if(r.throwIfCancellationRequested(),i&&n.target.previewId){let a=i.getInstance(n.target.previewId);if(r.operation.kind==="preview.destroy")i.markResourcesDeleted(a.id),i.transition(a.id,"destroyed",{operationId:r.operation.id,observedState:{reconciledResourceIds:i.listResources(a.id).map((d)=>d.providerResourceId),exactCommitSha:a.commitSha}});else{let d=e.store.getResource(a.resourceId)?.provider??"default";i.recordResource({previewId:a.id,provider:d,providerResourceId:a.stackName,kind:"stack",tags:{"ts-cloud:preview":a.id,"ts-cloud:project":a.projectId,"ts-cloud:expires-at":a.expiresAt},observedState:{command:s.command??null,exactCommitSha:a.commitSha}}),i.transition(a.id,"active",{operationId:r.operation.id,observedState:{url:a.url??null,stackName:a.stackName,exactCommitSha:a.commitSha,providerStatus:"deployed"}})}}if(o&&n.target.composeId){let a=o.get(n.target.composeId),d=typeof ct(r.operation.input).service==="string"?String(ct(r.operation.input).service):void 0,c=r.operation.kind==="compose.delete"?"deleted":r.operation.kind==="compose.stop"?"stopped":"running",p=o.transition(a.id,c,{operationId:r.operation.id,services:Object.values(a.manifest.spec.services).filter((l)=>!d||l.name===d).map((l)=>({name:l.name,status:c==="stopped"||c==="deleted"?"stopped":"running",replicas:c==="deleted"?0:l.replicas,healthyReplicas:c==="running"?l.replicas:0,observedState:{command:s.command??null,healthGatePassed:c==="running"}}))});if(c==="deleted")Rn(e.store,p,ct(r.operation.input).removeVolumes===!0)}return r.checkpoint("finalize","Deployment command completed; persisting the terminal result."),{command:s.command??`cloud ${n.command.join(" ")}`,exitCode:s.exitCode,environment:n.target.environment,resource:n.target.resource??null}};return Object.fromEntries(as.map((r)=>[r,t]))}class L extends Error{code;status;details;constructor(e,t,r,n){super(t);this.code=e;this.status=r;this.details=n}}function cr(e,t){if(e.organizationId!==t.organizationId)return!1;if(e.projectId&&e.projectId!==t.projectId)return!1;if(e.environmentId&&e.environmentId!==t.environmentId)return!1;if(e.resourceId&&e.resourceId!==t.resourceId)return!1;return!0}function us(e,t,r){return ls("sha256").update(`${e.toUpperCase()}
1616
1616
  ${t}
1617
- ${JSON.stringify(r)}`).digest("hex")}class ps{controlPlane;identities;queue;spendGate;constructor(e,t){this.controlPlane=e;this.identities=t;this.queue=new H(e),this.spendGate=new Ne(e)}target(e,t){let r=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,t),n=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,e.token.scope);if(!r||!n||!cr(n,r))throw new L("forbidden","The token does not grant access to this resource.",403);return r}authorize(e,t,r){if(!e.token.capabilities.includes(t))throw new L("forbidden",`The token is missing the ${t} capability.`,403);let n=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,r),i=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,e.token.scope),o=t==="project:read"&&!!n&&!!i&&cr(n,i);if(!n||!i||!cr(i,n)&&!o)throw new L("forbidden","The token does not grant access to this resource.",403);let s=o?i:n;if(!ke({membership:e.membership,grants:this.controlPlane.listGrants(e.membership.id),capability:t,target:s}).allowed)throw new L("forbidden","The service account does not have access to this resource.",403);return n}listProjects(e){return this.controlPlane.listProjects().filter((t)=>t.organizationId===e.serviceAccount.organizationId).filter((t)=>{try{return this.authorize(e,"project:read",{type:"project",id:t.id}),!0}catch{return!1}}).map((t)=>({id:t.id,slug:t.slug,name:t.name,description:t.description,version:t.version,createdAt:t.createdAt,updatedAt:t.updatedAt}))}listEnvironments(e,t){let r=this.controlPlane.getProject(t);if(!r||r.organizationId!==e.serviceAccount.organizationId)throw new L("not_found","Project was not found.",404);return this.controlPlane.listEnvironments(t).filter((n)=>{try{return this.authorize(e,"project:read",{type:"environment",id:n.id}),!0}catch{return!1}}).map((n)=>({id:n.id,projectId:n.projectId,slug:n.slug,name:n.name,kind:n.kind,region:n.region,version:n.version,createdAt:n.createdAt,updatedAt:n.updatedAt}))}listServices(e,t,r){let n=new Set(this.listEnvironments(e,t).map((i)=>String(i.id)));if(r&&!n.has(r))throw new L("not_found","Environment was not found.",404);return this.controlPlane.listResources(t,r).filter((i)=>!i.environmentId||n.has(i.environmentId)).filter((i)=>{try{return this.authorize(e,"project:read",{type:"resource",id:i.id}),!0}catch{return!1}}).map((i)=>({id:i.id,projectId:i.projectId,environmentId:i.environmentId,kind:i.kind,slug:i.slug,name:i.name,provider:i.provider,providerId:i.providerId,metadata:I(i.metadata),version:i.version,createdAt:i.createdAt,updatedAt:i.updatedAt}))}listOperations(e,t){return this.controlPlane.listOperations({projectId:t,limit:500}).filter((n)=>{let i=n.resourceId?{type:"resource",id:n.resourceId}:n.environmentId?{type:"environment",id:n.environmentId}:n.projectId?{type:"project",id:n.projectId}:{type:"organization"};try{return this.authorize(e,"deployments:read",i),!0}catch{return!1}}).map((n)=>this.operation(n))}listEvents(e,t,r){if(t)this.authorize(e,"audit:read",{type:"project",id:t});else this.authorize(e,"audit:read",e.token.scope);return this.controlPlane.listEvents({organizationId:e.serviceAccount.organizationId,projectId:t,afterSequence:r,limit:500}).filter((n)=>{let i=n.resourceId?{type:"resource",id:n.resourceId}:n.projectId?{type:"project",id:n.projectId}:{type:"organization"};try{return this.target(e,i),!0}catch{return!1}}).map((n)=>({id:n.id,sequence:n.sequence,projectId:n.projectId,operationId:n.operationId,resourceId:n.resourceId,correlationId:n.correlationId,type:n.type,level:n.level,payload:I(n.payload),createdAt:n.createdAt}))}createDeployment(e,t,r){if(!this.controlPlane.listEnvironments(t.projectId).find((p)=>p.id===t.environmentId))throw new L("not_found","Environment was not found in this project.",404);let i=t.serviceId?{type:"resource",id:t.serviceId}:{type:"environment",id:t.environmentId};this.authorize(e,"deployments:create",i);let o=this.spendGate.check("deploy",{organizationId:e.serviceAccount.organizationId,projectId:t.projectId,environmentId:t.environmentId});if(!o.allowed)throw new L("spend_cap_exceeded",o.reason??"A spend cap is blocking deployments.",402,{action:o.action,budgetId:o.budgetId});let s=us("POST","/api/v1/deployments",t),a=this.identities.getIdempotency(e.token.id,r);if(a){if(a.requestHash!==s)throw new L("idempotency_conflict","Idempotency-Key was already used for another request.",409);let p=a.operationId?this.controlPlane.getOperation(a.operationId):void 0;if(!p)throw new L("idempotency_unavailable","The original operation is no longer available.",409);return{operation:this.operation(p),replay:!0}}if(t.serviceId){let p=this.controlPlane.getResource(t.serviceId);if(!p||p.projectId!==t.projectId||p.environmentId!==t.environmentId)throw new L("not_found","Service was not found in this environment.",404)}let d=t.serviceId?this.controlPlane.getResource(t.serviceId):void 0,c=this.queue.enqueue({projectId:t.projectId,environmentId:t.environmentId,resourceId:t.serviceId,actorId:e.actor.id,kind:t.action==="rollback"?"deployment.rollback":"deployment.create",idempotencyKey:`api:${e.token.id}:${r}`,input:I({action:t.action??"deploy",revision:t.revision??null}),lockKey:t.serviceId?`resource:${t.serviceId}`:`environment:${t.environmentId}`,providerKey:d?.provider??"default",buildSlot:t.action!=="rollback",maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return this.identities.saveIdempotency({tokenId:e.token.id,key:r,requestHash:s,operationId:c.id,responseStatus:202,responseBody:{operationId:c.id}}),{operation:this.operation(c),replay:!1}}operation(e){return{id:e.id,state:e.state,kind:e.kind,projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:e.actorId,correlationId:e.correlationId,input:I(e.input),output:I(e.output),error:e.error,attempt:e.attempt,createdAt:e.createdAt,updatedAt:e.updatedAt,startedAt:e.startedAt,finishedAt:e.finishedAt}}}function lt(e){return e.serviceAccount.organizationId}function An(e){if(e==null)return;if(e==="daily"||e==="weekly"||e==="monthly")return e;throw new L("validation_error","period must be daily, weekly, or monthly.",422)}function le(e,t){if(e==null)return;let r=Number(e);if(!Number.isFinite(r)||r<0||!Number.isInteger(r))throw new L("validation_error",`${t} must be a non-negative integer.`,422);return r}function D(e,t,r,n,i){if(i)e.authorization.authorize(t,r,{type:"environment",id:i});else if(n)e.authorization.authorize(t,r,{type:"project",id:n});else e.authorization.authorize(t,r,{type:"organization"});return{organizationId:lt(t),projectId:n,environmentId:i}}async function qc(e,t,r){let{method:n,url:i}=r,o=e.now?.()??new Date,s=i.searchParams.get("projectId")??void 0,a=i.searchParams.get("environmentId")??void 0;if(n==="GET"&&i.pathname==="/api/v1/usage"){let u=D(e,t,"billing:read",s,a);return e.service.usageReport({...u,period:An(i.searchParams.get("period")),timezone:i.searchParams.get("timezone")??void 0,now:o})}if(n==="GET"&&i.pathname==="/api/v1/usage/rollups"){let u=D(e,t,"billing:read",s,a),m=i.searchParams.get("from"),E=i.searchParams.get("to");if(!m||!E)throw new L("validation_error","from and to are required.",422);if(Number.isNaN(Date.parse(m))||Number.isNaN(Date.parse(E)))throw new L("validation_error","from and to must be ISO-8601 timestamps.",422);let T=i.searchParams.getAll("meter");return{data:e.store.listRollups({...u,from:m,to:E,meters:T.length>0?T:void 0},le(i.searchParams.get("limit"),"limit")??1000)}}if(n==="GET"&&i.pathname==="/api/v1/usage/focus"){let u=D(e,t,"billing:read",s,a),m=i.searchParams.get("from"),E=i.searchParams.get("to");if(!m||!E)throw new L("validation_error","from and to are required.",422);if(Number.isNaN(Date.parse(m))||Number.isNaN(Date.parse(E)))throw new L("validation_error","from and to must be ISO-8601 timestamps.",422);if(new Date(E).getTime()-new Date(m).getTime()>31622400000)throw new L("validation_error","The range must not exceed one year.",422);let T=i.searchParams.get("granularity")==="hourly"?"hourly":"daily",_=e.store.listRollups({...u,from:m,to:E},1e4),h=Hr(_,{billingPeriodStart:m,billingPeriodEnd:E,currency:e.store.priceBook.currency,granularity:T});return{contentType:"application/x-ndjson",body:Pt(h),recordCount:h.length}}if(n==="GET"&&i.pathname==="/api/v1/spend/budgets"){let u=D(e,t,"billing:read",s,a);return{data:e.store.listBudgets({organizationId:u.organizationId,projectId:u.projectId})}}if(n==="POST"&&i.pathname==="/api/v1/spend/budgets"){let u=await r.body?.()??{},E={organizationId:D(e,t,"billing:manage",u.projectId,u.environmentId).organizationId,projectId:u.projectId,environmentId:u.environmentId,name:String(u.name??"").trim(),period:An(u.period??"monthly")??"monthly",timezone:u.timezone,currency:u.currency,softLimitCents:le(u.softLimitCents,"softLimitCents"),hardLimitCents:le(u.hardLimitCents,"hardLimitCents"),thresholds:u.thresholds,meters:u.meters,graceSeconds:le(u.graceSeconds,"graceSeconds"),hysteresisPercent:u.hysteresisPercent,dryRun:u.dryRun!==!1,enabled:u.enabled};try{return{data:e.store.createBudget(E)}}catch(T){throw new L("validation_error",T instanceof Error?T.message:String(T),422)}}let d=/^\/api\/v1\/spend\/budgets\/([^/]+)$/.exec(i.pathname);if(d&&(n==="PATCH"||n==="DELETE")){let u=e.store.getBudget(decodeURIComponent(d[1]));if(!u||u.organizationId!==lt(t))throw new L("not_found","Budget was not found.",404);if(D(e,t,"billing:manage",u.projectId,u.environmentId),n==="DELETE")return{data:{deleted:e.store.deleteBudget(u.id)}};let m=await r.body?.()??{};try{return{data:e.store.updateBudget(u.id,m,le(m.expectedVersion,"expectedVersion"))}}catch(E){let T=E instanceof Error?E.message:String(E);throw new L(T.includes("concurrently")?"conflict":"validation_error",T,T.includes("concurrently")?409:422)}}if(n==="GET"&&i.pathname==="/api/v1/spend/anomalies"){let u=D(e,t,"billing:read",s,a);return{data:e.store.listAnomalies({organizationId:u.organizationId,projectId:u.projectId,since:i.searchParams.get("since")??void 0,unacknowledgedOnly:i.searchParams.get("unacknowledged")==="true",limit:le(i.searchParams.get("limit"),"limit")})}}let c=/^\/api\/v1\/spend\/anomalies\/([^/]+)\/acknowledge$/.exec(i.pathname);if(c&&n==="POST"){let u=e.store.getAnomaly(decodeURIComponent(c[1]));if(!u||u.organizationId!==lt(t))throw new L("not_found","Anomaly was not found.",404);return D(e,t,"billing:manage",u.projectId,u.environmentId),{data:{acknowledged:e.store.acknowledgeAnomaly(u.id)}}}if(n==="GET"&&i.pathname==="/api/v1/spend/signals")return D(e,t,"billing:read",s,a),{data:he};if(i.pathname==="/api/v1/spend/anomaly-configs"){if(n==="GET"){let u=D(e,t,"billing:read",s,a);return{data:e.service.anomalyConfigs.list({organizationId:u.organizationId,projectId:u.projectId})}}if(n==="POST"){let u=await r.body?.()??{},m=D(e,t,"billing:manage",u.projectId,u.environmentId);try{return{data:e.service.anomalyConfigs.upsert({organizationId:m.organizationId,projectId:u.projectId,environmentId:u.environmentId,signal:String(u.signal??""),enabled:u.enabled,sensitivity:u.sensitivity,seasonLength:u.seasonLength==null?void 0:Number(u.seasonLength),minAbsoluteDelta:u.minAbsoluteDelta==null?void 0:Number(u.minAbsoluteDelta),detectDrops:u.detectDrops,severity:u.severity})}}catch(E){throw new L("validation_error",E instanceof Error?E.message:String(E),422)}}}let p=/^\/api\/v1\/spend\/anomaly-configs\/([^/]+)$/.exec(i.pathname);if(p&&n==="DELETE"){let u=e.service.anomalyConfigs.get(decodeURIComponent(p[1]));if(!u||u.organizationId!==lt(t))throw new L("not_found","Anomaly config was not found.",404);return D(e,t,"billing:manage",u.projectId,u.environmentId),{data:{deleted:e.service.anomalyConfigs.delete(u.id)}}}if(i.pathname==="/api/v1/spend/anomaly-silences"){if(n==="GET"){let u=D(e,t,"billing:read",s,a);return{data:e.service.anomalyConfigs.listSilences({organizationId:u.organizationId,projectId:u.projectId,includeExpired:i.searchParams.get("includeExpired")==="true"})}}if(n==="POST"){let u=await r.body?.()??{},m=D(e,t,"billing:manage",u.projectId);try{return{data:e.service.anomalyConfigs.silence({organizationId:m.organizationId,projectId:u.projectId,signal:u.signal,routePattern:u.routePattern,statusCode:u.statusCode==null?void 0:Number(u.statusCode),reason:String(u.reason??""),expiresAt:u.expiresAt})}}catch(E){throw new L("validation_error",E instanceof Error?E.message:String(E),422)}}}let l=/^\/api\/v1\/spend\/anomaly-silences\/([^/]+)$/.exec(i.pathname);if(l&&n==="DELETE")return D(e,t,"billing:manage",s),{data:{deleted:e.service.anomalyConfigs.removeSilence(decodeURIComponent(l[1]))}};if(n==="GET"&&i.pathname==="/api/v1/spend/enforcement"){let u=D(e,t,"billing:read",s,a);return{data:e.store.listEnforcements({organizationId:u.organizationId,activeOnly:i.searchParams.get("active")!=="false"})}}if(n==="GET"&&i.pathname==="/api/v1/spend/allowance"){let u=D(e,t,"billing:read",s,a),m=i.searchParams.get("operation")??"deploy";if(!["build","deploy","function_invoke","request"].includes(m))throw new L("validation_error","operation must be build, deploy, function_invoke, or request.",422);let T=e.store.listEnforcements({organizationId:u.organizationId,activeOnly:!0}).filter((f)=>(!f.projectId||f.projectId===u.projectId)&&(!f.environmentId||f.environmentId===u.environmentId)),_=jr(m,T),N=e.store.budgetsForScope(u.organizationId,u.projectId,u.environmentId).map((f)=>e.service.status(f,o));return{operation:m,allowed:_.allowed,blockedBy:_.blockedBy??null,reason:_.reason??null,budgets:N.map((f)=>({id:f.budget.id,name:f.budget.name,usedPercent:f.decision.usedPercent,projectedPercent:f.decision.projectedPercent,level:f.decision.level,timeToCap:f.timeToCap}))}}return}function Hc(){let e=[{name:"projectId",in:"query",schema:{type:"string"}},{name:"environmentId",in:"query",schema:{type:"string"}}];return{"/api/v1/usage":{get:{summary:"Current usage, cost, and every budget governing the scope.",parameters:[...e,{name:"period",in:"query",schema:{type:"string",enum:["daily","weekly","monthly"]}},{name:"timezone",in:"query",schema:{type:"string"}}],responses:{"200":{description:"Usage totals, per-meter breakdown, hourly series, and budget status."}}}},"/api/v1/usage/rollups":{get:{summary:"Itemized hourly usage rollups.",parameters:[...e,{name:"from",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"to",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"meter",in:"query",schema:{type:"array",items:{type:"string"}}},{name:"limit",in:"query",schema:{type:"integer"}}],responses:{"200":{description:"Hourly rollups, newest first."}}}},"/api/v1/usage/focus":{get:{summary:"Usage and cost in FOCUS v1.3 format, newline-delimited JSON.",parameters:[...e,{name:"from",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"to",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"granularity",in:"query",schema:{type:"string",enum:["daily","hourly"]}}],responses:{"200":{description:"FOCUS records, one JSON object per line."}}}},"/api/v1/spend/budgets":{get:{summary:"Budgets governing a scope.",parameters:e,responses:{"200":{description:"Budgets."}}},post:{summary:"Create a budget. Starts in dry run unless dryRun is explicitly false.",responses:{"201":{description:"The created budget."},"422":{description:"Validation error."}}}},"/api/v1/spend/budgets/{budgetId}":{patch:{summary:"Update a budget. Pass expectedVersion for optimistic concurrency.",responses:{"200":{description:"The updated budget."},"409":{description:"Version conflict."}}},delete:{summary:"Delete a budget.",responses:{"200":{description:"Deletion result."}}}},"/api/v1/spend/anomalies":{get:{summary:"Detected spend anomalies.",parameters:[...e,{name:"since",in:"query",schema:{type:"string",format:"date-time"}},{name:"unacknowledged",in:"query",schema:{type:"boolean"}}],responses:{"200":{description:"Anomalies, newest first."}}}},"/api/v1/spend/anomalies/{anomalyId}/acknowledge":{post:{summary:"Acknowledge an anomaly.",responses:{"200":{description:"Acknowledgement result."}}}},"/api/v1/spend/signals":{get:{summary:"Signals anomaly detection can run on, with their gap and sample rules.",responses:{"200":{description:"Signal catalog."}}}},"/api/v1/spend/anomaly-configs":{get:{summary:"Anomaly detection configuration.",parameters:e,responses:{"200":{description:"Configs."}}},post:{summary:"Create or update the config for a signal.",responses:{"200":{description:"The config."}}}},"/api/v1/spend/anomaly-configs/{configId}":{delete:{summary:"Delete an anomaly config, returning the signal to its default.",responses:{"200":{description:"Result."}}}},"/api/v1/spend/anomaly-silences":{get:{summary:"Active anomaly silences.",parameters:e,responses:{"200":{description:"Silences."}}},post:{summary:"Silence a signal, route, or status code. A reason is required.",responses:{"200":{description:"The silence."}}}},"/api/v1/spend/anomaly-silences/{silenceId}":{delete:{summary:"Remove a silence.",responses:{"200":{description:"Result."}}}},"/api/v1/spend/enforcement":{get:{summary:"Enforcement actions in force.",parameters:[...e,{name:"active",in:"query",schema:{type:"boolean"}}],responses:{"200":{description:"Enforcement records."}}}},"/api/v1/spend/allowance":{get:{summary:"Whether an operation is allowed under current spend enforcement.",parameters:[...e,{name:"operation",in:"query",schema:{type:"string",enum:["build","deploy","function_invoke","request"]}}],responses:{"200":{description:"Allowance verdict and the budgets behind it."}}}}}}export{q as $h,Tt as ai,re as bi,we as ci,_t as di,ke as ei,zn as fi,B as gi,ht as hi,Xe as ii,Kn as ji,vr as ki,Lt as li,I as mi,Sr as ni,ei as oi,ie as pi,Wt as qi,Jt as ri,Xo as si,Po as ti,Zt as ui,Ud as vi,Dd as wi,it as xi,Xd as yi,Pd as zi,xd as Ai,jd as Bi,Re as Ci,tt as Di,J as Ei,H as Fi,yo as Gi,ce as Hi,ss as Ii,as as Ji,ds as Ki,bc as Li,st as Mi,zo as Ni,ot as Oi,qo as Pi,Ho as Qi,Bo as Ri,zd as Si,rr as Ti,Jo as Ui,Zo as Vi,or as Wi,Rn as Xi,ee as Yi,ts as Zi,Es as _i,ut as $i,ms as aj,k as bj,gs as cj,lr as dj,Dn as ej,pt as fj,_s as gj,hs as hj,Ns as ij,ur as jj,Ue as kj,Et as lj,Er as mj,te as nj,Q as oj,ys as pj,ue as qj,Ls as rj,gr as sj,xn as tj,Fn as uj,mt as vj,_r as wj,hr as xj,G as yj,ni as zj,ii as Aj,Ur as Bj,Ct as Cj,ge as Dj,ai as Ej,Qe as Fj,Dr as Gj,wr as Hj,Ye as Ij,li as Jj,Xr as Kj,Pr as Lj,xr as Mj,jr as Nj,At as Oj,pi as Pj,Ei as Qj,na as Rj,Ti as Sj,Fr as Tj,Ge as Uj,gi as Vj,hi as Wj,Ut as Xj,he as Yj,wt as Zj,kt as _j,Xt as $j,Mr as ak,fi as bk,Hr as ck,Pt as dk,la as ek,xt as fk,ya as gk,Br as hk,Ne as ik,Vr as jk,Sa as kk,$r as lk,Ai as mk,wi as nk,fe as ok,qt as pk,Bi as qk,Qi as rk,Yi as sk,nn as tk,on as uk,Gi as vk,Fa as wk,Ma as xk,Bt as yk,ye as zk,sn as Ak,cn as Bk,io as Ck,oo as Dk,Vt as Ek,Ja as Fk,cd as Gk,Ie as Hk,ao as Ik,Kt as Jk,ud as Kk,po as Lk,Eo as Mk,mo as Nk,_d as Ok,To as Pk,go as Qk,fd as Rk,L as Sk,us as Tk,ps as Uk,qc as Vk,Hc as Wk};
1617
+ ${JSON.stringify(r)}`).digest("hex")}class ps{controlPlane;identities;queue;spendGate;constructor(e,t){this.controlPlane=e;this.identities=t;this.queue=new H(e),this.spendGate=new Ne(e)}target(e,t){let r=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,t),n=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,e.token.scope);if(!r||!n||!cr(n,r))throw new L("forbidden","The token does not grant access to this resource.",403);return r}authorize(e,t,r){if(!e.token.capabilities.includes(t))throw new L("forbidden",`The token is missing the ${t} capability.`,403);let n=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,r),i=this.controlPlane.resolveAuthorizationTarget(e.serviceAccount.organizationId,e.token.scope),o=t==="project:read"&&!!n&&!!i&&cr(n,i);if(!n||!i||!cr(i,n)&&!o)throw new L("forbidden","The token does not grant access to this resource.",403);let s=o?i:n;if(!ke({membership:e.membership,grants:this.controlPlane.listGrants(e.membership.id),capability:t,target:s}).allowed)throw new L("forbidden","The service account does not have access to this resource.",403);return n}listProjects(e){return this.controlPlane.listProjects().filter((t)=>t.organizationId===e.serviceAccount.organizationId).filter((t)=>{try{return this.authorize(e,"project:read",{type:"project",id:t.id}),!0}catch{return!1}}).map((t)=>({id:t.id,slug:t.slug,name:t.name,description:t.description,version:t.version,createdAt:t.createdAt,updatedAt:t.updatedAt}))}listEnvironments(e,t){let r=this.controlPlane.getProject(t);if(!r||r.organizationId!==e.serviceAccount.organizationId)throw new L("not_found","Project was not found.",404);return this.controlPlane.listEnvironments(t).filter((n)=>{try{return this.authorize(e,"project:read",{type:"environment",id:n.id}),!0}catch{return!1}}).map((n)=>({id:n.id,projectId:n.projectId,slug:n.slug,name:n.name,kind:n.kind,region:n.region,version:n.version,createdAt:n.createdAt,updatedAt:n.updatedAt}))}listServices(e,t,r){let n=new Set(this.listEnvironments(e,t).map((i)=>String(i.id)));if(r&&!n.has(r))throw new L("not_found","Environment was not found.",404);return this.controlPlane.listResources(t,r).filter((i)=>!i.environmentId||n.has(i.environmentId)).filter((i)=>{try{return this.authorize(e,"project:read",{type:"resource",id:i.id}),!0}catch{return!1}}).map((i)=>({id:i.id,projectId:i.projectId,environmentId:i.environmentId,kind:i.kind,slug:i.slug,name:i.name,provider:i.provider,providerId:i.providerId,metadata:I(i.metadata),version:i.version,createdAt:i.createdAt,updatedAt:i.updatedAt}))}listOperations(e,t){return this.controlPlane.listOperations({projectId:t,limit:500}).filter((n)=>{let i=n.resourceId?{type:"resource",id:n.resourceId}:n.environmentId?{type:"environment",id:n.environmentId}:n.projectId?{type:"project",id:n.projectId}:{type:"organization"};try{return this.authorize(e,"deployments:read",i),!0}catch{return!1}}).map((n)=>this.operation(n))}listEvents(e,t,r){if(t)this.authorize(e,"audit:read",{type:"project",id:t});else this.authorize(e,"audit:read",e.token.scope);return this.controlPlane.listEvents({organizationId:e.serviceAccount.organizationId,projectId:t,afterSequence:r,limit:500}).filter((n)=>{let i=n.resourceId?{type:"resource",id:n.resourceId}:n.projectId?{type:"project",id:n.projectId}:{type:"organization"};try{return this.target(e,i),!0}catch{return!1}}).map((n)=>({id:n.id,sequence:n.sequence,projectId:n.projectId,operationId:n.operationId,resourceId:n.resourceId,correlationId:n.correlationId,type:n.type,level:n.level,payload:I(n.payload),createdAt:n.createdAt}))}createDeployment(e,t,r){if(!this.controlPlane.listEnvironments(t.projectId).find((p)=>p.id===t.environmentId))throw new L("not_found","Environment was not found in this project.",404);let i=t.serviceId?{type:"resource",id:t.serviceId}:{type:"environment",id:t.environmentId};this.authorize(e,"deployments:create",i);let o=this.spendGate.check("deploy",{organizationId:e.serviceAccount.organizationId,projectId:t.projectId,environmentId:t.environmentId});if(!o.allowed)throw new L("spend_cap_exceeded",o.reason??"A spend cap is blocking deployments.",402,{action:o.action,budgetId:o.budgetId});let s=us("POST","/api/v1/deployments",t),a=this.identities.getIdempotency(e.token.id,r);if(a){if(a.requestHash!==s)throw new L("idempotency_conflict","Idempotency-Key was already used for another request.",409);let p=a.operationId?this.controlPlane.getOperation(a.operationId):void 0;if(!p)throw new L("idempotency_unavailable","The original operation is no longer available.",409);return{operation:this.operation(p),replay:!0}}if(t.serviceId){let p=this.controlPlane.getResource(t.serviceId);if(!p||p.projectId!==t.projectId||p.environmentId!==t.environmentId)throw new L("not_found","Service was not found in this environment.",404)}let d=t.serviceId?this.controlPlane.getResource(t.serviceId):void 0,c=this.queue.enqueue({projectId:t.projectId,environmentId:t.environmentId,resourceId:t.serviceId,actorId:e.actor.id,kind:t.action==="rollback"?"deployment.rollback":"deployment.create",idempotencyKey:`api:${e.token.id}:${r}`,input:I({action:t.action??"deploy",revision:t.revision??null}),lockKey:t.serviceId?`resource:${t.serviceId}`:`environment:${t.environmentId}`,providerKey:d?.provider??"default",buildSlot:t.action!=="rollback",maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return this.identities.saveIdempotency({tokenId:e.token.id,key:r,requestHash:s,operationId:c.id,responseStatus:202,responseBody:{operationId:c.id}}),{operation:this.operation(c),replay:!1}}operation(e){return{id:e.id,state:e.state,kind:e.kind,projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,actorId:e.actorId,correlationId:e.correlationId,input:I(e.input),output:I(e.output),error:e.error,attempt:e.attempt,createdAt:e.createdAt,updatedAt:e.updatedAt,startedAt:e.startedAt,finishedAt:e.finishedAt}}}function lt(e){return e.serviceAccount.organizationId}function An(e){if(e==null)return;if(e==="daily"||e==="weekly"||e==="monthly")return e;throw new L("validation_error","period must be daily, weekly, or monthly.",422)}function le(e,t){if(e==null)return;let r=Number(e);if(!Number.isFinite(r)||r<0||!Number.isInteger(r))throw new L("validation_error",`${t} must be a non-negative integer.`,422);return r}function D(e,t,r,n,i){if(i)e.authorization.authorize(t,r,{type:"environment",id:i});else if(n)e.authorization.authorize(t,r,{type:"project",id:n});else e.authorization.authorize(t,r,{type:"organization"});return{organizationId:lt(t),projectId:n,environmentId:i}}async function qc(e,t,r){let{method:n,url:i}=r,o=e.now?.()??new Date,s=i.searchParams.get("projectId")??void 0,a=i.searchParams.get("environmentId")??void 0;if(n==="GET"&&i.pathname==="/api/v1/usage"){let u=D(e,t,"billing:read",s,a);return e.service.usageReport({...u,period:An(i.searchParams.get("period")),timezone:i.searchParams.get("timezone")??void 0,now:o})}if(n==="GET"&&i.pathname==="/api/v1/usage/rollups"){let u=D(e,t,"billing:read",s,a),m=i.searchParams.get("from"),E=i.searchParams.get("to");if(!m||!E)throw new L("validation_error","from and to are required.",422);if(Number.isNaN(Date.parse(m))||Number.isNaN(Date.parse(E)))throw new L("validation_error","from and to must be ISO-8601 timestamps.",422);let T=i.searchParams.getAll("meter");return{data:e.store.listRollups({...u,from:m,to:E,meters:T.length>0?T:void 0},le(i.searchParams.get("limit"),"limit")??1000)}}if(n==="GET"&&i.pathname==="/api/v1/usage/focus"){let u=D(e,t,"billing:read",s,a),m=i.searchParams.get("from"),E=i.searchParams.get("to");if(!m||!E)throw new L("validation_error","from and to are required.",422);if(Number.isNaN(Date.parse(m))||Number.isNaN(Date.parse(E)))throw new L("validation_error","from and to must be ISO-8601 timestamps.",422);if(new Date(E).getTime()-new Date(m).getTime()>31622400000)throw new L("validation_error","The range must not exceed one year.",422);let T=i.searchParams.get("granularity")==="hourly"?"hourly":"daily",_=e.store.listRollups({...u,from:m,to:E},1e4),h=Hr(_,{billingPeriodStart:m,billingPeriodEnd:E,currency:e.store.priceBook.currency,granularity:T});return{contentType:"application/x-ndjson",body:Pt(h),recordCount:h.length}}if(n==="GET"&&i.pathname==="/api/v1/spend/budgets"){let u=D(e,t,"billing:read",s,a);return{data:e.store.listBudgets({organizationId:u.organizationId,projectId:u.projectId})}}if(n==="POST"&&i.pathname==="/api/v1/spend/budgets"){let u=await r.body?.()??{},E={organizationId:D(e,t,"billing:manage",u.projectId,u.environmentId).organizationId,projectId:u.projectId,environmentId:u.environmentId,name:String(u.name??"").trim(),period:An(u.period??"monthly")??"monthly",timezone:u.timezone,currency:u.currency,softLimitCents:le(u.softLimitCents,"softLimitCents"),hardLimitCents:le(u.hardLimitCents,"hardLimitCents"),thresholds:u.thresholds,meters:u.meters,graceSeconds:le(u.graceSeconds,"graceSeconds"),hysteresisPercent:u.hysteresisPercent,dryRun:u.dryRun!==!1,enabled:u.enabled};try{return{data:e.store.createBudget(E)}}catch(T){throw new L("validation_error",T instanceof Error?T.message:String(T),422)}}let d=/^\/api\/v1\/spend\/budgets\/([^/]+)$/.exec(i.pathname);if(d&&(n==="PATCH"||n==="DELETE")){let u=e.store.getBudget(decodeURIComponent(d[1]));if(!u||u.organizationId!==lt(t))throw new L("not_found","Budget was not found.",404);if(D(e,t,"billing:manage",u.projectId,u.environmentId),n==="DELETE")return{data:{deleted:e.store.deleteBudget(u.id)}};let m=await r.body?.()??{};try{return{data:e.store.updateBudget(u.id,m,le(m.expectedVersion,"expectedVersion"))}}catch(E){let T=E instanceof Error?E.message:String(E);throw new L(T.includes("concurrently")?"conflict":"validation_error",T,T.includes("concurrently")?409:422)}}if(n==="GET"&&i.pathname==="/api/v1/spend/anomalies"){let u=D(e,t,"billing:read",s,a);return{data:e.store.listAnomalies({organizationId:u.organizationId,projectId:u.projectId,since:i.searchParams.get("since")??void 0,unacknowledgedOnly:i.searchParams.get("unacknowledged")==="true",limit:le(i.searchParams.get("limit"),"limit")})}}let c=/^\/api\/v1\/spend\/anomalies\/([^/]+)\/acknowledge$/.exec(i.pathname);if(c&&n==="POST"){let u=e.store.getAnomaly(decodeURIComponent(c[1]));if(!u||u.organizationId!==lt(t))throw new L("not_found","Anomaly was not found.",404);return D(e,t,"billing:manage",u.projectId,u.environmentId),{data:{acknowledged:e.store.acknowledgeAnomaly(u.id)}}}if(n==="GET"&&i.pathname==="/api/v1/spend/signals")return D(e,t,"billing:read",s,a),{data:he};if(i.pathname==="/api/v1/spend/anomaly-configs"){if(n==="GET"){let u=D(e,t,"billing:read",s,a);return{data:e.service.anomalyConfigs.list({organizationId:u.organizationId,projectId:u.projectId})}}if(n==="POST"){let u=await r.body?.()??{},m=D(e,t,"billing:manage",u.projectId,u.environmentId);try{return{data:e.service.anomalyConfigs.upsert({organizationId:m.organizationId,projectId:u.projectId,environmentId:u.environmentId,signal:String(u.signal??""),enabled:u.enabled,sensitivity:u.sensitivity,seasonLength:u.seasonLength==null?void 0:Number(u.seasonLength),minAbsoluteDelta:u.minAbsoluteDelta==null?void 0:Number(u.minAbsoluteDelta),detectDrops:u.detectDrops,severity:u.severity})}}catch(E){throw new L("validation_error",E instanceof Error?E.message:String(E),422)}}}let p=/^\/api\/v1\/spend\/anomaly-configs\/([^/]+)$/.exec(i.pathname);if(p&&n==="DELETE"){let u=e.service.anomalyConfigs.get(decodeURIComponent(p[1]));if(!u||u.organizationId!==lt(t))throw new L("not_found","Anomaly config was not found.",404);return D(e,t,"billing:manage",u.projectId,u.environmentId),{data:{deleted:e.service.anomalyConfigs.delete(u.id)}}}if(i.pathname==="/api/v1/spend/anomaly-silences"){if(n==="GET"){let u=D(e,t,"billing:read",s,a);return{data:e.service.anomalyConfigs.listSilences({organizationId:u.organizationId,projectId:u.projectId,includeExpired:i.searchParams.get("includeExpired")==="true"})}}if(n==="POST"){let u=await r.body?.()??{},m=D(e,t,"billing:manage",u.projectId);try{return{data:e.service.anomalyConfigs.silence({organizationId:m.organizationId,projectId:u.projectId,signal:u.signal,routePattern:u.routePattern,statusCode:u.statusCode==null?void 0:Number(u.statusCode),reason:String(u.reason??""),expiresAt:u.expiresAt})}}catch(E){throw new L("validation_error",E instanceof Error?E.message:String(E),422)}}}let l=/^\/api\/v1\/spend\/anomaly-silences\/([^/]+)$/.exec(i.pathname);if(l&&n==="DELETE")return D(e,t,"billing:manage",s),{data:{deleted:e.service.anomalyConfigs.removeSilence(decodeURIComponent(l[1]))}};if(n==="GET"&&i.pathname==="/api/v1/spend/enforcement"){let u=D(e,t,"billing:read",s,a);return{data:e.store.listEnforcements({organizationId:u.organizationId,activeOnly:i.searchParams.get("active")!=="false"})}}if(n==="GET"&&i.pathname==="/api/v1/spend/allowance"){let u=D(e,t,"billing:read",s,a),m=i.searchParams.get("operation")??"deploy";if(!["build","deploy","function_invoke","request"].includes(m))throw new L("validation_error","operation must be build, deploy, function_invoke, or request.",422);let T=e.store.listEnforcements({organizationId:u.organizationId,activeOnly:!0}).filter((f)=>(!f.projectId||f.projectId===u.projectId)&&(!f.environmentId||f.environmentId===u.environmentId)),_=jr(m,T),N=e.store.budgetsForScope(u.organizationId,u.projectId,u.environmentId).map((f)=>e.service.status(f,o));return{operation:m,allowed:_.allowed,blockedBy:_.blockedBy??null,reason:_.reason??null,budgets:N.map((f)=>({id:f.budget.id,name:f.budget.name,usedPercent:f.decision.usedPercent,projectedPercent:f.decision.projectedPercent,level:f.decision.level,timeToCap:f.timeToCap}))}}return}function Hc(){let e=[{name:"projectId",in:"query",schema:{type:"string"}},{name:"environmentId",in:"query",schema:{type:"string"}}];return{"/api/v1/usage":{get:{summary:"Current usage, cost, and every budget governing the scope.",parameters:[...e,{name:"period",in:"query",schema:{type:"string",enum:["daily","weekly","monthly"]}},{name:"timezone",in:"query",schema:{type:"string"}}],responses:{"200":{description:"Usage totals, per-meter breakdown, hourly series, and budget status."}}}},"/api/v1/usage/rollups":{get:{summary:"Itemized hourly usage rollups.",parameters:[...e,{name:"from",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"to",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"meter",in:"query",schema:{type:"array",items:{type:"string"}}},{name:"limit",in:"query",schema:{type:"integer"}}],responses:{"200":{description:"Hourly rollups, newest first."}}}},"/api/v1/usage/focus":{get:{summary:"Usage and cost in FOCUS v1.3 format, newline-delimited JSON.",parameters:[...e,{name:"from",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"to",in:"query",required:!0,schema:{type:"string",format:"date-time"}},{name:"granularity",in:"query",schema:{type:"string",enum:["daily","hourly"]}}],responses:{"200":{description:"FOCUS records, one JSON object per line."}}}},"/api/v1/spend/budgets":{get:{summary:"Budgets governing a scope.",parameters:e,responses:{"200":{description:"Budgets."}}},post:{summary:"Create a budget. Starts in dry run unless dryRun is explicitly false.",responses:{"201":{description:"The created budget."},"422":{description:"Validation error."}}}},"/api/v1/spend/budgets/{budgetId}":{patch:{summary:"Update a budget. Pass expectedVersion for optimistic concurrency.",responses:{"200":{description:"The updated budget."},"409":{description:"Version conflict."}}},delete:{summary:"Delete a budget.",responses:{"200":{description:"Deletion result."}}}},"/api/v1/spend/anomalies":{get:{summary:"Detected spend anomalies.",parameters:[...e,{name:"since",in:"query",schema:{type:"string",format:"date-time"}},{name:"unacknowledged",in:"query",schema:{type:"boolean"}}],responses:{"200":{description:"Anomalies, newest first."}}}},"/api/v1/spend/anomalies/{anomalyId}/acknowledge":{post:{summary:"Acknowledge an anomaly.",responses:{"200":{description:"Acknowledgement result."}}}},"/api/v1/spend/signals":{get:{summary:"Signals anomaly detection can run on, with their gap and sample rules.",responses:{"200":{description:"Signal catalog."}}}},"/api/v1/spend/anomaly-configs":{get:{summary:"Anomaly detection configuration.",parameters:e,responses:{"200":{description:"Configs."}}},post:{summary:"Create or update the config for a signal.",responses:{"200":{description:"The config."}}}},"/api/v1/spend/anomaly-configs/{configId}":{delete:{summary:"Delete an anomaly config, returning the signal to its default.",responses:{"200":{description:"Result."}}}},"/api/v1/spend/anomaly-silences":{get:{summary:"Active anomaly silences.",parameters:e,responses:{"200":{description:"Silences."}}},post:{summary:"Silence a signal, route, or status code. A reason is required.",responses:{"200":{description:"The silence."}}}},"/api/v1/spend/anomaly-silences/{silenceId}":{delete:{summary:"Remove a silence.",responses:{"200":{description:"Result."}}}},"/api/v1/spend/enforcement":{get:{summary:"Enforcement actions in force.",parameters:[...e,{name:"active",in:"query",schema:{type:"boolean"}}],responses:{"200":{description:"Enforcement records."}}}},"/api/v1/spend/allowance":{get:{summary:"Whether an operation is allowed under current spend enforcement.",parameters:[...e,{name:"operation",in:"query",schema:{type:"string",enum:["build","deploy","function_invoke","request"]}}],responses:{"200":{description:"Allowance verdict and the budgets behind it."}}}}}}export{q as ci,Tt as di,re as ei,we as fi,_t as gi,ke as hi,zn as ii,B as ji,ht as ki,Xe as li,Kn as mi,vr as ni,Lt as oi,I as pi,Sr as qi,ei as ri,ie as si,Wt as ti,Jt as ui,Xo as vi,Po as wi,Zt as xi,Ud as yi,Dd as zi,it as Ai,Xd as Bi,Pd as Ci,xd as Di,jd as Ei,Re as Fi,tt as Gi,J as Hi,H as Ii,yo as Ji,ce as Ki,ss as Li,as as Mi,ds as Ni,bc as Oi,st as Pi,zo as Qi,ot as Ri,qo as Si,Ho as Ti,Bo as Ui,zd as Vi,rr as Wi,Jo as Xi,Zo as Yi,or as Zi,Rn as _i,ee as $i,ts as aj,Es as bj,ut as cj,ms as dj,k as ej,gs as fj,lr as gj,Dn as hj,pt as ij,_s as jj,hs as kj,Ns as lj,ur as mj,Ue as nj,Et as oj,Er as pj,te as qj,Q as rj,ys as sj,ue as tj,Ls as uj,gr as vj,xn as wj,Fn as xj,mt as yj,_r as zj,hr as Aj,G as Bj,ni as Cj,ii as Dj,Ur as Ej,Ct as Fj,ge as Gj,ai as Hj,Qe as Ij,Dr as Jj,wr as Kj,Ye as Lj,li as Mj,Xr as Nj,Pr as Oj,xr as Pj,jr as Qj,At as Rj,pi as Sj,Ei as Tj,na as Uj,Ti as Vj,Fr as Wj,Ge as Xj,gi as Yj,hi as Zj,Ut as _j,he as $j,wt as ak,kt as bk,Xt as ck,Mr as dk,fi as ek,Hr as fk,Pt as gk,la as hk,xt as ik,ya as jk,Br as kk,Ne as lk,Vr as mk,Sa as nk,$r as ok,Ai as pk,wi as qk,fe as rk,qt as sk,Bi as tk,Qi as uk,Yi as vk,nn as wk,on as xk,Gi as yk,Fa as zk,Ma as Ak,Bt as Bk,ye as Ck,sn as Dk,cn as Ek,io as Fk,oo as Gk,Vt as Hk,Ja as Ik,cd as Jk,Ie as Kk,ao as Lk,Kt as Mk,ud as Nk,po as Ok,Eo as Pk,mo as Qk,_d as Rk,To as Sk,go as Tk,fd as Uk,L as Vk,us as Wk,ps as Xk,qc as Yk,Hc as Zk};
@@ -1,4 +1,4 @@
1
- import{Yh as T}from"./chunk-gk58959n.js";class A{client;constructor(e,i){this.client=i??new T(void 0,{profile:e})}collectionItems(e,i){let t=e?.Items??e?.[i];if(!t)return[];if(Array.isArray(t))return t;let n=t[i]??t.Item;if(n===void 0)return typeof t==="object"&&(t.Id||t.PathPattern)?[t]:[];return Array.isArray(n)?n:[n]}validateExistingOriginInput(e,i){if(!/^[A-Z0-9]{8,32}$/.test(e))throw Error("CloudFront distribution ID is invalid");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test(i.id))throw Error("CloudFront origin ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/.test(i.domainName))throw Error("CloudFront origin must be a hostname without a scheme or path");let t=i.pathPattern.startsWith("/")?i.pathPattern:`/${i.pathPattern}`;if(t==="/"||t==="/*"||!/^\/[A-Za-z0-9_.*?~!$&'()+,;=:@%/-]{1,255}$/.test(t))throw Error("CloudFront path pattern must be a non-default absolute pattern");if(i.originPath&&(!i.originPath.startsWith("/")||i.originPath.includes("..")))throw Error("CloudFront origin path must be absolute and traversal-free");if(Object.entries(i.customHeaders??{}).some(([n,s])=>!/^[A-Za-z0-9-]{1,64}$/.test(n)||!s||s.length>1024))throw Error("CloudFront custom origin headers are invalid");return{...i,pathPattern:t}}async upsertExistingDistributionOrigin(e,i){let t=this.validateExistingOriginInput(e,i),n=await this.client.request({service:"cloudfront",region:"us-east-1",method:"GET",path:`/2020-05-31/distribution/${e}/config`,returnHeaders:!0}),s=n.headers?.etag||n.headers?.ETag||n.ETag||"",r=n.body?.DistributionConfig||n.DistributionConfig||n.body;if(!r||r.Enabled===void 0||!s)throw Error("Failed to read an ETag-protected CloudFront distribution config");let o=this.collectionItems(r.Origins,"Origin"),a=this.collectionItems(r.CacheBehaviors,"CacheBehavior"),u=o.find((f)=>String(f.Id)===t.id),c=a.find((f)=>String(f.PathPattern)===t.pathPattern);if(u&&String(u.DomainName)!==t.domainName&&!t.replaceExisting)throw Error(`Origin ${t.id} already targets ${u.DomainName}; pass replaceExisting only after reviewing the live config`);if(c&&String(c.TargetOriginId)!==t.id&&!t.replaceExisting)throw Error(`Path ${t.pathPattern} already targets ${c.TargetOriginId}; pass replaceExisting only after reviewing the live config`);let g={Id:t.id,DomainName:t.domainName,OriginPath:t.originPath??"",CustomHeaders:{Quantity:Object.keys(t.customHeaders??{}).length,...Object.keys(t.customHeaders??{}).length?{Items:{OriginCustomHeader:Object.entries(t.customHeaders).map(([f,I])=>({HeaderName:f,HeaderValue:I}))}}:{}},CustomOriginConfig:{HTTPPort:80,HTTPSPort:443,OriginProtocolPolicy:t.protocolPolicy??"https-only",OriginSslProtocols:{Quantity:1,Items:{SslProtocol:["TLSv1.2"]}},OriginReadTimeout:30,OriginKeepaliveTimeout:5},ConnectionAttempts:3,ConnectionTimeout:10,...t.originAccessControlId?{OriginAccessControlId:t.originAccessControlId}:{}},m=["GET","HEAD","OPTIONS","PUT","POST","PATCH","DELETE"],d={PathPattern:t.pathPattern,TargetOriginId:t.id,ViewerProtocolPolicy:"redirect-to-https",Compress:!0,CachePolicyId:"4135ea2d-6df8-44a3-9df3-4b5a84be39ad",OriginRequestPolicyId:"b689b0a8-53d0-40ab-baf2-68738e2966ac",AllowedMethods:{Quantity:m.length,Items:{Method:m},CachedMethods:{Quantity:2,Items:{Method:["GET","HEAD"]}}},SmoothStreaming:!1,FieldLevelEncryptionId:"",TrustedSigners:{Enabled:!1,Quantity:0},TrustedKeyGroups:{Enabled:!1,Quantity:0},LambdaFunctionAssociations:{Quantity:0},FunctionAssociations:{Quantity:0}},h=u?o.map((f)=>String(f.Id)===t.id?g:f):[...o,g],l=c?a.map((f)=>String(f.PathPattern)===t.pathPattern?d:f):[...a,d],y=JSON.stringify(o)!==JSON.stringify(h)||JSON.stringify(a)!==JSON.stringify(l);if(!y||t.dryRun)return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:y,applied:!1,etag:s};r.Origins={Quantity:h.length,Items:{Origin:h}},r.CacheBehaviors={Quantity:l.length,...l.length?{Items:{CacheBehavior:l}}:{}};let C=await this.client.request({service:"cloudfront",region:"us-east-1",method:"PUT",path:`/2020-05-31/distribution/${e}/config`,body:this.buildDistributionConfigXml(r),headers:{"Content-Type":"application/xml","If-Match":s}});return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!0,applied:!0,etag:C.ETag||C.headers?.etag||""}}async removeExistingDistributionOrigin(e,i){let t=this.validateExistingOriginInput(e,i),n=await this.client.request({service:"cloudfront",region:"us-east-1",method:"GET",path:`/2020-05-31/distribution/${e}/config`,returnHeaders:!0}),s=n.headers?.etag||n.headers?.ETag||n.ETag||"",r=n.body?.DistributionConfig||n.DistributionConfig||n.body;if(!r||r.Enabled===void 0||!s)throw Error("Failed to read an ETag-protected CloudFront distribution config");let o=this.collectionItems(r.Origins,"Origin"),a=this.collectionItems(r.CacheBehaviors,"CacheBehavior"),u=o.find((l)=>String(l.Id)===t.id),c=a.find((l)=>String(l.PathPattern)===t.pathPattern);if(u&&String(u.DomainName)!==t.domainName)throw Error(`Origin ${t.id} no longer targets ${t.domainName}; refusing ambiguous removal`);if(c&&String(c.TargetOriginId)!==t.id)throw Error(`Path ${t.pathPattern} no longer targets ${t.id}; refusing ambiguous removal`);if(!c)return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!1,applied:!1,originRemoved:!1,etag:s};let g=a.filter((l)=>String(l.PathPattern)!==t.pathPattern),m=String(r.DefaultCacheBehavior?.TargetOriginId)===t.id||g.some((l)=>String(l.TargetOriginId)===t.id),d=m?o:o.filter((l)=>String(l.Id)!==t.id);if(t.dryRun)return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!0,applied:!1,originRemoved:!m&&!!u,etag:s};r.Origins={Quantity:d.length,Items:{Origin:d}},r.CacheBehaviors={Quantity:g.length,...g.length?{Items:{CacheBehavior:g}}:{}};let h=await this.client.request({service:"cloudfront",region:"us-east-1",method:"PUT",path:`/2020-05-31/distribution/${e}/config`,body:this.buildDistributionConfigXml(r),headers:{"Content-Type":"application/xml","If-Match":s}});return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!0,applied:!0,originRemoved:!m&&!!u,etag:h.ETag||h.headers?.etag||""}}async createInvalidation(e){let i=e.callerReference||Date.now().toString(),t=`<?xml version="1.0" encoding="UTF-8"?>
1
+ import{$h as T}from"./chunk-mz0dk78z.js";class A{client;constructor(e,i){this.client=i??new T(void 0,{profile:e})}collectionItems(e,i){let t=e?.Items??e?.[i];if(!t)return[];if(Array.isArray(t))return t;let n=t[i]??t.Item;if(n===void 0)return typeof t==="object"&&(t.Id||t.PathPattern)?[t]:[];return Array.isArray(n)?n:[n]}validateExistingOriginInput(e,i){if(!/^[A-Z0-9]{8,32}$/.test(e))throw Error("CloudFront distribution ID is invalid");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test(i.id))throw Error("CloudFront origin ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/.test(i.domainName))throw Error("CloudFront origin must be a hostname without a scheme or path");let t=i.pathPattern.startsWith("/")?i.pathPattern:`/${i.pathPattern}`;if(t==="/"||t==="/*"||!/^\/[A-Za-z0-9_.*?~!$&'()+,;=:@%/-]{1,255}$/.test(t))throw Error("CloudFront path pattern must be a non-default absolute pattern");if(i.originPath&&(!i.originPath.startsWith("/")||i.originPath.includes("..")))throw Error("CloudFront origin path must be absolute and traversal-free");if(Object.entries(i.customHeaders??{}).some(([n,s])=>!/^[A-Za-z0-9-]{1,64}$/.test(n)||!s||s.length>1024))throw Error("CloudFront custom origin headers are invalid");return{...i,pathPattern:t}}async upsertExistingDistributionOrigin(e,i){let t=this.validateExistingOriginInput(e,i),n=await this.client.request({service:"cloudfront",region:"us-east-1",method:"GET",path:`/2020-05-31/distribution/${e}/config`,returnHeaders:!0}),s=n.headers?.etag||n.headers?.ETag||n.ETag||"",r=n.body?.DistributionConfig||n.DistributionConfig||n.body;if(!r||r.Enabled===void 0||!s)throw Error("Failed to read an ETag-protected CloudFront distribution config");let o=this.collectionItems(r.Origins,"Origin"),a=this.collectionItems(r.CacheBehaviors,"CacheBehavior"),u=o.find((f)=>String(f.Id)===t.id),c=a.find((f)=>String(f.PathPattern)===t.pathPattern);if(u&&String(u.DomainName)!==t.domainName&&!t.replaceExisting)throw Error(`Origin ${t.id} already targets ${u.DomainName}; pass replaceExisting only after reviewing the live config`);if(c&&String(c.TargetOriginId)!==t.id&&!t.replaceExisting)throw Error(`Path ${t.pathPattern} already targets ${c.TargetOriginId}; pass replaceExisting only after reviewing the live config`);let g={Id:t.id,DomainName:t.domainName,OriginPath:t.originPath??"",CustomHeaders:{Quantity:Object.keys(t.customHeaders??{}).length,...Object.keys(t.customHeaders??{}).length?{Items:{OriginCustomHeader:Object.entries(t.customHeaders).map(([f,I])=>({HeaderName:f,HeaderValue:I}))}}:{}},CustomOriginConfig:{HTTPPort:80,HTTPSPort:443,OriginProtocolPolicy:t.protocolPolicy??"https-only",OriginSslProtocols:{Quantity:1,Items:{SslProtocol:["TLSv1.2"]}},OriginReadTimeout:30,OriginKeepaliveTimeout:5},ConnectionAttempts:3,ConnectionTimeout:10,...t.originAccessControlId?{OriginAccessControlId:t.originAccessControlId}:{}},m=["GET","HEAD","OPTIONS","PUT","POST","PATCH","DELETE"],d={PathPattern:t.pathPattern,TargetOriginId:t.id,ViewerProtocolPolicy:"redirect-to-https",Compress:!0,CachePolicyId:"4135ea2d-6df8-44a3-9df3-4b5a84be39ad",OriginRequestPolicyId:"b689b0a8-53d0-40ab-baf2-68738e2966ac",AllowedMethods:{Quantity:m.length,Items:{Method:m},CachedMethods:{Quantity:2,Items:{Method:["GET","HEAD"]}}},SmoothStreaming:!1,FieldLevelEncryptionId:"",TrustedSigners:{Enabled:!1,Quantity:0},TrustedKeyGroups:{Enabled:!1,Quantity:0},LambdaFunctionAssociations:{Quantity:0},FunctionAssociations:{Quantity:0}},h=u?o.map((f)=>String(f.Id)===t.id?g:f):[...o,g],l=c?a.map((f)=>String(f.PathPattern)===t.pathPattern?d:f):[...a,d],y=JSON.stringify(o)!==JSON.stringify(h)||JSON.stringify(a)!==JSON.stringify(l);if(!y||t.dryRun)return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:y,applied:!1,etag:s};r.Origins={Quantity:h.length,Items:{Origin:h}},r.CacheBehaviors={Quantity:l.length,...l.length?{Items:{CacheBehavior:l}}:{}};let C=await this.client.request({service:"cloudfront",region:"us-east-1",method:"PUT",path:`/2020-05-31/distribution/${e}/config`,body:this.buildDistributionConfigXml(r),headers:{"Content-Type":"application/xml","If-Match":s}});return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!0,applied:!0,etag:C.ETag||C.headers?.etag||""}}async removeExistingDistributionOrigin(e,i){let t=this.validateExistingOriginInput(e,i),n=await this.client.request({service:"cloudfront",region:"us-east-1",method:"GET",path:`/2020-05-31/distribution/${e}/config`,returnHeaders:!0}),s=n.headers?.etag||n.headers?.ETag||n.ETag||"",r=n.body?.DistributionConfig||n.DistributionConfig||n.body;if(!r||r.Enabled===void 0||!s)throw Error("Failed to read an ETag-protected CloudFront distribution config");let o=this.collectionItems(r.Origins,"Origin"),a=this.collectionItems(r.CacheBehaviors,"CacheBehavior"),u=o.find((l)=>String(l.Id)===t.id),c=a.find((l)=>String(l.PathPattern)===t.pathPattern);if(u&&String(u.DomainName)!==t.domainName)throw Error(`Origin ${t.id} no longer targets ${t.domainName}; refusing ambiguous removal`);if(c&&String(c.TargetOriginId)!==t.id)throw Error(`Path ${t.pathPattern} no longer targets ${t.id}; refusing ambiguous removal`);if(!c)return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!1,applied:!1,originRemoved:!1,etag:s};let g=a.filter((l)=>String(l.PathPattern)!==t.pathPattern),m=String(r.DefaultCacheBehavior?.TargetOriginId)===t.id||g.some((l)=>String(l.TargetOriginId)===t.id),d=m?o:o.filter((l)=>String(l.Id)!==t.id);if(t.dryRun)return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!0,applied:!1,originRemoved:!m&&!!u,etag:s};r.Origins={Quantity:d.length,Items:{Origin:d}},r.CacheBehaviors={Quantity:g.length,...g.length?{Items:{CacheBehavior:g}}:{}};let h=await this.client.request({service:"cloudfront",region:"us-east-1",method:"PUT",path:`/2020-05-31/distribution/${e}/config`,body:this.buildDistributionConfigXml(r),headers:{"Content-Type":"application/xml","If-Match":s}});return{distributionId:e,originId:t.id,domainName:t.domainName,pathPattern:t.pathPattern,changed:!0,applied:!0,originRemoved:!m&&!!u,etag:h.ETag||h.headers?.etag||""}}async createInvalidation(e){let i=e.callerReference||Date.now().toString(),t=`<?xml version="1.0" encoding="UTF-8"?>
2
2
  <InvalidationBatch>
3
3
  <Paths>
4
4
  <Quantity>${e.paths.length}</Quantity>
@@ -1,4 +1,4 @@
1
- import{tf as L}from"./chunk-ky5c6t5y.js";import{Gs as E,ht as T,mt as M,nt as U,us as R,ws as P}from"./chunk-0hj552t7.js";import{execFileSync as C}from"node:child_process";import{mkdirSync as I,mkdtempSync as q,rmSync as N,writeFileSync as d}from"node:fs";import{tmpdir as z}from"node:os";import{dirname as G,join as s}from"node:path";var r={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m"};function b(t,e){return`${r[e]}${t}${r.reset}`}function _(t){console.log(`${r.green}✓${r.reset} ${t}`)}function H(t){console.error(`${r.red}✗${r.reset} ${t}`)}function K(t){console.warn(`${r.yellow}⚠${r.reset} ${t}`)}function k(t){console.log(`${r.blue}ℹ${r.reset} ${t}`)}function V(t){console.log(`${r.cyan}→${r.reset} ${t}`)}function J(t){console.log(`
1
+ import{tf as L}from"./chunk-73ztr55z.js";import{Js as E,kt as T,pt as M,qt as U,xs as R,zs as P}from"./chunk-zz52xje8.js";import{execFileSync as C}from"node:child_process";import{mkdirSync as I,mkdtempSync as q,rmSync as N,writeFileSync as d}from"node:fs";import{tmpdir as z}from"node:os";import{dirname as G,join as s}from"node:path";var r={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m"};function b(t,e){return`${r[e]}${t}${r.reset}`}function _(t){console.log(`${r.green}✓${r.reset} ${t}`)}function H(t){console.error(`${r.red}✗${r.reset} ${t}`)}function K(t){console.warn(`${r.yellow}⚠${r.reset} ${t}`)}function k(t){console.log(`${r.blue}ℹ${r.reset} ${t}`)}function V(t){console.log(`${r.cyan}→${r.reset} ${t}`)}function J(t){console.log(`
2
2
  ${r.bright}${r.cyan}${t}${r.reset}
3
3
  `)}var Q=!!(process.env.CI||process.env.GITHUB_ACTIONS||process.env.BUILDKITE||process.env.CIRCLECI||process.env.GITLAB_CI);function X(t,e="cyan"){let n=t.split(`
4
4
  `),i=Math.max(...n.map((l)=>l.length)),a="─".repeat(i+2);console.log(b(`┌${a}┐`,e)),n.forEach((l)=>{console.log(b(`│ ${l.padEnd(i)} │`,e))}),console.log(b(`└${a}┘`,e))}function A(t,e){for(let n of e){let i=s(t,n.name);I(G(i),{recursive:!0}),d(i,n.data,n.mode?{mode:n.mode}:void 0)}}async function ot(t){let{app:e,projectRoot:n,region:i,repository:a}=t,l=e.architecture??"x86_64",O=l==="arm64"?"linux/arm64":"linux/amd64",j=e.kind==="php",c=t.onStep??(()=>{}),p=q(s(z(),"tscloud-img-"));try{let f=s(p,"app");I(f,{recursive:!0});let y,w;if(j){M({projectRoot:n,app:e,skipBuild:t.skipBuild,onStep:c}),c("staging application tree");let o=U(n);A(f,o),A(s(p,"runtime"),T().map((g)=>({name:g.path,data:g.contents,mode:g.mode})));let B=e.handlers?.http??"public/index.php";y={http:B,queue:e.handlers?.queue??B,cli:e.handlers?.cli??B},w=R(o.map((g)=>`${g.name}:${g.data.length}`).join("|"))}else{c("bundling application");let o=await P({projectRoot:n,app:e,skipBuild:t.skipBuild,onStep:c});d(s(f,"index.mjs"),o.bundle),y=o.handlers,w=o.sha256}let S=w.slice(0,16);d(s(p,"Dockerfile"),E({kind:e.kind??"node",phpVersion:e.phpVersion,architecture:l}));let v=new L(i),u;try{u=(await v.describeRepositories({repositoryNames:[a]})).repositories?.[0]?.repositoryUri??""}catch{u=""}if(!u)c(`creating ECR repository ${a}`),u=(await v.createRepository({repositoryName:a,imageScanningConfiguration:{scanOnPush:!0}})).repository?.repositoryUri??"";if(!u)throw Error(`could not resolve ECR repository URI for ${a}`);let m=`${u}:${S}`;c("docker build"),C("docker",["build","--platform",O,"--provenance=false","--sbom=false","-t",m,p],{stdio:"inherit"}),c("ecr auth + push");let h=(await v.getAuthorizationToken()).authorizationData?.[0];if(!h?.authorizationToken||!h.proxyEndpoint)throw Error("failed to get an ECR authorization token");let D=h.proxyEndpoint.replace(/^https?:\/\//,""),x=s(p,".docker");return I(x,{recursive:!0}),d(s(x,"config.json"),JSON.stringify({auths:{[D]:{auth:h.authorizationToken}}})),C("docker",["push",m],{stdio:"inherit",env:{...process.env,DOCKER_CONFIG:x}}),k(`Image: ${m}`),{imageUri:m,tag:S,handlers:y}}finally{N(p,{recursive:!0,force:!0})}}
@@ -34,4 +34,4 @@ fi
34
34
  mv "${s}.new" "${s}"
35
35
  echo "ts-cloud: WAF config installed (mode: ${n.mode})"
36
36
  `}function _(e,r){return e.map((t)=>({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,kind:"event",source:"zig-waf",name:t.action==="blocked"?"waf.blocked":"waf.matched",timestamp:t.timestamp,value:1,host:t.host,pathTemplate:t.path,method:t.method,attributes:{ruleId:t.ruleId??null,anomalyScore:t.anomalyScore,action:t.action,messages:t.messages.slice(0,5)}}))}
37
- export{l as kl,g as ll,R as ml,v as nl,I as ol,_ as pl};
37
+ export{l as nl,g as ol,R as pl,v as ql,I as rl,_ as sl};