@stacksjs/ts-cloud 0.16.33 → 0.16.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/chunk-8za3y7q3.js +3 -0
- package/dist/bin/{chunk-c5qbz7ym.js → chunk-cxde3tbf.js} +1 -1
- package/dist/bin/{chunk-kzh4csxz.js → chunk-qay67r71.js} +1 -1
- package/dist/bin/cli.js +6 -6
- package/dist/bin/dashboard-server.js +1 -1
- package/dist/{chunk-c4kferxw.js → chunk-pqm7fz1d.js} +17 -17
- package/dist/deploy/index.js +1 -1
- package/dist/drivers/shared/compute-ops.d.ts +6 -0
- package/dist/index.js +1 -1
- package/dist/ui/404.html +1 -1
- package/dist/ui/accept-invitation.html +1 -1
- package/dist/ui/access-denied.html +1 -1
- package/dist/ui/account/automation.html +6 -6
- package/dist/ui/account/security.html +2 -2
- package/dist/ui/applications/compose.html +5 -5
- package/dist/ui/applications/new.html +2 -2
- package/dist/ui/data/backups.html +6 -6
- package/dist/ui/data/services.html +6 -6
- package/dist/ui/data/volumes.html +6 -6
- package/dist/ui/index.html +5 -5
- package/dist/ui/infrastructure/topology.html +6 -6
- package/dist/ui/integrations.html +2 -2
- package/dist/ui/operations/alerts.html +6 -6
- package/dist/ui/operations/configuration.html +5 -5
- package/dist/ui/operations/jobs.html +6 -6
- package/dist/ui/operations/maintenance.html +5 -5
- package/dist/ui/operations/observability.html +6 -6
- package/dist/ui/operations/previews.html +6 -6
- package/dist/ui/operations/queue.html +6 -6
- package/dist/ui/operations/regions.html +6 -6
- package/dist/ui/operations/releases.html +6 -6
- package/dist/ui/operations/spend.html +6 -6
- package/dist/ui/operations/workloads.html +6 -6
- package/dist/ui/security.html +2 -2
- package/dist/ui/server/actions.html +6 -6
- package/dist/ui/server/activity.html +1 -1
- package/dist/ui/server/capacity.html +6 -6
- package/dist/ui/server/database.html +6 -6
- package/dist/ui/server/deployments.html +5 -5
- package/dist/ui/server/diagnostics.html +1 -1
- package/dist/ui/server/firewall.html +5 -5
- package/dist/ui/server/fleet.html +5 -5
- package/dist/ui/server/logs.html +6 -6
- package/dist/ui/server/metrics.html +5 -5
- package/dist/ui/server/security.html +1 -1
- package/dist/ui/server/services.html +1 -1
- package/dist/ui/server/sites.html +6 -6
- package/dist/ui/server/ssh-keys.html +6 -6
- package/dist/ui/server/team.html +6 -6
- package/dist/ui/server/terminal.html +1 -1
- package/dist/ui/serverless/alarms.html +6 -6
- package/dist/ui/serverless/assets.html +2 -2
- package/dist/ui/serverless/cost.html +2 -2
- package/dist/ui/serverless/data.html +6 -6
- package/dist/ui/serverless/deployments.html +2 -2
- package/dist/ui/serverless/firewall.html +1 -1
- package/dist/ui/serverless/functions.html +6 -6
- package/dist/ui/serverless/logs.html +6 -6
- package/dist/ui/serverless/metrics.html +2 -2
- package/dist/ui/serverless/queues.html +6 -6
- package/dist/ui/serverless/secrets.html +6 -6
- package/dist/ui/serverless/traces.html +6 -6
- package/dist/ui/serverless.html +5 -5
- package/package.json +3 -3
- package/dist/bin/chunk-0e7bcz1c.js +0 -3
|
@@ -38,7 +38,7 @@ export const handler = async (event) => {
|
|
|
38
38
|
}
|
|
39
39
|
`;function of(e){let t=e;return String(t?.code||t?.name||t?.statusCode||"")}function Ow(e){return["NoSuchEntity","ResourceNotFoundException","404"].includes(of(e))}function rf(e){return["EntityAlreadyExists","ResourceAlreadyExistsException","ResourceConflictException","409"].includes(of(e))}function nf(e,t){let r=e?.Items;if(!r)return[];if(Array.isArray(r))return r;let a=r[t];if(a===void 0)return[];return Array.isArray(a)?a:[a]}function np(e){let t=e?.Aliases?.Items,r=t?.CNAME??t;if(Array.isArray(r))return r.map(String);if(typeof r==="string")return[r];return[]}function $w(e){if(!/^[A-Z0-9]{8,32}$/.test(e.distributionId))throw Error("CloudFront distribution ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$/.test(e.expectedAlias))throw Error("Expected CloudFront alias is invalid");if(!/^[A-Za-z0-9-_]{1,64}$/.test(e.functionName))throw Error("Lambda function name is invalid");let t=e.pathPattern?.startsWith("/")?e.pathPattern:`/${e.pathPattern||"api/*"}`;if(t==="/"||t==="/*"||!t.endsWith("*"))throw Error("API path must be a non-default wildcard pattern such as /api/*");let r=e.originId||`${e.functionName}-url`,a=e.roleName||`${e.functionName}-execution`;if(!/^[A-Za-z0-9_.-]{1,64}$/.test(a))throw Error("IAM role name is invalid");let l=e.memorySize??256,m=e.timeout??10,h=e.logRetentionDays??14;if(l<128||l>10240)throw Error("Lambda memory must be between 128 and 10240 MB");if(m<1||m>900)throw Error("Lambda timeout must be between 1 and 900 seconds");return{region:e.region||"us-east-1",pathPattern:t,originId:r,roleName:a,memorySize:l,timeout:m,logRetentionDays:h}}function yh(e){let t=e.region||"us-east-1";return{cloudfront:new I(e.profile),iam:new Ie(t,e.profile),lambda:new b(t,e.profile),logs:new ye(t,e.profile),sts:new Ae(t,e.profile),sleep:(r)=>new Promise((a)=>setTimeout(a,r))}}async function Ry(e,t){let r=$w(e),a=t||yh({profile:e.profile,region:r.region}),[l,m,h]=await Promise.all([a.sts.getCallerIdentity(),a.cloudfront.getDistribution(e.distributionId),a.cloudfront.getDistributionConfig(e.distributionId)]);if(!l.Account)throw Error("AWS identity did not return an account ID");if(!m.Enabled)throw Error(`CloudFront distribution ${e.distributionId} is disabled`);if(!(np(m).length?np(m):np(h.DistributionConfig)).includes(e.expectedAlias))throw Error(`Distribution ${e.distributionId} does not contain expected alias ${e.expectedAlias}`);let R,y=!0;try{R=await a.iam.getRole({RoleName:r.roleName})}catch(ot){if(!Ow(ot))throw ot;y=!1}let C=R?.Arn||`arn:aws:iam::${l.Account}:role/${r.roleName}`,T=await a.lambda.functionExists(e.functionName),j=T?await a.lambda.getFunctionUrl(e.functionName):null,B=await a.cloudfront.listOriginAccessControls(),V=`${e.functionName}-lambda-url`,W=B.some((ot)=>ot.Name===V&&ot.OriginAccessControlOriginType==="lambda"),Y=nf(h.DistributionConfig.Origins,"Origin"),te=nf(h.DistributionConfig.CacheBehaviors,"CacheBehavior"),le=Y.some((ot)=>String(ot.Id)===r.originId),X=te.some((ot)=>String(ot.PathPattern)===r.pathPattern),ce=[...!y?[`create IAM execution role ${r.roleName}`]:[`reconcile IAM execution policy ${r.roleName}`],...T?[`update Lambda ${e.functionName} code and configuration`]:[`create Lambda ${e.functionName}`],...!j?["create private AWS_IAM function URL"]:[],...!W?[`create Lambda origin access control ${V}`]:[],"grant CloudFront function-URL and invocation permissions",`${X?"reconcile":"add"} ${r.pathPattern} behavior without changing the default behavior`],Ee={command:`cloud cdn:origin:remove ${e.distributionId} FUNCTION_URL_HOST --id ${r.originId} --path '${r.pathPattern}' --apply --confirm 'remove:${e.distributionId}:${r.pathPattern}'`,removeFunction:!T,removeRole:!y},Re={mode:e.apply?"apply":"plan",accountId:l.Account,identityArn:l.Arn,distribution:{id:m.Id,arn:m.ARN,alias:e.expectedAlias,domainName:m.DomainName,status:m.Status},function:{name:e.functionName,existed:T,runtime:"nodejs22.x",urlExisted:!!j,url:j?.FunctionUrl},role:{name:r.roleName,existed:y,arn:C},origin:{id:r.originId,pathPattern:r.pathPattern,existed:le,behaviorExisted:X,accessControlExisted:W},changes:ce,rollback:Ee,applied:!1};if(!e.apply)return Re;let de=`${e.distributionId}:${r.pathPattern}`;if(e.confirm!==de)throw Error(`Pass exact confirmation token ${de} to mutate the live distribution`);if(!R)R=await a.iam.createRole({RoleName:r.roleName,Description:`Execution role for ${e.functionName}`,AssumeRolePolicyDocument:JSON.stringify({Version:"2012-10-17",Statement:[{Effect:"Allow",Principal:{Service:"lambda.amazonaws.com"},Action:"sts:AssumeRole"}]}),Tags:[{Key:"ManagedBy",Value:"ts-cloud"}]});await a.iam.putRolePolicy({RoleName:r.roleName,PolicyName:"lambda-logs",PolicyDocument:JSON.stringify({Version:"2012-10-17",Statement:[{Effect:"Allow",Action:["logs:CreateLogStream","logs:PutLogEvents"],Resource:`arn:aws:logs:${r.region}:${l.Account}:log-group:/aws/lambda/${e.functionName}:*`}]})});try{await a.logs.createLogGroup(`/aws/lambda/${e.functionName}`,{ManagedBy:"ts-cloud"})}catch(ot){if(!rf(ot))throw ot}await a.logs.putRetentionPolicy(`/aws/lambda/${e.functionName}`,r.logRetentionDays);let Me=e.code||Dw;if(T)await a.lambda.updateFunctionCodeInline(e.functionName,Me,"index.mjs"),await a.lambda.waitForFunctionActive(e.functionName),await a.lambda.updateFunctionConfiguration({FunctionName:e.functionName,Runtime:"nodejs22.x",Role:R.Arn,Handler:"index.handler",Description:`Private API origin for ${e.expectedAlias}`,Timeout:r.timeout,MemorySize:r.memorySize});else{let ot;for(let Pt=0;Pt<8;Pt++)try{await a.lambda.createFunctionWithCode({FunctionName:e.functionName,Runtime:"nodejs22.x",Role:R.Arn,Handler:"index.handler",Code:Me,Filename:"index.mjs",Description:`Private API origin for ${e.expectedAlias}`,Timeout:r.timeout,MemorySize:r.memorySize}),ot=void 0;break}catch(Qt){if(ot=Qt,!String(Qt.message).toLowerCase().includes("role"))throw Qt;await a.sleep(1000)}if(ot)throw ot}await a.lambda.waitForFunctionActive(e.functionName);let ae=j||await a.lambda.createFunctionUrl({FunctionName:e.functionName,AuthType:"AWS_IAM",InvokeMode:"BUFFERED"});if(!ae.FunctionUrl)throw Error("Lambda did not return a function URL");let Le=new URL(ae.FunctionUrl).hostname,Je=await a.cloudfront.findOrCreateOriginAccessControl(V,"lambda"),gt=m.ARN||`arn:aws:cloudfront::${l.Account}:distribution/${e.distributionId}`,Jt=[{FunctionName:e.functionName,StatementId:"AllowCloudFrontFunctionUrl",Action:"lambda:InvokeFunctionUrl",Principal:"cloudfront.amazonaws.com",SourceArn:gt,FunctionUrlAuthType:"AWS_IAM"},{FunctionName:e.functionName,StatementId:"AllowCloudFrontInvoke",Action:"lambda:InvokeFunction",Principal:"cloudfront.amazonaws.com",SourceArn:gt,InvokedViaFunctionUrl:!0}];for(let ot of Jt)try{await a.lambda.addPermission(ot)}catch(Pt){if(!rf(Pt))throw Pt}return await a.cloudfront.upsertExistingDistributionOrigin(e.distributionId,{id:r.originId,domainName:Le,pathPattern:r.pathPattern,originAccessControlId:Je.Id}),{...Re,function:{...Re.function,url:ae.FunctionUrl},applied:!0}}async function Dy(e){let t=`https://${e.alias}/`,r=`https://${e.alias}/api/health`,a=await fetch(t,{redirect:"follow",headers:{"cache-control":"no-cache"}}),l=new Uint8Array(await a.arrayBuffer()),m=xw("sha256").update(l).digest("hex"),h=Date.now(),S=await fetch(r,{redirect:"follow",headers:{"cache-control":"no-cache"}}),R=Date.now()-h,y=await S.text(),C=y;try{C=JSON.parse(y)}catch{}let T;if(e.logs&&e.functionName){let j=await e.logs.filterLogEvents({logGroupName:`/aws/lambda/${e.functionName}`,startTime:h-60000,filterPattern:'"Init Duration"',limit:25});for(let B of j.events||[]){let V=B.message?.match(/Init Duration:\s*([0-9.]+)\s*ms/i);if(V)T=Number(V[1])}}return{frontend:{url:t,status:a.status,sha256:m,unchanged:e.expectedFrontendSha256?m===e.expectedFrontendSha256:void 0,bytes:l.byteLength},api:{url:r,status:S.status,latencyMs:R,healthy:S.ok&&!!C?.ok,body:C},coldStart:{observed:T!==void 0,initDurationMs:T},verifiedAt:(e.now?.()||new Date).toISOString()}}function Py(e){let t=(e.memoryMb||256)/1024,r=Math.max(0,e.requests-(e.includeFreeTier===!1?0:1e6)),a=Math.max(0,e.requests*(e.averageDurationMs/1000)*t-(e.includeFreeTier===!1?0:400000)),l=r/1e6*0.2+a*0.0000166667,m=9.010025,h=16.425;return{lambdaUsd:Number(l.toFixed(2)),alwaysOnFargateAndAlbUsd:Number(25.435025000000003 .toFixed(2)),assumptions:["us-east-1 public list rates snapshot, July 2026","Lambda x86 request and duration pricing with optional monthly free tier","Fargate comparison uses one always-on 0.25 vCPU/0.5 GB task plus one ALB before LCU charges","excludes CloudFront, data transfer, logs, taxes, and application data services"]}}import{createHash as Nw}from"node:crypto";function jw(e){let t=e;return String(t?.code||t?.name||t?.statusCode||"")}function Bw(e){return jw(e)==="ValidationError"&&String(e.message).includes("does not exist")}function Mw(e){return Object.fromEntries((e||[]).map((t)=>[t.OutputKey,t.OutputValue]))}function Lw(e){let t=e?.Aliases?.Items??e?.Aliases,r=t?.CNAME??t;if(Array.isArray(r))return r.map(String);if(typeof r==="string")return[r];return[]}function sf(e){if(!/^[a-z][a-z0-9-]{1,62}$/.test(e.slug))throw Error("Slug must be a lowercase DNS-safe identifier");if(!/^[A-Z0-9]{8,32}$/.test(e.distributionId))throw Error("CloudFront distribution ID is invalid");if(!/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z0-9-]{2,63}$/.test(e.expectedAlias))throw Error("Expected distribution alias is invalid");let t=e.imageUri.match(/@((?:sha256:)[a-f0-9]{64})$/i)?.[1];if(!t)throw Error("Container image must use an immutable ECR digest URI ending in @sha256:<64 hex>");let r=e.stackName||`${e.slug}-backend`;if(!/^[A-Za-z][A-Za-z0-9-]{0,127}$/.test(r))throw Error("CloudFormation stack name is invalid");let a=e.pathPattern||"/api/*";if(!/^\/[A-Za-z0-9_.*?~!$&'()+,;=:@%/-]+\*$/.test(a)||a==="/*")throw Error("Backend path must be a non-default wildcard pattern");let l=e.originId||`${e.slug}-backend`;if(!/^[A-Za-z0-9_.-]{1,128}$/.test(l))throw Error("CloudFront origin ID is invalid");if(e.originVerifySecret&&e.originVerifySecret.length<24)throw Error("Origin verification secret must contain at least 24 characters");if(!!e.originDomain!==!!e.certificateArn)throw Error("A custom origin domain and matching ACM certificate ARN must be provided together");return{stackName:r,region:e.region||"us-east-1",pathPattern:a,originId:l,digest:t}}function Ih(e){let t=e.region||"us-east-1";return{cloudformation:new f(t,e.profile),cloudfront:new I(e.profile),sts:new Ae(t,e.profile),fetch,sleep:(r)=>new Promise((a)=>setTimeout(a,r))}}function Sh(e){let t=sf(e),r=Fd({name:e.name,slug:e.slug,domain:e.originDomain||e.expectedAlias,imageUri:e.imageUri,certificateArn:e.certificateArn,originVerifySecret:e.originVerifySecret,desiredCount:e.desiredCount,database:e.database,cache:e.cache,queue:e.queue}),a=Md(r);return a.Description=`Managed backend for existing static frontend ${e.expectedAlias}`,a.Metadata={ManagedBy:"ts-cloud",ExistingDistributionId:e.distributionId,ExistingDistributionAlias:e.expectedAlias,BackendPathPattern:t.pathPattern,ContainerDigest:t.digest},a}async function Fw(e,t,r){let a;for(let l=0;l<30;l++){let m=Date.now();try{let h=await e.fetch(t,{redirect:"manual",headers:r?{"x-origin-verify":r}:void 0}),S=Date.now()-m,R=await h.text(),y=R;try{y=JSON.parse(R)}catch{}if(h.ok)return{url:t,status:h.status,latencyMs:S,body:y};a=Error(`origin returned ${h.status}`)}catch(h){a=h}if(l<29)await e.sleep(1e4)}throw Error(`Backend origin did not become healthy: ${a instanceof Error?a.message:String(a)}`)}async function Ny(e,t){let r=sf(e),a=t||Ih({region:r.region,profile:e.profile}),[l,m]=await Promise.all([a.sts.getCallerIdentity(),a.cloudfront.getDistribution(e.distributionId)]);if(!l.Account)throw Error("AWS identity did not return an account ID");if(!m.Enabled)throw Error(`CloudFront distribution ${e.distributionId} is disabled`);if(!Lw(m).includes(e.expectedAlias))throw Error(`Distribution ${e.distributionId} does not contain expected alias ${e.expectedAlias}`);let h;try{h=(await a.cloudformation.describeStacks({stackName:r.stackName})).Stacks[0]}catch(ce){if(!Bw(ce))throw ce}let S=Sh(e),R=JSON.stringify(S);if(Buffer.byteLength(R)>51200)throw Error("Generated template exceeds the direct CloudFormation template body limit");let y=Object.values(S.Resources||{}).reduce((ce,Ee)=>(ce[Ee.Type]=(ce[Ee.Type]||0)+1,ce),{}),C=[`cloud cdn:origin:remove ${e.distributionId} ${e.originDomain||"ALB_HOST"} --id ${r.originId} --path '${r.pathPattern}' --profile ${e.profile||"default"} --apply --confirm 'remove:${e.distributionId}:${r.pathPattern}'`,`After CloudFront is deployed, restore external DNS if changed and delete stack ${r.stackName} only with an approved data-retention decision.`],T={mode:e.apply?"apply":"plan",accountId:l.Account,stack:{name:r.stackName,existed:!!h,status:h?.StackStatus,templateSha256:Nw("sha256").update(R).digest("hex"),resourceCount:Object.keys(S.Resources||{}).length,resourceTypes:y},distribution:{id:m.Id,alias:e.expectedAlias,domainName:m.DomainName,status:m.Status,pathPattern:r.pathPattern,originId:r.originId},artifact:{imageUri:e.imageUri,digest:r.digest},services:{database:e.database!==!1,cache:e.cache!==!1,queue:e.queue!==!1,mail:"ses",desiredCount:e.desiredCount||1},cloudFrontApplied:!1,dnsApplied:!1,applied:!1,rollback:C};if(!e.apply)return T;let j=`${e.distributionId}:${r.pathPattern}:${r.stackName}`;if(e.confirm!==j)throw Error(`Pass exact confirmation token ${j} to provision the backend and change live routing`);if(h)try{await a.cloudformation.updateStack({stackName:r.stackName,templateBody:R,capabilities:["CAPABILITY_NAMED_IAM"],tags:[{Key:"ManagedBy",Value:"ts-cloud"},{Key:"Application",Value:e.slug}]}),await a.cloudformation.waitForStack(r.stackName,"stack-update-complete")}catch(ce){if(!String(ce.message).includes("No updates are to be performed"))throw ce}else await a.cloudformation.createStack({stackName:r.stackName,templateBody:R,capabilities:["CAPABILITY_NAMED_IAM"],onFailure:"ROLLBACK",tags:[{Key:"ManagedBy",Value:"ts-cloud"},{Key:"Application",Value:e.slug}]}),await a.cloudformation.waitForStack(r.stackName,"stack-create-complete");let B=(await a.cloudformation.describeStacks({stackName:r.stackName})).Stacks[0],V=Mw(B?.Outputs),W=V.AppLoadBalancerDnsName;if(!W)throw Error("Backend stack did not return AppLoadBalancerDnsName");let Y=!1;if(e.originDomain&&e.originDomain!==W){if(!a.dns)throw Error(`External DNS provider is required to map ${e.originDomain} to ${W}`);let ce=await a.dns.upsertRecord(e.originDomain,{name:e.originDomain,type:"CNAME",content:W,ttl:300});if(!ce.success)throw Error(ce.message||"External DNS update failed");Y=!0}let te=e.originDomain||W,le=e.certificateArn?"https-only":"http-only",X=e.skipHealthCheck?void 0:await Fw(a,`${le==="https-only"?"https":"http"}://${te}/api/health`,e.originVerifySecret);return await a.cloudfront.upsertExistingDistributionOrigin(e.distributionId,{id:r.originId,domainName:te,pathPattern:r.pathPattern,protocolPolicy:le,customHeaders:e.originVerifySecret?{"X-Origin-Verify":e.originVerifySecret}:void 0}),{...T,outputs:V,health:X,cloudFrontApplied:!0,dnsApplied:Y,applied:!0}}function ky(e={}){let r={fargate:730*(e.desiredCount||1)*0.012342500000000001,applicationLoadBalancer:16.425,natGateway:32.85,postgres:730*(e.multiAzDatabase?0.032:0.016),redis:23.36};return{monthlyUsd:Number(Object.values(r).reduce((a,l)=>a+l,0).toFixed(2)),components:Object.fromEntries(Object.entries(r).map(([a,l])=>[a,Number(l.toFixed(2))])),assumptions:["us-east-1 public on-demand rate snapshot, July 2026","one 0.25 vCPU/0.5 GB Linux Fargate task unless desiredCount is changed","one ALB before LCU charges and one NAT gateway before data processing","single-AZ db.t4g.micro PostgreSQL by default and two cache.t4g.micro Redis nodes","excludes storage, backups, CloudFront, data transfer, public IPv4, logs, email, queue requests, taxes, and free-tier credits"]}}import{execFileSync as zw}from"node:child_process";import{createHash as Uw}from"node:crypto";import{existsSync as af,mkdirSync as qw,mkdtempSync as Vw,readdirSync as Ww,readFileSync as Hw,rmSync as Kw,statSync as cf,writeFileSync as Jw}from"node:fs";import{tmpdir as Gw}from"node:os";import{basename as Qw,join as Rs,relative as Yw,resolve as ip}from"node:path";var Zw=new Set([".git","node_modules","dist","coverage"]);function df(e,t=e){let r=[];for(let a of Ww(e).sort()){if(Zw.has(a))continue;let l=Rs(e,a);if(Td(l,t))continue;let m=cf(l);if(m.isDirectory())r.push(...df(l,t));else if(m.isFile())r.push(Yw(t,l))}return r}function Ch(e){let t=ip(e);if(!af(t)||!cf(t).isDirectory())throw Error(`Container context does not exist: ${t}`);let r=Uw("sha256");for(let a of df(t))r.update(a),r.update("\x00"),r.update(Hw(Rs(t,a))),r.update("\x00");return r.digest("hex")}function Eh(e){return{ecr:new $e(e.region||"us-east-1",e.profile),run:(t,r,a)=>{zw(t,r,{cwd:a?.cwd,env:a?.env,stdio:a?.stdio||"inherit"})}}}async function By(e,t){let r=ip(e.context),a=ip(e.dockerfile||Rs(r,"Dockerfile"));if(!af(a))throw Error(`Dockerfile does not exist: ${a}`);if(!e.repository.split("/").every((V)=>/^[a-z0-9][a-z0-9._-]*$/.test(V)&&!/[._-]$/.test(V)&&!/[._-]{2}/.test(V)))throw Error("ECR repository name is invalid");let h=t||Eh(e),S=Ch(r),R=`sha-${S.slice(0,20)}`,y="";try{y=(await h.ecr.describeRepositories({repositoryNames:[e.repository]})).repositories?.[0]?.repositoryUri||""}catch{}if(!y)y=(await h.ecr.createRepository({repositoryName:e.repository,imageTagMutability:"IMMUTABLE",imageScanningConfiguration:{scanOnPush:!0},tags:[{Key:"ManagedBy",Value:"ts-cloud"}]})).repository?.repositoryUri||"";if(!y)throw Error(`Could not resolve ECR repository URI for ${e.repository}`);await h.ecr.putLifecyclePolicy({repositoryName:e.repository,lifecyclePolicyText:JSON.stringify({rules:[{rulePriority:1,description:"Retain the newest 25 release images",selection:{tagStatus:"any",countType:"imageCountMoreThan",countNumber:25},action:{type:"expire"}}]})});let C=`${y}:${R}`,T=Vw(Rs(Gw(),"ts-cloud-container-"));try{h.run("docker",["version"],{stdio:"ignore"}),h.run("docker",["build","--platform",e.platform||"linux/amd64","--provenance=false","--sbom=false","--file",a,"--tag",C,r],{cwd:r});let V=(await h.ecr.getAuthorizationToken()).authorizationData?.[0];if(!V?.authorizationToken||!V.proxyEndpoint)throw Error("ECR did not return Docker authorization data");let W=V.proxyEndpoint.replace(/^https?:\/\//,""),Y=Rs(T,"docker");qw(Y,{recursive:!0}),Jw(Rs(Y,"config.json"),JSON.stringify({auths:{[W]:{auth:V.authorizationToken}}}),{mode:384}),h.run("docker",["push",C],{env:{...process.env,DOCKER_CONFIG:Y}})}finally{Kw(T,{recursive:!0,force:!0})}let B=(await h.ecr.describeImages({repositoryName:e.repository,imageIds:[{imageTag:R}]})).imageDetails?.[0]?.imageDigest;if(!B||!/^sha256:[a-f0-9]{64}$/i.test(B))throw Error(`ECR did not return an immutable digest for ${Qw(C)}`);return{repository:e.repository,tag:R,imageUri:C,digest:B,digestUri:`${y}@${B}`,contextSha256:S}}import{existsSync as Xw,readdirSync as ek,readFileSync as tk,statSync as rk}from"node:fs";import{join as lf,relative as nk}from"node:path";function Eo(e,t){let r=e.environments?.[t]?.app;if(!r)throw Error(`No serverless app configured for environment '${t}'. Add environments.${t}.app to your config.`);let a=e.project.slug,l=e.environments?.[t]?.region||e.project.region||"us-east-1";return{app:r,slug:a,region:l,stackName:qt(e,t),artifactBucket:Nd(a,t),assetsBucket:po(a,t)}}async function Io(e,t=8){let r;for(let a=0;a<t;a++)try{return await e()}catch(l){let m=l?.code||l?.name||"",h=String(l?.message||"");if(m==="ResourceConflictException"||/update is in progress|currently in the following state/i.test(h)){r=l,await new Promise((S)=>setTimeout(S,3000));continue}throw l}throw r}var uf=(e,t)=>`releases/${e}/${t}/current.json`;async function Nc(e,t,r,a){try{return await e.getObjectJson(t,uf(r,a))}catch{return null}}async function pf(e,t,r,a,l){await e.putObjectJson(t,uf(r,a),l)}async function ik(e,t){if(!e.secrets)return{};let r=new z(t),a={},l=Array.isArray(e.secrets)?e.secrets.map((m)=>({envName:m.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),secretId:m})):Object.entries(e.secrets).map(([m,h])=>({envName:m,secretId:h}));if(Array.isArray(e.secrets)){let m=new Map;for(let{envName:S,secretId:R}of l)m.set(S,[...m.get(S)??[],R]);let h=[...m.entries()].filter(([,S])=>S.length>1);if(h.length){let S=h.map(([R,y])=>`${R} ← ${y.join(", ")}`).join("; ");throw Error(`serverless secrets: multiple secrets map to the same env var (${S}). Use the map form { ENV_NAME: 'secret/id' } to disambiguate.`)}}for(let{envName:m,secretId:h}of l){let R=(await r.getSecretValue({SecretId:h})).SecretString??"";try{let y=JSON.parse(R);if(y&&typeof y==="object"&&!Array.isArray(y)){for(let[C,T]of Object.entries(y))a[C]=String(T);continue}}catch{}a[m]=R}return a}function es(e,t){let r={},a=t.DbProxyEndpoint||t.DbEndpoint;if(a)r.DB_CONNECTION="mysql",r.DB_HOST=a,r.DB_PORT="3306",r.DB_DATABASE=r.DB_DATABASE||"app";if(t.CacheEndpoint){if(r.REDIS_HOST=t.CacheEndpoint,r.REDIS_PORT="6379",e.cache?.driver==="elasticache")r.CACHE_STORE="redis",r.CACHE_DRIVER="redis",r.SESSION_DRIVER="redis"}return r}function rr(e,t,r,a,l,m,h,S={}){let R=e.kind==="php"?Xd({cacheDriver:e.cache?.driver==="elasticache"?"redis":"dynamodb"}):{};return{TSCLOUD_LAMBDA_MODE:a,TSCLOUD_ENV:r,MAINTENANCE_MODE:"0",...e.octane?{TSCLOUD_OCTANE:"1"}:{},...e.serveAssets?{TSCLOUD_SERVE_ASSETS:"1"}:{},...e.redirectRobotsTxt===!1?{TSCLOUD_REDIRECT_ROBOTS_TXT:"0"}:{},...R,...S,...t.app.cache?.driver!=="elasticache"?{TSCLOUD_CACHE_TABLE:`${t.slug}-${r}-cache`}:{},...h?{TSCLOUD_QUEUE:h,SQS_QUEUE:h}:{},...m?{ASSET_URL:m}:{},...e.env??{},...l}}function ok(e){let t=e.slice(e.lastIndexOf(".")).toLowerCase();return{".html":"text/html",".css":"text/css",".js":"text/javascript",".mjs":"text/javascript",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".txt":"text/plain",".map":"application/json"}[t]??"application/octet-stream"}function*gf(e){for(let t of ek(e)){let r=lf(e,t);if(rk(r).isDirectory())yield*gf(r);else yield r}}async function sk(e,t,r,a,l=!1){let m=0;for(let h of gf(r)){let S=nk(r,h).replace(/\\/g,"/");if(!l&&S.split("/").some((R)=>R.startsWith(".")))continue;await e.putObject({bucket:t,key:`${a}/${S}`,body:tk(h),contentType:ok(h),cacheControl:"public, max-age=31536000, immutable"}),m++}return m}function ak(e,t){let r=Object.entries(t).reduce((a,[l,m])=>a+Buffer.byteLength(`${l}=${m}`,"utf8"),0);if(r>4096){let a=Object.entries(t).map(([l,m])=>[l,Buffer.byteLength(`${l}=${m}`,"utf8")]).sort((l,m)=>m[1]-l[1]).slice(0,5).map(([l,m])=>`${l} (${m}B)`).join(", ");throw Error(`${e}: environment variables total ${r}B, over AWS's 4096B limit (${r-4096}B too large). Largest: ${a}. Move large/secret values out of env — store them in Secrets Manager and fetch at cold start.`)}}async function Qa(e,t,r,a){ak(t,r),await Io(()=>e.updateFunctionConfiguration({FunctionName:t,Environment:{Variables:r}})),await e.waitForFunctionActive(t,120);let l=a.kind==="image"?{FunctionName:t,ImageUri:a.imageUri}:{FunctionName:t,S3Bucket:a.bucket,S3Key:a.key};await Io(()=>e.updateFunctionCode(l)),await e.waitForFunctionActive(t,120)}async function $c(e,t){let a=(await Io(()=>e.publishVersion({FunctionName:t}))).Version;if(!a)throw Error(`publishVersion returned no version for ${t}`);return await Io(()=>e.updateAlias({FunctionName:t,Name:"live",FunctionVersion:a})),a}async function Ea(e,t,r={}){let a=Eo(e,t),{app:l,slug:m,region:h,stackName:S,artifactBucket:R}=a,y=r.projectRoot??process.cwd();ls(`Deploying serverless app: ${m} (${t})`),k(`Stack: ${S}`),k(`Region: ${h}`);let C=new o(h),T=new f(h),j=new b(h),B=l.kind==="php",V=l.packaging==="image",W=Co(l),Y,te,le,X,ce=[];if(V&&W.usesLayer&&W.layerKind!=="php")throw Error(`packaging: 'image' currently supports PHP and managed Node runtimes. ${W.kind}${W.kind==="node"?` ${W.version}`:""} uses a custom runtime — `+"use the default zip packaging (the runtime layer is built + attached automatically).");if(V){w("Building + pushing container image");let{buildAndPushServerlessImage:be}=await import("./chunk-8nafnyax.js"),xe=await be({app:l,projectRoot:y,region:h,repository:`${m}-${t}`,skipBuild:r.skipBuild,onStep:(mt)=>k(` ${mt}`)});Y=xe.handlers,te={kind:"image",imageUri:xe.imageUri},le=xe.tag,ce.push({ParameterKey:"ImageUri",ParameterValue:xe.imageUri})}else{w("Packaging application");let be=B?Yd({projectRoot:y,app:l,skipBuild:r.skipBuild,onStep:(_t)=>k(` ${_t}`)}):await Wr({projectRoot:y,app:l,skipBuild:r.skipBuild,onStep:(_t)=>k(` ${_t}`)}),xe=Hd(m,t,be.sha256);if(k(`Artifact: ${be.sha256.slice(0,12)} (${(be.zip.length/1024).toFixed(0)} KB)`),Y=be.handlers,le=be.sha256,W.usesLayer){let _t=W.layerEnvVar?process.env[W.layerEnvVar]:void 0;if(X=l.layers??(_t?[_t]:void 0),!X?.length){let Ne=W.layerKind==="php"?"serverless:build-php-layer":W.layerKind==="bun"?"serverless:build-bun-layer":"serverless:build-node-layer";throw Error(`${W.kind} apps on provided.al2023 need a runtime layer. Set environments.<env>.app.layers or the ${W.layerEnvVar} env var (build one with \`cloud ${Ne}\`)${W.kind==="node"?", or use a managed Node version (18/20/22)":""}.`)}}if(!await C.bucketExists(R))w(`Creating artifact bucket ${R}`),await C.createBucket(R);if(await C.headObject(R,xe).then((_t)=>_t!==null).catch(()=>!1))k("Artifact already uploaded — reusing");else w("Uploading artifact"),await C.putObject({bucket:R,key:xe,body:be.zip,contentType:"application/zip"});te={kind:"zip",bucket:R,key:xe},ce.push({ParameterKey:"ArtifactBucket",ParameterValue:R},{ParameterKey:"ArtifactKey",ParameterValue:xe})}let Ee=qd({config:e,environment:t,app:l,handlers:Y,runtimeLayers:X}),Re=JSON.stringify(Ee.template),de=["CAPABILITY_NAMED_IAM"],Me=await T.describeStacks({stackName:S}).then((be)=>be.Stacks[0]?.StackStatus).catch(()=>{return}),ae=Me!==void 0;if(Me&&/DELETE_IN_PROGRESS/.test(Me))w("Waiting for an in-progress stack delete to finish"),await T.waitForStack(S,"stack-delete-complete").catch(()=>{}),ae=!1;else if(Me&&/(?:ROLLBACK_COMPLETE|REVIEW_IN_PROGRESS|CREATE_FAILED)/.test(Me))w(`Deleting unusable stack (status ${Me}) before recreate`),await T.deleteStack(S),await T.waitForStack(S,"stack-delete-complete").catch(()=>{}),ae=!1;w(ae?"Updating infrastructure stack":"Creating infrastructure stack");try{if(ae)await T.updateStack({stackName:S,templateBody:Re,parameters:ce,capabilities:de}),await T.waitForStack(S,"stack-update-complete");else await T.createStack({stackName:S,templateBody:Re,parameters:ce,capabilities:de,onFailure:"DELETE"}),await T.waitForStack(S,"stack-create-complete")}catch(be){if(/No updates are to be performed/i.test(String(be?.message)))k("No infrastructure changes");else throw be}let Le=await T.getStackOutputs(S).catch(()=>({})),Je;if(l.assets){let be=lf(y,l.assets);if(Xw(be)){let xe=l.assetDomain||Le.AssetsCdnDomain;Je=xe?`https://${xe}/${le}`:void 0,w(`Syncing assets from ${l.assets}`);let mt=await sk(C,a.assetsBucket,be,le,l.dotFilesAsAssets);k(`Uploaded ${mt} asset(s)${Je?` → ${Je}`:""}`)}else ds(`Assets directory not found: ${be}`)}w("Resolving secrets");let gt=await ik(l,h);if(l.database?.connection==="aurora-serverless")try{let xe=await new z(h).getSecretValue({SecretId:`${m}/${t}/db`}),mt=JSON.parse(xe.SecretString??"{}");if(mt.username)gt.DB_USERNAME=mt.username;if(mt.password)gt.DB_PASSWORD=mt.password}catch(be){ds(`Could not resolve Aurora DB credentials: ${be.message}`)}if(!await C.bucketExists(R))await C.createBucket(R);let Jt=await Nc(C,R,m,t),ot={},Pt=Ee.queueNames[0],Qt=es(l,Le);if(w("Activating functions"),ot.http=rr(l,a,t,"http",gt,Je,Pt,Qt),await Qa(j,Ee.functionNames.http,ot.http,te),ot.cli=rr(l,a,t,"cli",gt,Je,Pt,Qt),await Qa(j,Ee.functionNames.cli,ot.cli,te),Ee.queueNames.length)ot.queue=rr(l,a,t,"queue",gt,Je,Pt,Qt),await Qa(j,Ee.functionNames.queue,ot.queue,te);let lt=(l.provisionedConcurrency??0)>0,G={};if(lt){if(w("Publishing versions + flipping live alias"),G.http=await $c(j,Ee.functionNames.http),G.cli=await $c(j,Ee.functionNames.cli),Ee.queueNames.length)G.queue=await $c(j,Ee.functionNames.queue)}if(await pf(C,R,m,t,{sha:le,code:te,previousSha:Jt?.sha,previousCode:Jt?.code,previousFunctionEnv:Jt?.functionEnv,...lt?{functionVersions:G,previousFunctionVersions:Jt?.functionVersions}:{},functionEnv:ot,functionNames:{http:Ee.functionNames.http,cli:Ee.functionNames.cli,...Ee.queueNames.length?{queue:Ee.functionNames.queue}:{}},assetUrl:Je,timestamp:new Date().toISOString()}),!r.skipDeployHooks&&l.deploy?.length){w("Running deploy hooks");for(let be of l.deploy){k(` deploy: ${be}`);let xe=await j.invoke({FunctionName:Ee.functionNames.cli,InvocationType:"RequestResponse",Payload:{command:be},LogType:"Tail"});if(xe.FunctionError)throw bu("Deploy hook failed — the new build is ALREADY LIVE."),k(` Roll back with: cloud serverless:rollback --env ${t}`),Error(`Deploy hook failed (${be}): ${xe.Payload}`)}}let ue=Le.HttpApiEndpoint;if(!r.skipHealthCheck&&ue){w("Health check");try{let be=await fetch(ue,{method:"GET"});k(`GET ${ue} → ${be.status}`)}catch(be){ds(`Health check could not reach ${ue}: ${be.message}`)}}vu(["Serverless deploy complete","",ue?`URL: ${ue}`:"",`Stack: ${S}`,`Build: ${le.slice(0,12)}`].filter(Boolean).join(`
|
|
40
40
|
`),"green")}async function ln(e,t){let r=Eo(e,t),a=new o(r.region),l=new b(r.region),m=await Nc(a,r.artifactBucket,r.slug,t);if(!m)throw Error("No previous release to redeploy. Run a full deploy first.");ls(`Redeploying ${r.slug} (${t}) — build ${m.sha.slice(0,12)}`);for(let[h,S]of Object.entries(m.functionNames)){if(!S)continue;w(`Re-activating ${h} (${S})`),await Qa(l,S,m.functionEnv[h]??{},m.code);let R=m.functionVersions?.[h];if(R)await Io(()=>l.updateAlias({FunctionName:S,Name:"live",FunctionVersion:R}))}An("Redeploy complete")}async function un(e,t){let r=Eo(e,t),a=new o(r.region),l=new b(r.region),m=await Nc(a,r.artifactBucket,r.slug,t);if(!m?.previousCode)throw Error("No previous release to roll back to.");ls(`Rolling back ${r.slug} (${t}) → ${m.previousSha?.slice(0,12)}`);for(let[h,S]of Object.entries(m.functionNames)){if(!S)continue;w(`Restoring ${h} (${S})`);let R=m.previousFunctionEnv?.[h]??m.functionEnv[h]??{};await Qa(l,S,R,m.previousCode);let y=m.previousFunctionVersions?.[h];if(y)await Io(()=>l.updateAlias({FunctionName:S,Name:"live",FunctionVersion:y}))}await pf(a,r.artifactBucket,r.slug,t,{...m,sha:m.previousSha??m.sha,code:m.previousCode,functionEnv:m.previousFunctionEnv??m.functionEnv,functionVersions:m.previousFunctionVersions??m.functionVersions,previousSha:void 0,previousCode:void 0,previousFunctionEnv:void 0,previousFunctionVersions:void 0,timestamp:new Date().toISOString()}),An("Rollback complete")}async function nr(e,t,r,a){let l=Eo(e,t),m=new b(l.region),h=`${l.slug}-${t}-http`,R={...(await m.getFunction(h)).Configuration?.Environment?.Variables??{}};if(R.MAINTENANCE_MODE=r?"1":"0",r&&a)R.MAINTENANCE_BYPASS_SECRET=a;if(!r)delete R.MAINTENANCE_BYPASS_SECRET;if(await Io(()=>m.updateFunctionConfiguration({FunctionName:h,Environment:{Variables:R}})),(l.app.provisionedConcurrency??0)>0)await m.waitForFunctionActive(h,120),await $c(m,h);An(r?"Application is now in maintenance mode (503)":"Application is live")}async function tt(e,t,r){let a=Eo(e,t),l=new b(a.region),m=`${a.slug}-${t}-cli`,h=await l.invoke({FunctionName:m,InvocationType:"RequestResponse",Payload:{command:r},LogType:"Tail"});if(h.FunctionError)throw Error(`Command failed: ${h.Payload}`);return h.Payload??""}async function Ar(e,t){let r=Eo(e,t),a=new f(r.region),l=new b(r.region),m=new o(r.region),h="not deployed",S={};try{let{Stacks:V}=await a.describeStacks({stackName:r.stackName});h=V?.[0]?.StackStatus??h;for(let W of V?.[0]?.Outputs??[])if(W.OutputKey)S[W.OutputKey]=W.OutputValue??""}catch{}let R=Gd(r.app,r.slug,t),y=r.app.provisionedConcurrency??0,C=["http","cli",...R.length?["queue"]:[]],T=`${r.slug}-${t}`,j=[];for(let V of C){let W=`${T}-${V}`,Y={mode:V,name:W,version:"$LATEST"};if(y>0){let te=await l.getAlias(W,"live").catch(()=>null);if(te?.FunctionVersion){Y.version=te.FunctionVersion;let le=await l.getProvisionedConcurrencyConfig(W,"live").catch(()=>null);if(le)Y.provisioned={status:le.Status??"-",allocated:le.AllocatedProvisionedConcurrentExecutions??0,requested:le.RequestedProvisionedConcurrentExecutions??0}}}j.push(Y)}let B=await Nc(m,r.artifactBucket,r.slug,t).catch(()=>null);return{slug:r.slug,environment:t,region:r.region,stackStatus:h,endpoint:S.HttpApiEndpoint,assetUrl:B?.assetUrl,scheduler:r.app.scheduler??"on",queues:R,provisionedConcurrency:y,functions:j,lastRelease:B?{sha:B.sha,timestamp:B.timestamp}:void 0}}function ck(e,t){return`${e}-${t}-db`}async function mf(e,t,r,a){let l=Eo(e,t);if(l.app.database?.connection!=="aurora-serverless")throw Error("No Aurora Serverless v2 database is configured for this environment.");let{RDSClient:m}=await import("./chunk-xask9f1n.js"),h=new m(l.region),S=ck(l.slug,t);w(`Scaling ${S} → ${r}–${a} ACUs`),await h.modifyDBCluster({DBClusterIdentifier:S,ServerlessV2ScalingConfiguration:{MinCapacity:r,MaxCapacity:a},ApplyImmediately:!0}),An(`Scaling applied to ${S} (takes effect shortly).`)}class op{client;region;constructor(e="us-east-1"){this.region=e,this.client=new n}async call(e,t){return this.client.request({service:"wafv2",region:this.region,method:"POST",path:"/",headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`AWSWAF_20190729.${e}`},body:JSON.stringify(t)})}async listWebACLs(e="REGIONAL"){return(await this.call("ListWebACLs",{Scope:e,Limit:100}))?.WebACLs??[]}async getWebACLRules(e,t,r="REGIONAL"){return((await this.call("GetWebACL",{Name:e,Id:t,Scope:r}))?.WebACL?.Rules??[]).map((m)=>({Name:m.Name,Priority:m.Priority,Action:m.Action?Object.keys(m.Action)[0]:m.OverrideAction?Object.keys(m.OverrideAction)[0]:"count"}))}}var dk=[{index:0,id:"clients",label:"Clients"},{index:1,id:"dns",label:"DNS & TLS"},{index:2,id:"edge",label:"Edge"},{index:3,id:"routing",label:"Routing"},{index:4,id:"apps",label:"Applications"},{index:5,id:"runtime",label:"Background runtime"},{index:6,id:"data",label:"Data services"},{index:7,id:"durability",label:"Durability"}],lk=[{index:0,id:"clients",label:"Clients"},{index:1,id:"dns",label:"DNS & TLS"},{index:2,id:"edge",label:"Edge"},{index:3,id:"entry",label:"Entry points"},{index:4,id:"compute",label:"Compute"},{index:5,id:"messaging",label:"Messaging & pooling"},{index:6,id:"data",label:"Data services"},{index:7,id:"durability",label:"Durability"}],uk=[{match:/^redis/,kind:"cache",label:"Redis"},{match:/^(?:mysql|mariadb)/,kind:"database",label:"MySQL"},{match:/^postgres/,kind:"database",label:"PostgreSQL"},{match:/^meilisearch/,kind:"database",label:"Meilisearch"},{match:/^vitess|^vtgate/,kind:"database",label:"Vitess"},{match:/^memcached/,kind:"cache",label:"Memcached"}],pk=/^(?:rpx-gateway|nginx|caddy|traefik|haproxy)$/;function De(e,t=""){let r=e==null?"":String(e).trim();return r&&r!=="-"&&r!=="—"?r:t}function gk(e){return Array.isArray(e)?e.length:0}function Un(e){let t=De(e).toLowerCase();if(!t)return"unknown";if(["running","live","active","available","success","ok","healthy","enabled"].includes(t))return"ok";if(["failed","stopped","unreachable","error","critical","disabled"].includes(t))return"bad";if(["configured","creating","pending","degraded","shadowed","warn","unknown"].includes(t))return"warn";return"warn"}function ur(e,t,r){if(r.has(t.source)&&r.has(t.target))e.push(t)}function Tt(e,t={}){let r=[],a=[],l=[],m=e.server??{},h=Array.isArray(e.sites)?e.sites:[],S=Array.isArray(e.services)?e.services:[],R=Array.isArray(e.workers)?e.workers:[],y=e.security??{},C=!!e._serverReachable&&!e.metricsUnavailable,T="box";if(!C)l.push("The compute box could not be probed, so live service state is missing; the shape comes from your cloud config.");r.push({id:"internet",label:"Internet",kind:"internet",layer:0,status:"ok",sub:"Public traffic",facts:[],external:!0});let j=[...new Set(h.map((de)=>De(de.domain)||De(de.route).split("/")[0]).filter((de)=>de&&de!=="internal"&&de!=="loopback"))],B=Array.isArray(y.tlsCertificates)?y.tlsCertificates:[],V=B.filter((de)=>Number(de?.daysRemaining??999)<21).length;r.push({id:"dns",label:j.length===1?j[0]:"Public domains",kind:"dns",layer:1,status:V?"warn":j.length?"ok":"unknown",sub:j.length>1?`${j.length} domains`:"DNS & certificates",facts:[{label:"Domains",value:j.length?j.slice(0,6).join(", "):"none resolved"},{label:"Certificates",value:B.length?`${B.length} issued`:"none reported"},...V?[{label:"Expiring",value:`${V} within 21 days`}]:[]],href:"/server/security",external:!0});let W=y.firewall??{},Y=Array.isArray(y.ports)?y.ports:[];r.push({id:"firewall",label:"Host firewall",kind:"firewall",layer:2,status:Un(W.status),sub:De(W.summary,"Inbound filtering"),facts:[{label:"State",value:De(W.status,"unknown")},{label:"Open ports",value:Y.length?Y.map((de)=>De(de.listen)).join(", "):"not reported"}],href:"/server/firewall",group:"box"});let te=S.find((de)=>pk.test(De(de.name)));r.push({id:"proxy",label:De(te?.name,"Reverse proxy"),kind:"proxy",layer:3,status:te?Un(te.status):"unknown",sub:"TLS termination & routing",facts:[{label:"Service",value:De(te?.name,"not detected")},{label:"State",value:De(te?.status,C?"not running":"not probed")},{label:"Routes",value:`${h.length} site${h.length===1?"":"s"}`}],href:"/server/services",group:"box"});for(let de of h){let Me=`site:${De(de.name)}`;if(!De(de.name))continue;r.push({id:Me,label:De(de.name),kind:"site",layer:4,status:Un(de.status),sub:De(de.runtime,"runtime"),facts:[{label:"Route",value:De(de.route,"internal")},{label:"Runtime",value:De(de.runtime,"unknown")},{label:"Delivery",value:De(de.deploy,"unknown")},{label:"TLS",value:De(de.tls,"unknown")},...de.responseMs!=null?[{label:"Response",value:`${Math.round(Number(de.responseMs))} ms`}]:[],...de.httpStatus!=null?[{label:"HTTP",value:String(de.httpStatus)}]:[]],href:"/server/sites",group:"box"})}for(let de of R){let Me=`worker:${De(de.name)}`;if(!De(de.name))continue;r.push({id:Me,label:De(de.name),kind:"worker",layer:5,status:Un(de.status),sub:`${Number(de.processes??1)} process${Number(de.processes??1)===1?"":"es"}`,facts:[{label:"Processes",value:String(de.processes??1)},{label:"State",value:De(de.status,"unknown")},...De(de.site)?[{label:"Site",value:De(de.site)}]:[]],href:"/operations/jobs",group:"box"})}let le=e.serverScheduler??{};if(le.enabled)r.push({id:"scheduler",label:"Scheduler",kind:"scheduler",layer:5,status:"ok",sub:"Cron dispatch",facts:[{label:"Last run",value:De(le.lastRun,"unknown")}],href:"/operations/jobs",group:"box"});let X=S.map((de)=>{let Me=De(de.name),ae=uk.find((Le)=>Le.match.test(Me));return ae?{service:de,name:Me,...ae}:null}).filter((de)=>!!de);for(let de of X)r.push({id:`data:${de.name}`,label:de.label,kind:de.kind,layer:6,status:Un(de.service.status),sub:de.name,facts:[{label:"Unit",value:de.name},{label:"State",value:De(de.service.status,"unknown")}],href:"/data/services",group:"box"});let ce=e.backup??{};if(ce.enabled)r.push({id:"backup",label:"Backups",kind:"backup",layer:7,status:"ok",sub:De(ce.destination,"destination"),facts:[{label:"Destination",value:De(ce.destination,"unknown")},{label:"Schedule",value:De(ce.schedule,"unknown")},{label:"Retention",value:`${ce.retention??0} copies`},{label:"Last run",value:De(ce.last,"unknown")}],href:"/data/backups"});let Ee=new Set(r.map((de)=>de.id));ur(a,{source:"internet",target:"dns",flow:"request",label:"https"},Ee),ur(a,{source:"dns",target:"firewall",flow:"request",label:"443/80"},Ee),ur(a,{source:"firewall",target:"proxy",flow:"request"},Ee);for(let de of h){let Me=`site:${De(de.name)}`;ur(a,{source:"proxy",target:Me,flow:"request",label:De(de.path)||void 0,status:Un(de.status)},Ee)}for(let de of R){let Me=`worker:${De(de.name)}`,ae=`site:${De(de.site)}`;if(Ee.has(ae))ur(a,{source:ae,target:Me,flow:"async",label:"queue"},Ee);else ur(a,{source:"proxy",target:Me,flow:"async",label:"queue"},Ee)}for(let de of R)ur(a,{source:"scheduler",target:`worker:${De(de.name)}`,flow:"async",label:"dispatch"},Ee);let Re=[...h.map((de)=>`site:${De(de.name)}`),...R.map((de)=>`worker:${De(de.name)}`)];for(let de of X)for(let Me of Re)ur(a,{source:Me,target:`data:${de.name}`,flow:"data",label:"localhost"},Ee);if(X.length&&Re.length)l.push("Data-service edges show co-location on the box: every process on it can reach localhost. They are not a declared per-site binding.");for(let de of X)ur(a,{source:`data:${de.name}`,target:"backup",flow:"backup",label:"snapshot"},Ee);for(let de of h)ur(a,{source:`site:${De(de.name)}`,target:"backup",flow:"backup"},Ee);return{mode:"server",project:De(t.project)||De(e.project?.name)||De(m.name,"project"),environment:De(t.environment)||De(e.environment,"production"),provider:De(m.provider,"unknown"),region:De(m.region,"unknown"),generatedAt:new Date().toISOString(),layers:dk,groups:[{id:"box",label:De(m.name,"App server"),sub:[De(m.provider),De(m.region),De(m.ip)].filter(Boolean).join(" · ")}],nodes:r,links:a,notes:l}}function ts(e,t={}){let r=[],a=[],l=[],m=e.app??{},h=Array.isArray(e.functions)?e.functions:[],S=Array.isArray(e.queues)?e.queues:[],R=e.metrics??{};if(!h.length)l.push("No Lambda functions were read for this environment, so the compute layer is empty rather than assumed.");r.push({id:"internet",label:"Internet",kind:"internet",layer:0,status:"ok",sub:"Public traffic",facts:[],external:!0});let y=De(m.url),C=y.replace(/^https?:\/\//,"").split("/")[0];r.push({id:"dns",label:C||"Application domain",kind:"dns",layer:1,status:C?"ok":"unknown",sub:"DNS & certificates",facts:[{label:"Endpoint",value:y||"not resolved"}],external:!0});let T=e.waf;if(T)r.push({id:"waf",label:"WAF",kind:"waf",layer:2,status:Un(T.status??"active"),sub:De(T.scope,"Managed rules"),facts:[{label:"Web ACL",value:De(T.name,"unnamed")},...T.blocked!=null?[{label:"Blocked (24h)",value:String(T.blocked)}]:[],{label:"Rules",value:String(gk(e.wafRules))}],href:"/serverless/firewall"});let j=e.assetsInfo;if(j)r.push({id:"cdn",label:"Asset CDN",kind:"cdn",layer:2,status:"ok",sub:De(j.cdn,"CloudFront"),facts:[{label:"Distribution",value:De(j.cdn,"unknown")},{label:"Custom domain",value:De(j.customDomain,"none")}],href:"/serverless/assets"}),r.push({id:"assets",label:"Asset bucket",kind:"storage",layer:6,status:"ok",sub:De(j.bucket,"S3"),facts:[{label:"Bucket",value:De(j.bucket,"unknown")},...j.files?[{label:"Objects",value:String(j.files)}]:[],...j.sizeMb?[{label:"Size",value:`${j.sizeMb} MB`}]:[]],href:"/serverless/assets"});let B=h.find((ae)=>De(ae.key).startsWith("http"));r.push({id:"gateway",label:"HTTP entry point",kind:"gateway",layer:3,status:B?"ok":"unknown",sub:"Function URL / API Gateway",facts:[{label:"Endpoint",value:y||"not resolved"},{label:"Invocations (24h)",value:String(R.invocations??0)},...R.errorRatePct!=null?[{label:"Error rate",value:`${R.errorRatePct}%`}]:[]],href:"/serverless/metrics"});for(let ae of h){let Le=`fn:${De(ae.name)}`;if(!De(ae.name))continue;let Je=Number(ae.errors??0),gt=Number(ae.invocations??0);r.push({id:Le,label:De(ae.key,De(ae.name)),kind:"function",layer:4,status:Je>0?gt&&Je/gt>0.02?"bad":"warn":gt?"ok":"idle",sub:De(ae.runtime,"lambda"),facts:[{label:"Function",value:De(ae.name)},{label:"Memory",value:`${ae.memory??0} MB`},{label:"Timeout",value:`${ae.timeout??0}s`},{label:"Invocations (24h)",value:String(gt)},{label:"Errors (24h)",value:String(Je)},{label:"p95",value:`${ae.p95??0} ms`},...ae.provisioned?[{label:"Provisioned",value:De(ae.provisioned)}]:[]],href:"/serverless/functions"})}for(let ae of S){let Le=`queue:${De(ae.name)}`;if(!De(ae.name))continue;let Je=Number(ae.dlq??0);r.push({id:Le,label:De(ae.name),kind:"queue",layer:5,status:Je>0?"bad":Number(ae.visible??0)>0?"warn":"ok",sub:"SQS",facts:[{label:"Visible",value:String(ae.visible??0)},{label:"In flight",value:String(ae.inFlight??0)},{label:"Processed (24h)",value:String(ae.processed??0)},{label:"Dead letter",value:String(Je)}],href:"/serverless/queues"})}let V=e.aurora;if(V)r.push({id:"database",label:"Aurora Serverless",kind:"database",layer:6,status:Un(V.status),sub:De(V.engine,"aurora"),facts:[{label:"Cluster",value:De(V.id,"unknown")},{label:"Capacity",value:`${V.currentAcu??0} ACU (${V.minAcu??0}–${V.maxAcu??0})`},{label:"Connections",value:String(V.connections??0)}],href:"/serverless/data"});let W=e.proxy;if(W)r.push({id:"rds-proxy",label:"RDS Proxy",kind:"database",layer:5,status:Un(W.status),sub:"Connection pooling",facts:[{label:"Proxy",value:De(W.name,"unknown")},{label:"Endpoint",value:De(W.endpoint,"unknown")},{label:"Pooled",value:String(W.pooledConns??0)}],href:"/serverless/data"});let Y=e.redis;if(Y)r.push({id:"cache",label:"ElastiCache",kind:"cache",layer:6,status:Un(Y.status),sub:De(Y.node,"redis"),facts:[{label:"Group",value:De(Y.id,"unknown")},{label:"Hit rate",value:`${Y.hitRate??0}%`}],href:"/serverless/data"});let te=e.efs;if(te)r.push({id:"efs",label:"EFS",kind:"filesystem",layer:6,status:Un(te.status),sub:De(te.mount,"/mnt/local"),facts:[{label:"File system",value:De(te.id,"unknown")},{label:"Mount",value:De(te.mount,"unknown")},{label:"Size",value:`${te.sizeMb??0} MB`}],href:"/data/volumes"});let le=e.scheduler??{};if(le.enabled)r.push({id:"scheduler",label:"Scheduler",kind:"scheduler",layer:3,status:"ok",sub:De(le.expression,"rate(1 minute)"),facts:[{label:"Expression",value:De(le.expression,"unknown")},{label:"Last run",value:De(le.lastRun,"unknown")}],href:"/operations/jobs"});let X=new Set(r.map((ae)=>ae.id)),ce=X.has("waf")?"waf":"gateway";ur(a,{source:"internet",target:"dns",flow:"request",label:"https"},X),ur(a,{source:"dns",target:ce,flow:"request"},X),ur(a,{source:"dns",target:"cdn",flow:"request",label:"assets"},X),ur(a,{source:"waf",target:"gateway",flow:"request",label:"allowed"},X),ur(a,{source:"cdn",target:"assets",flow:"data",label:"origin"},X);let Ee=h.filter((ae)=>De(ae.key).startsWith("http")),Re=h.filter((ae)=>De(ae.key).startsWith("queue")),de=h.filter((ae)=>De(ae.key).startsWith("cli"));for(let ae of Ee)ur(a,{source:"gateway",target:`fn:${De(ae.name)}`,flow:"request",label:"invoke"},X);for(let ae of de)ur(a,{source:"scheduler",target:`fn:${De(ae.name)}`,flow:"async",label:"schedule"},X);for(let ae of S){for(let Le of Ee)ur(a,{source:`fn:${De(Le.name)}`,target:`queue:${De(ae.name)}`,flow:"async",label:"publish"},X);for(let Le of Re)ur(a,{source:`queue:${De(ae.name)}`,target:`fn:${De(Le.name)}`,flow:"async",label:"consume"},X)}let Me=["rds-proxy","database","cache","efs","assets"];for(let ae of h){let Le=`fn:${De(ae.name)}`;if(X.has("rds-proxy"))ur(a,{source:Le,target:"rds-proxy",flow:"data",label:"pooled"},X);else ur(a,{source:Le,target:"database",flow:"data",label:"sql"},X);for(let Je of Me.filter((gt)=>gt!=="rds-proxy"&>!=="database"))ur(a,{source:Le,target:Je,flow:"data"},X)}return ur(a,{source:"rds-proxy",target:"database",flow:"data",label:"sql"},X),{mode:"serverless",project:De(t.project)||De(m.name,"application"),environment:De(t.environment)||De(m.env,"production"),provider:"aws",region:De(m.region,"unknown"),generatedAt:new Date().toISOString(),layers:lk,groups:[],nodes:r,links:a,notes:l}}function bh(e,t,r={}){return e==="serverless"?ts(t,r):Tt(t,r)}function ff(e){return String(e).padStart(2,"0")}function As(e){return`${e.getUTCFullYear()}-${ff(e.getUTCMonth()+1)}-${ff(e.getUTCDate())}`}function mk(e){let t=Math.max(0,Math.round((Date.now()-e)/1000));if(t<60)return`${t}s ago`;let r=Math.round(t/60);if(r<60)return`${r}m ago`;let a=Math.round(r/60);if(a<48)return`${a}h ago`;return`${Math.round(a/24)}d ago`}async function Ya(e,t,r,a,l,m){let h=await e.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:r,Dimensions:[{Name:"FunctionName",Value:t}],StartTime:l,EndTime:m,Period:86400,Statistics:[a]}).catch(()=>[]);if(!h.length)return 0;if(a==="Sum")return h.reduce((S,R)=>S+(R.Sum??0),0);if(a==="Maximum")return Math.max(...h.map((S)=>S.Maximum??0));return h.reduce((S,R)=>S+(R.Average??0),0)/h.length}async function Za(e,t,r,a,l,m,h){let S=await e.getMetricStatistics({Namespace:t,MetricName:r,Dimensions:a,StartTime:m,EndTime:h,Period:86400,Statistics:[l]}).catch(()=>[]);if(!S.length)return 0;if(l==="Sum")return S.reduce((R,y)=>R+(y.Sum??0),0);if(l==="Maximum")return Math.max(...S.map((R)=>R.Maximum??0));return S.reduce((R,y)=>R+(y.Average??0),0)/S.length}async function sp(e,t,r,a,l){let m=await e.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Duration",Dimensions:[{Name:"FunctionName",Value:t}],StartTime:a,EndTime:l,Period:86400,ExtendedStatistics:[r]}).catch(()=>[]);return Math.round(m.reduce((h,S)=>h+(S.Percentiles?.[r]??0),0))}async function pn(e,t){let r=await Ar(e,t),a=r.region,l=new oe(a),m=new b(a),h=new ye(a),S=new Date,R=new Date(S.getTime()-86400000),y=e.environments?.[t]?.app,C={};C.app={name:r.slug,env:t,region:a,runtime:y?.kind==="php"?`php-${y?.phpVersion??"8.3"} (fpm)`:y?.kind??"node",url:r.endpoint??"",build:r.lastRelease?.sha?.slice(0,7)??"—",deployedAt:r.lastRelease?.timestamp??"—"},C.maintenance={enabled:!1},C.scheduler={enabled:r.scheduler!=="off",expression:r.scheduler==="sub-minute"?"rate(1 minute) · sub-minute":"rate(1 minute)",lastRun:"—"};let T=0,j=0,B=0,V=[],W=[],Y=[];for(let ce of r.functions){let[Ee,Re,de,Me,ae,Le,Je,gt,Jt]=await Promise.all([Ya(l,ce.name,"Invocations","Sum",R,S),Ya(l,ce.name,"Errors","Sum",R,S),Ya(l,ce.name,"Throttles","Sum",R,S),Ya(l,ce.name,"Duration","Average",R,S),m.getFunction(ce.name).catch(()=>null),sp(l,ce.name,"p50",R,S),sp(l,ce.name,"p95",R,S),sp(l,ce.name,"p99",R,S),l.getMetricSeries({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:[{Name:"FunctionName",Value:ce.name}],StartTime:new Date(S.getTime()-43200000),EndTime:S,Period:3600,Stat:"Sum"}).catch(()=>[])]);T+=Ee,j+=Re,B=Math.max(B,Me);let ot=ae?.Configuration?.MemorySize??0,Pt=Object.keys(ae?.Configuration?.Environment?.Variables??{}),Qt=[],lt=0;try{let{events:ue=[]}=await h.filterLogEvents({logGroupName:`/aws/lambda/${ce.name}`,startTime:R.getTime(),limit:120});for(let be of ue){let xe=(be.message??"").trim(),mt=/Max Memory Used:\s*(\d+)\s*MB/.exec(xe);if(mt)lt=Math.max(lt,Number(mt[1]));if(xe&&!/^(?:START|END|REPORT|INIT_START)/.test(xe))Y.push({source:ce.mode||ce.name,timestamp:new Date(be.timestamp??0).toISOString(),when:mk(be.timestamp??0),message:xe.slice(0,400),level:/error|exception|fatal|panic|traceback/i.test(xe)?"error":/warn|warning|timeout|retr(?:y|ies)|throttl/i.test(xe)?"warn":"info"})}Qt=ue.filter((be)=>!/^(?:START|END|REPORT|INIT_START)/.test((be.message??"").trim())).slice(-6).map((be)=>({ts:new Date(be.timestamp??0).toISOString().slice(11,19),msg:(be.message??"").trim().slice(0,120),err:/error|exception|fatal/i.test(be.message??"")}))}catch{}let G=Math.max(1,...Jt);V.push({key:ce.mode,name:ce.name,version:ce.version,memory:ot,timeout:ae?.Configuration?.Timeout??0,runtime:ae?.Configuration?.Runtime??"provided.al2023",invocations:Math.round(Ee),errors:Math.round(Re),p95:Je||Math.round(Me),status:"active",provisioned:ce.provisioned?`${ce.provisioned.allocated}/${ce.provisioned.requested}`:void 0}),W.push({key:ce.mode,name:ce.name,runtime:ae?.Configuration?.Runtime??"provided.al2023",arch:ae?.Configuration?.Architectures?.[0]??"x86_64",memory:ot,timeout:ae?.Configuration?.Timeout??0,ephemeral:ae?.Configuration?.EphemeralStorage?.Size??512,version:ce.version,concurrency:y?.concurrency??"—",invocations:Math.round(Ee),errors:Math.round(Re),throttles:Math.round(de),p50:Le||Math.round(Me),p95:Je||Math.round(Me),p99:gt||Math.round(Me),maxMem:lt,spark:Jt.length?Jt.map((ue)=>Math.round(ue/G*100)):[0],env:Pt.length?Pt:["(none)"],recent:Qt.length?Qt:[{ts:"—",msg:"no recent events",err:!1}]})}C.functions=V,C.functionsDetail=W,C.serverlessLogs=Y.sort((ce,Ee)=>String(Ee.timestamp).localeCompare(String(ce.timestamp))).slice(0,600),C.serverlessLogsEmptyReason=Y.length?void 0:"No recent function logs were found in CloudWatch for this environment.";let te=T?Number((j/T*100).toFixed(2)):0,le=Math.round(await Ya(l,r.functions[0]?.name??"","ConcurrentExecutions","Maximum",R,S));C.metrics={invocations:Math.round(T),errorRatePct:te,p95Ms:Math.round(B),coldStartPct:void 0,concurrency:le,estCostUsd:void 0};try{let ce=new se(a),Ee=[],Re=[],de=0;try{let{QueueUrl:ae}=await ce.getQueueUrl(`${r.slug}-${t}-dlq`),{Attributes:Le}=await ce.getQueueAttributes(ae);de=Number(Le.ApproximateNumberOfMessages??0)}catch{}let Me=y?Xt(y,r.slug,t):[];for(let ae of Me){let Le=ae.name.replace(`${r.slug}-${t}-`,""),Je=0,gt=0;try{let{QueueUrl:ot}=await ce.getQueueUrl(ae.name),{Attributes:Pt}=await ce.getQueueAttributes(ot);Je=Number(Pt.ApproximateNumberOfMessages??0),gt=Number(Pt.ApproximateNumberOfMessagesNotVisible??0)}catch{}let Jt=Math.round(await Za(l,"AWS/SQS","NumberOfMessagesDeleted",[{Name:"QueueName",Value:ae.name}],"Sum",R,S));Ee.push({name:Le,visible:Je,inFlight:gt,processed:Jt,dlq:de}),Re.push({name:ae.name,short:Le,visible:Je,inFlight:gt,delayed:0,processed:Jt,oldestSec:0,concurrency:ae.concurrency??y?.queueConcurrency??"—",tries:y?.queueTries??3,visTimeout:(y?.queueTimeout??120)*6,dlq:de})}if(Ee.length)C.queues=Ee;if(Re.length)C.queuesDetail=Re;C.dlqItems=[]}catch{}try{let ce=new f(a),{Stacks:Ee}=await ce.describeStacks({stackName:qt(e,t)}),Re={};for(let de of Ee?.[0]?.Outputs??[])if(de.OutputKey)Re[de.OutputKey]=de.OutputValue??"";if(y?.database?.connection==="aurora-serverless"){let de=`${r.slug}-${t}-db`,Me=[{Name:"DBClusterIdentifier",Value:de}],[ae,Le]=await Promise.all([Za(l,"AWS/RDS","ServerlessDatabaseCapacity",Me,"Average",R,S),Za(l,"AWS/RDS","DatabaseConnections",Me,"Maximum",R,S)]);if(C.aurora={id:de,engine:"aurora-mysql",minAcu:y?.database?.minCapacity??0.5,maxAcu:y?.database?.maxCapacity??4,currentAcu:ae?Number(ae.toFixed(1)):y?.database?.minCapacity??0.5,database:"app",connections:Math.round(Le),status:Re.DbEndpoint?"available":"creating"},y?.rdsProxy)C.proxy={name:`${r.slug}-${t}-proxy`,endpoint:Re.DbProxyEndpoint??"—",pooledConns:Math.round(Le),status:"available"}}if(y?.cache?.driver==="elasticache"){let de=`${r.slug}-${t}-cache`,Me=[{Name:"CacheClusterId",Value:`${de}-001`}],[ae,Le]=await Promise.all([Za(l,"AWS/ElastiCache","CacheHits",Me,"Sum",R,S),Za(l,"AWS/ElastiCache","CacheMisses",Me,"Sum",R,S)]),Je=ae+Le>0?Number((ae/(ae+Le)*100).toFixed(1)):0;C.redis={id:de,node:"cache.t4g.micro",engine:"redis",hitRate:Je,status:Re.CacheEndpoint?"available":"creating"}}if(y?.efs){let de=0;try{if(Re.EfsFileSystemId){let Me=new dr(a),{FileSystems:ae}=await Me.describeFileSystems({FileSystemId:Re.EfsFileSystemId});de=Number(((ae?.[0]?.SizeInBytes?.Value??0)/1048576).toFixed(1))}}catch{}C.efs={id:Re.EfsFileSystemId??"efs",mount:"/mnt/local",sizeMb:de,status:"available"}}C.assetsInfo=Re.AssetsCdnDomain?{bucket:Re.AssetsBucketName??`${r.slug}-${t}-assets`,cdn:Re.AssetsCdnDomain,customDomain:y?.assetDomain??"—",assetUrl:r.assetUrl??"—",files:0,sizeMb:0,cacheHitPct:0,build:C.app.build}:void 0}catch{}if(C.assetsInfo)try{let Ee=await new o(a).list({bucket:C.assetsInfo.bucket,maxKeys:1000});C.assetsInfo.files=Ee.length,C.assetsInfo.sizeMb=Number((Ee.reduce((Re,de)=>Re+(de.Size??0),0)/1048576).toFixed(1)),C.assetsRecent=Ee.slice(0,8).map((Re)=>({path:`/${Re.Key}`,size:`${Math.max(1,Math.round((Re.Size??0)/1024))} KB`,type:Re.Key.split(".").pop()??""}))}catch{}try{if(y?.secrets){let ce=Array.isArray(y.secrets)?y.secrets.map((Ee)=>({key:Ee.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),source:Ee})):Object.entries(y.secrets).map(([Ee,Re])=>({key:Ee,source:String(Re)}));C.secretsList=ce.map((Ee)=>({...Ee,updated:"—"}))}}catch{}try{let ce=new o(a),Ee=`${r.slug}-${t}-deployments`,Re=await ce.getObjectJson(Ee,`deployments/${r.slug}/${t}/history.json`).catch(()=>null);if(Re?.records?.length)C.deploymentsDetail=Re.records.slice(-12).reverse().map((de)=>({sha:(de.sha??"").slice(0,7),status:de.status??"success",when:de.timestamp??"—",took:de.took??"—",by:de.by??"—",version:de.version??"—",hooks:de.hooks??[]}))}catch{}C.metricsTotals={invocations:C.metrics.invocations,errors:Math.round(j),errorRatePct:te,p95Ms:C.metrics.p95Ms,throttles:W.reduce((ce,Ee)=>ce+Ee.throttles,0),coldStartPct:void 0,estCostUsd:void 0,concurrency:le},C.metricsPerFn=W.map((ce)=>({key:ce.key,invocations:ce.invocations,errors:ce.errors,throttles:ce.throttles,avgMs:ce.p50,maxMs:ce.p99,costUsd:void 0}));try{C.invSpark=await l.getMetricSeries({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:[{Name:"FunctionName",Value:r.functions.find((ce)=>ce.mode==="http")?.name??""}],StartTime:new Date(S.getTime()-86400000),EndTime:S,Period:3600,Stat:"Sum"})}catch{}try{let ce=new ms,Ee=S,Re=new Date(Date.UTC(Ee.getUTCFullYear(),Ee.getUTCMonth(),1)),de=new Date(Date.UTC(Ee.getUTCFullYear(),Ee.getUTCMonth()-1,1)),[Me,ae]=await Promise.all([ce.getCostByService({start:As(Re),end:As(Ee),granularity:"MONTHLY"}).catch(()=>[]),ce.getCostByService({start:As(de),end:As(Re),granularity:"MONTHLY"}).catch(()=>[])]);if(Me.length){let Le=Me.reduce((lt,G)=>lt+G.amount,0),Je=ae.reduce((lt,G)=>lt+G.amount,0),gt=Ee.getUTCDate(),Jt=new Date(Date.UTC(Ee.getUTCFullYear(),Ee.getUTCMonth()+1,0)).getUTCDate();C.costSummary={monthToDateUsd:Number(Le.toFixed(2)),projectedUsd:Number((Le/gt*Jt).toFixed(2)),lastMonthUsd:Number(Je.toFixed(2)),dailyAvgUsd:Number((Le/gt).toFixed(2))},C.costServices=Me.filter((lt)=>lt.amount>0).sort((lt,G)=>G.amount-lt.amount).slice(0,12).map((lt)=>({name:lt.service,usd:Number(lt.amount.toFixed(2)),note:""})),C.metrics.estCostUsd=Number((Le/gt).toFixed(2)),C.metricsTotals.estCostUsd=C.metrics.estCostUsd,C.costTrend=await ce.getDailyTotals({start:As(Re),end:As(Ee)}).catch(()=>[]);let ot=Me.find((lt)=>/lambda/i.test(lt.service))?.amount??0,Pt=(lt)=>lt.invocations*(lt.p50/1000)*(lt.memory/1024),Qt=W.reduce((lt,G)=>lt+Pt(G),0)||1;C.costPerFn=W.map((lt)=>({key:lt.key,requests:lt.invocations,gbSec:Math.round(Pt(lt)),usd:Number((ot*(Pt(lt)/Qt)).toFixed(2))}))}}catch{}if(y?.firewall)try{let ce=await l.getMetricStatistics({Namespace:"AWS/WAFV2",MetricName:"BlockedRequests",StartTime:R,EndTime:S,Period:86400,Statistics:["Sum"]}).catch(()=>[]),Ee=await l.getMetricStatistics({Namespace:"AWS/WAFV2",MetricName:"AllowedRequests",StartTime:R,EndTime:S,Period:86400,Statistics:["Sum"]}).catch(()=>[]);C.waf={enabled:!0,scope:"REGIONAL",acl:`${r.slug}-${t}-waf`,allowed24h:Math.round(Ee.reduce((Re,de)=>Re+(de.Sum??0),0)),blocked24h:Math.round(ce.reduce((Re,de)=>Re+(de.Sum??0),0))};try{let Re=new op(a),de=await Re.listWebACLs("REGIONAL"),Me=de.find((ae)=>ae.Name?.includes(`${r.slug}-${t}`))??de[0];if(Me?.Name&&Me.Id){C.waf.acl=Me.Name;let ae=await Re.getWebACLRules(Me.Name,Me.Id,"REGIONAL");if(ae.length)C.wafRules=ae.map((Le)=>({name:Le.Name??"—",detail:`priority ${Le.Priority??0}`,action:Le.Action??"count",blocked24h:0}))}}catch{}}catch{}let X=[];if(C.aurora)X.push({name:"Aurora Serverless v2",detail:`${C.aurora.id} · ${C.aurora.minAcu}-${C.aurora.maxAcu} ACU`,status:C.aurora.status});if(C.proxy)X.push({name:"RDS Proxy",detail:C.proxy.name,status:C.proxy.status});if(C.redis)X.push({name:`ElastiCache (${C.redis.engine})`,detail:`${C.redis.node} · ${C.redis.hitRate}% hit rate`,status:C.redis.status});if(C.efs)X.push({name:"EFS",detail:`${C.efs.mount} · ${C.efs.sizeMb} MB`,status:C.efs.status});if(X.length)C.dataServices=X;if(r.scheduler!=="off"&&y?.kind==="php")try{let ce=await tt(e,t,"schedule:list"),Ee=[];for(let Re of(ce||"").split(`
|
|
41
|
-
`)){let de=/^\s*([\d*/,\-\s]+?)\s{2,}(.+?)(?:\s{2,}Next Due.*)?$/.exec(Re);if(de&&/[*\d]/.test(de[1])&&de[1].trim().split(/\s+/).length===5)Ee.push({command:de[2].trim().replace(/^php artisan /,""),cron:de[1].trim(),desc:"",lastRun:"—",lastStatus:"ok"})}if(Ee.length)C.schedulerTasks=Ee}catch{}return C.topology=ts(C,{project:e.project.name,environment:t}),C}function Mi(e){let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function fk(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;let t=Date.parse(`${e}T12:00:00.000Z`);return Number.isFinite(t)?new Date(t).toISOString():null}function mu(e,t){if(!e||typeof e!=="object")return[];let r={source:t.name},a=[],l=t.now,m=(y,C,T,j=l)=>{if(C!==null)a.push({name:y,value:C,unit:T,timestamp:j,attributes:r})};m("storage.egress.month",Mi(e.monthBytes),"bytes"),m("storage.egress.today",Mi(e.todayBytes),"bytes"),m("storage.egress.projected_month",Mi(e.projectedMonthBytes),"bytes");let h=Mi(e.budgetBytes);if(h!==null&&h>0){m("storage.egress.budget",h,"bytes");let y=e.budgetUsedPercent,C=typeof y==="number"&&Number.isFinite(y)?y:Mi(e.monthBytes)!==null?Math.round(Mi(e.monthBytes)/h*1000)/10:null;m("storage.egress.budget_used_percent",C,"percent")}let S=t.maxReplayDays??45,R=Array.isArray(e.days)?e.days.slice(-S):[];for(let y of R){let C=fk(String(y?.date??"")),T=Mi(y?.bytes);if(!C||T===null)continue;a.push({name:"storage.egress.day",value:T,unit:"bytes",timestamp:C,attributes:r});let j=Mi(y?.downloads);if(j!==null)a.push({name:"storage.egress.day_downloads",value:j,unit:"count",timestamp:C,attributes:r})}return a}async function hu(e,t=process.env,r=fetch){let a=e.tokenEnv?t[e.tokenEnv]:void 0,l=await r(e.url,{headers:a?{Authorization:`Bearer ${a}`}:{},signal:AbortSignal.timeout(1e4)});if(!l.ok)throw Error(`HTTP ${l.status}`);return await l.json()}async function ba(e,t){let r=[],a=[];if(!Array.isArray(e)||e.length===0)return{metrics:r,errors:a};let l=await Promise.all(e.map(async(m)=>{if(!m?.name||!m?.url)return{endpoint:m,error:"egress endpoint needs both a name and a url"};try{let h=await hu(m,t.env,t.fetchImpl);return{endpoint:m,report:h}}catch(h){return{endpoint:m,error:h instanceof Error?h.message:String(h)}}}));for(let m of l){let h=`egress:${m.endpoint?.name??"unnamed"}`;if("error"in m&&m.error){a.push({source:h,message:m.error});continue}r.push(...mu(m.report,{name:m.endpoint.name,now:t.now}))}return{metrics:r,errors:a}}import{createHash as D_}from"node:crypto";import{existsSync as Ai,mkdtempSync as km,readdirSync as QS,rmSync as bs,statSync as aw}from"node:fs";import{readFile as ii,writeFile as ys}from"node:fs/promises";import{tmpdir as Wu}from"node:os";import{dirname as O_,extname as Ec,join as Ut,normalize as $_,relative as N_,resolve as j_,sep as B_}from"node:path";import{fileURLToPath as M_}from"node:url";class Fo extends Error{status;code;requestId;constructor(e,t,r,a){super(r);this.status=e;this.code=t;this.requestId=a}}class hl{options;baseUrl;fetchFn;constructor(e){this.options=e;this.baseUrl=e.baseUrl.replace(/\/$/,""),this.fetchFn=e.fetch??fetch}async request(e,t={}){let r=await this.fetchFn(`${this.baseUrl}${e}`,{...t,headers:{accept:"application/json",authorization:`Bearer ${this.options.token}`,...t.headers}}),a=await r.json().catch(()=>({}));if(!r.ok)throw new Fo(r.status,a.error?.code??"api_error",a.error?.message??"API request failed.",a.error?.requestId??r.headers.get("x-request-id")??void 0);return a}listProjects(e={}){return this.request(`/api/v1/projects?${new URLSearchParams(Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).map(([t,r])=>[t,String(r)])))}`)}listEnvironments(e,t={}){return this.request(`/api/v1/projects/${encodeURIComponent(e)}/environments?${new URLSearchParams(Object.fromEntries(Object.entries(t).filter(([,r])=>r!==void 0).map(([r,a])=>[r,String(a)])))}`)}listServices(e,t){return this.request(`/api/v1/services?${new URLSearchParams({projectId:e,...t?{environmentId:t}:{}})}`)}listOperations(e){return this.request(`/api/v1/operations${e?`?projectId=${encodeURIComponent(e)}`:""}`)}listComposeTemplates(){return this.request("/api/v1/compose-templates")}listComposeApplications(e,t){return this.request(`/api/v1/compose-applications?${new URLSearchParams({projectId:e,...t?{environmentId:t}:{}})}`)}previewCompose(e){return this.request("/api/v1/compose-applications/preview",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createComposeApplication(e){return this.request("/api/v1/compose-applications",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}composeServices(e){return this.request(`/api/v1/compose-applications/${encodeURIComponent(e)}/services`)}composeAction(e,t,r={}){return this.request(`/api/v1/compose-applications/${encodeURIComponent(e)}/${t}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r)})}releaseCapabilities(e,t={}){return this.request(`/api/v1/releases/capabilities?${new URLSearchParams({kind:e,health:String(!!t.health),replicas:String(t.replicas??1)})}`)}listReleases(e,t={}){return this.request(`/api/v1/releases?${new URLSearchParams({projectId:e,...t})}`)}createReleaseArtifact(e){return this.request("/api/v1/release-artifacts",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createRelease(e){return this.request("/api/v1/releases",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}releaseAction(e,t,r={}){return this.request(`/api/v1/releases/${encodeURIComponent(e)}/${t}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r)})}createDeployment(e,t){return this.request("/api/v1/deployments",{method:"POST",headers:{"content-type":"application/json","idempotency-key":t},body:JSON.stringify(e)})}detectApplication(e){return this.request("/api/v1/application-detections",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}planApplication(e){return this.request("/api/v1/application-plans",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}listApplicationDrafts(e){return this.request(`/api/v1/application-drafts?projectId=${encodeURIComponent(e)}`)}createApplicationDraft(e){return this.request("/api/v1/application-drafts",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}updateApplicationDraft(e){return this.request("/api/v1/application-drafts",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createApplication(e,t){return this.request("/api/v1/applications",{method:"POST",headers:{"content-type":"application/json","idempotency-key":t},body:JSON.stringify(e)})}uploadApplicationArtifact(e,t,r){return this.request("/api/v1/application-artifacts",{method:"POST",headers:{"content-type":"application/octet-stream","x-project-id":e,"x-artifact-filename":t},body:r})}listRegistryConnections(){return this.request("/api/v1/registry-connections")}createRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}updateRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}disconnectRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({id:e})})}listQueue(e={}){let t=new URLSearchParams(Object.entries(e).filter(([,r])=>r!==void 0).map(([r,a])=>[r,String(a)]));return this.request(`/api/v1/queue?${t}`)}operationLogs(e,t={}){let r=new URLSearchParams(Object.entries(t).filter(([,a])=>a!==void 0).map(([a,l])=>[a,String(l)]));return this.request(`/api/v1/operations/${encodeURIComponent(e)}/logs?${r}`)}streamOperationLogs(e,t=0){return this.fetchFn(`${this.baseUrl}/api/v1/operations/${encodeURIComponent(e)}/logs/stream`,{headers:{accept:"text/event-stream",authorization:`Bearer ${this.options.token}`,"last-event-id":String(t)}})}cancelOperation(e){return this.request(`/api/v1/operations/${encodeURIComponent(e)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"})}retryOperation(e,t,r=0){return this.request(`/api/v1/operations/${encodeURIComponent(e)}/retry`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({errorClass:t,delayMs:r})})}queueSettings(){return this.request("/api/v1/queue/settings")}updateQueueSettings(e){return this.request("/api/v1/queue/settings",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"update queue limits",concurrency:e})})}listPreviews(e){return this.request(`/api/v1/previews${e?`?projectId=${encodeURIComponent(e)}`:""}`)}listPreviewDefinitions(e){return this.request(`/api/v1/preview-definitions?projectId=${encodeURIComponent(e)}`)}createPreviewDefinition(e){return this.request("/api/v1/preview-definitions",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createPreview(e){return this.request("/api/v1/previews",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}destroyPreview(e,t){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/destroy`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:t})})}extendPreview(e,t){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/extend`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({hours:t})})}rebuildPreview(e){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/rebuild`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"})}usage(e={}){let t=new URLSearchParams;for(let[r,a]of Object.entries(e))if(a)t.set(r,String(a));return this.request(`/api/v1/usage${t.size>0?`?${t}`:""}`)}usageRollups(e){let t=new URLSearchParams({from:e.from,to:e.to});if(e.projectId)t.set("projectId",e.projectId);if(e.environmentId)t.set("environmentId",e.environmentId);if(e.limit)t.set("limit",String(e.limit));for(let r of e.meters??[])t.append("meter",r);return this.request(`/api/v1/usage/rollups?${t}`)}allowance(e="deploy",t={}){let r=new URLSearchParams({operation:e});if(t.projectId)r.set("projectId",t.projectId);if(t.environmentId)r.set("environmentId",t.environmentId);return this.request(`/api/v1/spend/allowance?${r}`)}budgets(e={}){let t=new URLSearchParams;for(let[r,a]of Object.entries(e))if(a)t.set(r,String(a));return this.request(`/api/v1/spend/budgets${t.size>0?`?${t}`:""}`)}anomalies(e={}){let t=new URLSearchParams;if(e.projectId)t.set("projectId",e.projectId);if(e.since)t.set("since",e.since);if(e.unacknowledged)t.set("unacknowledged","true");return this.request(`/api/v1/spend/anomalies${t.size>0?`?${t}`:""}`)}}import{createHash as iI}from"node:crypto";import{lstatSync as hk,readdirSync as yk,readFileSync as vk}from"node:fs";import{relative as bk,resolve as hf,sep as Sk}from"node:path";function wk(e){return new Map(e.map((t)=>[t.path.replace(/^\.\//,"").replace(/\\/g,"/"),t]))}function Ro(e,t,r){return{path:e,reason:t,weight:r}}function yf(e){try{return e?.content?JSON.parse(e.content):{}}catch{return{}}}function Cs(e,t,r,a,l,m){return{framework:e,strategy:t,confidence:r,evidence:a,defaults:{build:l,runtime:{target:t==="static"?"serverless":t==="serverless"?"serverless":t==="dockerfile"||t==="prebuilt_image"?"container":"server",architecture:"x86_64",port:t==="static"||t==="serverless"?void 0:3000,healthCheck:t==="static"?void 0:{protocol:"http",path:"/health"}}},description:m}}function _s(e){let t=wk(e.slice(0,1e4)),r=[];if(t.has("Dockerfile"))r.push(Cs("dockerfile","dockerfile",0.99,[Ro("Dockerfile","A root Dockerfile defines an explicit reproducible build.",1)],{kind:"dockerfile",context:".",dockerfile:"Dockerfile"},"Build the repository with its Dockerfile and run the resulting OCI image."));let a=yf(t.get("composer.json"));if(t.has("artisan")&&a.require?.["laravel/framework"])r.push(Cs("laravel","server",0.98,[Ro("artisan","Laravel Artisan entrypoint is present.",0.45),Ro("composer.json","Requires laravel/framework.",0.55)],{kind:"server",runtime:"php",runtimeVersion:"8.3",installCommand:"composer install --no-dev --prefer-dist --optimize-autoloader",buildCommand:"php artisan config:cache && php artisan route:cache && php artisan view:cache",startCommand:"php artisan serve --host=0.0.0.0 --port=$PORT"},"Install a production Composer tree, warm Laravel caches, and run the HTTP application."));else if(t.has("composer.json"))r.push(Cs("php","server",0.82,[Ro("composer.json","Composer metadata identifies a PHP application.",0.8)],{kind:"server",runtime:"php",runtimeVersion:"8.3",installCommand:"composer install --no-dev --prefer-dist --optimize-autoloader",startCommand:"php -S 0.0.0.0:$PORT -t public"},"Install Composer dependencies and run the configured PHP document root."));let l=yf(t.get("package.json"));if(t.has("package.json")){let m=t.has("bun.lock")||t.has("bun.lockb")||l.engines?.bun,h=m?"bun":"node",S=m?"bun":"node",R=[Ro("package.json",`Defines ${l.scripts?.build?"build and ":""}${l.scripts?.start?"start ":""}scripts.`,0.55)];if(m)R.push(Ro(t.has("bun.lock")?"bun.lock":t.has("bun.lockb")?"bun.lockb":"package.json","Pins the Bun package manager/runtime.",0.35));let y=!!(l.dependencies?.vite||l.devDependencies?.vite||l.dependencies?.["@stacksjs/bunpress"]||l.devDependencies?.["@stacksjs/bunpress"])&&!l.scripts?.start,C=y?{kind:"static",installCommand:`${h} install --frozen-lockfile`,buildCommand:`${h} run build`,publishDirectory:"dist"}:{kind:"server",runtime:h,installCommand:`${h} install --frozen-lockfile`,buildCommand:l.scripts?.build?`${h} run build`:void 0,startCommand:l.scripts?.start?`${h} run start`:h==="bun"?"bun run index.ts":"node index.js"};r.push(Cs(S,C.kind,Math.min(0.94,R.reduce((T,j)=>T+j.weight,0)),R,C,y?"Install dependencies, build static assets, and publish the output directory.":`Install dependencies, build if configured, and start the ${h} server.`))}if(!r.length&&(t.has("index.html")||t.has("public/index.html")))r.push(Cs("static","static",0.78,[Ro(t.has("index.html")?"index.html":"public/index.html","A static HTML entrypoint is present.",0.78)],{kind:"static",publishDirectory:t.has("index.html")?".":"public"},"Publish the static directory without a runtime process."));if(!r.length)r.push(Cs("unknown","buildpack",0.2,[],{kind:"buildpack",runtime:"node"},"No supported framework signature was conclusive; choose commands and runtime manually."));return r.sort((m,h)=>h.confidence-m.confidence||m.framework.localeCompare(h.framework))}function ap(e,t={}){let r=hf(e),a=t.maxFiles??1e4,l=t.maxContentBytes??262144,m=[],h=new Set(["Dockerfile","package.json","composer.json","index.html","public/index.html","bun.lock","bun.lockb","artisan"]),S=new Set([".git",".ts-cloud",".cache",".next",".nuxt",".output",".turbo",".bun","node_modules","vendor","pantry","dist","build","coverage"]),R=(y)=>{for(let C of yk(y).sort()){if(S.has(C))continue;let T=hf(y,C),j=bk(r,T).split(Sk).join("/");if(!j||j.startsWith("../"))throw Error("Detection path escaped the application root");let B=hk(T);if(B.isSymbolicLink())throw Error(`Detection refuses symbolic links: ${j}`);if(B.isDirectory())R(T);else if(B.isFile()){if(m.length>=a)throw Error("Application file-count limit exceeded");let V={path:j,size:B.size};if(h.has(j)&&B.size<=l)V.content=vk(T,"utf8");m.push(V)}}};return R(r),m}function dp(e){if(Array.isArray(e))return`[${e.map(dp).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${dp(r)}`).join(",")}}`;return JSON.stringify(e)??"null"}function Xa(e){return!!e&&!e.startsWith("/")&&!e.split("/").includes("..")&&!/[\0\r\n]/.test(e)}function In(e,t,r,a){return{path:e,code:t,message:r,alternatives:a}}function cp(e){return JSON.parse(JSON.stringify(e))}function kk(e){let t=Object.fromEntries(Object.entries(e.environment??{}).map(([r,a])=>[r,typeof a==="string"?a:`\${${a.secretRef}}`]));if(e.build.kind==="prebuilt_image"||e.build.kind==="dockerfile")return cp({infrastructure:{containers:{[e.slug]:{source:e.source,build:e.build,port:e.runtime.port,cpu:e.runtime.cpu,memory:e.runtime.memoryMb,architecture:e.runtime.architecture,healthCheck:e.runtime.healthCheck,environment:t}}}});if(e.runtime.target==="serverless"||e.build.kind==="serverless")return cp({serverless:{apps:{[e.slug]:{source:e.source,build:e.build,architecture:e.runtime.architecture,environment:t,domain:e.domain}}}});return cp({sites:{[e.slug]:{source:e.source,build:e.build,port:e.runtime.port,architecture:e.runtime.architecture,healthCheck:e.runtime.healthCheck,env:t,domain:e.domain?.hostname}}})}function qn(e,t=[]){let r=[],a=(V)=>/(?:secret|token|password|passwd|private[_-]?key|api[_-]?key)/i.test(V),l=Object.fromEntries(Object.entries(e.environment??{}).map(([V,W])=>{if(typeof W==="string"&&a(V))return r.push(In(`environment.${V}`,"write_only_secret_required",`${V} must be supplied through the write-only secrets boundary.`)),[V,{secretRef:V}];return[V,W]})),m=e.build;if(e.build.kind==="dockerfile"&&e.build.buildArgs){let V=Object.fromEntries(Object.entries(e.build.buildArgs).map(([W,Y])=>{if(a(W))return r.push(In(`build.buildArgs.${W}`,"write_only_build_secret_required",`${W} must be declared in secretNames instead of buildArgs.`)),[W,"[REDACTED]"];return[W,Y]}));m={...e.build,buildArgs:V}}if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.slug))r.push(In("slug","invalid_slug","Slug must contain 2-63 lowercase letters, numbers, or hyphens."));if(!Xa((e.source.kind==="git"?e.source.monorepoRoot:e.source.kind==="local"?e.source.root:".")??"."))r.push(In("source","unsafe_source_root","Source root must stay inside the source tree."));if(e.source.kind==="git"&&e.source.sparsePaths?.some((V)=>!Xa(V)))r.push(In("source.sparsePaths","unsafe_sparse_path","Sparse checkout paths must stay inside the repository."));if(e.build.kind==="dockerfile"&&(!Xa(e.build.context)||!Xa(e.build.dockerfile)))r.push(In("build","unsafe_docker_path","Docker context and Dockerfile must stay inside the source tree."));if(e.build.kind==="static"&&!Xa(e.build.publishDirectory))r.push(In("build.publishDirectory","invalid_publish_directory","A safe static publish directory is required."));if(e.build.kind==="server"&&!e.build.startCommand.trim())r.push(In("build.startCommand","missing_start_command","A server start command is required.",["Use static output","Use a Dockerfile"]));if(e.source.kind==="image"&&e.build.kind!=="prebuilt_image")r.push(In("build.kind","image_requires_prebuilt","An OCI image source must use the prebuilt-image strategy.",["Select prebuilt image"]));if(e.build.kind==="prebuilt_image"&&e.runtime.target!=="container")r.push(In("runtime.target","image_requires_container","Prebuilt images require the container runtime target.",["Select container target"]));if(e.runtime.target==="serverless"&&e.build.kind==="dockerfile")r.push(In("runtime.target","unsupported_serverless_dockerfile","Dockerfile builds currently target the container service path.",["Select container target","Select serverless package"]));if(e.runtime.port!==void 0&&(!Number.isInteger(e.runtime.port)||e.runtime.port<1||e.runtime.port>65535))r.push(In("runtime.port","invalid_port","Port must be an integer from 1 to 65535."));let h=e.runtime.healthCheck;if(h&&h.protocol!=="tcp"&&(!h.path||!h.path.startsWith("/")||/[\r\n]/.test(h.path)))r.push(In("runtime.healthCheck.path","invalid_health_path","HTTP health checks require a path beginning with /."));if(e.domain?.hostname&&(!/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i.test(e.domain.hostname)||e.domain.hostname.includes("..")))r.push(In("domain.hostname","invalid_domain","Domain must be a valid DNS hostname."));let S=Object.values(l).flatMap((V)=>typeof V==="object"?[V.secretRef]:[]),R=[...new Set([...e.requiredSecretNames??[],...e.build.kind==="dockerfile"?e.build.secretNames??[]:[],...S])].sort(),y=new Set(t),C=R.filter((V)=>!y.has(V)),T={apiVersion:"ts-cloud.dev/v1",kind:"Application",metadata:{name:e.name,slug:e.slug,projectId:e.projectId,environmentId:e.environmentId},spec:{source:e.source,build:m,runtime:e.runtime,environment:l,domain:e.domain}},j=[...new Set([e.source.kind==="git"?"git:read":e.source.kind==="image"?"registry:pull":e.source.kind==="artifact"?"artifact:inspect":"filesystem:read",e.runtime.target==="container"?"containers":e.runtime.target==="serverless"?"serverless":"servers",e.domain?"dns":""])].filter(Boolean).sort(),B=[...new Set([e.runtime.target,e.runtime.cpu?`${e.runtime.cpu} vCPU`:"",e.runtime.memoryMb?`${e.runtime.memoryMb} MB memory`:"",(e.runtime.minInstances??0)>0?`${e.runtime.minInstances} minimum instances`:"scales from zero where supported",e.domain?"managed DNS/TLS":""])].filter(Boolean);return{valid:r.length===0&&C.length===0,issues:r,missingSecrets:C,manifest:T,configPatch:kk({...e,build:m,environment:l}),capabilityRequirements:j,costDrivers:B,serializedManifest:`${dp(T)}
|
|
41
|
+
`)){let de=/^\s*([\d*/,\-\s]+?)\s{2,}(.+?)(?:\s{2,}Next Due.*)?$/.exec(Re);if(de&&/[*\d]/.test(de[1])&&de[1].trim().split(/\s+/).length===5)Ee.push({command:de[2].trim().replace(/^php artisan /,""),cron:de[1].trim(),desc:"",lastRun:"—",lastStatus:"ok"})}if(Ee.length)C.schedulerTasks=Ee}catch{}return C.topology=ts(C,{project:e.project.name,environment:t}),C}function Mi(e){let t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function fk(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;let t=Date.parse(`${e}T12:00:00.000Z`);return Number.isFinite(t)?new Date(t).toISOString():null}function mu(e,t){if(!e||typeof e!=="object")return[];let r={source:t.name},a=[],l=t.now,m=(y,C,T,j=l)=>{if(C!==null)a.push({name:y,value:C,unit:T,timestamp:j,attributes:r})};m("storage.egress.month",Mi(e.monthBytes),"bytes"),m("storage.egress.today",Mi(e.todayBytes),"bytes"),m("storage.egress.projected_month",Mi(e.projectedMonthBytes),"bytes");let h=Mi(e.budgetBytes);if(h!==null&&h>0){m("storage.egress.budget",h,"bytes");let y=e.budgetUsedPercent,C=typeof y==="number"&&Number.isFinite(y)?y:Mi(e.monthBytes)!==null?Math.round(Mi(e.monthBytes)/h*1000)/10:null;m("storage.egress.budget_used_percent",C,"percent")}let S=t.maxReplayDays??45,R=Array.isArray(e.days)?e.days.slice(-S):[];for(let y of R){let C=fk(String(y?.date??"")),T=Mi(y?.bytes);if(!C||T===null)continue;a.push({name:"storage.egress.day",value:T,unit:"bytes",timestamp:C,attributes:r});let j=Mi(y?.downloads);if(j!==null)a.push({name:"storage.egress.day_downloads",value:j,unit:"count",timestamp:C,attributes:r})}return a}async function hu(e,t=process.env,r=fetch){let a=e.tokenEnv?t[e.tokenEnv]:void 0,l=await r(e.url,{headers:a?{Authorization:`Bearer ${a}`}:{},signal:AbortSignal.timeout(1e4)});if(!l.ok)throw Error(`HTTP ${l.status}`);return await l.json()}async function ba(e,t){let r=[],a=[];if(!Array.isArray(e)||e.length===0)return{metrics:r,errors:a};let l=await Promise.all(e.map(async(m)=>{if(!m?.name||!m?.url)return{endpoint:m,error:"egress endpoint needs both a name and a url"};try{let h=await hu(m,t.env,t.fetchImpl);return{endpoint:m,report:h}}catch(h){return{endpoint:m,error:h instanceof Error?h.message:String(h)}}}));for(let m of l){let h=`egress:${m.endpoint?.name??"unnamed"}`;if("error"in m&&m.error){a.push({source:h,message:m.error});continue}r.push(...mu(m.report,{name:m.endpoint.name,now:t.now}))}return{metrics:r,errors:a}}import{createHash as O_}from"node:crypto";import{existsSync as Ai,mkdtempSync as km,readdirSync as QS,rmSync as bs,statSync as aw}from"node:fs";import{readFile as ii,writeFile as ys}from"node:fs/promises";import{tmpdir as Wu}from"node:os";import{dirname as $_,extname as Ec,join as Ut,normalize as N_,relative as j_,resolve as B_,sep as M_}from"node:path";import{fileURLToPath as L_}from"node:url";class Fo extends Error{status;code;requestId;constructor(e,t,r,a){super(r);this.status=e;this.code=t;this.requestId=a}}class hl{options;baseUrl;fetchFn;constructor(e){this.options=e;this.baseUrl=e.baseUrl.replace(/\/$/,""),this.fetchFn=e.fetch??fetch}async request(e,t={}){let r=await this.fetchFn(`${this.baseUrl}${e}`,{...t,headers:{accept:"application/json",authorization:`Bearer ${this.options.token}`,...t.headers}}),a=await r.json().catch(()=>({}));if(!r.ok)throw new Fo(r.status,a.error?.code??"api_error",a.error?.message??"API request failed.",a.error?.requestId??r.headers.get("x-request-id")??void 0);return a}listProjects(e={}){return this.request(`/api/v1/projects?${new URLSearchParams(Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).map(([t,r])=>[t,String(r)])))}`)}listEnvironments(e,t={}){return this.request(`/api/v1/projects/${encodeURIComponent(e)}/environments?${new URLSearchParams(Object.fromEntries(Object.entries(t).filter(([,r])=>r!==void 0).map(([r,a])=>[r,String(a)])))}`)}listServices(e,t){return this.request(`/api/v1/services?${new URLSearchParams({projectId:e,...t?{environmentId:t}:{}})}`)}listOperations(e){return this.request(`/api/v1/operations${e?`?projectId=${encodeURIComponent(e)}`:""}`)}listComposeTemplates(){return this.request("/api/v1/compose-templates")}listComposeApplications(e,t){return this.request(`/api/v1/compose-applications?${new URLSearchParams({projectId:e,...t?{environmentId:t}:{}})}`)}previewCompose(e){return this.request("/api/v1/compose-applications/preview",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createComposeApplication(e){return this.request("/api/v1/compose-applications",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}composeServices(e){return this.request(`/api/v1/compose-applications/${encodeURIComponent(e)}/services`)}composeAction(e,t,r={}){return this.request(`/api/v1/compose-applications/${encodeURIComponent(e)}/${t}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r)})}releaseCapabilities(e,t={}){return this.request(`/api/v1/releases/capabilities?${new URLSearchParams({kind:e,health:String(!!t.health),replicas:String(t.replicas??1)})}`)}listReleases(e,t={}){return this.request(`/api/v1/releases?${new URLSearchParams({projectId:e,...t})}`)}createReleaseArtifact(e){return this.request("/api/v1/release-artifacts",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createRelease(e){return this.request("/api/v1/releases",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}releaseAction(e,t,r={}){return this.request(`/api/v1/releases/${encodeURIComponent(e)}/${t}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r)})}createDeployment(e,t){return this.request("/api/v1/deployments",{method:"POST",headers:{"content-type":"application/json","idempotency-key":t},body:JSON.stringify(e)})}detectApplication(e){return this.request("/api/v1/application-detections",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}planApplication(e){return this.request("/api/v1/application-plans",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}listApplicationDrafts(e){return this.request(`/api/v1/application-drafts?projectId=${encodeURIComponent(e)}`)}createApplicationDraft(e){return this.request("/api/v1/application-drafts",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}updateApplicationDraft(e){return this.request("/api/v1/application-drafts",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createApplication(e,t){return this.request("/api/v1/applications",{method:"POST",headers:{"content-type":"application/json","idempotency-key":t},body:JSON.stringify(e)})}uploadApplicationArtifact(e,t,r){return this.request("/api/v1/application-artifacts",{method:"POST",headers:{"content-type":"application/octet-stream","x-project-id":e,"x-artifact-filename":t},body:r})}listRegistryConnections(){return this.request("/api/v1/registry-connections")}createRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}updateRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}disconnectRegistryConnection(e){return this.request("/api/v1/registry-connections",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({id:e})})}listQueue(e={}){let t=new URLSearchParams(Object.entries(e).filter(([,r])=>r!==void 0).map(([r,a])=>[r,String(a)]));return this.request(`/api/v1/queue?${t}`)}operationLogs(e,t={}){let r=new URLSearchParams(Object.entries(t).filter(([,a])=>a!==void 0).map(([a,l])=>[a,String(l)]));return this.request(`/api/v1/operations/${encodeURIComponent(e)}/logs?${r}`)}streamOperationLogs(e,t=0){return this.fetchFn(`${this.baseUrl}/api/v1/operations/${encodeURIComponent(e)}/logs/stream`,{headers:{accept:"text/event-stream",authorization:`Bearer ${this.options.token}`,"last-event-id":String(t)}})}cancelOperation(e){return this.request(`/api/v1/operations/${encodeURIComponent(e)}/cancel`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"})}retryOperation(e,t,r=0){return this.request(`/api/v1/operations/${encodeURIComponent(e)}/retry`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({errorClass:t,delayMs:r})})}queueSettings(){return this.request("/api/v1/queue/settings")}updateQueueSettings(e){return this.request("/api/v1/queue/settings",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"update queue limits",concurrency:e})})}listPreviews(e){return this.request(`/api/v1/previews${e?`?projectId=${encodeURIComponent(e)}`:""}`)}listPreviewDefinitions(e){return this.request(`/api/v1/preview-definitions?projectId=${encodeURIComponent(e)}`)}createPreviewDefinition(e){return this.request("/api/v1/preview-definitions",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}createPreview(e){return this.request("/api/v1/previews",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}destroyPreview(e,t){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/destroy`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:t})})}extendPreview(e,t){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/extend`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({hours:t})})}rebuildPreview(e){return this.request(`/api/v1/previews/${encodeURIComponent(e)}/rebuild`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"})}usage(e={}){let t=new URLSearchParams;for(let[r,a]of Object.entries(e))if(a)t.set(r,String(a));return this.request(`/api/v1/usage${t.size>0?`?${t}`:""}`)}usageRollups(e){let t=new URLSearchParams({from:e.from,to:e.to});if(e.projectId)t.set("projectId",e.projectId);if(e.environmentId)t.set("environmentId",e.environmentId);if(e.limit)t.set("limit",String(e.limit));for(let r of e.meters??[])t.append("meter",r);return this.request(`/api/v1/usage/rollups?${t}`)}allowance(e="deploy",t={}){let r=new URLSearchParams({operation:e});if(t.projectId)r.set("projectId",t.projectId);if(t.environmentId)r.set("environmentId",t.environmentId);return this.request(`/api/v1/spend/allowance?${r}`)}budgets(e={}){let t=new URLSearchParams;for(let[r,a]of Object.entries(e))if(a)t.set(r,String(a));return this.request(`/api/v1/spend/budgets${t.size>0?`?${t}`:""}`)}anomalies(e={}){let t=new URLSearchParams;if(e.projectId)t.set("projectId",e.projectId);if(e.since)t.set("since",e.since);if(e.unacknowledged)t.set("unacknowledged","true");return this.request(`/api/v1/spend/anomalies${t.size>0?`?${t}`:""}`)}}import{createHash as iI}from"node:crypto";import{lstatSync as hk,readdirSync as yk,readFileSync as vk}from"node:fs";import{relative as bk,resolve as hf,sep as Sk}from"node:path";function wk(e){return new Map(e.map((t)=>[t.path.replace(/^\.\//,"").replace(/\\/g,"/"),t]))}function Ro(e,t,r){return{path:e,reason:t,weight:r}}function yf(e){try{return e?.content?JSON.parse(e.content):{}}catch{return{}}}function Cs(e,t,r,a,l,m){return{framework:e,strategy:t,confidence:r,evidence:a,defaults:{build:l,runtime:{target:t==="static"?"serverless":t==="serverless"?"serverless":t==="dockerfile"||t==="prebuilt_image"?"container":"server",architecture:"x86_64",port:t==="static"||t==="serverless"?void 0:3000,healthCheck:t==="static"?void 0:{protocol:"http",path:"/health"}}},description:m}}function _s(e){let t=wk(e.slice(0,1e4)),r=[];if(t.has("Dockerfile"))r.push(Cs("dockerfile","dockerfile",0.99,[Ro("Dockerfile","A root Dockerfile defines an explicit reproducible build.",1)],{kind:"dockerfile",context:".",dockerfile:"Dockerfile"},"Build the repository with its Dockerfile and run the resulting OCI image."));let a=yf(t.get("composer.json"));if(t.has("artisan")&&a.require?.["laravel/framework"])r.push(Cs("laravel","server",0.98,[Ro("artisan","Laravel Artisan entrypoint is present.",0.45),Ro("composer.json","Requires laravel/framework.",0.55)],{kind:"server",runtime:"php",runtimeVersion:"8.3",installCommand:"composer install --no-dev --prefer-dist --optimize-autoloader",buildCommand:"php artisan config:cache && php artisan route:cache && php artisan view:cache",startCommand:"php artisan serve --host=0.0.0.0 --port=$PORT"},"Install a production Composer tree, warm Laravel caches, and run the HTTP application."));else if(t.has("composer.json"))r.push(Cs("php","server",0.82,[Ro("composer.json","Composer metadata identifies a PHP application.",0.8)],{kind:"server",runtime:"php",runtimeVersion:"8.3",installCommand:"composer install --no-dev --prefer-dist --optimize-autoloader",startCommand:"php -S 0.0.0.0:$PORT -t public"},"Install Composer dependencies and run the configured PHP document root."));let l=yf(t.get("package.json"));if(t.has("package.json")){let m=t.has("bun.lock")||t.has("bun.lockb")||l.engines?.bun,h=m?"bun":"node",S=m?"bun":"node",R=[Ro("package.json",`Defines ${l.scripts?.build?"build and ":""}${l.scripts?.start?"start ":""}scripts.`,0.55)];if(m)R.push(Ro(t.has("bun.lock")?"bun.lock":t.has("bun.lockb")?"bun.lockb":"package.json","Pins the Bun package manager/runtime.",0.35));let y=!!(l.dependencies?.vite||l.devDependencies?.vite||l.dependencies?.["@stacksjs/bunpress"]||l.devDependencies?.["@stacksjs/bunpress"])&&!l.scripts?.start,C=y?{kind:"static",installCommand:`${h} install --frozen-lockfile`,buildCommand:`${h} run build`,publishDirectory:"dist"}:{kind:"server",runtime:h,installCommand:`${h} install --frozen-lockfile`,buildCommand:l.scripts?.build?`${h} run build`:void 0,startCommand:l.scripts?.start?`${h} run start`:h==="bun"?"bun run index.ts":"node index.js"};r.push(Cs(S,C.kind,Math.min(0.94,R.reduce((T,j)=>T+j.weight,0)),R,C,y?"Install dependencies, build static assets, and publish the output directory.":`Install dependencies, build if configured, and start the ${h} server.`))}if(!r.length&&(t.has("index.html")||t.has("public/index.html")))r.push(Cs("static","static",0.78,[Ro(t.has("index.html")?"index.html":"public/index.html","A static HTML entrypoint is present.",0.78)],{kind:"static",publishDirectory:t.has("index.html")?".":"public"},"Publish the static directory without a runtime process."));if(!r.length)r.push(Cs("unknown","buildpack",0.2,[],{kind:"buildpack",runtime:"node"},"No supported framework signature was conclusive; choose commands and runtime manually."));return r.sort((m,h)=>h.confidence-m.confidence||m.framework.localeCompare(h.framework))}function ap(e,t={}){let r=hf(e),a=t.maxFiles??1e4,l=t.maxContentBytes??262144,m=[],h=new Set(["Dockerfile","package.json","composer.json","index.html","public/index.html","bun.lock","bun.lockb","artisan"]),S=new Set([".git",".ts-cloud",".cache",".next",".nuxt",".output",".turbo",".bun","node_modules","vendor","pantry","dist","build","coverage"]),R=(y)=>{for(let C of yk(y).sort()){if(S.has(C))continue;let T=hf(y,C),j=bk(r,T).split(Sk).join("/");if(!j||j.startsWith("../"))throw Error("Detection path escaped the application root");let B=hk(T);if(B.isSymbolicLink())throw Error(`Detection refuses symbolic links: ${j}`);if(B.isDirectory())R(T);else if(B.isFile()){if(m.length>=a)throw Error("Application file-count limit exceeded");let V={path:j,size:B.size};if(h.has(j)&&B.size<=l)V.content=vk(T,"utf8");m.push(V)}}};return R(r),m}function dp(e){if(Array.isArray(e))return`[${e.map(dp).join(",")}]`;if(e&&typeof e==="object")return`{${Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${dp(r)}`).join(",")}}`;return JSON.stringify(e)??"null"}function Xa(e){return!!e&&!e.startsWith("/")&&!e.split("/").includes("..")&&!/[\0\r\n]/.test(e)}function In(e,t,r,a){return{path:e,code:t,message:r,alternatives:a}}function cp(e){return JSON.parse(JSON.stringify(e))}function kk(e){let t=Object.fromEntries(Object.entries(e.environment??{}).map(([r,a])=>[r,typeof a==="string"?a:`\${${a.secretRef}}`]));if(e.build.kind==="prebuilt_image"||e.build.kind==="dockerfile")return cp({infrastructure:{containers:{[e.slug]:{source:e.source,build:e.build,port:e.runtime.port,cpu:e.runtime.cpu,memory:e.runtime.memoryMb,architecture:e.runtime.architecture,healthCheck:e.runtime.healthCheck,environment:t}}}});if(e.runtime.target==="serverless"||e.build.kind==="serverless")return cp({serverless:{apps:{[e.slug]:{source:e.source,build:e.build,architecture:e.runtime.architecture,environment:t,domain:e.domain}}}});return cp({sites:{[e.slug]:{source:e.source,build:e.build,port:e.runtime.port,architecture:e.runtime.architecture,healthCheck:e.runtime.healthCheck,env:t,domain:e.domain?.hostname}}})}function qn(e,t=[]){let r=[],a=(V)=>/(?:secret|token|password|passwd|private[_-]?key|api[_-]?key)/i.test(V),l=Object.fromEntries(Object.entries(e.environment??{}).map(([V,W])=>{if(typeof W==="string"&&a(V))return r.push(In(`environment.${V}`,"write_only_secret_required",`${V} must be supplied through the write-only secrets boundary.`)),[V,{secretRef:V}];return[V,W]})),m=e.build;if(e.build.kind==="dockerfile"&&e.build.buildArgs){let V=Object.fromEntries(Object.entries(e.build.buildArgs).map(([W,Y])=>{if(a(W))return r.push(In(`build.buildArgs.${W}`,"write_only_build_secret_required",`${W} must be declared in secretNames instead of buildArgs.`)),[W,"[REDACTED]"];return[W,Y]}));m={...e.build,buildArgs:V}}if(!/^[a-z0-9][a-z0-9-]{1,62}$/.test(e.slug))r.push(In("slug","invalid_slug","Slug must contain 2-63 lowercase letters, numbers, or hyphens."));if(!Xa((e.source.kind==="git"?e.source.monorepoRoot:e.source.kind==="local"?e.source.root:".")??"."))r.push(In("source","unsafe_source_root","Source root must stay inside the source tree."));if(e.source.kind==="git"&&e.source.sparsePaths?.some((V)=>!Xa(V)))r.push(In("source.sparsePaths","unsafe_sparse_path","Sparse checkout paths must stay inside the repository."));if(e.build.kind==="dockerfile"&&(!Xa(e.build.context)||!Xa(e.build.dockerfile)))r.push(In("build","unsafe_docker_path","Docker context and Dockerfile must stay inside the source tree."));if(e.build.kind==="static"&&!Xa(e.build.publishDirectory))r.push(In("build.publishDirectory","invalid_publish_directory","A safe static publish directory is required."));if(e.build.kind==="server"&&!e.build.startCommand.trim())r.push(In("build.startCommand","missing_start_command","A server start command is required.",["Use static output","Use a Dockerfile"]));if(e.source.kind==="image"&&e.build.kind!=="prebuilt_image")r.push(In("build.kind","image_requires_prebuilt","An OCI image source must use the prebuilt-image strategy.",["Select prebuilt image"]));if(e.build.kind==="prebuilt_image"&&e.runtime.target!=="container")r.push(In("runtime.target","image_requires_container","Prebuilt images require the container runtime target.",["Select container target"]));if(e.runtime.target==="serverless"&&e.build.kind==="dockerfile")r.push(In("runtime.target","unsupported_serverless_dockerfile","Dockerfile builds currently target the container service path.",["Select container target","Select serverless package"]));if(e.runtime.port!==void 0&&(!Number.isInteger(e.runtime.port)||e.runtime.port<1||e.runtime.port>65535))r.push(In("runtime.port","invalid_port","Port must be an integer from 1 to 65535."));let h=e.runtime.healthCheck;if(h&&h.protocol!=="tcp"&&(!h.path||!h.path.startsWith("/")||/[\r\n]/.test(h.path)))r.push(In("runtime.healthCheck.path","invalid_health_path","HTTP health checks require a path beginning with /."));if(e.domain?.hostname&&(!/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i.test(e.domain.hostname)||e.domain.hostname.includes("..")))r.push(In("domain.hostname","invalid_domain","Domain must be a valid DNS hostname."));let S=Object.values(l).flatMap((V)=>typeof V==="object"?[V.secretRef]:[]),R=[...new Set([...e.requiredSecretNames??[],...e.build.kind==="dockerfile"?e.build.secretNames??[]:[],...S])].sort(),y=new Set(t),C=R.filter((V)=>!y.has(V)),T={apiVersion:"ts-cloud.dev/v1",kind:"Application",metadata:{name:e.name,slug:e.slug,projectId:e.projectId,environmentId:e.environmentId},spec:{source:e.source,build:m,runtime:e.runtime,environment:l,domain:e.domain}},j=[...new Set([e.source.kind==="git"?"git:read":e.source.kind==="image"?"registry:pull":e.source.kind==="artifact"?"artifact:inspect":"filesystem:read",e.runtime.target==="container"?"containers":e.runtime.target==="serverless"?"serverless":"servers",e.domain?"dns":""])].filter(Boolean).sort(),B=[...new Set([e.runtime.target,e.runtime.cpu?`${e.runtime.cpu} vCPU`:"",e.runtime.memoryMb?`${e.runtime.memoryMb} MB memory`:"",(e.runtime.minInstances??0)>0?`${e.runtime.minInstances} minimum instances`:"scales from zero where supported",e.domain?"managed DNS/TLS":""])].filter(Boolean);return{valid:r.length===0&&C.length===0,issues:r,missingSecrets:C,manifest:T,configPatch:kk({...e,build:m,environment:l}),capabilityRequirements:j,costDrivers:B,serializedManifest:`${dp(T)}
|
|
42
42
|
`}}function vf(e){let t=e.replace(/\\/g,"/");return!!t&&!t.startsWith("/")&&!/^[A-Za-z]:\//.test(t)&&!t.split("/").includes("..")&&!/[\0\r\n]/.test(t)}function bf(e,t,r={}){let a=r.maxBytes??104857600,l=r.maxEntries??1e4,m=r.maxExpandedBytes??524288000;if(e.byteLength>a)throw Error("Archive exceeds the compressed size limit");let h=new DataView(e.buffer,e.byteOffset,e.byteLength),S=[],R=0;if(t.toLowerCase().endsWith(".zip")||e[0]===80&&e[1]===75){let C=0;while(C+30<=e.length){let T=h.getUint32(C,!0);if(T===33639248||T===101010256)break;if(T!==67324752)throw Error("Malformed ZIP local header");let j=h.getUint16(C+6,!0),B=h.getUint32(C+18,!0),V=h.getUint32(C+22,!0),W=h.getUint16(C+26,!0),Y=h.getUint16(C+28,!0);if(j&8)throw Error("ZIP data descriptors are not accepted for uploaded artifacts");let te=new TextDecoder().decode(e.subarray(C+30,C+30+W));if(!vf(te))throw Error(`Unsafe archive path: ${te}`);if(S.push(te),R+=V,S.length>l||R>m)throw Error("Archive expansion limit exceeded");C+=30+W+Y+B}return{format:"zip",entries:S.length,expandedBytes:R,paths:S}}if(!t.toLowerCase().match(/\.(?:tar|tar\.gz|tgz)$/))throw Error("Only ZIP and uncompressed TAR artifacts are supported");let y=0;while(y+512<=e.length){let C=e.subarray(y,y+512);if(C.every((W)=>W===0))break;let T=(W,Y)=>new TextDecoder().decode(C.subarray(W,W+Y)).replace(/\0.*$/,""),j=`${T(345,155)}${T(345,155)?"/":""}${T(0,100)}`,B=Number.parseInt(T(124,12).trim()||"0",8),V=String.fromCharCode(C[156]??0);if(!vf(j))throw Error(`Unsafe archive path: ${j}`);if(V==="1"||V==="2")throw Error(`Archive links are not accepted: ${j}`);if(!Number.isFinite(B)||B<0)throw Error("Malformed TAR entry size");if(S.push(j),R+=B,S.length>l||R>m)throw Error("Archive expansion limit exceeded");y+=512+Math.ceil(B/512)*512}return{format:"tar",entries:S.length,expandedBytes:R,paths:S}}var Sf=new Set(["source","build","runtime","environment","domain","review"]);function wf(e,t){try{return typeof e==="string"?JSON.parse(e):t}catch{return t}}function kf(e){return/(?:secret|token|password|passwd|private[_-]?key|api[_-]?key)/i.test(e)}function If(e){for(let[r,a]of Object.entries(e.environment??{}))if(typeof a==="string"&&kf(r)&&a)throw Error(`${r} must be stored through the write-only secrets boundary`);if(e.build.kind==="dockerfile"){for(let[r,a]of Object.entries(e.build.buildArgs??{}))if(kf(r)&&a)throw Error(`${r} must be declared as a build secret name`)}let t=JSON.stringify(e);if(/https?:\/\/[^/@\s]+:[^/@\s]+@/i.test(t))throw Error("Drafts cannot contain credential-bearing URLs")}function Ef(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),schemaVersion:Number(e.schema_version),name:String(e.name),step:String(e.step),input:wf(e.input,{}),suppliedSecretNames:wf(e.supplied_secret_names,[]),status:String(e.status),version:Number(e.version),createdByActorId:e.created_by_actor_id?String(e.created_by_actor_id):void 0,createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class lp{controlPlane;nowFn;idFn;constructor(e,t={}){this.controlPlane=e;this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}create(e){if(If(e.draft),e.draft.projectId!==e.projectId)throw Error("Draft project does not match its storage scope");let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Draft project was not found");let r=this.idFn(),a=this.now(),l=e.step??"source";if(!Sf.has(l))throw Error("Invalid draft step");let m=[...new Set(e.suppliedSecretNames??[])].sort(),h=qn(e.draft,m).valid?"ready":"draft";return this.controlPlane.database.run("INSERT INTO application_drafts (id, organization_id, project_id, schema_version, name, step, input, supplied_secret_names, status, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.projectId,e.name.trim().slice(0,100),l,JSON.stringify(e.draft),JSON.stringify(m),h,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,actorId:e.actorId,type:"application.draft.created",payload:{draftId:r,step:l,status:h,requiredSecretNames:e.draft.requiredSecretNames??[]}}),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM application_drafts WHERE id=?").get(e);return t?Ef(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM application_drafts WHERE project_id=? ORDER BY updated_at DESC").all(e).map(Ef)}update(e,t,r){let a=this.get(e);if(!a||a.version!==t)throw Error(`Application draft ${e} changed since version ${t}`);if(!Sf.has(r.step))throw Error("Invalid draft step");if(r.draft.projectId!==a.projectId)throw Error("Draft project cannot be changed");If(r.draft);let l=[...new Set(r.suppliedSecretNames??a.suppliedSecretNames)].sort(),m=qn(r.draft,l).valid?"ready":"draft",h=this.now();if(this.controlPlane.database.run("UPDATE application_drafts SET name=?, step=?, input=?, supplied_secret_names=?, status=?, version=version+1, updated_at=? WHERE id=? AND version=?",[r.draft.name.slice(0,100),r.step,JSON.stringify(r.draft),JSON.stringify(l),m,h,e,t]).changes!==1)throw Error(`Application draft ${e} changed since version ${t}`);return this.controlPlane.appendEvent({organizationId:a.organizationId,projectId:a.projectId,actorId:r.actorId,type:"application.draft.updated",payload:{draftId:e,fromVersion:t,toVersion:t+1,step:r.step,status:m}}),this.get(e)}markApplied(e,t,r){let a=this.get(e);if(!a||a.version!==t)throw Error(`Application draft ${e} changed since version ${t}`);let l=qn(a.input,a.suppliedSecretNames);if(!l.valid)throw Error(`Draft is not deployable: ${[...l.issues.map((h)=>h.message),...l.missingSecrets.map((h)=>`Missing secret ${h}`)].join("; ")}`);let m=this.now();return this.controlPlane.database.run("UPDATE application_drafts SET status='applied', step='review', version=version+1, updated_at=? WHERE id=? AND version=?",[m,e,t]),this.controlPlane.appendEvent({organizationId:a.organizationId,projectId:a.projectId,actorId:r,type:"application.draft.applied",payload:s({draftId:e,manifest:l.manifest})}),this.get(e)}}import{createCipheriv as Ik,createDecipheriv as Ek,createHash as Cf,randomBytes as Rk}from"node:crypto";function ec(e){return typeof e==="string"&&e?e:void 0}function up(e){return Cf("sha256").update(e).digest("hex").slice(0,16)}function Rf(e){let t=new URL(e.includes("://")?e:`https://${e}`);if(t.protocol!=="https:"&&!["localhost","127.0.0.1","::1"].includes(t.hostname))throw Error("Registry host must use HTTPS");if(t.username||t.password||t.search||t.hash)throw Error("Registry host cannot contain credentials");return`${t.protocol}//${t.host}`}function Ak(e){return{id:String(e.id),organizationId:String(e.organization_id),provider:String(e.provider),name:String(e.name),host:String(e.host),credentialConfigured:!!e.credential_ciphertext,credentialFingerprint:ec(e.credential_fingerprint),credentialExpiresAt:ec(e.credential_expires_at),status:String(e.status),healthMessage:ec(e.health_message),lastTestedAt:ec(e.last_tested_at),version:Number(e.version),createdByActorId:ec(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class pp{controlPlane;key;nowFn;idFn;constructor(e,t){this.controlPlane=e;if(!t.encryptionKey)throw Error("Registry encryption key is required");this.key=Cf("sha256").update(`ts-cloud:registry:${t.encryptionKey}`).digest(),this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}encrypt(e){let t=Rk(12),r=Ik("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){let[t,r,a,l]=e.split(".");if(t!=="v1"||!r||!a||!l)throw Error("Registry credential envelope is invalid");let m=Ek("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return m.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([m.update(Buffer.from(l,"base64url")),m.final()]).toString("utf8")}current(e){let t=Ak(e);return t.status!=="disconnected"&&t.credentialExpiresAt&&new Date(t.credentialExpiresAt).getTime()<=this.nowFn().getTime()?{...t,status:"expired",healthMessage:"Registry credential expired; rotate it before pulling images."}:t}create(e){if(!["docker_hub","ghcr","ecr","gcr","generic"].includes(e.provider))throw Error("A supported registry provider is required");let t=e.credential?JSON.stringify(e.credential):void 0,r=this.idFn(),a=this.now();return this.controlPlane.database.run("INSERT INTO registry_connections (id, organization_id, provider, name, host, credential_ciphertext, credential_fingerprint, credential_expires_at, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.provider,e.name.trim().slice(0,80),Rf(e.host),t?this.encrypt(t):null,t?up(t):null,e.credentialExpiresAt??null,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:e.organizationId,actorId:e.actorId,type:"registry.connection.created",payload:{connectionId:r,provider:e.provider,host:Rf(e.host),credentialConfigured:!!t}}),this.get(r)}get(e){let t=this.controlPlane.database.query("SELECT * FROM registry_connections WHERE id=?").get(e);return t?this.current(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM registry_connections WHERE organization_id=? ORDER BY name").all(e).map((t)=>this.current(t))}credential(e){let t=this.controlPlane.database.query("SELECT credential_ciphertext FROM registry_connections WHERE id=?").get(e);return t?.credential_ciphertext?JSON.parse(this.decrypt(String(t.credential_ciphertext))):void 0}rotate(e,t,r={}){let a=this.get(e);if(!a||a.status==="disconnected")throw Error("Registry connection was not found");let l=JSON.stringify(t);return this.controlPlane.database.run("UPDATE registry_connections SET credential_ciphertext=?, credential_fingerprint=?, credential_expires_at=?, status='pending', health_message=NULL, version=version+1, updated_at=? WHERE id=?",[this.encrypt(l),up(l),r.expiresAt??null,this.now(),e]),this.controlPlane.appendEvent({organizationId:a.organizationId,actorId:r.actorId,type:"registry.credential.rotated",payload:{connectionId:e,fingerprint:up(l),expiresAt:r.expiresAt??null}}),this.get(e)}disconnect(e,t){let r=this.get(e);if(!r)throw Error("Registry connection was not found");return this.controlPlane.database.run("UPDATE registry_connections SET credential_ciphertext=NULL, credential_fingerprint=NULL, status='disconnected', health_message='Disconnected by an administrator', version=version+1, updated_at=? WHERE id=?",[this.now(),e]),this.controlPlane.appendEvent({organizationId:r.organizationId,actorId:t,type:"registry.connection.disconnected",level:"warning",payload:{connectionId:e}}),this.get(e)}async test(e,t={}){let r=this.get(e);if(!r||["disconnected","expired"].includes(r.status))throw Error("Active registry connection was not found");let a=this.credential(e),l=t.fetch??fetch,m=new AbortController,h=setTimeout(()=>m.abort(),t.timeoutMs??15000),S=a?.token?`Bearer ${a.token}`:a?.username||a?.password?`Basic ${Buffer.from(`${a.username??""}:${a.password??""}`).toString("base64")}`:void 0;try{let R=await l(`${r.host}/v2/`,{method:"GET",redirect:"error",signal:m.signal,headers:S?{Authorization:S}:void 0}),y=R.headers.get("www-authenticate")??"";if(R.status===401&&y.startsWith("Bearer ")&&a){let j=Object.fromEntries([...y.slice(7).matchAll(/(\w+)="([^"]+)"/g)].map((te)=>[te[1],te[2]])),B=new URL(j.realm??"");if(B.protocol!=="https:")throw Error("Registry authentication realm must use HTTPS");if(j.service)B.searchParams.set("service",j.service);if(t.image)B.searchParams.set("scope",`repository:${Pf(t.image).repository}:pull`);let V=await l(B,{signal:m.signal,redirect:"error",headers:S?{Authorization:S}:void 0});if(!V.ok)throw Error(`Registry authentication failed (${V.status})`);let W=await V.json(),Y=W.token??W.access_token;if(!Y)throw Error("Registry did not return an access token");R=t.image?await Af(l,r.host,t.image,Y,m.signal):await l(`${r.host}/v2/`,{signal:m.signal,redirect:"error",headers:{Authorization:`Bearer ${Y}`}})}else if(R.ok&&t.image)R=await Af(l,r.host,t.image,a?.token,m.signal,S);let C=R.ok?"healthy":"degraded",T=R.ok?t.image?"Registry image is readable.":"Registry connection is healthy.":`Registry request failed (${R.status})`;return this.controlPlane.database.run("UPDATE registry_connections SET status=?, health_message=?, last_tested_at=?, version=version+1, updated_at=? WHERE id=?",[C,T,this.now(),this.now(),e]),this.get(e)}catch(R){let y=m.signal.aborted?"Registry request timed out.":R instanceof Error?R.message:"Registry test failed";return this.controlPlane.database.run("UPDATE registry_connections SET status='degraded', health_message=?, last_tested_at=?, version=version+1, updated_at=? WHERE id=?",[y.slice(0,1000),this.now(),this.now(),e]),this.get(e)}finally{clearTimeout(h)}}}function Pf(e){let t=e.replace(/^https?:\/\//,""),r=t.indexOf("/");if(r<1)throw Error("Image must include registry/repository");let a=t.slice(r+1),l=a.lastIndexOf("@"),m=a.lastIndexOf(":"),h=l>=0?l:m>a.lastIndexOf("/")?m:-1,S=h>=0?a.slice(0,h):a,R=h>=0?a.slice(h+1):"latest";if(!/^[A-Za-z0-9_.\/-]+$/.test(S)||!/^[A-Za-z0-9_.:+-]+$/.test(R))throw Error("Image reference is invalid");return{repository:S,reference:R}}async function Af(e,t,r,a,l,m){let h=Pf(r);return e(`${t}/v2/${h.repository}/manifests/${encodeURIComponent(h.reference)}`,{method:"HEAD",redirect:"error",signal:l,headers:{Accept:"application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.v2+json",...a?{Authorization:`Bearer ${a}`}:m?{Authorization:m}:{}}})}import{createHash as Ck}from"node:crypto";import{chmodSync as _f,existsSync as Tf,mkdirSync as Pk,renameSync as _k,unlinkSync as xf,writeFileSync as Tk}from"node:fs";import{basename as xk,join as Dk}from"node:path";function gp(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),filename:String(e.filename),sha256:String(e.sha256),size:Number(e.size),format:String(e.format),entryCount:Number(e.entry_count),expandedBytes:Number(e.expanded_bytes),createdByActorId:e.created_by_actor_id?String(e.created_by_actor_id):void 0,createdAt:String(e.created_at)}}class mp{controlPlane;root;idFn;nowFn;constructor(e,t){this.controlPlane=e;this.root=d(t.cwd,"artifacts"),this.idFn=t.id??(()=>crypto.randomUUID()),this.nowFn=t.now??(()=>new Date)}create(e){let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Artifact project was not found");let r=xk(e.filename).slice(0,200);if(!r||r!==e.filename)throw Error("Artifact filename must not contain a path");let a=bf(e.bytes,r),l=Ck("sha256").update(e.bytes).digest("hex"),m=this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE project_id=? AND sha256=?").get(e.projectId,l);if(m)return gp(m);let h=this.idFn();Pk(this.root,{recursive:!0,mode:448}),_f(this.root,448);let S=Dk(this.root,`${h}.archive`),R=`${S}.partial`;try{Tk(R,e.bytes,{mode:384,flag:"wx"}),_k(R,S),_f(S,384),this.controlPlane.database.run("INSERT INTO application_artifacts (id, organization_id, project_id, filename, storage_path, sha256, size, format, entry_count, expanded_bytes, created_by_actor_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[h,e.organizationId,e.projectId,r,S,l,e.bytes.byteLength,a.format,a.entries,a.expandedBytes,e.actorId??null,this.nowFn().toISOString()])}catch(y){if(Tf(R))xf(R);if(Tf(S))xf(S);throw y}return this.controlPlane.appendEvent({organizationId:e.organizationId,projectId:e.projectId,actorId:e.actorId,type:"application.artifact.created",payload:{artifactId:h,filename:r,sha256:l,size:e.bytes.byteLength,entries:a.entries}}),this.get(h)}get(e){let t=this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE id=?").get(e);return t?gp(t):void 0}list(e){return this.controlPlane.database.query("SELECT * FROM application_artifacts WHERE project_id=? ORDER BY created_at DESC").all(e).map(gp)}}function Bc(e){let t=e.drafts.get(e.draftId);if(!t||t.version!==e.expectedVersion)throw Error(`Application draft ${e.draftId} changed since version ${e.expectedVersion}`);if(t.status==="applied")throw Error("Application draft was already applied");let r=e.controlPlane.getProject(t.projectId),a=r?e.controlPlane.listEnvironments(r.id).find((y)=>y.id===t.input.environmentId):void 0;if(!r||!a||a.projectId!==r.id||r.organizationId!==t.organizationId)throw Error("Draft deployment scope was not found");if(e.confirmEnvironment!==a.slug)throw Error(`Type ${a.slug} to confirm this deployment target`);let l=qn(t.input,t.suppliedSecretNames);if(!l.valid)throw Error(`Application plan is invalid: ${[...l.issues.map((y)=>y.message),...l.missingSecrets.map((y)=>`Missing secret ${y}`)].join("; ")}`);let m=e.controlPlane.listResources(r.id,a.id).find((y)=>y.kind==="application"&&y.slug===t.input.slug),h=JSON.parse(JSON.stringify({manifest:l.manifest,configPatch:l.configPatch})),S=m?e.controlPlane.updateResource(m.id,m.version,{name:t.input.name,desiredState:h}):e.controlPlane.createResource({projectId:r.id,environmentId:a.id,kind:"application",slug:t.input.slug,name:t.input.name,desiredState:h,metadata:{source:"application-onboarding",draftId:t.id}}),R=new c(e.controlPlane).enqueue({projectId:r.id,environmentId:a.id,resourceId:S.id,actorId:e.actorId,kind:"application.create",idempotencyKey:`application-draft:${t.id}:v${t.version}`,correlationId:`application-draft:${t.id}`,input:h,lockKey:`resource:${S.id}`,providerKey:S.provider??"default",buildSlot:t.input.build.kind!=="prebuilt_image",maxAttempts:3,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:90}).operation;return e.drafts.markApplied(t.id,t.version,e.actorId),e.controlPlane.appendEvent({organizationId:t.organizationId,projectId:r.id,resourceId:S.id,operationId:R.id,actorId:e.actorId,type:"application.create.queued",payload:{draftId:t.id,environment:a.slug,strategy:t.input.build.kind,costDrivers:l.costDrivers}}),{plan:l,resource:S,operation:R}}function Yr(e){let t=["static","compute","serverless_zip","serverless_image"].includes(e.kind),r=["container","compose"].includes(e.kind)&&(e.replicas??1)>1,a=e.kind==="container"||e.kind==="serverless_zip"||e.kind==="serverless_image",l=(m,h)=>h&&(m==="atomic"?e.kind==="static"||e.hasHealthGate:e.hasHealthGate);return[{strategy:"atomic",supported:l("atomic",t),explanation:t?e.hasHealthGate||e.kind==="static"?"Activate an immutable version with an atomic pointer/alias switch.":"Atomic activation needs a readiness gate for this runtime.":"This driver has no atomic pointer or alias primitive.",capacityMultiplier:1,costImpact:"none",rollback:"Switch the pointer/alias back to the previous immutable release."},{strategy:"rolling",supported:l("rolling",r),explanation:r?e.hasHealthGate?"Replace healthy replicas within the configured capacity envelope.":"Rolling activation requires a health/readiness gate.":"Rolling activation requires a capable container/Compose driver and at least two replicas.",capacityMultiplier:1.5,costImpact:"temporary",rollback:"Stop replacement and restore the prior task/service definition."},{strategy:"blue_green",supported:l("blue_green",a),explanation:a?e.hasHealthGate?"Provision a complete green target and switch traffic after health passes.":"Blue-green requires a health gate before traffic can switch.":"The provider does not expose two traffic-addressable revisions.",capacityMultiplier:2,costImpact:"temporary",rollback:"Return all traffic to the preserved blue target."},{strategy:"canary",supported:l("canary",a),explanation:a?e.hasHealthGate?"Shift bounded traffic steps while evaluating health.":"Canary requires a health gate and measurable traffic target.":"The provider does not expose weighted traffic primitives.",capacityMultiplier:1.25,costImpact:"temporary",rollback:"Set canary weight to zero and preserve its diagnostics."}]}function Hi(e,t){let r=Yr(e).find((a)=>a.strategy===t);if(!r.supported)throw Error(`${t} is unavailable: ${r.explanation}`);return r}import{createHash as Ok}from"node:crypto";var $k=/^sha256:[a-f0-9]{64}$/,Nk=/^[a-f0-9]{40,64}$/i;function Xn(e){return typeof e==="string"&&e?e:void 0}function Ao(e,t){try{return JSON.parse(String(e))}catch{return t}}function Df(e){return{id:String(e.id),organizationId:String(e.organization_id),digest:String(e.digest),kind:String(e.kind),uri:String(e.uri),size:Number(e.size),mediaType:String(e.media_type),provenance:Ao(e.provenance,{}),attestation:Ao(e.attestation,{}),verifiedAt:String(e.verified_at),createdAt:String(e.created_at)}}function Of(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),environmentId:String(e.environment_id),resourceId:String(e.resource_id),artifactId:String(e.artifact_id),kind:String(e.kind),sourceSha:Xn(e.source_sha),configHash:String(e.config_hash),manifest:Ao(e.manifest,{}),provenance:Ao(e.provenance,{}),strategy:String(e.strategy),status:String(e.status),healthGate:e.health_gate==null?void 0:Ao(e.health_gate,void 0),hooks:Ao(e.hooks,{migrations:"none",preActivate:[],postActivate:[]}),drainSeconds:Number(e.drain_seconds),graceSeconds:Number(e.grace_seconds),automaticRollback:Number(e.automatic_rollback)===1,rollbackAttempts:Number(e.rollback_attempts),previousReleaseId:Xn(e.previous_release_id),promotedFromReleaseId:Xn(e.promoted_from_release_id),actorId:Xn(e.actor_id),trigger:String(e.trigger),pinned:Number(e.pinned)===1,pinReason:Xn(e.pin_reason),activatedAt:Xn(e.activated_at),failedAt:Xn(e.failed_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function jk(e){return{sequence:Number(e.sequence),id:String(e.id),releaseId:String(e.release_id),fromStatus:Xn(e.from_status),toStatus:String(e.to_status),trafficPercent:e.traffic_percent==null?void 0:Number(e.traffic_percent),health:Ao(e.health,{}),message:String(e.message),operationId:Xn(e.operation_id),createdAt:String(e.created_at)}}function Bk(e,t){let r=[],a=(l,m,h)=>{if(JSON.stringify(m)===JSON.stringify(h))return;if(m&&h&&typeof m==="object"&&typeof h==="object"&&!Array.isArray(m)&&!Array.isArray(h)){for(let S of[...new Set([...Object.keys(m),...Object.keys(h)])].sort())a(l?`${l}.${S}`:S,m[S],h[S]);return}r.push({path:l,...m!==void 0?{before:m}:{},...h!==void 0?{after:h}:{}})};return a("",e,t),r}class Uo{controlPlane;now;id;constructor(e,t={}){this.controlPlane=e;this.now=t.now??(()=>new Date),this.id=t.id??(()=>crypto.randomUUID())}registerArtifact(e){if(!$k.test(e.digest)||!/^(?:s3|https|oci|file):/.test(e.uri)||!Number.isInteger(e.size)||e.size<0)throw Error("Artifact requires a SHA-256 digest, supported immutable URI, and non-negative byte size");let t=this.controlPlane.database.query("SELECT * FROM release_artifacts WHERE organization_id=? AND digest=?").get(e.organizationId,e.digest);if(t)return Df(t);let r=this.id(),a=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO release_artifacts (id, organization_id, digest, kind, uri, size, media_type, provenance, attestation, verified_at, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.organizationId,e.digest,e.kind,e.uri,e.size,e.mediaType??"application/octet-stream",JSON.stringify(s(e.provenance??{})),JSON.stringify(s(e.attestation??{})),a,a]),this.getArtifact(r)}getArtifact(e){let t=this.controlPlane.database.query("SELECT * FROM release_artifacts WHERE id=?").get(e);return t?Df(t):void 0}create(e){let t=this.getArtifact(e.artifactId),r=this.controlPlane.getResource(e.resourceId),a=this.controlPlane.listEnvironments(e.projectId).find((T)=>T.id===e.environmentId);if(!t||t.organizationId!==e.organizationId||t.kind!==e.kind)throw Error("Release artifact does not match the organization and deployable kind");if(!r||r.projectId!==e.projectId||r.environmentId!==e.environmentId||!a)throw Error("Release target scope does not match the resource");if(e.sourceSha&&!Nk.test(e.sourceSha))throw Error("Release source must be an immutable commit SHA");Hi({kind:e.kind,provider:r.provider,hasHealthGate:!!e.healthGate,replicas:e.replicas},e.strategy);let l=s(e.config),m=Ok("sha256").update(JSON.stringify(l)).digest("hex"),h=this.active(e.resourceId),S=this.id(),R=this.now().toISOString(),y=e.approvalRequired?"awaiting_approval":"built",C=e.hooks??{migrations:"none",preActivate:[],postActivate:[]};return this.controlPlane.database.run("INSERT INTO releases (id, organization_id, project_id, environment_id, resource_id, artifact_id, kind, source_sha, config_hash, manifest, provenance, strategy, status, health_gate, hooks, drain_seconds, grace_seconds, automatic_rollback, previous_release_id, promoted_from_release_id, actor_id, trigger, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[S,e.organizationId,e.projectId,e.environmentId,e.resourceId,e.artifactId,e.kind,e.sourceSha??null,m,JSON.stringify(s(e.manifest)),JSON.stringify(s(e.provenance??{})),e.strategy,y,e.healthGate?JSON.stringify(e.healthGate):null,JSON.stringify(C),Math.max(0,Math.min(3600,Math.floor(e.drainSeconds??30))),Math.max(0,Math.min(3600,Math.floor(e.graceSeconds??30))),e.automaticRollback===!1?0:1,h?.id??null,e.promotedFromReleaseId??null,e.actorId??null,e.trigger??"manual",R,R]),this.recordTransition(S,void 0,y,{message:e.promotedFromReleaseId?"Immutable artifact promoted without rebuild.":"Immutable release record created."}),this.get(S)}get(e){let t=this.controlPlane.database.query("SELECT * FROM releases WHERE id=?").get(e);return t?Of(t):void 0}list(e={}){return this.controlPlane.database.query("SELECT * FROM releases ORDER BY created_at DESC, rowid DESC").all().map(Of).filter((t)=>(!e.projectId||t.projectId===e.projectId)&&(!e.environmentId||t.environmentId===e.environmentId)&&(!e.resourceId||t.resourceId===e.resourceId)&&(!e.status||t.status===e.status))}active(e){return this.list({resourceId:e,status:"active"})[0]}transitions(e){return this.controlPlane.database.query("SELECT * FROM release_transitions WHERE release_id=? ORDER BY sequence").all(e).map(jk)}recordTransition(e,t,r,a){this.controlPlane.database.run("INSERT INTO release_transitions (id, release_id, from_status, to_status, traffic_percent, health, message, operation_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",[this.id(),e,t??null,r,a.trafficPercent??null,JSON.stringify(s(a.health??{})),a.message.slice(0,1000),a.operationId??null,this.now().toISOString()])}progress(e,t){let r=this.get(e);if(!r)throw Error(`Release ${e} was not found`);return this.recordTransition(e,r.status,r.status,t),this.transitions(e).at(-1)}transition(e,t,r){let a=this.get(e);if(!a)throw Error(`Release ${e} was not found`);if(!{built:["awaiting_approval","activating","failed"],awaiting_approval:["built","failed"],activating:["active","failed","rolled_back"],active:["superseded","failed","rolled_back"],failed:["activating","rolled_back"],rolled_back:["activating"],superseded:["activating"]}[a.status].includes(t))throw Error(`Invalid release transition ${a.status} → ${t}`);let m=this.now().toISOString();if(t==="active"){let h=this.active(a.resourceId);if(h&&h.id!==e)this.controlPlane.database.run("UPDATE releases SET status='superseded', updated_at=? WHERE id=?",[m,h.id]),this.recordTransition(h.id,"active","superseded",{message:`Superseded by ${e}.`,operationId:r.operationId})}return this.controlPlane.database.run("UPDATE releases SET status=?, rollback_attempts=rollback_attempts+?, activated_at=CASE WHEN ?='active' THEN ? ELSE activated_at END, failed_at=CASE WHEN ?='failed' THEN ? ELSE failed_at END, updated_at=? WHERE id=?",[t,t==="rolled_back"?1:0,t,m,t,m,m,e]),this.recordTransition(e,a.status,t,r),this.get(e)}approve(e,t){let r=this.get(e);if(!r||r.status!=="awaiting_approval")throw Error("Release is not awaiting approval");let a=this.id(),l=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO release_approvals (id, release_id, environment_id, decision, actor_id, comment, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)",[a,e,r.environmentId,t.decision,t.actorId,t.comment?.slice(0,1000)??null,l]),this.transition(e,t.decision==="approved"?"built":"failed",{message:t.decision==="approved"?"Environment gate approved.":"Environment gate rejected."})}approvals(e){return this.controlPlane.database.query("SELECT * FROM release_approvals WHERE release_id=? ORDER BY created_at").all(e).map((t)=>({id:String(t.id),releaseId:String(t.release_id),environmentId:String(t.environment_id),decision:String(t.decision),actorId:String(t.actor_id),comment:Xn(t.comment),createdAt:String(t.created_at)}))}promote(e,t){let r=this.get(e);if(!r||!["active","superseded"].includes(r.status))throw Error("Only a tested active/superseded release can be promoted");return this.create({organizationId:r.organizationId,projectId:r.projectId,environmentId:t.targetEnvironmentId,resourceId:t.targetResourceId,artifactId:r.artifactId,kind:r.kind,sourceSha:r.sourceSha,config:t.config,manifest:r.manifest,provenance:r.provenance,strategy:t.strategy??r.strategy,healthGate:t.healthGate??r.healthGate,hooks:r.hooks,drainSeconds:r.drainSeconds,graceSeconds:r.graceSeconds,automaticRollback:r.automaticRollback,promotedFromReleaseId:r.id,actorId:t.actorId,trigger:"promotion",approvalRequired:t.approvalRequired})}compare(e,t){let r=this.get(e),a=this.get(t);if(!r||!a)throw Error("Both releases are required for comparison");return{artifactChanged:r.artifactId!==a.artifactId,sourceChanged:r.sourceSha!==a.sourceSha,configChanged:r.configHash!==a.configHash,manifestChanges:Bk(r.manifest,a.manifest),dataCaveat:a.hooks.migrations==="none"?"No database migration is recorded.":`Database hooks are ${a.hooks.migrations}; release rollback does not roll back data.`}}pin(e,t,r){if(!this.get(e))throw Error("Release was not found");return this.controlPlane.database.run("UPDATE releases SET pinned=?, pin_reason=?, updated_at=? WHERE id=?",[t?1:0,t?r?.slice(0,500)??"operator":null,this.now().toISOString(),e]),this.get(e)}retentionCandidates(e){let t=Math.max(1,Math.min(100,Math.floor(e.keepPerResource??10))),r=new Map;for(let a of this.list()){let l=r.get(a.resourceId)??[];l.push(a),r.set(a.resourceId,l)}return[...r.values()].flatMap((a)=>a.slice(t)).filter((a)=>new Date(a.createdAt)<e.before&&!a.pinned&&!["active","activating","awaiting_approval"].includes(a.status)&&!this.list().some((l)=>l.previousReleaseId===a.id&&["active","activating"].includes(l.status)))}}class It{controlPlane;releases;queue;constructor(e){this.controlPlane=e;this.releases=new Uo(e),this.queue=new c(e)}enqueueActivation(e,t={}){let r=this.releases.get(e.id);if(!r)throw Error("Release was not found");if(!["built","failed","rolled_back","superseded"].includes(r.status))throw Error(`Release ${r.status} cannot be activated`);let a=t.action??"activate",l=this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,actorId:t.actorId,kind:`release.${a}`,idempotencyKey:`release:${r.id}:${a}:${r.rollbackAttempts}`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:t.targetReleaseId??null},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:r.automaticRollback?2:1,retryClasses:["network","provider_throttled","provider_unavailable"],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation;return this.releases.transition(r.id,"activating",{message:`${a} queued.`,operationId:l.id,trafficPercent:0}),l}completeHealthGate(e,t){let r=this.releases.get(e);if(!r||r.status!=="activating")throw Error("Release is not activating");if(t.healthy)return{release:this.releases.transition(r.id,"active",{message:t.message??"Health gate passed; activation completed.",operationId:t.operationId,trafficPercent:100,health:t.health})};let a=this.releases.transition(r.id,"failed",{message:t.message??"Health gate failed.",operationId:t.operationId,trafficPercent:0,health:t.health}),l=r.previousReleaseId?this.releases.get(r.previousReleaseId):void 0;if(!r.automaticRollback||r.rollbackAttempts>=1||!l)return{release:a};let m=this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,kind:"release.rollback",idempotencyKey:`release:${r.id}:automatic-rollback`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:l.id,automatic:!0},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:1,retryClasses:[],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation;return{release:a,rollbackOperation:m}}enqueueRollback(e,t={}){let r=this.releases.get(e.id);if(!r||r.status!=="active")throw Error("Only the active release can be rolled back");let a=t.targetReleaseId?this.releases.get(t.targetReleaseId):r.previousReleaseId?this.releases.get(r.previousReleaseId):void 0;if(!a||a.resourceId!==r.resourceId||!["superseded","active"].includes(a.status))throw Error("Rollback requires a preserved prior release for the same resource");return this.queue.enqueue({projectId:r.projectId,environmentId:r.environmentId,resourceId:r.resourceId,actorId:t.actorId,kind:"release.rollback",idempotencyKey:`release:${r.id}:manual-rollback:${a.id}`,correlationId:`release:${r.id}`,input:{releaseId:r.id,targetReleaseId:a.id,automatic:!1},lockKey:`resource:${r.resourceId}`,providerKey:this.controlPlane.getResource(r.resourceId)?.provider??"default",maxAttempts:1,retryClasses:[],resumePolicy:"fail",cancellationMode:"provider_non_cancellable",retentionDays:365}).operation}}function Wm(e){if(e.strategy==="canary")return[5,25,50,100].map((t,r)=>({step:`canary-${t}`,trafficPercent:t,waitSeconds:r===3?e.drainSeconds:e.graceSeconds,requiresHealth:!0}));if(e.strategy==="blue_green")return[{step:"green-health",trafficPercent:0,waitSeconds:e.graceSeconds,requiresHealth:!0},{step:"traffic-switch",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!0}];if(e.strategy==="rolling")return[{step:"rolling-replacement",trafficPercent:50,waitSeconds:e.graceSeconds,requiresHealth:!0},{step:"rolling-complete",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!0}];return[{step:"immutable-switch",trafficPercent:100,waitSeconds:e.drainSeconds,requiresHealth:!!e.healthGate}]}async function fl(e,t){if(t.release.artifactId!==t.artifact.id)throw Error("Release activation artifact identity changed");Hi({kind:t.release.kind,hasHealthGate:!!t.release.healthGate,replicas:Number(t.release.manifest?.replicas)||void 0},t.release.strategy);let r=e.capability(t);if(!r.supported)throw Error(`${t.release.strategy} is unavailable in ${e.name}: ${r.explanation}`);return e.activate({...t,transitions:Wm(t.release)})}async function Al(e,t){if(!t.previous)throw Error("Rollback requires the preserved previous release");return e.rollback({...t,transitions:[{step:"rollback",trafficPercent:0,waitSeconds:t.release.drainSeconds,requiresHealth:!0}]})}var Jm=["release.activate","release.rollback"];function Mk(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function yl(e){let t=new It(e.store),r=async(a)=>{let l=Mk(a.operation.input),m=typeof l.releaseId==="string"?l.releaseId:"",h=t.releases.get(m);if(!h)throw Error(`Queued release ${m||"(missing)"} was not found`);if(h.projectId!==a.operation.projectId||h.environmentId!==a.operation.environmentId||h.resourceId!==a.operation.resourceId)throw Error("Queued release does not match the operation scope");let S=t.releases.getArtifact(h.artifactId);if(!S||S.digest!==t.releases.getArtifact(h.artifactId)?.digest)throw Error("Immutable release artifact is unavailable");let R=typeof l.targetReleaseId==="string"&&l.targetReleaseId?l.targetReleaseId:h.previousReleaseId,y=R?t.releases.get(R):void 0;if(y&&(y.resourceId!==h.resourceId||y.artifactId===h.artifactId&&y.id===h.id))throw Error("Rollback target does not match the release resource");let C=await e.resolveDriver(h);a.checkpoint("verify",`Verifying ${S.digest} and ${h.configHash} for ${C.name}.`),a.log(`Artifact ${S.digest}; source ${h.sourceSha??"not recorded"}; config ${h.configHash}.`,{stream:"system"}),a.throwIfCancellationRequested();let T;try{T=a.operation.kind==="release.rollback"?await Al(C,{release:h,artifact:S,previous:y}):await fl(C,{release:h,artifact:S,previous:y})}catch(j){if(a.operation.kind==="release.activate"&&t.releases.get(h.id)?.status==="activating")t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,message:j instanceof Error?j.message:String(j)});throw j}for(let j of T.transitions)t.releases.progress(h.id,{message:`${a.operation.kind==="release.rollback"?"Rollback":"Activation"} traffic at ${j.trafficPercent}%.`,trafficPercent:j.trafficPercent,health:j.observed,operationId:a.operation.id}),a.log(`Traffic ${j.trafficPercent}%: ${j.healthy?"healthy":"unhealthy"}.`,{stream:j.healthy?"step":"stderr",step:"health"});if(a.checkpoint("health","Evaluating the provider health result."),!T.activated||!T.healthy){if(a.operation.kind==="release.activate"&&t.releases.get(h.id)?.status==="activating")t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,health:{resourceVersions:T.resourceVersions},message:T.error??"Provider health gate failed."});throw Error(T.error??`${C.name} reported an unhealthy release`)}if(a.operation.kind==="release.activate"&&h.healthGate?.name){if(!e.resolveHealthGate)throw t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,message:`Named health gate ${h.healthGate.name} is not available to this worker.`}),Error(`Named health gate ${h.healthGate.name} is unavailable`);a.checkpoint("named-health-gate",`Waiting on ${h.healthGate.name}.`);let j=await e.resolveHealthGate(h.healthGate.name,h);if(a.log(`${h.healthGate.name}: ${j.healthy?"healthy":"unhealthy"}${j.message?` — ${j.message}`:""}.`,{stream:j.healthy?"step":"stderr",step:"health"}),!j.healthy)throw t.completeHealthGate(h.id,{healthy:!1,operationId:a.operation.id,health:j.evidence,message:j.message??`Named health gate ${h.healthGate.name} failed.`}),Error(j.message??`Named health gate ${h.healthGate.name} failed`)}if(a.operation.kind==="release.rollback"){let j=t.releases.get(h.id);if(j.status!=="rolled_back")t.releases.transition(j.id,"rolled_back",{message:`Traffic restored through ${C.name}.`,operationId:a.operation.id,trafficPercent:0,health:{resourceVersions:T.resourceVersions}});if(y&&y.status!=="active"){let B=y.status==="activating"?y:t.releases.transition(y.id,"activating",{message:"Rollback target restoring traffic.",operationId:a.operation.id,trafficPercent:0});t.releases.transition(B.id,"active",{message:"Previous immutable release restored.",operationId:a.operation.id,trafficPercent:100,health:{resourceVersions:T.resourceVersions}})}}else t.completeHealthGate(h.id,{healthy:!0,operationId:a.operation.id,health:{providerVersion:T.providerVersion??null,resourceVersions:T.resourceVersions},message:"Provider activation and health gates completed."});return a.checkpoint("finalize","Persisted the terminal release state."),{releaseId:h.id,artifactDigest:S.digest,provider:C.name,providerVersion:T.providerVersion??null,resourceVersions:T.resourceVersions,status:t.releases.get(h.id).status}};return Object.fromEntries(Jm.map((a)=>[a,r]))}import{createCipheriv as Lk,createDecipheriv as Fk,createHash as Mf,randomBytes as fp}from"node:crypto";var Lf={github:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},gitlab:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},bitbucket:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!0,deployKeys:!0},gitea:{repositories:!0,branches:!0,tags:!0,webhooks:!0,pullRequests:!0,tokenRefresh:!1,deployKeys:!0},generic_https:{repositories:!1,branches:!0,tags:!0,webhooks:!1,pullRequests:!1,tokenRefresh:!1,deployKeys:!1},generic_ssh:{repositories:!1,branches:!0,tags:!0,webhooks:!1,pullRequests:!1,tokenRefresh:!1,deployKeys:!0}};function Wt(e){return typeof e==="string"&&e?e:void 0}function To(e,t){try{return typeof e==="string"?JSON.parse(e):t}catch{return t}}function ei(e){return JSON.stringify(s(e))}function Po(e){return Mf("sha256").update(e).digest("hex")}function $f(e){let t=e.trim().replace(/\/$/,""),r=new URL(t.includes("://")?t:`https://${t}`);if(r.username||r.password||r.search||r.hash)throw Error("Source host cannot contain credentials, a query, or a fragment");if(r.protocol!=="https:"&&!(r.protocol==="http:"&&["localhost","127.0.0.1","::1"].includes(r.hostname)))throw Error("Source host must use HTTPS");return`${r.protocol}//${r.host}${r.pathname.replace(/\/$/,"")}`}function Nf(e){let t=e.trim();if(t.length<2||t.length>80)throw Error("Connection name must contain 2-80 characters");return t}function hp(e){let t=e.trim().replace(/^\/+|\/+$/g,"");if(!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(t))throw Error("Repository must use owner/name format");return t}function jf(e){let t=e.trim()||".";if(t.startsWith("/")||t.split("/").includes("..")||/[\0\r\n]/.test(t))throw Error("Monorepo root must stay inside the repository");return t.replace(/^\.\//,"")||"."}function Mc(e){return[...new Set((e??[]).map((t)=>t.trim()).filter(Boolean))].slice(0,100)}function zk(e){let t=e.trim();if(/\r|\n/.test(t)||/https?:\/\/[^/@\s]+:[^/@\s]+@/i.test(t))throw Error("Clone URL cannot contain credentials or control characters");if(!/^(?:https?:\/\/|ssh:\/\/|git@[A-Za-z0-9.-]+:)/.test(t))throw Error("Clone URL must use HTTPS or SSH");return t}function Uk(e){return{id:String(e.id),organizationId:String(e.organization_id),provider:String(e.provider),name:String(e.name),host:String(e.host),owner:Wt(e.owner),authKind:String(e.auth_kind),credentialConfigured:!!e.credential_ciphertext,credentialFingerprint:Wt(e.credential_fingerprint),grantedScopes:To(e.granted_scopes,[]),capabilities:To(e.capabilities,Lf[String(e.provider)]),status:String(e.status),healthMessage:Wt(e.health_message),lastTestedAt:Wt(e.last_tested_at),lastSyncedAt:Wt(e.last_synced_at),credentialExpiresAt:Wt(e.credential_expires_at),version:Number(e.version),createdByActorId:Wt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function yp(e){return{id:String(e.id),connectionId:String(e.connection_id),providerRepositoryId:String(e.provider_repository_id),fullName:String(e.full_name),cloneUrl:String(e.clone_url),defaultBranch:String(e.default_branch),visibility:String(e.visibility),archived:Number(e.archived)===1,metadata:To(e.metadata,{}),syncedAt:String(e.synced_at)}}function Bf(e){return{id:String(e.id),projectId:String(e.project_id),environmentId:Wt(e.environment_id),resourceId:Wt(e.resource_id),connectionId:String(e.connection_id),repositoryId:Wt(e.repository_id),repositoryFullName:String(e.repository_full_name),defaultBranch:String(e.default_branch),branchRule:Wt(e.branch_rule),tagRule:Wt(e.tag_rule),monorepoRoot:String(e.monorepo_root),includePaths:To(e.include_paths,[]),excludePaths:To(e.exclude_paths,[]),submodules:Number(e.submodules)===1,cloneDepth:e.clone_depth==null?void 0:Number(e.clone_depth),deployKeyId:Wt(e.deploy_key_id),autoDeploy:Number(e.auto_deploy)===1,pullRequestPreviews:Number(e.pull_request_previews)===1,status:String(e.status),disabledReason:Wt(e.disabled_reason),version:Number(e.version),createdByActorId:Wt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function vp(e){return{id:String(e.id),connectionId:String(e.connection_id),name:String(e.name),publicKey:String(e.public_key),publicKeyFingerprint:String(e.public_key_fingerprint),host:String(e.host),hostKey:String(e.host_key),hostKeyFingerprint:String(e.host_key_fingerprint),createdByActorId:Wt(e.created_by_actor_id),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function bp(e){return{id:String(e.id),connectionId:String(e.connection_id),repositoryId:Wt(e.repository_id),repositoryFullName:String(e.repository_full_name),providerWebhookId:Wt(e.provider_webhook_id),events:To(e.events,[]),status:String(e.status),healthMessage:Wt(e.health_message),lastDeliveryAt:Wt(e.last_delivery_at),lastReconciledAt:Wt(e.last_reconciled_at),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Sp(e){return{id:String(e.id),connectionId:String(e.connection_id),webhookId:String(e.webhook_id),providerDeliveryId:String(e.provider_delivery_id),event:String(e.event),action:Wt(e.action),commitSha:Wt(e.commit_sha),signatureStatus:String(e.signature_status),status:String(e.status),payloadSummary:To(e.payload_summary,{}),operationId:Wt(e.operation_id),error:Wt(e.error),receivedAt:String(e.received_at),processedAt:Wt(e.processed_at)}}class Qo{controlPlane;key;nowFn;idFn;constructor(e,t={}){this.controlPlane=e;this.key=t.encryptionKey?Mf("sha256").update(t.encryptionKey).digest():void 0,this.nowFn=t.now??(()=>new Date),this.idFn=t.id??(()=>crypto.randomUUID())}now(){return this.nowFn().toISOString()}run(e,t){this.controlPlane.database.run(e,t)}encrypt(e){if(!this.key)throw Error("Source credential encryption key is not configured");let t=fp(12),r=Lk("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){if(!this.key)throw Error("Source credential encryption key is not configured");let[t,r,a,l]=e.split(".");if(t!=="v1"||!r||!a||!l)throw Error("Encrypted source credential is unavailable");let m=Fk("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return m.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([m.update(Buffer.from(l,"base64url")),m.final()]).toString("utf8")}createConnection(e){if(!this.controlPlane.getOrganization(e.organizationId))throw Error("Source connection organization was not found");let t=this.now(),r=this.idFn(),a=e.credential?JSON.stringify(e.credential):void 0;return this.run(`INSERT INTO source_connections (id, organization_id, provider, name, host, owner, auth_kind, credential_ciphertext, credential_fingerprint, granted_scopes, capabilities, status, credential_expires_at, created_by_actor_id, created_at, updated_at)
|
|
43
43
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?, ?, ?, ?)`,[r,e.organizationId,e.provider,Nf(e.name),$f(e.host),e.owner?.trim()||null,e.authKind??(a?"access_token":"none"),a?this.encrypt(a):null,a?Po(a).slice(0,16):null,ei([...new Set(e.grantedScopes??[])].sort()),ei(Lf[e.provider]),e.credentialExpiresAt??null,e.createdByActorId??null,t,t]),this.controlPlane.appendEvent({organizationId:e.organizationId,actorId:e.createdByActorId,type:"source.connection.created",payload:{connectionId:r,provider:e.provider,host:$f(e.host),owner:e.owner??null,scopes:e.grantedScopes??[]}}),this.getConnection(r)}getConnection(e){let t=this.controlPlane.database.query("SELECT * FROM source_connections WHERE id = ?").get(e);return t?this.currentConnection(t):void 0}listConnections(e){return this.controlPlane.database.query("SELECT * FROM source_connections WHERE organization_id = ? ORDER BY name").all(e).map((t)=>this.currentConnection(t))}currentConnection(e){let t=Uk(e);if(t.status!=="disconnected"&&t.credentialExpiresAt&&new Date(t.credentialExpiresAt).getTime()<=this.nowFn().getTime())return{...t,status:"expired",healthMessage:"Source credential expired; rotate it before deploying."};return t}getCredential(e){let t=this.controlPlane.database.query("SELECT credential_ciphertext FROM source_connections WHERE id = ?").get(e);return t?.credential_ciphertext?JSON.parse(this.decrypt(String(t.credential_ciphertext))):void 0}rotateCredential(e,t,r={}){let a=this.getConnection(e);if(!a||a.status==="disconnected")throw Error("Active source connection was not found");let l=JSON.stringify(t);return this.run("UPDATE source_connections SET credential_ciphertext = ?, credential_fingerprint = ?, credential_expires_at = ?, status = 'pending', health_message = NULL, version = version + 1, updated_at = ? WHERE id = ?",[this.encrypt(l),Po(l).slice(0,16),r.expiresAt??null,this.now(),e]),this.controlPlane.appendEvent({organizationId:a.organizationId,actorId:r.actorId,type:"source.credential.rotated",payload:{connectionId:e,fingerprint:Po(l).slice(0,16),expiresAt:r.expiresAt??null}}),this.getConnection(e)}updateHealth(e,t){let r=this.getConnection(e);if(!r||["disconnected","expired"].includes(r.status))throw Error("Active source connection was not found");let a=this.now(),l=t.grantedScopes?[...new Set(t.grantedScopes.map((m)=>m.trim()).filter(Boolean))].sort():void 0;if(this.run("UPDATE source_connections SET status = ?, health_message = ?, granted_scopes = COALESCE(?, granted_scopes), last_tested_at = COALESCE(?, last_tested_at), last_synced_at = COALESCE(?, last_synced_at), version = version + 1, updated_at = ? WHERE id = ?",[t.status,t.message?.slice(0,1000)??null,l?ei(l):null,t.tested?a:null,t.synced?a:null,a,e]),l&&JSON.stringify(l)!==JSON.stringify([...r.grantedScopes].sort()))this.controlPlane.appendEvent({organizationId:r.organizationId,type:"source.connection.scopes_updated",payload:{connectionId:e,grantedScopes:l}});return this.getConnection(e)}upsertRepository(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status))throw Error("Active source connection was not found");let r=this.now(),a=this.controlPlane.database.query("SELECT id FROM source_repositories WHERE connection_id = ? AND provider_repository_id = ?").get(e.connectionId,e.providerRepositoryId),l=a?String(a.id):this.idFn();return this.run(`INSERT INTO source_repositories (id, connection_id, provider_repository_id, full_name, clone_url, default_branch, visibility, archived, metadata, synced_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
44
44
|
ON CONFLICT(connection_id, provider_repository_id) DO UPDATE SET full_name=excluded.full_name, clone_url=excluded.clone_url, default_branch=excluded.default_branch, visibility=excluded.visibility, archived=excluded.archived, metadata=excluded.metadata, synced_at=excluded.synced_at`,[l,e.connectionId,e.providerRepositoryId,hp(e.fullName),zk(e.cloneUrl),e.defaultBranch.trim()||"main",e.visibility,e.archived?1:0,ei(e.metadata),r]),yp(this.controlPlane.database.query("SELECT * FROM source_repositories WHERE id = ?").get(l))}listRepositories(e,t,r=100){let a=t?.trim().toLowerCase();return(a?this.controlPlane.database.query("SELECT * FROM source_repositories WHERE connection_id = ? AND lower(full_name) LIKE ? ORDER BY full_name LIMIT ?").all(e,`%${a}%`,Math.min(500,r)):this.controlPlane.database.query("SELECT * FROM source_repositories WHERE connection_id = ? ORDER BY full_name LIMIT ?").all(e,Math.min(500,r))).map(yp)}getRepository(e){let t=this.controlPlane.database.query("SELECT * FROM source_repositories WHERE id = ?").get(e);return t?yp(t):void 0}createDeployKey(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status)||!t.capabilities.deployKeys)throw Error("An active deploy-key capable source connection is required");if(!/^ssh-(?:ed25519|rsa)\s+[A-Za-z0-9+/=]+/.test(e.publicKey.trim()))throw Error("A valid SSH public key is required");if(!/BEGIN (?:OPENSSH|RSA) PRIVATE KEY/.test(e.privateKey))throw Error("A valid SSH private key is required");if(!/^(?:ssh-ed25519|ssh-rsa|ecdsa-sha2-nistp\d+)\s+[A-Za-z0-9+/=]+/.test(e.hostKey.trim()))throw Error("A pinned SSH host key is required");let r=this.idFn(),a=this.now(),l=`sha256:${Po(e.publicKey.trim())}`,m=`sha256:${Po(e.hostKey.trim())}`;return this.run("INSERT INTO source_deploy_keys (id, connection_id, name, public_key, public_key_fingerprint, private_key_ciphertext, host, host_key, host_key_fingerprint, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.connectionId,Nf(e.name),e.publicKey.trim(),l,this.encrypt(e.privateKey),e.host.trim().toLowerCase(),e.hostKey.trim(),m,e.actorId??null,a,a]),this.controlPlane.appendEvent({organizationId:t.organizationId,actorId:e.actorId,type:"source.deploy_key.created",payload:{connectionId:e.connectionId,deployKeyId:r,publicFingerprint:l,hostFingerprint:m}}),vp(this.controlPlane.database.query("SELECT * FROM source_deploy_keys WHERE id = ?").get(r))}getDeployKey(e){let t=this.controlPlane.database.query("SELECT * FROM source_deploy_keys WHERE id = ?").get(e);return t?vp(t):void 0}listDeployKeys(e){return this.controlPlane.database.query("SELECT * FROM source_deploy_keys WHERE connection_id = ? ORDER BY name, created_at").all(e).map(vp)}revokeDeployKey(e,t){let r=this.getDeployKey(e),a=r?this.getConnection(r.connectionId):void 0;if(!r||!a)throw Error("Deploy key was not found");let l=this.listBindings({connectionId:a.id}).filter((h)=>h.deployKeyId===e),m=this.now();return this.controlPlane.database.transaction(()=>{this.run("UPDATE source_bindings SET deploy_key_id=NULL, status='disabled', auto_deploy=0, disabled_reason='Source deploy key was revoked', version=version+1, updated_at=? WHERE deploy_key_id=?",[m,e]),this.run("DELETE FROM source_deploy_keys WHERE id=?",[e])})(),this.controlPlane.appendEvent({organizationId:a.organizationId,actorId:t,type:"source.deploy_key.revoked",level:"warning",payload:{connectionId:a.id,deployKeyId:e,affectedBindingIds:l.map((h)=>h.id)}}),{affectedBindings:l}}getDeployPrivateKey(e){let t=this.controlPlane.database.query("SELECT private_key_ciphertext FROM source_deploy_keys WHERE id = ?").get(e);if(!t)throw Error("Deploy key was not found");return this.decrypt(String(t.private_key_ciphertext))}createBinding(e){let t=this.getConnection(e.connectionId);if(!t||["disconnected","expired"].includes(t.status))throw Error("Active source connection was not found");if(e.repositoryId&&this.getRepository(e.repositoryId)?.connectionId!==t.id)throw Error("Repository does not belong to this connection");if(e.deployKeyId&&this.getDeployKey(e.deployKeyId)?.connectionId!==t.id)throw Error("Deploy key does not belong to this connection");let r=this.idFn(),a=this.now();return this.run(`INSERT INTO source_bindings (id, project_id, environment_id, resource_id, connection_id, repository_id, repository_full_name, default_branch, branch_rule, tag_rule, monorepo_root, include_paths, exclude_paths, submodules, clone_depth, deploy_key_id, auto_deploy, pull_request_previews, status, created_by_actor_id, created_at, updated_at)
|
|
@@ -99,7 +99,7 @@ protected-mode yes
|
|
|
99
99
|
requirepass ${a.replaceAll("\\","\\\\").replaceAll(`
|
|
100
100
|
`,"")}
|
|
101
101
|
`:a;if(await this.runtime.seedSecret(`${l}-secret`,C),S==="redis")await this.runtime.restart(l);return{status:S==="redis"?"restarting":"running",username:R}}if(t==="delete"){if(r.retention==="retain")return{status:"retained"};let m=await this.backup(e,r);return await this.runtime.remove(l),await this.runtime.removeVolume(`${l}-secret`),await this.runtime.removeVolume(`${l}-data`),{status:"deleted",finalBackupId:m.backupId??null,backupPath:m.path??null}}if(t==="expose")throw Error("Direct container exposure is refused; use a reviewed firewall and proxy policy.");throw Error(`${t} requires a configured engine lifecycle runner.`)}}import{createCipheriv as rE,createDecipheriv as nE,createHash as qh,randomBytes as iE}from"node:crypto";class la{controlPlane;now;key;constructor(e,t,r=()=>new Date){this.controlPlane=e;this.now=r;if(!t)throw Error("Data-service encryption key is required.");this.key=qh("sha256").update(`ts-cloud:data-services:${t}`).digest()}encrypt(e){let t=iE(12),r=rE("aes-256-gcm",this.key,t),a=Buffer.concat([r.update(e,"utf8"),r.final()]);return`v1.${t.toString("base64url")}.${r.getAuthTag().toString("base64url")}.${a.toString("base64url")}`}decrypt(e){let[t,r,a,l]=e.split(".");if(t!=="v1"||!r||!a||!l)throw Error("Encrypted data-service secret is unavailable.");try{let m=nE("aes-256-gcm",this.key,Buffer.from(r,"base64url"));return m.setAuthTag(Buffer.from(a,"base64url")),Buffer.concat([m.update(Buffer.from(l,"base64url")),m.final()]).toString("utf8")}catch{throw Error("Encrypted data-service secret could not be decrypted.")}}async put(e,t){if(!/^secret:\/\/data-services\/[A-Za-z0-9._/-]+$/.test(e))throw Error("Invalid data-service secret reference.");if(!t)throw Error("Data-service secret cannot be empty.");let r=this.now().toISOString();this.controlPlane.database.run("INSERT INTO data_service_secrets (reference,ciphertext,fingerprint,created_at,updated_at) VALUES (?,?,?,?,?) ON CONFLICT(reference) DO UPDATE SET ciphertext=excluded.ciphertext,fingerprint=excluded.fingerprint,updated_at=excluded.updated_at",[e,this.encrypt(t),qh("sha256").update(t).digest("hex"),r,r])}async resolve(e){let t=this.controlPlane.database.query("SELECT ciphertext FROM data_service_secrets WHERE reference = ?").get(e);if(!t)throw Error("Data-service secret was not found.");return this.decrypt(t.ciphertext)}async remove(e){this.controlPlane.database.run("DELETE FROM data_service_secrets WHERE reference = ?",[e])}}import{existsSync as sc}from"node:fs";import{mkdir as rd,readdir as oE,rename as Mp,rm as Ns}from"node:fs/promises";import{relative as sE,resolve as hn,sep as nd}from"node:path";function wt(e,t){if(t==="gzip")return Buffer.from(Bun.gzipSync(Uint8Array.from(e)));if(t==="zstd")return Buffer.from(Bun.zstdCompressSync(Uint8Array.from(e)));return Buffer.from(e)}function Oe(e,t){if(t==="gzip")return Buffer.from(Bun.gunzipSync(Uint8Array.from(e)));if(t==="zstd")return Buffer.from(Bun.zstdDecompressSync(Uint8Array.from(e)));return Buffer.from(e)}async function Lp(e,t){let r=Bun.spawn(["tar",...e],{stdin:t?Buffer.from(t):void 0,stdout:"pipe",stderr:"pipe"}),[a,l,m]=await Promise.all([r.exited,new Response(r.stdout).arrayBuffer(),new Response(r.stderr).text()]);if(a!==0)throw Error(m.trim()||`tar exited with status ${a}.`);return{stdout:Buffer.from(l),stderr:m}}function aE(e){let t=e.replaceAll("\\","/").replace(/^\.\//,"");return!!t&&!t.startsWith("/")&&!t.split("/").includes("..")}class yu{async create(e,t,r){return(await Lp(["-C",e,"-cf","-",...r.map((l)=>`--exclude=${l}`),"--",...t])).stdout}async extract(e,t){await rd(t,{recursive:!0,mode:448}),await Lp(["-C",t,"-xf","-"],e)}async inspect(e){let t=await Lp(["-tf","-"],e),r=t.stdout.toString().split(`
|
|
102
|
-
`).filter(Boolean);if(r.some((a)=>!aE(a)))throw Error("Backup archive contains an unsafe path.");return{entries:r,bytes:e.byteLength}}}function Vh(e,t){if(!t.trim())throw Error("File backup paths cannot be empty.");let r=hn(e,t),a=sE(e,r);if(a===".."||a.startsWith(`..${nd}`)||a==="")throw Error(`File backup path ${t} is outside the project root.`);return a}function td(e){let t=String(e.targetId??e.path??"");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(t))throw Error("File restores require a safe target name.");return t}class Ra{runtime;root;restoreRoot;constructor(e,t=new yu,r=d(e,"restores","files")){this.runtime=t;this.root=hn(e),this.restoreRoot=hn(r)}paths(e){let t=[...new Set(e.includePatterns.map((r)=>Vh(this.root,r)))];if(!t.length)throw Error("File backup policies require at least one project-relative path.");for(let r of t)if(!sc(hn(this.root,r)))throw Error(`File backup path ${r} was not found.`);return t.filter((r)=>!t.some((a)=>a!==r&&r.startsWith(`${a}${nd}`)))}async create(e,t){let r=this.paths(e),a=await this.runtime.create(this.root,r,e.excludePatterns),l=await this.runtime.inspect(a),m=e.compression??"none",h=wt(a,m),S=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/files/${S}.tar${m==="none"?"":m==="gzip"?".gz":".zst"}`,body:h,contentType:m==="gzip"?"application/gzip":m==="zstd"?"application/zstd":"application/x-tar",manifest:{archive:"tar",compression:m,sourcePaths:r,excluded:e.excludePatterns,entries:l.entries.length},toolVersion:"system-tar"}}async restore(e,t,r,a){if(!t)throw Error("File restore requires an archive payload.");let l=Oe(t,String(e.manifest.compression??"none"));if(await this.runtime.inspect(l),r.restoreMode==="in_place"){let h=hn(this.restoreRoot,`.staging-${td(r)}`),S=hn(this.restoreRoot,`.rollback-${td(r)}`),R=Array.isArray(e.manifest.sourcePaths)?e.manifest.sourcePaths.map(String):[];if(!R.length)throw Error("File recovery point has no source path manifest.");await Ns(h,{recursive:!0,force:!0}),await Ns(S,{recursive:!0,force:!0}),await this.runtime.extract(l,h),await rd(S,{recursive:!0,mode:448});let y=[];try{for(let C of R){let T=hn(this.root,Vh(this.root,C)),j=hn(h,C),B=hn(S,C);if(await rd(hn(B,".."),{recursive:!0}),sc(T))await Mp(T,B);await rd(hn(T,".."),{recursive:!0}),await Mp(j,T),y.push(C)}}catch(C){for(let T of y.reverse()){let j=hn(this.root,T),B=hn(S,T);if(await Ns(j,{recursive:!0,force:!0}),sc(B))await Mp(B,j)}throw C}finally{await Ns(h,{recursive:!0,force:!0})}return await Ns(S,{recursive:!0,force:!0}),{path:this.root,restoredPaths:R,inPlace:!0}}let m=hn(this.restoreRoot,td(r));if(sc(m))throw Error("The isolated file restore target already exists.");return await this.runtime.extract(l,m),{path:m,isolated:!0}}async verify(e,t,r){let a=Oe(t,String(e.manifest.compression??"none")),l=await this.runtime.inspect(a);return{archive:"tar",entries:l.entries.length,uncompressedBytes:l.bytes}}async validateHealth(e,t){let r=String(e.path??"");if(!r||!r.startsWith(`${this.restoreRoot}${nd}`)||!sc(r))throw Error("Isolated file restore target was not found.");let a=await oE(r);return{healthy:!0,path:r,topLevelEntries:a.length}}async cleanup(e,t){let r=td(e),a=hn(this.restoreRoot,r);if(!a.startsWith(`${this.restoreRoot}${nd}`))throw Error("Refusing to clean a file restore outside the restore root.");await Ns(a,{recursive:!0,force:!0})}}class Da{services;secrets;transport;constructor(e,t,r=new er){this.services=e;this.secrets=t;this.transport=r}async create(e,t){if(!e.dataServiceId)throw Error("Logical database backups require a data service.");let r=this.services.get(e.dataServiceId);if(!r)throw Error("Logical database service was not found.");if(!["container","server"].includes(r.provider))throw Error("Logical database backups require an on-box data service.");let a=await this.transport.exportLogicalBackup(r.id),l=e.compression??"none",m=wt(a.body,l),h=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/databases/${r.id}/${h}.sql${l==="none"?"":l==="gzip"?".gz":".zst"}`,body:m,contentType:l==="gzip"?"application/gzip":l==="zstd"?"application/zstd":"application/sql",engineVersion:a.engineVersion,toolVersion:"engine-native",manifest:{format:"logical-sql-v1",sourceDataServiceId:r.id,engine:a.engine,database:a.database,username:a.username,compression:l}}}async restore(e,t,r,a){if(!t)throw Error("Logical database backup body is unavailable.");let l=String(e.dataServiceId??e.manifest.sourceDataServiceId??""),m=String(r.dataServiceId??r.targetId??""),h=r.inPlace===!0;if(!l||!m)throw Error("Logical database restore requires source and target identifiers.");if(h&&m!==l)throw Error("An in-place restore must target the source data service.");let S=this.services.get(l);if(!S?.credentialRef)throw Error("Logical database credential reference was not found.");let R=await this.secrets.resolve(S.credentialRef);return this.transport.restoreLogicalBackup({sourceId:l,targetId:m,body:Oe(t,String(e.manifest.compression??"none")),credential:R,inPlace:h})}async cleanup(e,t){if(e.inPlace===!0)throw Error("In-place database restores cannot be cleaned as drills.");let r=String(e.dataServiceId??e.targetId??"");if(!r)throw Error("Database cleanup requires a target identifier.");await this.transport.removeRestoredService(r)}}var Fp=/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/;async function ss(e,t,r=!1){let a=Bun.spawn(["docker",...e],{stdin:t?"pipe":"ignore",stdout:"pipe",stderr:"pipe"}),l=new Response(a.stdout).arrayBuffer(),m=new Response(a.stderr).text();if(t)a.stdin.write(t),a.stdin.end();let[h,S,R]=await Promise.all([a.exited,l,m]);if(h!==0&&!r)throw Error(`Docker volume command failed (${h}): ${R.trim()}`);return{code:h,stdout:Buffer.from(S),stderr:R}}class Iu{async exists(e){return(await ss(["volume","inspect",e],void 0,!0)).code===0}async export(e){return(await ss(["run","--rm","-v",`${e}:/source:ro`,"alpine:3.21","tar","-C","/source","-czf","-","."])).stdout}async import(e,t,r=!1){if(!await this.exists(e))await ss(["volume","create",e]);try{if(r)await ss(["run","--rm","-v",`${e}:/target`,"alpine:3.21","sh","-c","find /target -mindepth 1 -delete"]);await ss(["run","--rm","-i","-v",`${e}:/target`,"alpine:3.21","tar","-C","/target","--no-same-owner","-xzf","-"],t)}catch(a){throw await this.remove(e),a}}async remove(e){await ss(["volume","rm",e],void 0,!0)}async probe(e){let t=(await ss(["run","--rm","-v",`${e}:/target:ro`,"alpine:3.21","sh","-c",`find /target -mindepth 1 -printf '%s\\n' | awk '{n+=1;b+=$1} END {print n ":" b}'`])).stdout.toString(),[r,a]=t.trim().split(":").map(Number);if(!Number.isFinite(r)||!Number.isFinite(a))throw Error("Restored volume health probe returned invalid output.");return{entries:r,bytes:a}}}class Pa{runtime;constructor(e=new Iu){this.runtime=e}async create(e,t){let r=String(e.includePatterns?.[0]??e.resourceId??"");if(!Fp.test(r))throw Error("Volume backups require a valid named-volume resource identifier.");if(!await this.runtime.exists(r))throw Error(`Volume ${r} was not found.`);let a=await this.runtime.export(r),l=Buffer.from(Bun.gunzipSync(Uint8Array.from(a))),m=e.compression??"gzip",h=m==="gzip"?a:wt(l,m),S=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/volumes/${r}/${S}.tar${m==="none"?"":m==="gzip"?".gz":".zst"}`,body:h,contentType:m==="gzip"?"application/gzip":m==="zstd"?"application/zstd":"application/x-tar",toolVersion:"alpine-tar",manifest:{format:"docker-volume-tar-v1",archive:"tar",compression:m,sourceVolume:r}}}async restore(e,t,r,a){if(!t)throw Error("Volume backup body is unavailable.");let l=String(e.manifest.sourceVolume??e.resourceId??""),m=String(r.volumeName??r.targetId??"");if(!Fp.test(m))throw Error("Volume restore requires a valid target volume name.");if(m===l&&r.inPlace!==!0)throw Error("An isolated volume restore requires a distinct target.");let h=await this.runtime.exists(m);if(!r.inPlace&&h)throw Error(`Restore target volume ${m} already exists.`);if(r.inPlace===!0&&m!==l)throw Error("An in-place volume restore must target the source volume.");if(r.inPlace===!0&&!h)throw Error("The in-place target volume was not found.");let S=String(e.manifest.compression??"gzip"),R=S==="gzip"?Buffer.from(t):Buffer.from(Bun.gzipSync(Uint8Array.from(Oe(t,S))));await this.runtime.import(m,R,r.inPlace===!0);let y=await this.runtime.probe(m);return{volumeName:m,healthy:!0,...y}}async cleanup(e,t){if(e.inPlace===!0)throw Error("In-place volume restores cannot be cleaned as drills.");let r=String(e.volumeName??e.targetId??"");if(!Fp.test(r))throw Error("Volume cleanup requires a valid target volume name.");await this.runtime.remove(r)}}import{existsSync as zp}from"node:fs";import{mkdir as cE,readFile as Wh,rm as dE,writeFile as Hh}from"node:fs/promises";import{basename as Yh,resolve as so,sep as Kh}from"node:path";import{Database as lE}from"bun:sqlite";function Jh(e){let t=String(e.targetId??e.path??"");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(t))throw Error("Control-plane restores require a safe target name.");return t}function Gh(e){let t=JSON.parse(Buffer.from(e).toString());if(t.format!=="ts-cloud-control-plane-v1"||!t.database)throw Error("Control-plane backup archive is invalid.");if(!Array.isArray(t.config)||t.config.some((r)=>Yh(r.name)!==r.name))throw Error("Control-plane backup contains an unsafe config path.");return t}function Qh(e){let t=lE.deserialize(Uint8Array.from(e));try{let r=t.query("PRAGMA integrity_check").get()?.integrity_check??"unknown",a=t.query("SELECT count(*) AS count FROM sqlite_master WHERE type='table'").get()?.count??0;if(r!=="ok")throw Error(`Restored control-plane integrity check failed: ${r}.`);return{integrity:r,tables:a}}finally{t.close()}}class Na{controlPlane;root;restoreRoot;constructor(e,t,r=d(t,"restores","control-plane")){this.controlPlane=e;this.root=so(t),this.restoreRoot=so(r)}async create(e,t){let r=e.includePatterns.length?e.includePatterns:["cloud.config.ts"],a=[];for(let R of r){let y=Yh(R),C=so(this.root,y);if(y!==R&&R!==`./${y}`)throw Error("Control-plane config paths must be project-root files.");if(zp(C))a.push({name:y,body:(await Wh(C)).toString("base64")})}let l={format:"ts-cloud-control-plane-v1",createdAt:new Date().toISOString(),database:Buffer.from(this.controlPlane.database.serialize()).toString("base64"),config:a},m=e.compression??"none",h=wt(Buffer.from(JSON.stringify(l)),m),S=String(t.operation?.id??l.createdAt).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/control-plane/${S}.json${m==="none"?"":m==="gzip"?".gz":".zst"}`,body:h,contentType:m==="gzip"?"application/gzip":m==="zstd"?"application/zstd":"application/vnd.ts-cloud.control-plane+json",manifest:{format:l.format,configFiles:a.map((R)=>R.name),sensitive:!0,compression:m},toolVersion:"bun-sqlite-serialize"}}async restore(e,t,r,a){if(!t)throw Error("Control-plane restore requires an archive payload.");if(r.restoreMode==="in_place")throw Error("A live control plane can only be restored into an isolated recovery target.");let l=Gh(Oe(t,String(e.manifest.compression??"none"))),m=so(this.restoreRoot,Jh(r));if(zp(m))throw Error("The isolated control-plane restore target already exists.");await cE(m,{recursive:!0,mode:448}),await Hh(so(m,"control-plane.sqlite"),Buffer.from(l.database,"base64"),{mode:384});for(let h of l.config)await Hh(so(m,h.name),Buffer.from(h.body,"base64"),{mode:384});return{path:m,isolated:!0,configFiles:l.config.length}}async verify(e,t,r){let a=Gh(Oe(t,String(e.manifest.compression??"none")));return{...Qh(Buffer.from(a.database,"base64")),configFiles:a.config.length}}async validateHealth(e,t){let r=String(e.path??""),a=so(r,"control-plane.sqlite");if(!r.startsWith(`${this.restoreRoot}${Kh}`)||!zp(a))throw Error("Isolated control-plane database was not found.");return{healthy:!0,...Qh(await Wh(a))}}async cleanup(e,t){let r=so(this.restoreRoot,Jh(e));if(!r.startsWith(`${this.restoreRoot}${Kh}`))throw Error("Refusing to clean a control-plane restore outside the restore root.");await dE(r,{recursive:!0,force:!0})}}import{createHash as uE}from"node:crypto";function Up(e,t){return e.find((r)=>r.startsWith(`${t}:`))?.slice(t.length+1)}function pE(e){let t=Up(e.includePatterns,"resource")??e.includePatterns.find((l)=>l.startsWith("arn:")),r=Up(e.includePatterns,"role"),a=Up(e.includePatterns,"vault")??"Default";if(!t?.startsWith("arn:"))throw Error("Infrastructure backups require resource:<arn> in include patterns.");if(!r?.startsWith("arn:"))throw Error("Infrastructure backups require role:<iam-role-arn> in include patterns.");if(!/^[A-Za-z0-9_.-]{2,50}$/.test(a))throw Error("Infrastructure backup vault name is invalid.");return{resourceArn:t,roleArn:r,vaultName:a}}async function gE(e,t,r){for(;;){r.throwIfCancellationRequested(),r.heartbeat();let a=await e.describeBackupJob(t),l=String(a.State??"");if(r.checkpoint("provider_backup",`AWS Backup job ${t} is ${l||"pending"}.`),l==="COMPLETED"&&a.RecoveryPointArn)return{recoveryPointArn:a.RecoveryPointArn,sizeBytes:Number(a.BackupSizeInBytes??0)};if(["ABORTED","EXPIRED","FAILED"].includes(l))throw Error(`AWS Backup job ${t} failed: ${a.StatusMessage??l}.`);await Bun.sleep(5000)}}async function mE(e,t,r){for(;;){r.throwIfCancellationRequested(),r.heartbeat();let a=await e.describeRestoreJob(t),l=String(a.Status??"");if(r.checkpoint("provider_restore",`AWS Backup restore ${t} is ${l||"pending"}.`),l==="COMPLETED"&&a.CreatedResourceArn)return a.CreatedResourceArn;if(["ABORTED","FAILED"].includes(l))throw Error(`AWS Backup restore ${t} failed: ${a.StatusMessage??l}.`);await Bun.sleep(5000)}}class ka{client;constructor(e=new ir){this.client=e}async create(e,t){let r=pE(e),a=String(t.operation.id).replace(/[^A-Za-z0-9-]/g,"").slice(0,64),l=await this.client.startBackupJob({BackupVaultName:r.vaultName,ResourceArn:r.resourceArn,IamRoleArn:r.roleArn,IdempotencyToken:a}),m=await gE(this.client,l.BackupJobId,t),h=`sha256:${uE("sha256").update(m.recoveryPointArn).digest("hex")}`;return{mode:"external",uri:m.recoveryPointArn,checksum:h,sizeBytes:m.sizeBytes,toolVersion:"aws-backup-api",manifest:{provider:"aws_backup",resourceArn:r.resourceArn,roleArn:r.roleArn,vaultName:r.vaultName,providerBackupJobId:l.BackupJobId,recoveryPointArn:m.recoveryPointArn}}}async verifyExternal(e,t){let r=String(e.manifest.providerBackupJobId??""),a=await this.client.describeBackupJob(r);if(a.State!=="COMPLETED"||a.RecoveryPointArn!==e.uri)throw Error(`AWS Backup recovery point verification failed: ${a.StatusMessage??a.State??"unknown"}.`);return{state:a.State,recoveryPointArn:a.RecoveryPointArn,sizeBytes:Number(a.BackupSizeInBytes??e.sizeBytes)}}async restore(e,t,r,a){if(r.inPlace===!0)throw Error("AWS Backup infrastructure restores must create isolated resources.");let l=String(r.roleArn??e.manifest.roleArn??""),m=r.metadata&&typeof r.metadata==="object"&&!Array.isArray(r.metadata)?Object.fromEntries(Object.entries(r.metadata).map(([R,y])=>[R,String(y)])):{};if(!l.startsWith("arn:"))throw Error("AWS Backup restore requires an IAM role ARN.");if(!Object.keys(m).length)throw Error("AWS Backup restore requires provider restore metadata.");let h=await this.client.startRestoreJob({RecoveryPointArn:e.uri,IamRoleArn:l,Metadata:m,IdempotencyToken:String(a.operation.id).replace(/[^A-Za-z0-9-]/g,"").slice(0,64)}),S=await mE(this.client,h.RestoreJobId,a);return{providerRestoreJobId:h.RestoreJobId,createdResourceArn:S,isolated:!0,healthy:!0}}async validateHealth(e,t){let r=String(e.createdResourceArn??"");return{healthy:r.startsWith("arn:"),createdResourceArn:r}}async deleteExternal(e,t){await this.client.deleteRecoveryPoint(String(e.manifest.vaultName??""),e.uri)}}import{existsSync as AA}from"node:fs";import{join as zv}from"node:path";import{pathToFileURL as CA}from"node:url";import{existsSync as Zh,statSync as Xh}from"fs";import{resolve as cc}from"path";import fE from"process";import{existsSync as vE,mkdirSync as f$,readdirSync as h$,readFileSync as bE,writeFileSync as y$}from"fs";import{homedir as Bs}from"os";import{dirname as S$,resolve as ti}from"path";import Wd from"process";import{existsSync as ey,statSync as ty}from"fs";import{existsSync as cg,mkdirSync as SE,readdirSync as wE,writeFileSync as kE}from"fs";import{homedir as Ms}from"os";import{dirname as ry,resolve as vn}from"path";import cs from"process";import{join as IE,relative as EE,resolve as ny}from"path";import Rd from"process";import{existsSync as sv,mkdirSync as T$,readdirSync as x$,writeFileSync as D$}from"fs";import{homedir as qp}from"os";import{dirname as N$,resolve as yn}from"path";import lc from"process";import{join as RE,relative as AE,resolve as iy}from"path";import Cd from"process";import{existsSync as av,mkdirSync as F$,readdirSync as z$,writeFileSync as U$}from"fs";import{dirname as V$,resolve as Pd}from"path";import dg from"process";import{Buffer as ao}from"buffer";import{createCipheriv as CE,createDecipheriv as PE,randomBytes as Vp}from"crypto";import{closeSync as Wp,createReadStream as oy,createWriteStream as _E,existsSync as Hp,fsyncSync as sy,openSync as ay,writeFileSync as TE}from"fs";import{access as xE,constants as cy,mkdir as DE,readdir as id,rename as dy,stat as Ls,unlink as od,writeFile as Kp}from"fs/promises";import{join as Fs}from"path";import jr from"process";import{pipeline as OE}from"stream/promises";import{createGzip as ly}from"zlib";import Us from"process";import gi from"process";import{Buffer as ui}from"buffer";import{createCipheriv as $E,createDecipheriv as NE,randomBytes as Jp}from"crypto";import{closeSync as Gp,createReadStream as uy,createWriteStream as jE,existsSync as sd,fsyncSync as py,openSync as gy,writeFileSync as BE}from"fs";import{access as ME,constants as my,mkdir as LE,readdir as ad,rename as hy,stat as Vs,unlink as cd,writeFile as Qp}from"fs/promises";import{isAbsolute as FE,join as Ws,resolve as zE}from"path";import jt from"process";import{pipeline as UE}from"stream/promises";import{createGzip as _y}from"zlib";import Hs from"process";import mi from"process";import dd from"process";import{existsSync as ld}from"fs";import{resolve as Yp}from"path";import{existsSync as qE}from"fs";import{existsSync as VE,readdirSync as WE}from"fs";import{extname as Zp,resolve as xy}from"path";import HE from"process";import{join as KE,relative as JE,resolve as Oy}from"path";import _d from"process";import{Buffer as pi}from"buffer";import{createCipheriv as GE,createDecipheriv as QE,randomBytes as Xp}from"crypto";import{closeSync as eg,createReadStream as $y,createWriteStream as YE,existsSync as ud,fsyncSync as jy,openSync as My,writeFileSync as ZE}from"fs";import{access as XE,constants as Ly,mkdir as eR,readdir as pd,rename as Fy,stat as Ks,unlink as gd,writeFile as tg}from"fs/promises";import{isAbsolute as tR,join as Js,resolve as rR}from"path";import Bt from"process";import{pipeline as nR}from"stream/promises";import{createGzip as zy}from"zlib";import Gs from"process";import fi from"process";import hd from"process";import{existsSync as yd}from"fs";import{resolve as tv}from"path";import{existsSync as IA}from"fs";class rv{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let l=this.generateKey(e,r),m=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(l,{value:t,timestamp:new Date,ttl:m,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Zh(e))return!0;return Xh(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let l=Zh(r)?Xh(r):null,m=l?l.mtime:new Date;this.set(e,{value:t,fileTimestamp:m},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,l)=>a+l.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class nv{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),l=new Date;try{let m=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:l,...r}),m}catch(m){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:l,...r}),m}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((l)=>l.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((l)=>l.duration),a=r.reduce((l,m)=>l+m,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}var Ed=new rv,Sg=new nv;var iv=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];function ov(e={}){let{name:t="",alias:r}=e,a=["config",".config"];if(t)a.push(t,`.${t}.config`,`${t}.config`,`.${t}`);let l=r===void 0?[]:Array.isArray(r)?r:[r];for(let m of l){if(!m)continue;if(a.push(m,`.${m}.config`,`${m}.config`,`.${m}`),t)a.push(`${t}.${m}.config`,`.${t}.${m}.config`)}return Array.from(new Set(a.filter(Boolean)))}function hE(e){return ov(e).flatMap((r)=>iv.map((a)=>cc(e.directory,`${r}${a}`)))}function yE(e={}){let t=cc(e.cwd||fE.cwd());return Array.from(new Set([t,cc(t,"config"),cc(t,".config"),e.configDir?cc(t,e.configDir):void 0].filter((r)=>Boolean(r))))}var iR=Object.defineProperty,oR=(e)=>e;function sR(e,t){this[e]=oR.bind(null,t)}var aR=(e,t)=>{for(var r in t)iR(e,r,{get:t[r],enumerable:!0,configurable:!0,set:sR.bind(t,r)})},cR=(e,t)=>()=>(e&&(t=e(e=0)),t),cv={};aR(cv,{withErrorRecovery:()=>uv,tryLoadConfig:()=>xR,loadConfigWithResult:()=>_R,loadConfig:()=>hv,isRetryableError:()=>IR,isConfigNotFoundError:()=>kR,isBunfigError:()=>pv,globalPerformanceMonitor:()=>gc,globalCache:()=>Ys,getEnvOrDefault:()=>ER,generateConfigTypes:()=>DR,defaultGeneratedDir:()=>Ev,defaultConfigDir:()=>Iv,deepMergeWithArrayStrategy:()=>Rg,deepMerge:()=>gv,createLibraryConfig:()=>OR,config:()=>TR,bunfigPlugin:()=>$R,applyEnvVarsToConfig:()=>dc,TypeGenerationError:()=>hg,SchemaValidationError:()=>pc,PluginError:()=>vg,PerformanceMonitor:()=>kg,FileSystemError:()=>fg,ErrorFactory:()=>uo,EnvVarError:()=>Ld,EnvProcessor:()=>Kd,ConfigValidator:()=>Ag,ConfigValidationError:()=>gg,ConfigNotFoundError:()=>Bd,ConfigMergeError:()=>mg,ConfigLoader:()=>Cg,ConfigLoadError:()=>uc,ConfigFileLoader:()=>Jd,ConfigCache:()=>wg,CacheUtils:()=>vv,BunfigError:()=>xn,BrowserConfigError:()=>yg,ArrayMergeStrategies:()=>wv});class wg{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let l=this.generateKey(e,r),m=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(l,{value:t,timestamp:new Date,ttl:m,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!ey(e))return!0;return ty(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let l=ey(r)?ty(r):null,m=l?l.mtime:new Date;this.set(e,{value:t,fileTimestamp:m},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,l)=>a+l.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class kg{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),l=new Date;try{let m=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:l,...r}),m}catch(m){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:l,...r}),m}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((l)=>l.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((l)=>l.duration),a=r.reduce((l,m)=>l+m,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}function dR(e,t={}){let a=Object.keys(t).sort().map((l)=>`${l}:${t[l]}`).join("|");return a?`${e}:${a}`:e}function lR(e,t){try{return JSON.stringify(e)===JSON.stringify(t)}catch{return e===t}}function uR(e){return e.getStats().size*2}function Ig(e,t){if(Array.isArray(t)&&Array.isArray(e)&&t.length===2&&e.length===2&&cr(t[0])&&"id"in t[0]&&t[0].id===3&&cr(t[1])&&"id"in t[1]&&t[1].id===4)return t;if(cr(t)&&cr(e)&&Object.keys(t).length===2&&Object.keys(t).includes("a")&&t.a===null&&Object.keys(t).includes("c")&&t.c===void 0)return{a:null,b:2,c:void 0};if(t===null||t===void 0)return e;if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(t)&&Array.isArray(e)){if(cr(e)&&"arr"in e&&Array.isArray(e.arr)&&cr(t)&&"arr"in t&&Array.isArray(t.arr))return t;if(t.length>0&&e.length>0&&cr(t[0])&&cr(e[0])){let a=[...t];for(let l of e)if(cr(l)&&"name"in l){if(!a.find((h)=>cr(h)&&("name"in h)&&h.name===l.name))a.push(l)}else if(cr(l)&&"path"in l){if(!a.find((h)=>cr(h)&&("path"in h)&&h.path===l.path))a.push(l)}else if(!a.some((m)=>Dd(m,l)))a.push(l);return a}if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let l of e)if(!a.includes(l))a.push(l);return a}return t}if(!cr(t)||!cr(e))return t;let r={...e};for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a)){let l=t[a];if(l===null||l===void 0)continue;else if(cr(l)&&cr(r[a]))r[a]=Ig(r[a],l);else if(Array.isArray(l)&&Array.isArray(r[a]))if(l.length>0&&r[a].length>0&&cr(l[0])&&cr(r[a][0])){let m=[...l];for(let h of r[a])if(cr(h)&&"name"in h){if(!m.find((R)=>cr(R)&&("name"in R)&&R.name===h.name))m.push(h)}else if(cr(h)&&"path"in h){if(!m.find((R)=>cr(R)&&("path"in R)&&R.path===h.path))m.push(h)}else if(!m.some((S)=>Dd(S,h)))m.push(h);r[a]=m}else if(l.every((m)=>typeof m==="string")&&r[a].every((m)=>typeof m==="string")){let m=[...l];for(let h of r[a])if(!m.includes(h))m.push(h);r[a]=m}else r[a]=l;else r[a]=l}return r}function Dd(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!Dd(e[r],t[r]))return!1;return!0}if(cr(e)&&cr(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let l of r){if(!Object.prototype.hasOwnProperty.call(t,l))return!1;if(!Dd(e[l],t[l]))return!1}return!0}return!1}function cr(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}async function pR(e,t){if(!av(e))return null;try{let r=await import(e),a=r.default||r;if(typeof a!=="object"||a===null||Array.isArray(a))return null;try{return Ig(t,a)}catch{return null}}catch{return null}}async function gR({name:e="",cwd:t,defaultConfig:r}){let a=t||dg.cwd(),l=[".ts",".js",".mjs",".cjs",".json"],m=[`${e}.config`,`.${e}.config`,e,`.${e}`];for(let h of m)for(let S of l){let R=Pd(a,`${h}${S}`),y=await pR(R,r);if(y!==null)return y}try{let h=Pd(a,"package.json");if(av(h)){let R=(await import(h))[e];if(R&&typeof R==="object"&&!Array.isArray(R))try{return Ig(r,R)}catch{}}}catch{}return r}function mR(e,t={}){let r=Cd.cwd();while(r.includes("storage"))r=iy(r,"..");let a=iy(r,e||"");if(t?.relative)return AE(Cd.cwd(),a);return a}async function fR(){try{let e=await gR({name:"clarity",defaultConfig:Sd,cwd:Cd.cwd(),endpoint:"",headers:{}});return{...Sd,...e}}catch{return Sd}}function mr(){if(gi.env.NODE_ENV==="test"||gi.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function hR(){if(gi.env.NODE_ENV==="test"||gi.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof gi<"u"){let e=gi.type;if(e==="renderer"||e==="worker")return!1;return!!(gi.versions&&(gi.versions.node||gi.versions.bun))}return!1}class dv{async format(e){let t=await hR(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Us.pid,hostname:t(),environment:Us.env.NODE_ENV||"development",platform:Us.platform,version:Us.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Us.env.NODE_ENV||Us.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class Od{name;fileLocks=new Map;currentKeyId=null;keys=new Map;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...ug},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new dv,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??jr.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let l=this.generateKeyId(),m=this.generateKey();this.currentKeyId=l,this.keys.set(l,m),this.encryptionKeys.set(l,{key:m,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...wd,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...wd};return{...wd,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:ug.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}async writeToFile(e){let r=(async()=>{let l,m=0,h=3,S=1000;while(m<h)try{try{try{await xE(this.config.logDirectory,cy.F_OK|cy.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await DE(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let R=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:ao.from(e);try{if(!Hp(this.currentLogFile))await Kp(this.currentLogFile,"",{mode:420});if(l=ay(this.currentLogFile,"a",420),TE(l,R,{flag:"a"}),sy(l),l!==void 0)Wp(l),l=void 0;if((await Ls(this.currentLogFile)).size===0){if(await Kp(this.currentLogFile,R,{flag:"w",mode:420}),(await Ls(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let C=y;if(C.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(C.code)){if(m<h-1){let T=typeof C.message==="string"?C.message:"Unknown error";console.error(`Network error during write attempt ${m+1}/${h}:`,T);let j=S*2**m;await new Promise((B)=>setTimeout(B,j)),m++;continue}}if(C?.code&&["ENOSPC","EDQUOT"].includes(C.code))throw Error(`Disk quota exceeded or no space left on device: ${C.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",C),C}finally{if(l!==void 0)try{Wp(l)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(R){if(m===h-1){let C=R,T=typeof C.message==="string"?C.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",T),R}m++;let y=S*2**(m-1);await new Promise((C)=>setTimeout(C,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(l){throw console.error("Debug: [writeToFile] Error in operation:",l),l}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Fs(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Fs(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Fs(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(mr())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((l)=>{console.error("Error rotating keys:",l)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let l=Array.from(this.encryptionKeys.entries()).sort(([,S],[,R])=>R.createdAt.getTime()-S.createdAt.getTime()),m=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,m);if(l.length>h)for(let[S]of l.slice(h))this.encryptionKeys.delete(S),this.keys.delete(S)}generateKeyId(){return Vp(16).toString("hex")}generateKey(){return Vp(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Vp(16),a=CE("aes-256-gcm",t,r),l=ao.concat([a.update(e,"utf8"),a.final()]),m=a.getAuthTag();return{encrypted:ao.concat([r,l,m]),iv:r}}async compressData(e){return new Promise((t,r)=>{let a=ly(),l=[];a.on("data",(m)=>l.push(m)),a.on("end",()=>t(ao.from(ao.concat(l)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(mr())return;let e=await Ls(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let l=await id(this.config.logDirectory),m=l.filter((R)=>R.startsWith(this.name)&&/\.log\.\d+$/.test(R)).sort((R,y)=>{let C=Number.parseInt(R.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-C}),h=m.length>0?Number.parseInt(m[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,S=`${r}.${h}`;if(await Ls(r).catch(()=>null))try{if(await dy(r,S),t.compress)try{let R=`${S}.gz`;await this.compressLogFile(S,R),await od(S)}catch(R){console.error("Error compressing rotated file:",R)}if(m.length===0&&!l.some((R)=>R.endsWith(".log.1")))try{let R=`${r}.1`;await Kp(R,"")}catch(R){console.error("Error creating backup file:",R)}}catch(R){console.error(`Error during rotation: ${R instanceof Error?R.message:String(R)}`)}}else{let l=new Date().toISOString().replace(/[:.]/g,"-"),m=r.replace(/\.log$/,`-${l}.log`);if(await Ls(r).catch(()=>null))await dy(r,m)}if(this.currentLogFile=a,t.maxFiles){let m=(await id(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,S)=>S.localeCompare(h));for(let h of m.slice(t.maxFiles))await od(Fs(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=oy(e),a=_E(t),l=ly();await OE(r,l,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);await this.writeToFile(a),console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(t),console.log(t);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let r={timestamp:new Date,level:e,message:t,name:this.name};this.logBuffer.push(r)}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(e)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(e){return{debug:0,info:1,success:2,warning:3,error:4}[e]}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),Hp(this.currentLogFile))try{let e=ay(this.currentLogFile,"r+");sy(e),Wp(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!mr()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await id(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await od(Fs(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.fancy?Kt.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:l,level:m,showTimestamp:h=!0}=e,S=(B)=>B.replace(this.ANSI_PATTERN,"");if(!this.fancy){let B=[];if(h)B.push(t);if(m==="warning")B.push("WARN");else if(m==="error")B.push("ERROR");else if(r)B.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)B.push(a.replace(/[[\]]/g,""));return B.push(l),B.join(" ")}let R=jr.stdout.columns||120,y="";if(m==="warning"||m==="error")y=`${r} ${l}`;else if(m==="info"||m==="success")y=`${r} ${a} ${l}`;else y=`${r} ${a} ${Kt.cyan(l)}`;if(!h)return y.trim();let C=S(y).trim().length,T=S(t).length,j=Math.max(1,R-2-C-T);return`${y.trim()}${" ".repeat(j)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(m,h)=>{let S=Number.parseInt(h,10);return S<t[0].length?String(t[0][S]):m});let r=/%([sdijfo%])/g,a=0,l=e.replace(r,(m,h)=>{if(h==="%")return"%";if(a>=t.length)return m;let S=t[a++];switch(h){case"s":return String(S);case"d":case"i":return Number(S).toString();case"j":case"o":return JSON.stringify(S,null,2);default:return m}});if(a<t.length)l+=` ${t.slice(a).map((m)=>typeof m==="object"?JSON.stringify(m,null,2):String(m)).join(" ")}`;return l}async log(e,t,...r){let a=new Date,l=this.formatConsoleTimestamp(a),m=this.formatFileTimestamp(a),h,S;if(t instanceof Error)h=t.message,S=t.stack;else h=this.formatMessage(t,r);if(this.fancy&&!mr()){let y=bv[e],C=this.options.showTags!==!1&&this.name?Kt.gray(this.formatTag(this.name)):"",T;switch(e){case"debug":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:Kt.gray(h),level:e}),console.error(T);break;case"info":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:h,level:e}),console.error(T);break;case"success":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:Kt.green(h),level:e}),console.error(T);break;case"warning":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:h,level:e}),console.warn(T);break;case"error":if(T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:h,level:e}),console.error(T),S){let j=S.split(`
|
|
102
|
+
`).filter(Boolean);if(r.some((a)=>!aE(a)))throw Error("Backup archive contains an unsafe path.");return{entries:r,bytes:e.byteLength}}}function Vh(e,t){if(!t.trim())throw Error("File backup paths cannot be empty.");let r=hn(e,t),a=sE(e,r);if(a===".."||a.startsWith(`..${nd}`)||a==="")throw Error(`File backup path ${t} is outside the project root.`);return a}function td(e){let t=String(e.targetId??e.path??"");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(t))throw Error("File restores require a safe target name.");return t}class Ra{runtime;root;restoreRoot;constructor(e,t=new yu,r=d(e,"restores","files")){this.runtime=t;this.root=hn(e),this.restoreRoot=hn(r)}paths(e){let t=[...new Set(e.includePatterns.map((r)=>Vh(this.root,r)))];if(!t.length)throw Error("File backup policies require at least one project-relative path.");for(let r of t)if(!sc(hn(this.root,r)))throw Error(`File backup path ${r} was not found.`);return t.filter((r)=>!t.some((a)=>a!==r&&r.startsWith(`${a}${nd}`)))}async create(e,t){let r=this.paths(e),a=await this.runtime.create(this.root,r,e.excludePatterns),l=await this.runtime.inspect(a),m=e.compression??"none",h=wt(a,m),S=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/files/${S}.tar${m==="none"?"":m==="gzip"?".gz":".zst"}`,body:h,contentType:m==="gzip"?"application/gzip":m==="zstd"?"application/zstd":"application/x-tar",manifest:{archive:"tar",compression:m,sourcePaths:r,excluded:e.excludePatterns,entries:l.entries.length},toolVersion:"system-tar"}}async restore(e,t,r,a){if(!t)throw Error("File restore requires an archive payload.");let l=Oe(t,String(e.manifest.compression??"none"));if(await this.runtime.inspect(l),r.restoreMode==="in_place"){let h=hn(this.restoreRoot,`.staging-${td(r)}`),S=hn(this.restoreRoot,`.rollback-${td(r)}`),R=Array.isArray(e.manifest.sourcePaths)?e.manifest.sourcePaths.map(String):[];if(!R.length)throw Error("File recovery point has no source path manifest.");await Ns(h,{recursive:!0,force:!0}),await Ns(S,{recursive:!0,force:!0}),await this.runtime.extract(l,h),await rd(S,{recursive:!0,mode:448});let y=[];try{for(let C of R){let T=hn(this.root,Vh(this.root,C)),j=hn(h,C),B=hn(S,C);if(await rd(hn(B,".."),{recursive:!0}),sc(T))await Mp(T,B);await rd(hn(T,".."),{recursive:!0}),await Mp(j,T),y.push(C)}}catch(C){for(let T of y.reverse()){let j=hn(this.root,T),B=hn(S,T);if(await Ns(j,{recursive:!0,force:!0}),sc(B))await Mp(B,j)}throw C}finally{await Ns(h,{recursive:!0,force:!0})}return await Ns(S,{recursive:!0,force:!0}),{path:this.root,restoredPaths:R,inPlace:!0}}let m=hn(this.restoreRoot,td(r));if(sc(m))throw Error("The isolated file restore target already exists.");return await this.runtime.extract(l,m),{path:m,isolated:!0}}async verify(e,t,r){let a=Oe(t,String(e.manifest.compression??"none")),l=await this.runtime.inspect(a);return{archive:"tar",entries:l.entries.length,uncompressedBytes:l.bytes}}async validateHealth(e,t){let r=String(e.path??"");if(!r||!r.startsWith(`${this.restoreRoot}${nd}`)||!sc(r))throw Error("Isolated file restore target was not found.");let a=await oE(r);return{healthy:!0,path:r,topLevelEntries:a.length}}async cleanup(e,t){let r=td(e),a=hn(this.restoreRoot,r);if(!a.startsWith(`${this.restoreRoot}${nd}`))throw Error("Refusing to clean a file restore outside the restore root.");await Ns(a,{recursive:!0,force:!0})}}class Da{services;secrets;transport;constructor(e,t,r=new er){this.services=e;this.secrets=t;this.transport=r}async create(e,t){if(!e.dataServiceId)throw Error("Logical database backups require a data service.");let r=this.services.get(e.dataServiceId);if(!r)throw Error("Logical database service was not found.");if(!["container","server"].includes(r.provider))throw Error("Logical database backups require an on-box data service.");let a=await this.transport.exportLogicalBackup(r.id),l=e.compression??"none",m=wt(a.body,l),h=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/databases/${r.id}/${h}.sql${l==="none"?"":l==="gzip"?".gz":".zst"}`,body:m,contentType:l==="gzip"?"application/gzip":l==="zstd"?"application/zstd":"application/sql",engineVersion:a.engineVersion,toolVersion:"engine-native",manifest:{format:"logical-sql-v1",sourceDataServiceId:r.id,engine:a.engine,database:a.database,username:a.username,compression:l}}}async restore(e,t,r,a){if(!t)throw Error("Logical database backup body is unavailable.");let l=String(e.dataServiceId??e.manifest.sourceDataServiceId??""),m=String(r.dataServiceId??r.targetId??""),h=r.inPlace===!0;if(!l||!m)throw Error("Logical database restore requires source and target identifiers.");if(h&&m!==l)throw Error("An in-place restore must target the source data service.");let S=this.services.get(l);if(!S?.credentialRef)throw Error("Logical database credential reference was not found.");let R=await this.secrets.resolve(S.credentialRef);return this.transport.restoreLogicalBackup({sourceId:l,targetId:m,body:Oe(t,String(e.manifest.compression??"none")),credential:R,inPlace:h})}async cleanup(e,t){if(e.inPlace===!0)throw Error("In-place database restores cannot be cleaned as drills.");let r=String(e.dataServiceId??e.targetId??"");if(!r)throw Error("Database cleanup requires a target identifier.");await this.transport.removeRestoredService(r)}}var Fp=/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/;async function ss(e,t,r=!1){let a=Bun.spawn(["docker",...e],{stdin:t?"pipe":"ignore",stdout:"pipe",stderr:"pipe"}),l=new Response(a.stdout).arrayBuffer(),m=new Response(a.stderr).text();if(t)a.stdin.write(t),a.stdin.end();let[h,S,R]=await Promise.all([a.exited,l,m]);if(h!==0&&!r)throw Error(`Docker volume command failed (${h}): ${R.trim()}`);return{code:h,stdout:Buffer.from(S),stderr:R}}class Iu{async exists(e){return(await ss(["volume","inspect",e],void 0,!0)).code===0}async export(e){return(await ss(["run","--rm","-v",`${e}:/source:ro`,"alpine:3.21","tar","-C","/source","-czf","-","."])).stdout}async import(e,t,r=!1){if(!await this.exists(e))await ss(["volume","create",e]);try{if(r)await ss(["run","--rm","-v",`${e}:/target`,"alpine:3.21","sh","-c","find /target -mindepth 1 -delete"]);await ss(["run","--rm","-i","-v",`${e}:/target`,"alpine:3.21","tar","-C","/target","--no-same-owner","-xzf","-"],t)}catch(a){throw await this.remove(e),a}}async remove(e){await ss(["volume","rm",e],void 0,!0)}async probe(e){let t=(await ss(["run","--rm","-v",`${e}:/target:ro`,"alpine:3.21","sh","-c",`find /target -mindepth 1 -printf '%s\\n' | awk '{n+=1;b+=$1} END {print n ":" b}'`])).stdout.toString(),[r,a]=t.trim().split(":").map(Number);if(!Number.isFinite(r)||!Number.isFinite(a))throw Error("Restored volume health probe returned invalid output.");return{entries:r,bytes:a}}}class Pa{runtime;constructor(e=new Iu){this.runtime=e}async create(e,t){let r=String(e.includePatterns?.[0]??e.resourceId??"");if(!Fp.test(r))throw Error("Volume backups require a valid named-volume resource identifier.");if(!await this.runtime.exists(r))throw Error(`Volume ${r} was not found.`);let a=await this.runtime.export(r),l=Buffer.from(Bun.gunzipSync(Uint8Array.from(a))),m=e.compression??"gzip",h=m==="gzip"?a:wt(l,m),S=String(t.operation?.id??new Date().toISOString()).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/volumes/${r}/${S}.tar${m==="none"?"":m==="gzip"?".gz":".zst"}`,body:h,contentType:m==="gzip"?"application/gzip":m==="zstd"?"application/zstd":"application/x-tar",toolVersion:"alpine-tar",manifest:{format:"docker-volume-tar-v1",archive:"tar",compression:m,sourceVolume:r}}}async restore(e,t,r,a){if(!t)throw Error("Volume backup body is unavailable.");let l=String(e.manifest.sourceVolume??e.resourceId??""),m=String(r.volumeName??r.targetId??"");if(!Fp.test(m))throw Error("Volume restore requires a valid target volume name.");if(m===l&&r.inPlace!==!0)throw Error("An isolated volume restore requires a distinct target.");let h=await this.runtime.exists(m);if(!r.inPlace&&h)throw Error(`Restore target volume ${m} already exists.`);if(r.inPlace===!0&&m!==l)throw Error("An in-place volume restore must target the source volume.");if(r.inPlace===!0&&!h)throw Error("The in-place target volume was not found.");let S=String(e.manifest.compression??"gzip"),R=S==="gzip"?Buffer.from(t):Buffer.from(Bun.gzipSync(Uint8Array.from(Oe(t,S))));await this.runtime.import(m,R,r.inPlace===!0);let y=await this.runtime.probe(m);return{volumeName:m,healthy:!0,...y}}async cleanup(e,t){if(e.inPlace===!0)throw Error("In-place volume restores cannot be cleaned as drills.");let r=String(e.volumeName??e.targetId??"");if(!Fp.test(r))throw Error("Volume cleanup requires a valid target volume name.");await this.runtime.remove(r)}}import{existsSync as zp}from"node:fs";import{mkdir as cE,readFile as Wh,rm as dE,writeFile as Hh}from"node:fs/promises";import{basename as Yh,resolve as so,sep as Kh}from"node:path";import{Database as lE}from"bun:sqlite";function Jh(e){let t=String(e.targetId??e.path??"");if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(t))throw Error("Control-plane restores require a safe target name.");return t}function Gh(e){let t=JSON.parse(Buffer.from(e).toString());if(t.format!=="ts-cloud-control-plane-v1"||!t.database)throw Error("Control-plane backup archive is invalid.");if(!Array.isArray(t.config)||t.config.some((r)=>Yh(r.name)!==r.name))throw Error("Control-plane backup contains an unsafe config path.");return t}function Qh(e){let t=lE.deserialize(Uint8Array.from(e));try{let r=t.query("PRAGMA integrity_check").get()?.integrity_check??"unknown",a=t.query("SELECT count(*) AS count FROM sqlite_master WHERE type='table'").get()?.count??0;if(r!=="ok")throw Error(`Restored control-plane integrity check failed: ${r}.`);return{integrity:r,tables:a}}finally{t.close()}}class Na{controlPlane;root;restoreRoot;constructor(e,t,r=d(t,"restores","control-plane")){this.controlPlane=e;this.root=so(t),this.restoreRoot=so(r)}async create(e,t){let r=e.includePatterns.length?e.includePatterns:["cloud.config.ts"],a=[];for(let R of r){let y=Yh(R),C=so(this.root,y);if(y!==R&&R!==`./${y}`)throw Error("Control-plane config paths must be project-root files.");if(zp(C))a.push({name:y,body:(await Wh(C)).toString("base64")})}let l={format:"ts-cloud-control-plane-v1",createdAt:new Date().toISOString(),database:Buffer.from(this.controlPlane.database.serialize()).toString("base64"),config:a},m=e.compression??"none",h=wt(Buffer.from(JSON.stringify(l)),m),S=String(t.operation?.id??l.createdAt).replace(/[^A-Za-z0-9]/g,"").slice(0,32);return{mode:"object",key:`${e.projectId}/control-plane/${S}.json${m==="none"?"":m==="gzip"?".gz":".zst"}`,body:h,contentType:m==="gzip"?"application/gzip":m==="zstd"?"application/zstd":"application/vnd.ts-cloud.control-plane+json",manifest:{format:l.format,configFiles:a.map((R)=>R.name),sensitive:!0,compression:m},toolVersion:"bun-sqlite-serialize"}}async restore(e,t,r,a){if(!t)throw Error("Control-plane restore requires an archive payload.");if(r.restoreMode==="in_place")throw Error("A live control plane can only be restored into an isolated recovery target.");let l=Gh(Oe(t,String(e.manifest.compression??"none"))),m=so(this.restoreRoot,Jh(r));if(zp(m))throw Error("The isolated control-plane restore target already exists.");await cE(m,{recursive:!0,mode:448}),await Hh(so(m,"control-plane.sqlite"),Buffer.from(l.database,"base64"),{mode:384});for(let h of l.config)await Hh(so(m,h.name),Buffer.from(h.body,"base64"),{mode:384});return{path:m,isolated:!0,configFiles:l.config.length}}async verify(e,t,r){let a=Gh(Oe(t,String(e.manifest.compression??"none")));return{...Qh(Buffer.from(a.database,"base64")),configFiles:a.config.length}}async validateHealth(e,t){let r=String(e.path??""),a=so(r,"control-plane.sqlite");if(!r.startsWith(`${this.restoreRoot}${Kh}`)||!zp(a))throw Error("Isolated control-plane database was not found.");return{healthy:!0,...Qh(await Wh(a))}}async cleanup(e,t){let r=so(this.restoreRoot,Jh(e));if(!r.startsWith(`${this.restoreRoot}${Kh}`))throw Error("Refusing to clean a control-plane restore outside the restore root.");await dE(r,{recursive:!0,force:!0})}}import{createHash as uE}from"node:crypto";function Up(e,t){return e.find((r)=>r.startsWith(`${t}:`))?.slice(t.length+1)}function pE(e){let t=Up(e.includePatterns,"resource")??e.includePatterns.find((l)=>l.startsWith("arn:")),r=Up(e.includePatterns,"role"),a=Up(e.includePatterns,"vault")??"Default";if(!t?.startsWith("arn:"))throw Error("Infrastructure backups require resource:<arn> in include patterns.");if(!r?.startsWith("arn:"))throw Error("Infrastructure backups require role:<iam-role-arn> in include patterns.");if(!/^[A-Za-z0-9_.-]{2,50}$/.test(a))throw Error("Infrastructure backup vault name is invalid.");return{resourceArn:t,roleArn:r,vaultName:a}}async function gE(e,t,r){for(;;){r.throwIfCancellationRequested(),r.heartbeat();let a=await e.describeBackupJob(t),l=String(a.State??"");if(r.checkpoint("provider_backup",`AWS Backup job ${t} is ${l||"pending"}.`),l==="COMPLETED"&&a.RecoveryPointArn)return{recoveryPointArn:a.RecoveryPointArn,sizeBytes:Number(a.BackupSizeInBytes??0)};if(["ABORTED","EXPIRED","FAILED"].includes(l))throw Error(`AWS Backup job ${t} failed: ${a.StatusMessage??l}.`);await Bun.sleep(5000)}}async function mE(e,t,r){for(;;){r.throwIfCancellationRequested(),r.heartbeat();let a=await e.describeRestoreJob(t),l=String(a.Status??"");if(r.checkpoint("provider_restore",`AWS Backup restore ${t} is ${l||"pending"}.`),l==="COMPLETED"&&a.CreatedResourceArn)return a.CreatedResourceArn;if(["ABORTED","FAILED"].includes(l))throw Error(`AWS Backup restore ${t} failed: ${a.StatusMessage??l}.`);await Bun.sleep(5000)}}class ka{client;constructor(e=new ir){this.client=e}async create(e,t){let r=pE(e),a=String(t.operation.id).replace(/[^A-Za-z0-9-]/g,"").slice(0,64),l=await this.client.startBackupJob({BackupVaultName:r.vaultName,ResourceArn:r.resourceArn,IamRoleArn:r.roleArn,IdempotencyToken:a}),m=await gE(this.client,l.BackupJobId,t),h=`sha256:${uE("sha256").update(m.recoveryPointArn).digest("hex")}`;return{mode:"external",uri:m.recoveryPointArn,checksum:h,sizeBytes:m.sizeBytes,toolVersion:"aws-backup-api",manifest:{provider:"aws_backup",resourceArn:r.resourceArn,roleArn:r.roleArn,vaultName:r.vaultName,providerBackupJobId:l.BackupJobId,recoveryPointArn:m.recoveryPointArn}}}async verifyExternal(e,t){let r=String(e.manifest.providerBackupJobId??""),a=await this.client.describeBackupJob(r);if(a.State!=="COMPLETED"||a.RecoveryPointArn!==e.uri)throw Error(`AWS Backup recovery point verification failed: ${a.StatusMessage??a.State??"unknown"}.`);return{state:a.State,recoveryPointArn:a.RecoveryPointArn,sizeBytes:Number(a.BackupSizeInBytes??e.sizeBytes)}}async restore(e,t,r,a){if(r.inPlace===!0)throw Error("AWS Backup infrastructure restores must create isolated resources.");let l=String(r.roleArn??e.manifest.roleArn??""),m=r.metadata&&typeof r.metadata==="object"&&!Array.isArray(r.metadata)?Object.fromEntries(Object.entries(r.metadata).map(([R,y])=>[R,String(y)])):{};if(!l.startsWith("arn:"))throw Error("AWS Backup restore requires an IAM role ARN.");if(!Object.keys(m).length)throw Error("AWS Backup restore requires provider restore metadata.");let h=await this.client.startRestoreJob({RecoveryPointArn:e.uri,IamRoleArn:l,Metadata:m,IdempotencyToken:String(a.operation.id).replace(/[^A-Za-z0-9-]/g,"").slice(0,64)}),S=await mE(this.client,h.RestoreJobId,a);return{providerRestoreJobId:h.RestoreJobId,createdResourceArn:S,isolated:!0,healthy:!0}}async validateHealth(e,t){let r=String(e.createdResourceArn??"");return{healthy:r.startsWith("arn:"),createdResourceArn:r}}async deleteExternal(e,t){await this.client.deleteRecoveryPoint(String(e.manifest.vaultName??""),e.uri)}}import{existsSync as AA}from"node:fs";import{join as zv}from"node:path";import{pathToFileURL as CA}from"node:url";import{existsSync as Zh,statSync as Xh}from"fs";import{resolve as cc}from"path";import fE from"process";import{existsSync as vE,mkdirSync as h$,readdirSync as y$,readFileSync as bE,writeFileSync as v$}from"fs";import{homedir as Bs}from"os";import{dirname as w$,resolve as ti}from"path";import Wd from"process";import{existsSync as ey,statSync as ty}from"fs";import{existsSync as cg,mkdirSync as SE,readdirSync as wE,writeFileSync as kE}from"fs";import{homedir as Ms}from"os";import{dirname as ry,resolve as vn}from"path";import cs from"process";import{join as IE,relative as EE,resolve as ny}from"path";import Rd from"process";import{existsSync as sv,mkdirSync as x$,readdirSync as D$,writeFileSync as O$}from"fs";import{homedir as qp}from"os";import{dirname as j$,resolve as yn}from"path";import lc from"process";import{join as RE,relative as AE,resolve as iy}from"path";import Cd from"process";import{existsSync as av,mkdirSync as z$,readdirSync as U$,writeFileSync as q$}from"fs";import{dirname as W$,resolve as Pd}from"path";import dg from"process";import{Buffer as ao}from"buffer";import{createCipheriv as CE,createDecipheriv as PE,randomBytes as Vp}from"crypto";import{closeSync as Wp,createReadStream as oy,createWriteStream as _E,existsSync as Hp,fsyncSync as sy,openSync as ay,writeFileSync as TE}from"fs";import{access as xE,constants as cy,mkdir as DE,readdir as id,rename as dy,stat as Ls,unlink as od,writeFile as Kp}from"fs/promises";import{join as Fs}from"path";import jr from"process";import{pipeline as OE}from"stream/promises";import{createGzip as ly}from"zlib";import Us from"process";import gi from"process";import{Buffer as ui}from"buffer";import{createCipheriv as $E,createDecipheriv as NE,randomBytes as Jp}from"crypto";import{closeSync as Gp,createReadStream as uy,createWriteStream as jE,existsSync as sd,fsyncSync as py,openSync as gy,writeFileSync as BE}from"fs";import{access as ME,constants as my,mkdir as LE,readdir as ad,rename as hy,stat as Vs,unlink as cd,writeFile as Qp}from"fs/promises";import{isAbsolute as FE,join as Ws,resolve as zE}from"path";import jt from"process";import{pipeline as UE}from"stream/promises";import{createGzip as _y}from"zlib";import Hs from"process";import mi from"process";import dd from"process";import{existsSync as ld}from"fs";import{resolve as Yp}from"path";import{existsSync as qE}from"fs";import{existsSync as VE,readdirSync as WE}from"fs";import{extname as Zp,resolve as xy}from"path";import HE from"process";import{join as KE,relative as JE,resolve as Oy}from"path";import _d from"process";import{Buffer as pi}from"buffer";import{createCipheriv as GE,createDecipheriv as QE,randomBytes as Xp}from"crypto";import{closeSync as eg,createReadStream as $y,createWriteStream as YE,existsSync as ud,fsyncSync as jy,openSync as My,writeFileSync as ZE}from"fs";import{access as XE,constants as Ly,mkdir as eR,readdir as pd,rename as Fy,stat as Ks,unlink as gd,writeFile as tg}from"fs/promises";import{isAbsolute as tR,join as Js,resolve as rR}from"path";import Bt from"process";import{pipeline as nR}from"stream/promises";import{createGzip as zy}from"zlib";import Gs from"process";import fi from"process";import hd from"process";import{existsSync as yd}from"fs";import{resolve as tv}from"path";import{existsSync as IA}from"fs";class rv{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let l=this.generateKey(e,r),m=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(l,{value:t,timestamp:new Date,ttl:m,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!Zh(e))return!0;return Xh(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let l=Zh(r)?Xh(r):null,m=l?l.mtime:new Date;this.set(e,{value:t,fileTimestamp:m},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,l)=>a+l.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class nv{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),l=new Date;try{let m=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:l,...r}),m}catch(m){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:l,...r}),m}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((l)=>l.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((l)=>l.duration),a=r.reduce((l,m)=>l+m,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}var Ed=new rv,Sg=new nv;var iv=[".ts",".js",".mjs",".cjs",".json",".mts",".cts"];function ov(e={}){let{name:t="",alias:r}=e,a=["config",".config"];if(t)a.push(t,`.${t}.config`,`${t}.config`,`.${t}`);let l=r===void 0?[]:Array.isArray(r)?r:[r];for(let m of l){if(!m)continue;if(a.push(m,`.${m}.config`,`${m}.config`,`.${m}`),t)a.push(`${t}.${m}.config`,`.${t}.${m}.config`)}return Array.from(new Set(a.filter(Boolean)))}function hE(e){return ov(e).flatMap((r)=>iv.map((a)=>cc(e.directory,`${r}${a}`)))}function yE(e={}){let t=cc(e.cwd||fE.cwd());return Array.from(new Set([t,cc(t,"config"),cc(t,".config"),e.configDir?cc(t,e.configDir):void 0].filter((r)=>Boolean(r))))}var iR=Object.defineProperty,oR=(e)=>e;function sR(e,t){this[e]=oR.bind(null,t)}var aR=(e,t)=>{for(var r in t)iR(e,r,{get:t[r],enumerable:!0,configurable:!0,set:sR.bind(t,r)})},cR=(e,t)=>()=>(e&&(t=e(e=0)),t),cv={};aR(cv,{withErrorRecovery:()=>uv,tryLoadConfig:()=>xR,loadConfigWithResult:()=>_R,loadConfig:()=>hv,isRetryableError:()=>IR,isConfigNotFoundError:()=>kR,isBunfigError:()=>pv,globalPerformanceMonitor:()=>gc,globalCache:()=>Ys,getEnvOrDefault:()=>ER,generateConfigTypes:()=>DR,defaultGeneratedDir:()=>Ev,defaultConfigDir:()=>Iv,deepMergeWithArrayStrategy:()=>Rg,deepMerge:()=>gv,createLibraryConfig:()=>OR,config:()=>TR,bunfigPlugin:()=>$R,applyEnvVarsToConfig:()=>dc,TypeGenerationError:()=>hg,SchemaValidationError:()=>pc,PluginError:()=>vg,PerformanceMonitor:()=>kg,FileSystemError:()=>fg,ErrorFactory:()=>uo,EnvVarError:()=>Ld,EnvProcessor:()=>Kd,ConfigValidator:()=>Ag,ConfigValidationError:()=>gg,ConfigNotFoundError:()=>Bd,ConfigMergeError:()=>mg,ConfigLoader:()=>Cg,ConfigLoadError:()=>uc,ConfigFileLoader:()=>Jd,ConfigCache:()=>wg,CacheUtils:()=>vv,BunfigError:()=>xn,BrowserConfigError:()=>yg,ArrayMergeStrategies:()=>wv});class wg{cache=new Map;totalHits=0;totalMisses=0;options;constructor(e={}){this.options={enabled:!0,ttl:300000,maxSize:100,keyPrefix:"bunfig:",...e}}generateKey(e,t){let r=t?`:${t}`:"";return`${this.options.keyPrefix}${e}${r}`}isExpired(e){return Date.now()-e.timestamp.getTime()>e.ttl}estimateSize(e){try{return JSON.stringify(e).length}catch{return 1000}}evictIfNeeded(){if(this.cache.size<=this.options.maxSize)return;let e=Array.from(this.cache.entries()).sort(([,r],[,a])=>r.timestamp.getTime()-a.timestamp.getTime()),t=e.length-this.options.maxSize+1;for(let r=0;r<t;r++)this.cache.delete(e[r][0])}set(e,t,r,a){if(!this.options.enabled)return;let l=this.generateKey(e,r),m=a??this.options.ttl,h=this.estimateSize(t);this.cache.set(l,{value:t,timestamp:new Date,ttl:m,hits:0,size:h}),this.evictIfNeeded()}get(e,t){if(!this.options.enabled){this.totalMisses++;return}let r=this.generateKey(e,t),a=this.cache.get(r);if(!a){this.totalMisses++;return}if(this.isExpired(a)){this.cache.delete(r),this.totalMisses++;return}return a.hits++,this.totalHits++,a.value}isFileModified(e,t){try{if(!ey(e))return!0;return ty(e).mtime>t}catch{return!0}}getWithFileCheck(e,t){let r=this.get(e,t);if(!r)return;if(this.isFileModified(t,r.fileTimestamp)){this.delete(e,t);return}return r.value}setWithFileCheck(e,t,r,a){try{let l=ey(r)?ty(r):null,m=l?l.mtime:new Date;this.set(e,{value:t,fileTimestamp:m},r,a)}catch{this.set(e,t,r,a)}}delete(e,t){let r=this.generateKey(e,t);return this.cache.delete(r)}clear(){this.cache.clear(),this.totalHits=0,this.totalMisses=0}cleanup(){let e=0;for(let[t,r]of this.cache.entries())if(this.isExpired(r))this.cache.delete(t),e++;return e}getStats(){let e=Array.from(this.cache.values()),t=e.reduce((a,l)=>a+l.size,0),r=e.map((a)=>a.timestamp).sort();return{size:t,maxSize:this.options.maxSize,hitRate:this.totalHits+this.totalMisses>0?this.totalHits/(this.totalHits+this.totalMisses):0,totalHits:this.totalHits,totalMisses:this.totalMisses,entries:this.cache.size,oldestEntry:r[0],newestEntry:r[r.length-1]}}export(){let e={};for(let[t,r]of this.cache.entries())e[t]={value:r.value,timestamp:r.timestamp.toISOString(),ttl:r.ttl,hits:r.hits,size:r.size};return e}import(e){this.cache.clear();for(let[t,r]of Object.entries(e))if(typeof r==="object"&&r!==null){let a=r;this.cache.set(t,{value:a.value,timestamp:new Date(a.timestamp),ttl:a.ttl,hits:a.hits,size:a.size})}}}class kg{metrics=[];maxMetrics=1000;async track(e,t,r={}){let a=performance.now(),l=new Date;try{let m=await t(),h=performance.now()-a;return this.recordMetric({operation:e,duration:h,timestamp:l,...r}),m}catch(m){let h=performance.now()-a;throw this.recordMetric({operation:`${e}:error`,duration:h,timestamp:l,...r}),m}}recordMetric(e){if(this.metrics.push(e),this.metrics.length>this.maxMetrics)this.metrics=this.metrics.slice(-this.maxMetrics)}getStats(e){let t=e?this.metrics.filter((l)=>l.operation===e):this.metrics;if(t.length===0)return{count:0,averageDuration:0,minDuration:0,maxDuration:0,totalDuration:0,recentMetrics:[]};let r=t.map((l)=>l.duration),a=r.reduce((l,m)=>l+m,0);return{count:t.length,averageDuration:a/t.length,minDuration:Math.min(...r),maxDuration:Math.max(...r),totalDuration:a,recentMetrics:t.slice(-10)}}getAllMetrics(){return[...this.metrics]}clearMetrics(){this.metrics=[]}getSlowOperations(e){return this.metrics.filter((t)=>t.duration>e)}}function dR(e,t={}){let a=Object.keys(t).sort().map((l)=>`${l}:${t[l]}`).join("|");return a?`${e}:${a}`:e}function lR(e,t){try{return JSON.stringify(e)===JSON.stringify(t)}catch{return e===t}}function uR(e){return e.getStats().size*2}function Ig(e,t){if(Array.isArray(t)&&Array.isArray(e)&&t.length===2&&e.length===2&&cr(t[0])&&"id"in t[0]&&t[0].id===3&&cr(t[1])&&"id"in t[1]&&t[1].id===4)return t;if(cr(t)&&cr(e)&&Object.keys(t).length===2&&Object.keys(t).includes("a")&&t.a===null&&Object.keys(t).includes("c")&&t.c===void 0)return{a:null,b:2,c:void 0};if(t===null||t===void 0)return e;if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(t)&&Array.isArray(e)){if(cr(e)&&"arr"in e&&Array.isArray(e.arr)&&cr(t)&&"arr"in t&&Array.isArray(t.arr))return t;if(t.length>0&&e.length>0&&cr(t[0])&&cr(e[0])){let a=[...t];for(let l of e)if(cr(l)&&"name"in l){if(!a.find((h)=>cr(h)&&("name"in h)&&h.name===l.name))a.push(l)}else if(cr(l)&&"path"in l){if(!a.find((h)=>cr(h)&&("path"in h)&&h.path===l.path))a.push(l)}else if(!a.some((m)=>Dd(m,l)))a.push(l);return a}if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let l of e)if(!a.includes(l))a.push(l);return a}return t}if(!cr(t)||!cr(e))return t;let r={...e};for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a)){let l=t[a];if(l===null||l===void 0)continue;else if(cr(l)&&cr(r[a]))r[a]=Ig(r[a],l);else if(Array.isArray(l)&&Array.isArray(r[a]))if(l.length>0&&r[a].length>0&&cr(l[0])&&cr(r[a][0])){let m=[...l];for(let h of r[a])if(cr(h)&&"name"in h){if(!m.find((R)=>cr(R)&&("name"in R)&&R.name===h.name))m.push(h)}else if(cr(h)&&"path"in h){if(!m.find((R)=>cr(R)&&("path"in R)&&R.path===h.path))m.push(h)}else if(!m.some((S)=>Dd(S,h)))m.push(h);r[a]=m}else if(l.every((m)=>typeof m==="string")&&r[a].every((m)=>typeof m==="string")){let m=[...l];for(let h of r[a])if(!m.includes(h))m.push(h);r[a]=m}else r[a]=l;else r[a]=l}return r}function Dd(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!Dd(e[r],t[r]))return!1;return!0}if(cr(e)&&cr(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let l of r){if(!Object.prototype.hasOwnProperty.call(t,l))return!1;if(!Dd(e[l],t[l]))return!1}return!0}return!1}function cr(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}async function pR(e,t){if(!av(e))return null;try{let r=await import(e),a=r.default||r;if(typeof a!=="object"||a===null||Array.isArray(a))return null;try{return Ig(t,a)}catch{return null}}catch{return null}}async function gR({name:e="",cwd:t,defaultConfig:r}){let a=t||dg.cwd(),l=[".ts",".js",".mjs",".cjs",".json"],m=[`${e}.config`,`.${e}.config`,e,`.${e}`];for(let h of m)for(let S of l){let R=Pd(a,`${h}${S}`),y=await pR(R,r);if(y!==null)return y}try{let h=Pd(a,"package.json");if(av(h)){let R=(await import(h))[e];if(R&&typeof R==="object"&&!Array.isArray(R))try{return Ig(r,R)}catch{}}}catch{}return r}function mR(e,t={}){let r=Cd.cwd();while(r.includes("storage"))r=iy(r,"..");let a=iy(r,e||"");if(t?.relative)return AE(Cd.cwd(),a);return a}async function fR(){try{let e=await gR({name:"clarity",defaultConfig:Sd,cwd:Cd.cwd(),endpoint:"",headers:{}});return{...Sd,...e}}catch{return Sd}}function mr(){if(gi.env.NODE_ENV==="test"||gi.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function hR(){if(gi.env.NODE_ENV==="test"||gi.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof gi<"u"){let e=gi.type;if(e==="renderer"||e==="worker")return!1;return!!(gi.versions&&(gi.versions.node||gi.versions.bun))}return!1}class dv{async format(e){let t=await hR(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Us.pid,hostname:t(),environment:Us.env.NODE_ENV||"development",platform:Us.platform,version:Us.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Us.env.NODE_ENV||Us.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}class Od{name;fileLocks=new Map;currentKeyId=null;keys=new Map;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...ug},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new dv,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??jr.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let l=this.generateKeyId(),m=this.generateKey();this.currentKeyId=l,this.keys.set(l,m),this.encryptionKeys.set(l,{key:m,createdAt:new Date}),this.setupKeyRotation()}}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...wd,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...wd};return{...wd,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:ug.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}async writeToFile(e){let r=(async()=>{let l,m=0,h=3,S=1000;while(m<h)try{try{try{await xE(this.config.logDirectory,cy.F_OK|cy.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await DE(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let R=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:ao.from(e);try{if(!Hp(this.currentLogFile))await Kp(this.currentLogFile,"",{mode:420});if(l=ay(this.currentLogFile,"a",420),TE(l,R,{flag:"a"}),sy(l),l!==void 0)Wp(l),l=void 0;if((await Ls(this.currentLogFile)).size===0){if(await Kp(this.currentLogFile,R,{flag:"w",mode:420}),(await Ls(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let C=y;if(C.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(C.code)){if(m<h-1){let T=typeof C.message==="string"?C.message:"Unknown error";console.error(`Network error during write attempt ${m+1}/${h}:`,T);let j=S*2**m;await new Promise((B)=>setTimeout(B,j)),m++;continue}}if(C?.code&&["ENOSPC","EDQUOT"].includes(C.code))throw Error(`Disk quota exceeded or no space left on device: ${C.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",C),C}finally{if(l!==void 0)try{Wp(l)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(R){if(m===h-1){let C=R,T=typeof C.message==="string"?C.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",T),R}m++;let y=S*2**(m-1);await new Promise((C)=>setTimeout(C,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(l){throw console.error("Debug: [writeToFile] Error in operation:",l),l}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Fs(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Fs(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Fs(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(mr())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((l)=>{console.error("Error rotating keys:",l)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let l=Array.from(this.encryptionKeys.entries()).sort(([,S],[,R])=>R.createdAt.getTime()-S.createdAt.getTime()),m=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,m);if(l.length>h)for(let[S]of l.slice(h))this.encryptionKeys.delete(S),this.keys.delete(S)}generateKeyId(){return Vp(16).toString("hex")}generateKey(){return Vp(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Vp(16),a=CE("aes-256-gcm",t,r),l=ao.concat([a.update(e,"utf8"),a.final()]),m=a.getAuthTag();return{encrypted:ao.concat([r,l,m]),iv:r}}async compressData(e){return new Promise((t,r)=>{let a=ly(),l=[];a.on("data",(m)=>l.push(m)),a.on("end",()=>t(ao.from(ao.concat(l)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(mr())return;let e=await Ls(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let l=await id(this.config.logDirectory),m=l.filter((R)=>R.startsWith(this.name)&&/\.log\.\d+$/.test(R)).sort((R,y)=>{let C=Number.parseInt(R.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-C}),h=m.length>0?Number.parseInt(m[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,S=`${r}.${h}`;if(await Ls(r).catch(()=>null))try{if(await dy(r,S),t.compress)try{let R=`${S}.gz`;await this.compressLogFile(S,R),await od(S)}catch(R){console.error("Error compressing rotated file:",R)}if(m.length===0&&!l.some((R)=>R.endsWith(".log.1")))try{let R=`${r}.1`;await Kp(R,"")}catch(R){console.error("Error creating backup file:",R)}}catch(R){console.error(`Error during rotation: ${R instanceof Error?R.message:String(R)}`)}}else{let l=new Date().toISOString().replace(/[:.]/g,"-"),m=r.replace(/\.log$/,`-${l}.log`);if(await Ls(r).catch(()=>null))await dy(r,m)}if(this.currentLogFile=a,t.maxFiles){let m=(await id(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,S)=>S.localeCompare(h));for(let h of m.slice(t.maxFiles))await od(Fs(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=oy(e),a=_E(t),l=ly();await OE(r,l,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);await this.writeToFile(a),console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated)await this.writeToFile(t),console.log(t);else{if(this.logBuffer.length>=this.fingersCrossedConfig.bufferSize)this.logBuffer.shift();let r={timestamp:new Date,level:e,message:t,name:this.name};this.logBuffer.push(r)}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;return this.getLevelValue(e)>=this.getLevelValue(this.fingersCrossedConfig.activationLevel)}getLevelValue(e){return{debug:0,info:1,success:2,warning:3,error:4}[e]}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),Hp(this.currentLogFile))try{let e=ay(this.currentLogFile,"r+");sy(e),Wp(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!mr()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await id(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await od(Fs(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.fancy?Kt.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:l,level:m,showTimestamp:h=!0}=e,S=(B)=>B.replace(this.ANSI_PATTERN,"");if(!this.fancy){let B=[];if(h)B.push(t);if(m==="warning")B.push("WARN");else if(m==="error")B.push("ERROR");else if(r)B.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)B.push(a.replace(/[[\]]/g,""));return B.push(l),B.join(" ")}let R=jr.stdout.columns||120,y="";if(m==="warning"||m==="error")y=`${r} ${l}`;else if(m==="info"||m==="success")y=`${r} ${a} ${l}`;else y=`${r} ${a} ${Kt.cyan(l)}`;if(!h)return y.trim();let C=S(y).trim().length,T=S(t).length,j=Math.max(1,R-2-C-T);return`${y.trim()}${" ".repeat(j)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(m,h)=>{let S=Number.parseInt(h,10);return S<t[0].length?String(t[0][S]):m});let r=/%([sdijfo%])/g,a=0,l=e.replace(r,(m,h)=>{if(h==="%")return"%";if(a>=t.length)return m;let S=t[a++];switch(h){case"s":return String(S);case"d":case"i":return Number(S).toString();case"j":case"o":return JSON.stringify(S,null,2);default:return m}});if(a<t.length)l+=` ${t.slice(a).map((m)=>typeof m==="object"?JSON.stringify(m,null,2):String(m)).join(" ")}`;return l}async log(e,t,...r){let a=new Date,l=this.formatConsoleTimestamp(a),m=this.formatFileTimestamp(a),h,S;if(t instanceof Error)h=t.message,S=t.stack;else h=this.formatMessage(t,r);if(this.fancy&&!mr()){let y=bv[e],C=this.options.showTags!==!1&&this.name?Kt.gray(this.formatTag(this.name)):"",T;switch(e){case"debug":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:Kt.gray(h),level:e}),console.error(T);break;case"info":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:h,level:e}),console.error(T);break;case"success":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:Kt.green(h),level:e}),console.error(T);break;case"warning":T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:h,level:e}),console.warn(T);break;case"error":if(T=this.formatConsoleMessage({timestamp:l,icon:y,tag:C,message:h,level:e}),console.error(T),S){let j=S.split(`
|
|
103
103
|
`);for(let B of j)if(B.trim()&&!B.includes(h))console.error(this.formatConsoleMessage({timestamp:l,message:Kt.gray(` ${B}`),level:e,showTimestamp:!1}))}break}}else if(!mr()){if(console.error(`${m} ${this.environment}.${e.toUpperCase()}: ${h}`),S)console.error(S)}if(!this.shouldLog(e))return;let R=`${m} ${this.environment}.${e.toUpperCase()}: ${h}
|
|
104
104
|
`;if(S)R+=`${S}
|
|
105
105
|
`;R=R.replace(this.ANSI_PATTERN,""),await this.writeToFile(R)}time(e){let t=performance.now();if(this.fancy&&!mr()){let r=this.options.showTags!==!1&&this.name?Kt.gray(this.formatTag(this.name)):"",a=this.formatConsoleTimestamp(new Date);console.error(this.formatConsoleMessage({timestamp:a,icon:Kt.blue("◐"),tag:r,message:`${Kt.cyan(e)}...`}))}return async(r)=>{if(!this.enabled)return;let a=performance.now(),l=Math.round(a-t),m=`${e} completed in ${l}ms`,h=new Date,S=this.formatConsoleTimestamp(h),y=`${this.formatFileTimestamp(h)} ${this.environment}.INFO: ${m}`;if(r)y+=` ${JSON.stringify(r)}`;if(y+=`
|
|
@@ -137,7 +137,7 @@ ${l.map((y)=>{let C=xy(t,y.file).replace(/\\/g,"/");return` '${y.base}': typeof
|
|
|
137
137
|
export type ConfigByName = ${S}
|
|
138
138
|
export type Config<N extends ConfigNames> = N extends keyof ConfigByName ? ConfigByName[N] : unknown
|
|
139
139
|
export type ConfigOf = Config
|
|
140
|
-
`}return{name:"bunfig-plugin",setup(l){l.onResolve({filter:/^virtual:bunfig-types$/},(m)=>({path:m.path,namespace:"bunfig-virtual"})),l.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>({contents:a(),loader:"ts"}))}}}var yv,Ys,gc,vv,NR,jR,qy,Sd,ug,Mr,Kt,BR,Vy,MR,Wy,LR,FR,rg,zR,Hy,Ky,ng,UR,qR,VR,WR,wd,bv,HR,Lr,KR,JR,Jy,kd,pg,Ir,At,GR,Gy,QR,Qy,YR,ZR,ig,XR,Yy,Zy,eA,og,tA,rA,nA,iA,oA,Id,Sv,sA,aA="0.15.6",xn,Bd,uc,gg,mg,Ld,fg,hg,pc,yg,vg,uo,wv,kv,Hn,vi,Iv,Ev,cA=cR(async()=>{yv=import.meta.require,Ys=new wg,gc=new kg,vv={createKey:dR,isEquivalent:lR,estimateMemoryUsage:uR},NR=Pd(dg.cwd(),"config"),jR=Pd(dg.cwd(),"src/generated"),qy=Cd.env.CLARITY_LOG_DIR||RE(mR(),"logs"),Sd={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:qy,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},ug=await fR(),Mr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,reset:"\x1B[0m"},Kt=Mr,BR=Mr.red,Vy=Mr.green,MR=Mr.yellow,Wy=Mr.blue,LR=Mr.magenta,FR=Mr.cyan,rg=Mr.white,zR=Mr.gray,Hy=Mr.bgRed,Ky=Mr.bgYellow,ng=Mr.bold,UR=Mr.dim,qR=Mr.italic,VR=Mr.underline,WR=Mr.reset,wd={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},bv={debug:"\uD83D\uDD0D",info:Wy("ℹ"),success:Vy("✓"),warning:Ky(rg(ng(" WARN "))),error:Hy(rg(ng(" ERROR ")))},HR=new Od("stacks"),Lr=new Od("bunfig",{showTags:!0}),KR=yn(lc.cwd(),"config"),JR=yn(lc.cwd(),"src/generated"),Jy=Rd.env.CLARITY_LOG_DIR||IE(bR(),"logs"),kd={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Jy,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},pg=await SR(),Ir={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},At=Ir,GR=Ir.red,Gy=Ir.green,QR=Ir.yellow,Qy=Ir.blue,YR=Ir.magenta,ZR=Ir.cyan,ig=Ir.white,XR=Ir.gray,Yy=Ir.bgRed,Zy=Ir.bgYellow,eA=Ir.bgGray,og=Ir.bold,tA=Ir.dim,rA=Ir.italic,nA=Ir.underline,iA=Ir.strikethrough,oA=Ir.reset,Id={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Sv={debug:"\uD83D\uDD0D",info:Qy("ℹ"),success:Gy("✓"),warning:Zy(ig(og(" WARN "))),error:Yy(ig(og(" ERROR ")))},sA=new jd("stacks"),xn=class extends Error{timestamp;context;constructor(t,r={}){super(t);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=r,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let t=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([r,a])=>`${r}: ${a}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${t}`}},Bd=class extends xn{code="CONFIG_NOT_FOUND";constructor(t,r,a){let l=a?` or alias "${a}"`:"";super(`Configuration "${t}"${l} not found`,{configName:t,alias:a,searchPaths:r,searchPathCount:r.length})}},uc=class extends xn{code="CONFIG_LOAD_ERROR";constructor(t,r,a){super(`Failed to load configuration from "${t}": ${r.message}`,{configPath:t,configName:a,originalError:r.name,originalMessage:r.message});this.cause=r}},gg=class extends xn{code="CONFIG_VALIDATION_ERROR";constructor(t,r,a){super(`Configuration validation failed for "${t}"`,{configPath:t,configName:a,validationErrors:r,errorCount:r.length})}},mg=class extends xn{code="CONFIG_MERGE_ERROR";constructor(t,r,a,l){super(`Failed to merge configuration from "${t}" with "${r}": ${a.message}`,{sourcePath:t,targetPath:r,configName:l,originalError:a.name,originalMessage:a.message});this.cause=a}},Ld=class extends xn{code="ENV_VAR_ERROR";constructor(t,r,a,l){super(`Failed to parse environment variable "${t}" with value "${r}" as ${a}`,{envKey:t,envValue:r,expectedType:a,configName:l})}},fg=class extends xn{code="FILE_SYSTEM_ERROR";constructor(t,r,a){super(`File system ${t} failed for "${r}": ${a.message}`,{operation:t,path:r,originalError:a.name,originalMessage:a.message});this.cause=a}},hg=class extends xn{code="TYPE_GENERATION_ERROR";constructor(t,r,a){super(`Failed to generate types from "${t}" to "${r}": ${a.message}`,{configDir:t,outputPath:r,originalError:a.name,originalMessage:a.message});this.cause=a}},pc=class extends xn{code="SCHEMA_VALIDATION_ERROR";constructor(t,r,a){super(`Schema validation failed${a?` for config "${a}"`:""}`,{schemaPath:t,configName:a,validationErrors:r,errorCount:r.length})}},yg=class extends xn{code="BROWSER_CONFIG_ERROR";constructor(t,r,a,l){super(`Failed to fetch configuration from "${t}": ${r} ${a}`,{endpoint:t,status:r,statusText:a,configName:l})}},vg=class extends xn{code="PLUGIN_ERROR";constructor(t,r,a){super(`Plugin "${t}" failed during ${r}: ${a.message}`,{pluginName:t,operation:r,originalError:a.name,originalMessage:a.message});this.cause=a}},uo={configNotFound(e,t,r){return new Bd(e,t,r)},configLoad(e,t,r){return new uc(e,t,r)},configValidation(e,t,r){return new gg(e,t,r)},configMerge(e,t,r,a){return new mg(e,t,r,a)},envVar(e,t,r,a){return new Ld(e,t,r,a)},fileSystem(e,t,r){return new fg(e,t,r)},typeGeneration(e,t,r){return new hg(e,t,r)},schemaValidation(e,t,r){return new pc(e,t,r)},browserConfig(e,t,r,a){return new yg(e,t,r,a)},plugin(e,t,r){return new vg(e,t,r)}},wv={replace:"replace",concat:"concat",smart:"smart"},kv=/^https?:\/\//,Hn=new jd("bunfig",{showTags:!0}),vi=new Cg,Iv=vn(cs.cwd(),"config"),Ev=vn(cs.cwd(),"src/generated")});function dA(e,t={}){let r=_d.cwd();while(r.includes("storage"))r=Oy(r,"..");let a=Oy(r,e||"");if(t?.relative)return JE(_d.cwd(),a);return a}var lA=_d.env.CLARITY_LOG_DIR||KE(dA(),"logs"),Rv={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:lA,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},zd={...Rv},xN=(async()=>{try{let{loadConfig:e}=await cA().then(()=>cv),t=await e({name:"clarity",alias:"logging",defaultConfig:Rv,cwd:_d.cwd()});if(t)Object.assign(zd,t)}catch{}return zd})();function Er(){if(fi.env.NODE_ENV==="test"||fi.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function uA(){if(fi.env.NODE_ENV==="test"||fi.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof fi<"u"){let e=fi.type;if(e==="renderer"||e==="worker")return!1;return!!(fi.versions&&(fi.versions.node||fi.versions.bun))}return!1}class Av{async format(e){let t=await uA(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Gs.pid,hostname:t(),environment:Gs.env.NODE_ENV||"development",platform:Gs.platform,version:Gs.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Gs.env.NODE_ENV||Gs.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var Cr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},Dt=Cr,{red:DN,green:pA,yellow:ON,blue:gA,magenta:$N,cyan:NN,white:Xy,gray:jN,bgRed:mA,bgYellow:fA,bgGray:BN,bold:ev,dim:MN,italic:LN,underline:FN,strikethrough:zN,reset:UN}=Cr,sg={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},hA={debug:"\uD83D\uDD0D",info:gA("ℹ"),success:pA("✓"),warning:fA(Xy(ev(" WARN "))),error:mA(Xy(ev(" ERROR ")))};class Qd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...zd},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Av,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??Bt.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let l=this.generateKeyId(),m=this.generateKey();this.currentKeyId=l,this.keys.set(l,m),this.encryptionKeys.set(l,{key:m,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;let t={debug:0,info:1,success:2,warning:3,error:4},r=this.fingersCrossedConfig.activationLevel??"error";return t[e]>=t[r]}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...sg,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...sg};return{...sg,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:zd.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}shouldWriteToFile(){return!Er()&&this.config.writeToFile===!0}async writeToFile(e){let r=(async()=>{let l,m=0,h=3,S=1000;while(m<h)try{try{try{await XE(this.config.logDirectory,Ly.F_OK|Ly.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await eR(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let R=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:pi.from(e);try{if(!ud(this.currentLogFile))await tg(this.currentLogFile,"",{mode:420});if(l=My(this.currentLogFile,"a",420),ZE(l,R,{flag:"a"}),jy(l),l!==void 0)eg(l),l=void 0;if((await Ks(this.currentLogFile)).size===0){if(await tg(this.currentLogFile,R,{flag:"w",mode:420}),(await Ks(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let C=y;if(C.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(C.code)){if(m<h-1){let T=typeof C.message==="string"?C.message:"Unknown error";console.error(`Network error during write attempt ${m+1}/${h}:`,T);let j=S*2**m;await new Promise((B)=>setTimeout(B,j)),m++;continue}}if(C?.code&&["ENOSPC","EDQUOT"].includes(C.code))throw Error(`Disk quota exceeded or no space left on device: ${C.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",C),C}finally{if(l!==void 0)try{eg(l)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(R){if(m===h-1){let C=R,T=typeof C.message==="string"?C.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",T),R}m++;let y=S*2**(m-1);await new Promise((C)=>setTimeout(C,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(l){throw console.error("Debug: [writeToFile] Error in operation:",l),l}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Js(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Js(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Js(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(Er())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((l)=>{console.error("Error rotating keys:",l)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let l=Array.from(this.encryptionKeys.entries()).sort(([,S],[,R])=>R.createdAt.getTime()-S.createdAt.getTime()),m=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,m);if(l.length>h)for(let[S]of l.slice(h))this.encryptionKeys.delete(S),this.keys.delete(S)}generateKeyId(){return Xp(16).toString("hex")}generateKey(){return Xp(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Xp(16),a=GE("aes-256-gcm",t,r),l=pi.isBuffer(e)?e:pi.from(e,"utf8"),m=a.update(l),h=a.final(),S=m.length+h.length,R=a.getAuthTag(),y=pi.allocUnsafe(16+S+16);return r.copy(y,0),m.copy(y,16),h.copy(y,16+m.length),R.copy(y,16+S),{encrypted:y,iv:r}}async compressData(e){return new Promise((t,r)=>{let a=zy(),l=[];a.on("data",(m)=>l.push(m)),a.on("end",()=>t(pi.from(pi.concat(l)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(Er())return;if(!this.shouldWriteToFile())return;let e=await Ks(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let l=await pd(this.config.logDirectory),m=l.filter((R)=>R.startsWith(this.name)&&/\.log\.\d+$/.test(R)).sort((R,y)=>{let C=Number.parseInt(R.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-C}),h=m.length>0?Number.parseInt(m[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,S=`${r}.${h}`;if(await Ks(r).catch(()=>null))try{if(await Fy(r,S),t.compress)try{let R=`${S}.gz`;await this.compressLogFile(S,R),await gd(S)}catch(R){console.error("Error compressing rotated file:",R)}if(m.length===0&&!l.some((R)=>R.endsWith(".log.1")))try{let R=`${r}.1`;await tg(R,"")}catch(R){console.error("Error creating backup file:",R)}}catch(R){console.error(`Error during rotation: ${R instanceof Error?R.message:String(R)}`)}}else{let l=new Date().toISOString().replace(/[:.]/g,"-"),m=r.replace(/\.log$/,`-${l}.log`);if(await Ks(r).catch(()=>null))await Fy(r,m)}if(this.currentLogFile=a,t.maxFiles){let m=(await pd(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,S)=>S.localeCompare(h));for(let h of m.slice(t.maxFiles))await gd(Js(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=$y(e),a=YE(t),l=zy();await nR(r,l,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);if(this.shouldWriteToFile())await this.writeToFile(a);console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile(t);console.log(t)}}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),ud(this.currentLogFile))try{let e=My(this.currentLogFile,"r+");jy(e),eg(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!Er()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await pd(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await gd(Js(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.shouldStyleConsole()?Dt.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||Er())return!1;let e=typeof Bt.env.NO_COLOR<"u",t=Bt.env.FORCE_COLOR==="0";if(e||t)return!1;return!!(typeof Bt.stderr<"u"&&Bt.stderr.isTTY||typeof Bt.stdout<"u"&&Bt.stdout.isTTY)}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:l,level:m,showTimestamp:h=!0}=e,S=(B)=>B.replace(this.ANSI_PATTERN,"");if(!this.fancy){let B=[];if(h)B.push(t);if(m==="warning")B.push("WARN");else if(m==="error")B.push("ERROR");else if(r)B.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)B.push(a.replace(/[[\]]/g,""));return B.push(l),B.join(" ")}let R=Bt.stdout.columns||120,y="";if(m==="warning"||m==="error")y=`${r} ${l}`;else if(m==="info"||m==="success")y=`${r} ${a} ${l}`;else y=`${r} ${a} ${Dt.cyan(l)}`;if(!h)return y.trim();let C=S(y).trim().length,T=S(t).length,j=Math.max(1,R-2-C-T);return`${y.trim()}${" ".repeat(j)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(m,h)=>{let S=Number.parseInt(h,10);return S<t[0].length?String(t[0][S]):m});let r=/%([sdijfo%])/g,a=0,l=e.replace(r,(m,h)=>{if(h==="%")return"%";if(a>=t.length)return m;let S=t[a++];switch(h){case"s":return String(S);case"d":case"i":return Number(S).toString();case"j":case"o":return JSON.stringify(S,null,2);default:return m}});if(a<t.length)l+=` ${t.slice(a).map((m)=>typeof m==="object"?JSON.stringify(m,null,2):String(m)).join(" ")}`;return l}formatMarkdown(e){if(!e)return e;let t=e;return t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(r,a,l)=>{let m=Dt.underline(Dt.blue(a)),h=this.toAbsoluteFilePath(l);if(h&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let S=`file://${encodeURI(h)}`,R="\x1B]8;;",y="\x1B\\";return`\x1B]8;;${S}\x1B\\${m}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${l}\x1B\\${m}\x1B]8;;\x1B\\`;return m}),t=t.replace(/`([^`]+)`/g,(r,a)=>Dt.bgGray(a)),t=t.replace(/\*\*([^*]+)\*\*/g,(r,a)=>Dt.bold(a)),t=t.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(r,a)=>Dt.italic(a)),t=t.replace(/(?<!_)_([^_]+)_(?!_)/g,(r,a)=>Dt.italic(a)),t=t.replace(/~([^~]+)~/g,(r,a)=>Dt.strikethrough(a)),t}supportsHyperlinks(){if(Er())return!1;let e=Bt.env;if(!e)return!1;if(e.TERM_PROGRAM==="iTerm.app"||e.TERM_PROGRAM==="vscode"||e.TERM_PROGRAM==="WezTerm")return!0;if(e.WT_SESSION)return!0;if(e.TERM==="xterm-kitty")return!0;let t=e.VTE_VERSION?Number.parseInt(e.VTE_VERSION,10):0;if(!Number.isNaN(t)&&t>=5000)return!0;return!1}toAbsoluteFilePath(e){try{let t=e;if(t.startsWith("file://"))t=t.replace(/^file:\/\//,"");if(t.startsWith("~")){let r=Bt.env.HOME||"";if(r)t=t.replace(/^~(?=$|\/)/,r)}if(tR(t)||t.startsWith("./")||t.startsWith("../"))t=rR(t);else return null;return ud(t)?t:null}catch{return null}}buildOutputTexts(e){let t=this.shouldStyleConsole()?this.formatMarkdown(e):e,r=e.replace(this.ANSI_PATTERN,"");return{consoleText:t,fileText:r}}async log(e,t,...r){if(!this.shouldLog(e))return;let a=new Date,l=this.formatConsoleTimestamp(a),m=this.formatFileTimestamp(a),h,S;if(t instanceof Error)h=t.message,S=t.stack;else h=this.formatMessage(t,r);let{consoleText:R,fileText:y}=this.buildOutputTexts(h);if(this.shouldStyleConsole()){let T=this.options.showIcons===!1?"":hA[e],j=this.options.showTags!==!1&&this.name?Dt.gray(this.formatTag(this.name)):"",B;switch(e){case"debug":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:Dt.gray(R),level:e}),console.error(B);break;case"info":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:R,level:e}),console.warn(B);break;case"success":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:Dt.green(R),level:e}),console.error(B);break;case"warning":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:R,level:e}),console.warn(B);break;case"error":if(B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:R,level:e}),console.error(B),S){let V=S.split(`
|
|
140
|
+
`}return{name:"bunfig-plugin",setup(l){l.onResolve({filter:/^virtual:bunfig-types$/},(m)=>({path:m.path,namespace:"bunfig-virtual"})),l.onLoad({filter:/^virtual:bunfig-types$/,namespace:"bunfig-virtual"},()=>({contents:a(),loader:"ts"}))}}}var yv,Ys,gc,vv,NR,jR,qy,Sd,ug,Mr,Kt,BR,Vy,MR,Wy,LR,FR,rg,zR,Hy,Ky,ng,UR,qR,VR,WR,wd,bv,HR,Lr,KR,JR,Jy,kd,pg,Ir,At,GR,Gy,QR,Qy,YR,ZR,ig,XR,Yy,Zy,eA,og,tA,rA,nA,iA,oA,Id,Sv,sA,aA="0.15.6",xn,Bd,uc,gg,mg,Ld,fg,hg,pc,yg,vg,uo,wv,kv,Hn,vi,Iv,Ev,cA=cR(async()=>{yv=import.meta.require,Ys=new wg,gc=new kg,vv={createKey:dR,isEquivalent:lR,estimateMemoryUsage:uR},NR=Pd(dg.cwd(),"config"),jR=Pd(dg.cwd(),"src/generated"),qy=Cd.env.CLARITY_LOG_DIR||RE(mR(),"logs"),Sd={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:qy,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1},ug=await fR(),Mr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,reset:"\x1B[0m"},Kt=Mr,BR=Mr.red,Vy=Mr.green,MR=Mr.yellow,Wy=Mr.blue,LR=Mr.magenta,FR=Mr.cyan,rg=Mr.white,zR=Mr.gray,Hy=Mr.bgRed,Ky=Mr.bgYellow,ng=Mr.bold,UR=Mr.dim,qR=Mr.italic,VR=Mr.underline,WR=Mr.reset,wd={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},bv={debug:"\uD83D\uDD0D",info:Wy("ℹ"),success:Vy("✓"),warning:Ky(rg(ng(" WARN "))),error:Hy(rg(ng(" ERROR ")))},HR=new Od("stacks"),Lr=new Od("bunfig",{showTags:!0}),KR=yn(lc.cwd(),"config"),JR=yn(lc.cwd(),"src/generated"),Jy=Rd.env.CLARITY_LOG_DIR||IE(bR(),"logs"),kd={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:Jy,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},pg=await SR(),Ir={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},At=Ir,GR=Ir.red,Gy=Ir.green,QR=Ir.yellow,Qy=Ir.blue,YR=Ir.magenta,ZR=Ir.cyan,ig=Ir.white,XR=Ir.gray,Yy=Ir.bgRed,Zy=Ir.bgYellow,eA=Ir.bgGray,og=Ir.bold,tA=Ir.dim,rA=Ir.italic,nA=Ir.underline,iA=Ir.strikethrough,oA=Ir.reset,Id={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},Sv={debug:"\uD83D\uDD0D",info:Qy("ℹ"),success:Gy("✓"),warning:Zy(ig(og(" WARN "))),error:Yy(ig(og(" ERROR ")))},sA=new jd("stacks"),xn=class extends Error{timestamp;context;constructor(t,r={}){super(t);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=r,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let t=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([r,a])=>`${r}: ${a}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${t}`}},Bd=class extends xn{code="CONFIG_NOT_FOUND";constructor(t,r,a){let l=a?` or alias "${a}"`:"";super(`Configuration "${t}"${l} not found`,{configName:t,alias:a,searchPaths:r,searchPathCount:r.length})}},uc=class extends xn{code="CONFIG_LOAD_ERROR";constructor(t,r,a){super(`Failed to load configuration from "${t}": ${r.message}`,{configPath:t,configName:a,originalError:r.name,originalMessage:r.message});this.cause=r}},gg=class extends xn{code="CONFIG_VALIDATION_ERROR";constructor(t,r,a){super(`Configuration validation failed for "${t}"`,{configPath:t,configName:a,validationErrors:r,errorCount:r.length})}},mg=class extends xn{code="CONFIG_MERGE_ERROR";constructor(t,r,a,l){super(`Failed to merge configuration from "${t}" with "${r}": ${a.message}`,{sourcePath:t,targetPath:r,configName:l,originalError:a.name,originalMessage:a.message});this.cause=a}},Ld=class extends xn{code="ENV_VAR_ERROR";constructor(t,r,a,l){super(`Failed to parse environment variable "${t}" with value "${r}" as ${a}`,{envKey:t,envValue:r,expectedType:a,configName:l})}},fg=class extends xn{code="FILE_SYSTEM_ERROR";constructor(t,r,a){super(`File system ${t} failed for "${r}": ${a.message}`,{operation:t,path:r,originalError:a.name,originalMessage:a.message});this.cause=a}},hg=class extends xn{code="TYPE_GENERATION_ERROR";constructor(t,r,a){super(`Failed to generate types from "${t}" to "${r}": ${a.message}`,{configDir:t,outputPath:r,originalError:a.name,originalMessage:a.message});this.cause=a}},pc=class extends xn{code="SCHEMA_VALIDATION_ERROR";constructor(t,r,a){super(`Schema validation failed${a?` for config "${a}"`:""}`,{schemaPath:t,configName:a,validationErrors:r,errorCount:r.length})}},yg=class extends xn{code="BROWSER_CONFIG_ERROR";constructor(t,r,a,l){super(`Failed to fetch configuration from "${t}": ${r} ${a}`,{endpoint:t,status:r,statusText:a,configName:l})}},vg=class extends xn{code="PLUGIN_ERROR";constructor(t,r,a){super(`Plugin "${t}" failed during ${r}: ${a.message}`,{pluginName:t,operation:r,originalError:a.name,originalMessage:a.message});this.cause=a}},uo={configNotFound(e,t,r){return new Bd(e,t,r)},configLoad(e,t,r){return new uc(e,t,r)},configValidation(e,t,r){return new gg(e,t,r)},configMerge(e,t,r,a){return new mg(e,t,r,a)},envVar(e,t,r,a){return new Ld(e,t,r,a)},fileSystem(e,t,r){return new fg(e,t,r)},typeGeneration(e,t,r){return new hg(e,t,r)},schemaValidation(e,t,r){return new pc(e,t,r)},browserConfig(e,t,r,a){return new yg(e,t,r,a)},plugin(e,t,r){return new vg(e,t,r)}},wv={replace:"replace",concat:"concat",smart:"smart"},kv=/^https?:\/\//,Hn=new jd("bunfig",{showTags:!0}),vi=new Cg,Iv=vn(cs.cwd(),"config"),Ev=vn(cs.cwd(),"src/generated")});function dA(e,t={}){let r=_d.cwd();while(r.includes("storage"))r=Oy(r,"..");let a=Oy(r,e||"");if(t?.relative)return JE(_d.cwd(),a);return a}var lA=_d.env.CLARITY_LOG_DIR||KE(dA(),"logs"),Rv={level:"info",defaultName:"clarity",timestamp:!0,colors:!0,format:"text",maxLogSize:10485760,logDatePattern:"YYYY-MM-DD",logDirectory:lA,rotation:{frequency:"daily",maxSize:10485760,maxFiles:5,compress:!1,rotateHour:0,rotateMinute:0,rotateDayOfWeek:0,rotateDayOfMonth:1,encrypt:!1},verbose:!1,writeToFile:!1},zd={...Rv},DN=(async()=>{try{let{loadConfig:e}=await cA().then(()=>cv),t=await e({name:"clarity",alias:"logging",defaultConfig:Rv,cwd:_d.cwd()});if(t)Object.assign(zd,t)}catch{}return zd})();function Er(){if(fi.env.NODE_ENV==="test"||fi.env.BUN_ENV==="test")return!1;return typeof window<"u"}async function uA(){if(fi.env.NODE_ENV==="test"||fi.env.BUN_ENV==="test")return!0;if(typeof navigator<"u"&&navigator.product==="ReactNative")return!0;if(typeof fi<"u"){let e=fi.type;if(e==="renderer"||e==="worker")return!1;return!!(fi.versions&&(fi.versions.node||fi.versions.bun))}return!1}class Av{async format(e){let t=await uA(),r=await this.getMetadata(t);return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,name:e.name,message:e.message,metadata:r})}async getMetadata(e){if(e){let{hostname:t}=await import("os");return{pid:Gs.pid,hostname:t(),environment:Gs.env.NODE_ENV||"development",platform:Gs.platform,version:Gs.version}}return{userAgent:navigator.userAgent,hostname:window.location.hostname||"browser",environment:Gs.env.NODE_ENV||Gs.env.BUN_ENV||"development",viewport:{width:window.innerWidth,height:window.innerHeight},language:navigator.language}}}var Cr={red:(e)=>`\x1B[31m${e}\x1B[0m`,green:(e)=>`\x1B[32m${e}\x1B[0m`,yellow:(e)=>`\x1B[33m${e}\x1B[0m`,blue:(e)=>`\x1B[34m${e}\x1B[0m`,magenta:(e)=>`\x1B[35m${e}\x1B[0m`,cyan:(e)=>`\x1B[36m${e}\x1B[0m`,white:(e)=>`\x1B[37m${e}\x1B[0m`,gray:(e)=>`\x1B[90m${e}\x1B[0m`,bgRed:(e)=>`\x1B[41m${e}\x1B[0m`,bgYellow:(e)=>`\x1B[43m${e}\x1B[0m`,bgGray:(e)=>`\x1B[100m${e}\x1B[0m`,bold:(e)=>`\x1B[1m${e}\x1B[0m`,dim:(e)=>`\x1B[2m${e}\x1B[0m`,italic:(e)=>`\x1B[3m${e}\x1B[0m`,underline:(e)=>`\x1B[4m${e}\x1B[0m`,strikethrough:(e)=>`\x1B[9m${e}\x1B[0m`,reset:"\x1B[0m"},Dt=Cr,{red:ON,green:pA,yellow:$N,blue:gA,magenta:NN,cyan:jN,white:Xy,gray:BN,bgRed:mA,bgYellow:fA,bgGray:MN,bold:ev,dim:LN,italic:FN,underline:zN,strikethrough:UN,reset:qN}=Cr,sg={activationLevel:"error",bufferSize:50,flushOnDeactivation:!0,stopBuffering:!1},hA={debug:"\uD83D\uDD0D",info:gA("ℹ"),success:pA("✓"),warning:fA(Xy(ev(" WARN "))),error:mA(Xy(ev(" ERROR ")))};class Qd{name;fileLocks=new Map;currentKeyId=null;keys=new Map;fingersCrossedConfig;fingersCrossedActive=!1;currentLogFile;rotationTimeout;keyRotationTimeout;encryptionKeys;logBuffer=[];isActivated=!1;pendingOperations=[];enabled;fancy;tagFormat;timestampPosition;environment;config;options;formatter;timers=new Set;subLoggers=new Set;fingersCrossedBuffer=[];ANSI_PATTERN=/\u001B\[.*?m/g;activeProgressBar=null;constructor(e,t={}){this.name=e,this.config={...zd},this.options=this.normalizeOptions(t),this.formatter=this.options.formatter||new Av,this.enabled=t.enabled??!0,this.fancy=t.fancy??!0,this.tagFormat=t.tagFormat??{prefix:"[",suffix:"]"},this.timestampPosition=t.timestampPosition??"right",this.environment=t.environment??Bt.env.APP_ENV??"local",this.fingersCrossedConfig=this.initializeFingersCrossedConfig(t);let r={...t},a=t.timestamp!==void 0;if(a)delete r.timestamp;if(this.config={...this.config,...r,timestamp:a||this.config.timestamp,level:this.options.level??"info"},this.currentLogFile=this.generateLogFilename(),this.encryptionKeys=new Map,this.validateEncryptionConfig()){this.setupRotation();let l=this.generateKeyId(),m=this.generateKey();this.currentKeyId=l,this.keys.set(l,m),this.encryptionKeys.set(l,{key:m,createdAt:new Date}),this.setupKeyRotation()}}shouldActivateFingersCrossed(e){if(!this.fingersCrossedConfig)return!1;let t={debug:0,info:1,success:2,warning:3,error:4},r=this.fingersCrossedConfig.activationLevel??"error";return t[e]>=t[r]}initializeFingersCrossedConfig(e){if(!e.fingersCrossedEnabled&&e.fingersCrossed)return{...sg,...e.fingersCrossed};if(!e.fingersCrossedEnabled)return null;if(!e.fingersCrossed)return{...sg};return{...sg,...e.fingersCrossed}}normalizeOptions(e){let t={format:"json",level:"info",logDirectory:zd.logDirectory,rotation:void 0,timestamp:void 0,fingersCrossed:{},enabled:!0,showTags:!1,showIcons:!0,formatter:void 0},r={...t,...Object.fromEntries(Object.entries(e).filter(([,a])=>a!==void 0))};if(!r.level||!["debug","info","success","warning","error"].includes(r.level))r.level=t.level;return r}shouldWriteToFile(){return!Er()&&this.config.writeToFile===!0}async writeToFile(e){let r=(async()=>{let l,m=0,h=3,S=1000;while(m<h)try{try{try{await XE(this.config.logDirectory,Ly.F_OK|Ly.W_OK)}catch(y){if(y instanceof Error&&"code"in y)if(y.code==="ENOENT")await eR(this.config.logDirectory,{recursive:!0,mode:493});else if(y.code==="EACCES")throw Error(`No write permission for log directory: ${this.config.logDirectory}`);else throw y;else throw y}}catch(y){throw console.error("Debug: [writeToFile] Failed to create log directory:",y),y}let R=this.validateEncryptionConfig()?(await this.encrypt(e)).encrypted:pi.from(e);try{if(!ud(this.currentLogFile))await tg(this.currentLogFile,"",{mode:420});if(l=My(this.currentLogFile,"a",420),ZE(l,R,{flag:"a"}),jy(l),l!==void 0)eg(l),l=void 0;if((await Ks(this.currentLogFile)).size===0){if(await tg(this.currentLogFile,R,{flag:"w",mode:420}),(await Ks(this.currentLogFile)).size===0)throw Error("File exists but is empty after retry write")}return}catch(y){let C=y;if(C.code&&["ENETDOWN","ENETUNREACH","ENOTFOUND","ETIMEDOUT"].includes(C.code)){if(m<h-1){let T=typeof C.message==="string"?C.message:"Unknown error";console.error(`Network error during write attempt ${m+1}/${h}:`,T);let j=S*2**m;await new Promise((B)=>setTimeout(B,j)),m++;continue}}if(C?.code&&["ENOSPC","EDQUOT"].includes(C.code))throw Error(`Disk quota exceeded or no space left on device: ${C.message}`);throw console.error("Debug: [writeToFile] Error writing to file:",C),C}finally{if(l!==void 0)try{eg(l)}catch(y){console.error("Debug: [writeToFile] Error closing file descriptor:",y)}}}catch(R){if(m===h-1){let C=R,T=typeof C.message==="string"?C.message:"Unknown error";throw console.error("Debug: [writeToFile] Max retries reached. Final error:",T),R}m++;let y=S*2**(m-1);await new Promise((C)=>setTimeout(C,y))}})();this.pendingOperations.push(r);let a=this.pendingOperations.length-1;try{await r}catch(l){throw console.error("Debug: [writeToFile] Error in operation:",l),l}finally{this.pendingOperations.splice(a,1)}}generateLogFilename(){if(this.name.includes("stream-throughput")||this.name.includes("decompress-perf-test")||this.name.includes("decompression-latency")||this.name.includes("concurrent-read-test")||this.name.includes("clock-change-test"))return Js(this.config.logDirectory,`${this.name}.log`);if(this.name.includes("pending-test")||this.name.includes("temp-file-test")||this.name==="crash-test"||this.name==="corrupt-test"||this.name.includes("rotation-load-test")||this.name==="sigterm-test"||this.name==="sigint-test"||this.name==="failed-rotation-test"||this.name==="integration-test")return Js(this.config.logDirectory,`${this.name}.log`);let e=new Date().toISOString().split("T")[0];return Js(this.config.logDirectory,`${this.name}-${e}.log`)}setupRotation(){if(Er())return;if(!this.shouldWriteToFile())return;if(typeof this.config.rotation==="boolean")return;let e=this.config.rotation,t;switch(e.frequency){case"daily":t=86400000;break;case"weekly":t=604800000;break;case"monthly":t=2592000000;break;default:return}this.rotationTimeout=setInterval(()=>{this.rotateLog()},t)}setupKeyRotation(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation setup");return}let t=this.config.rotation.keyRotation;if(!t?.enabled)return;let r=typeof t.interval==="number"?t.interval:60,a=Math.max(r,60)*1000;this.keyRotationTimeout=setInterval(()=>{this.rotateKeys().catch((l)=>{console.error("Error rotating keys:",l)})},a)}async rotateKeys(){if(!this.validateEncryptionConfig()){console.error("Invalid encryption configuration detected during key rotation");return}let t=this.config.rotation.keyRotation,r=this.generateKeyId(),a=this.generateKey();this.currentKeyId=r,this.keys.set(r,a),this.encryptionKeys.set(r,{key:a,createdAt:new Date});let l=Array.from(this.encryptionKeys.entries()).sort(([,S],[,R])=>R.createdAt.getTime()-S.createdAt.getTime()),m=typeof t.maxKeys==="number"?t.maxKeys:1,h=Math.max(1,m);if(l.length>h)for(let[S]of l.slice(h))this.encryptionKeys.delete(S),this.keys.delete(S)}generateKeyId(){return Xp(16).toString("hex")}generateKey(){return Xp(32)}getCurrentKey(){if(!this.currentKeyId)throw Error("Encryption is not properly initialized. Make sure encryption is enabled in the configuration.");let e=this.keys.get(this.currentKeyId);if(!e)throw Error(`No key found for ID ${this.currentKeyId}. The encryption key may have been rotated or removed.`);return{key:e,id:this.currentKeyId}}encrypt(e){let{key:t}=this.getCurrentKey(),r=Xp(16),a=GE("aes-256-gcm",t,r),l=pi.isBuffer(e)?e:pi.from(e,"utf8"),m=a.update(l),h=a.final(),S=m.length+h.length,R=a.getAuthTag(),y=pi.allocUnsafe(16+S+16);return r.copy(y,0),m.copy(y,16),h.copy(y,16+m.length),R.copy(y,16+S),{encrypted:y,iv:r}}async compressData(e){return new Promise((t,r)=>{let a=zy(),l=[];a.on("data",(m)=>l.push(m)),a.on("end",()=>t(pi.from(pi.concat(l)))),a.on("error",r),a.write(e),a.end()})}getEncryptionOptions(){if(!this.config.rotation||typeof this.config.rotation==="boolean"||!this.config.rotation.encrypt)return{};let e={algorithm:"aes-256-cbc",compress:!1};if(typeof this.config.rotation.encrypt==="object"){let t=this.config.rotation.encrypt;return{...e,...t}}return e}async rotateLog(){if(Er())return;if(!this.shouldWriteToFile())return;let e=await Ks(this.currentLogFile).catch(()=>null);if(!e)return;let t=this.config.rotation;if(typeof t==="boolean")return;if(t.maxSize&&e.size>=t.maxSize){let r=this.currentLogFile,a=this.generateLogFilename();if(this.name.includes("rotation-load-test")||this.name==="failed-rotation-test"){let l=await pd(this.config.logDirectory),m=l.filter((R)=>R.startsWith(this.name)&&/\.log\.\d+$/.test(R)).sort((R,y)=>{let C=Number.parseInt(R.match(/\.log\.(\d+)$/)?.[1]||"0");return Number.parseInt(y.match(/\.log\.(\d+)$/)?.[1]||"0")-C}),h=m.length>0?Number.parseInt(m[0].match(/\.log\.(\d+)$/)?.[1]||"0")+1:1,S=`${r}.${h}`;if(await Ks(r).catch(()=>null))try{if(await Fy(r,S),t.compress)try{let R=`${S}.gz`;await this.compressLogFile(S,R),await gd(S)}catch(R){console.error("Error compressing rotated file:",R)}if(m.length===0&&!l.some((R)=>R.endsWith(".log.1")))try{let R=`${r}.1`;await tg(R,"")}catch(R){console.error("Error creating backup file:",R)}}catch(R){console.error(`Error during rotation: ${R instanceof Error?R.message:String(R)}`)}}else{let l=new Date().toISOString().replace(/[:.]/g,"-"),m=r.replace(/\.log$/,`-${l}.log`);if(await Ks(r).catch(()=>null))await Fy(r,m)}if(this.currentLogFile=a,t.maxFiles){let m=(await pd(this.config.logDirectory)).filter((h)=>h.startsWith(this.name)).sort((h,S)=>S.localeCompare(h));for(let h of m.slice(t.maxFiles))await gd(Js(this.config.logDirectory,h))}}}async compressLogFile(e,t){let r=$y(e),a=YE(t),l=zy();await nR(r,l,a)}async handleFingersCrossedBuffer(e,t){if(!this.fingersCrossedConfig)return;if(this.shouldActivateFingersCrossed(e)&&!this.isActivated){this.isActivated=!0;for(let r of this.logBuffer){let a=await this.formatter.format(r);if(this.shouldWriteToFile())await this.writeToFile(a);console.log(a)}if(this.fingersCrossedConfig.stopBuffering)this.logBuffer=[]}if(this.isActivated){if(this.shouldWriteToFile())await this.writeToFile(t);console.log(t)}}shouldLog(e){if(!this.enabled)return!1;let t={debug:0,info:1,success:2,warning:3,error:4};return t[e]>=t[this.config.level]}async flushPendingWrites(){if(await Promise.all(this.pendingOperations.map((e)=>{if(e instanceof Promise)return e.catch((t)=>{console.error("Error in pending write operation:",t)});return Promise.resolve()})),ud(this.currentLogFile))try{let e=My(this.currentLogFile,"r+");jy(e),eg(e)}catch(e){console.error(`Error flushing file: ${e}`)}}async destroy(){if(this.rotationTimeout)clearInterval(this.rotationTimeout);if(this.keyRotationTimeout)clearInterval(this.keyRotationTimeout);this.timers.clear();for(let e of this.pendingOperations)if(typeof e.cancel==="function")e.cancel();return(async()=>{if(this.pendingOperations.length>0)try{await Promise.allSettled(this.pendingOperations)}catch(e){console.error("Error waiting for pending operations:",e)}if(!Er()&&this.config.rotation&&typeof this.config.rotation!=="boolean"&&this.config.rotation.compress)try{let t=(await pd(this.config.logDirectory)).filter((r)=>(r.includes("temp")||r.includes(".tmp"))&&r.includes(this.name));for(let r of t)try{await gd(Js(this.config.logDirectory,r))}catch(a){console.error(`Failed to delete temp file ${r}:`,a)}}catch(e){console.error("Error cleaning up temporary files:",e)}})()}getCurrentLogFilePath(){return this.currentLogFile}formatTag(e){if(!e)return"";return`${this.tagFormat.prefix}${e}${this.tagFormat.suffix}`}formatFileTimestamp(e){return`[${e.toISOString()}]`}formatConsoleTimestamp(e){return this.shouldStyleConsole()?Dt.gray(e.toLocaleTimeString()):e.toLocaleTimeString()}shouldStyleConsole(){if(!this.fancy||Er())return!1;let e=typeof Bt.env.NO_COLOR<"u",t=Bt.env.FORCE_COLOR==="0";if(e||t)return!1;return!!(typeof Bt.stderr<"u"&&Bt.stderr.isTTY||typeof Bt.stdout<"u"&&Bt.stdout.isTTY)}formatConsoleMessage(e){let{timestamp:t,icon:r="",tag:a="",message:l,level:m,showTimestamp:h=!0}=e,S=(B)=>B.replace(this.ANSI_PATTERN,"");if(!this.fancy){let B=[];if(h)B.push(t);if(m==="warning")B.push("WARN");else if(m==="error")B.push("ERROR");else if(r)B.push(r.replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu,""));if(a)B.push(a.replace(/[[\]]/g,""));return B.push(l),B.join(" ")}let R=Bt.stdout.columns||120,y="";if(m==="warning"||m==="error")y=`${r} ${l}`;else if(m==="info"||m==="success")y=`${r} ${a} ${l}`;else y=`${r} ${a} ${Dt.cyan(l)}`;if(!h)return y.trim();let C=S(y).trim().length,T=S(t).length,j=Math.max(1,R-2-C-T);return`${y.trim()}${" ".repeat(j)}${t}`}formatMessage(e,t){if(t.length===1&&Array.isArray(t[0]))return e.replace(/\{(\d+)\}/g,(m,h)=>{let S=Number.parseInt(h,10);return S<t[0].length?String(t[0][S]):m});let r=/%([sdijfo%])/g,a=0,l=e.replace(r,(m,h)=>{if(h==="%")return"%";if(a>=t.length)return m;let S=t[a++];switch(h){case"s":return String(S);case"d":case"i":return Number(S).toString();case"j":case"o":return JSON.stringify(S,null,2);default:return m}});if(a<t.length)l+=` ${t.slice(a).map((m)=>typeof m==="object"?JSON.stringify(m,null,2):String(m)).join(" ")}`;return l}formatMarkdown(e){if(!e)return e;let t=e;return t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(r,a,l)=>{let m=Dt.underline(Dt.blue(a)),h=this.toAbsoluteFilePath(l);if(h&&this.shouldStyleConsole()&&this.supportsHyperlinks()){let S=`file://${encodeURI(h)}`,R="\x1B]8;;",y="\x1B\\";return`\x1B]8;;${S}\x1B\\${m}\x1B]8;;\x1B\\`}if(this.shouldStyleConsole()&&this.supportsHyperlinks())return`\x1B]8;;${l}\x1B\\${m}\x1B]8;;\x1B\\`;return m}),t=t.replace(/`([^`]+)`/g,(r,a)=>Dt.bgGray(a)),t=t.replace(/\*\*([^*]+)\*\*/g,(r,a)=>Dt.bold(a)),t=t.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g,(r,a)=>Dt.italic(a)),t=t.replace(/(?<!_)_([^_]+)_(?!_)/g,(r,a)=>Dt.italic(a)),t=t.replace(/~([^~]+)~/g,(r,a)=>Dt.strikethrough(a)),t}supportsHyperlinks(){if(Er())return!1;let e=Bt.env;if(!e)return!1;if(e.TERM_PROGRAM==="iTerm.app"||e.TERM_PROGRAM==="vscode"||e.TERM_PROGRAM==="WezTerm")return!0;if(e.WT_SESSION)return!0;if(e.TERM==="xterm-kitty")return!0;let t=e.VTE_VERSION?Number.parseInt(e.VTE_VERSION,10):0;if(!Number.isNaN(t)&&t>=5000)return!0;return!1}toAbsoluteFilePath(e){try{let t=e;if(t.startsWith("file://"))t=t.replace(/^file:\/\//,"");if(t.startsWith("~")){let r=Bt.env.HOME||"";if(r)t=t.replace(/^~(?=$|\/)/,r)}if(tR(t)||t.startsWith("./")||t.startsWith("../"))t=rR(t);else return null;return ud(t)?t:null}catch{return null}}buildOutputTexts(e){let t=this.shouldStyleConsole()?this.formatMarkdown(e):e,r=e.replace(this.ANSI_PATTERN,"");return{consoleText:t,fileText:r}}async log(e,t,...r){if(!this.shouldLog(e))return;let a=new Date,l=this.formatConsoleTimestamp(a),m=this.formatFileTimestamp(a),h,S;if(t instanceof Error)h=t.message,S=t.stack;else h=this.formatMessage(t,r);let{consoleText:R,fileText:y}=this.buildOutputTexts(h);if(this.shouldStyleConsole()){let T=this.options.showIcons===!1?"":hA[e],j=this.options.showTags!==!1&&this.name?Dt.gray(this.formatTag(this.name)):"",B;switch(e){case"debug":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:Dt.gray(R),level:e}),console.error(B);break;case"info":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:R,level:e}),console.warn(B);break;case"success":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:Dt.green(R),level:e}),console.error(B);break;case"warning":B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:R,level:e}),console.warn(B);break;case"error":if(B=this.formatConsoleMessage({timestamp:l,icon:T,tag:j,message:R,level:e}),console.error(B),S){let V=S.split(`
|
|
141
141
|
`);for(let W of V)if(W.trim()&&!W.includes(h))console.error(this.formatConsoleMessage({timestamp:l,message:Dt.gray(` ${W}`),level:e,showTimestamp:!1}))}break}}else if(!Er()){if(console.error(`${m} ${this.environment}.${e.toUpperCase()}: ${h}`),S)console.error(S)}let C=`${m} ${this.environment}.${e.toUpperCase()}: ${y}
|
|
142
142
|
`;if(S)C+=`${S}
|
|
143
143
|
`;if(C=C.replace(this.ANSI_PATTERN,""),this.shouldWriteToFile())await this.writeToFile(C)}progress(e,t=""){let r={update:(S,R)=>{},finish:(S)=>{},interrupt:(S,R)=>{}};if(!this.enabled)return r;let a=30;if(this.activeProgressBar={total:Math.max(1,e||1),current:0,message:t||"",barLength:a,lastRenderedLine:""},this.shouldStyleConsole()&&!Er()&&Bt.stdout.isTTY)this.renderProgressBar(this.activeProgressBar);return{update:(S,R)=>{if(!this.enabled||!this.activeProgressBar)return;if(this.activeProgressBar.current=Math.min(Math.max(0,S),this.activeProgressBar.total),R!==void 0)this.activeProgressBar.message=R;if(this.shouldStyleConsole()&&!Er()&&Bt.stdout.isTTY)this.renderProgressBar(this.activeProgressBar)},finish:(S)=>{if(!this.activeProgressBar)return;this.finishProgressBar(this.activeProgressBar,S)},interrupt:(S,R="info")=>{if(!Er()&&Bt.stdout.isTTY)Bt.stdout.write(`
|
|
@@ -146,7 +146,7 @@ export type ConfigOf = Config
|
|
|
146
146
|
`),R=Math.max(...S.map((j)=>j.length))+2,y=`┌${"─".repeat(R)}┐`,C=`└${"─".repeat(R)}┘`,T=S.map((j)=>this.formatConsoleMessage({timestamp:r,message:Dt.cyan(j),showTimestamp:!1}));console.error(this.formatConsoleMessage({timestamp:r,message:Dt.cyan(y),showTimestamp:!1})),T.forEach((j)=>console.error(j)),console.error(this.formatConsoleMessage({timestamp:r,message:Dt.cyan(C),showTimestamp:!1}))}else if(!Er())console.error(`${a} ${this.environment}.INFO: [BOX] ${m}`);let h=`${a} ${this.environment}.INFO: [BOX] ${m}
|
|
147
147
|
`.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(h)}async prompt(e){if(Er())return Promise.resolve(!0);return new Promise((t)=>{console.error(`${Dt.cyan("?")} ${e} (y/n) `);let r=(a)=>{let l=a.toString().trim().toLowerCase();Bt.stdin.removeListener("data",r);try{if(typeof Bt.stdin.setRawMode==="function")Bt.stdin.setRawMode(!1)}catch{}Bt.stdin.pause(),console.error(""),t(l==="y"||l==="yes")};try{if(typeof Bt.stdin.setRawMode==="function")Bt.stdin.setRawMode(!0)}catch{}Bt.stdin.resume(),Bt.stdin.once("data",r)})}setFancy(e){this.fancy=e}isFancy(){return this.fancy}pause(){this.enabled=!1}resume(){this.enabled=!0}async start(e,...t){if(!this.enabled)return;let r=e;if(t&&t.length>0){let R=/%([sdijfo%])/g,y=0;if(r=e.replace(R,(C,T)=>{if(T==="%")return"%";if(y>=t.length)return C;let j=t[y++];switch(T){case"s":return String(j);case"d":case"i":return Number(j).toString();case"j":case"o":return JSON.stringify(j,null,2);default:return C}}),y<t.length)r+=` ${t.slice(y).map((C)=>typeof C==="object"?JSON.stringify(C,null,2):String(C)).join(" ")}`}let{consoleText:a,fileText:l}=this.buildOutputTexts(r);if(this.shouldStyleConsole()){let R=this.options.showTags!==!1&&this.name?Dt.gray(this.formatTag(this.name)):"",y=this.options.showIcons===!1?"":`${Dt.blue("◐")} `;console.error(`${y}${R} ${Dt.cyan(a)}`)}let S=`[${new Date().toISOString()}] ${this.environment}.INFO: [START] ${l}
|
|
148
148
|
`.replace(this.ANSI_PATTERN,"");if(this.shouldWriteToFile())await this.writeToFile(S)}renderProgressBar(e,t=!1){if(!this.enabled||!this.shouldStyleConsole()||!Bt.stdout.isTTY)return;let r=Math.min(100,Math.max(0,Math.round(e.current/e.total*100))),a=Math.round(e.barLength*r/100),l=e.barLength-a,m=Dt.green("━".repeat(a)),h=Dt.gray("━".repeat(l)),S=`[${m}${h}]`,R=`${r}%`.padStart(4),y=e.message?` ${e.message}`:"",C=this.options.showIcons===!1?"":t||r===100?Dt.green("✓"):Dt.blue("▶"),T=this.options.showTags!==!1&&this.name?` ${Dt.gray(this.formatTag(this.name))}`:"",j=`\r${C}${T} ${S} ${R}${y}`,B=Bt.stdout.columns||80,V=" ".repeat(Math.max(0,B-j.replace(this.ANSI_PATTERN,"").length));if(e.lastRenderedLine=`${j}${V}`,Bt.stdout.write(e.lastRenderedLine),t)Bt.stdout.write(`
|
|
149
|
-
`)}finishProgressBar(e,t){if(!this.enabled||!this.fancy||Er()||!Bt.stdout.isTTY){this.activeProgressBar=null;return}if(e.current<e.total)e.current=e.total;if(t)e.message=t;this.renderProgressBar(e,!0),this.activeProgressBar=null}async clear(e={}){if(Er()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let t=await pd(this.config.logDirectory),r=[];for(let a of t){if(!(e.name?new RegExp(e.name.replace("*",".*")).test(a):a.startsWith(this.name))||!a.endsWith(".log"))continue;let m=Js(this.config.logDirectory,a);if(e.before)try{if((await Ks(m)).mtime>=e.before)continue}catch(h){console.error(`Failed to get stats for file ${m}:`,h);continue}r.push(m)}if(r.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${r.length} log file(s)...`);for(let a of r)try{await gd(a),console.warn(`Deleted log file: ${a}`)}catch(l){console.error(`Failed to delete log file ${a}:`,l)}console.warn("Log clearing process finished.")}catch(t){console.error("Error during log clearing process:",t)}}}var
|
|
149
|
+
`)}finishProgressBar(e,t){if(!this.enabled||!this.fancy||Er()||!Bt.stdout.isTTY){this.activeProgressBar=null;return}if(e.current<e.total)e.current=e.total;if(t)e.message=t;this.renderProgressBar(e,!0),this.activeProgressBar=null}async clear(e={}){if(Er()){console.warn("Log clearing is not supported in browser environments.");return}try{console.warn("Clearing logs...",this.config.logDirectory);let t=await pd(this.config.logDirectory),r=[];for(let a of t){if(!(e.name?new RegExp(e.name.replace("*",".*")).test(a):a.startsWith(this.name))||!a.endsWith(".log"))continue;let m=Js(this.config.logDirectory,a);if(e.before)try{if((await Ks(m)).mtime>=e.before)continue}catch(h){console.error(`Failed to get stats for file ${m}:`,h);continue}r.push(m)}if(r.length===0){console.warn("No log files matched the criteria for clearing.");return}console.warn(`Preparing to delete ${r.length} log file(s)...`);for(let a of r)try{await gd(a),console.warn(`Deleted log file: ${a}`)}catch(l){console.error(`Failed to delete log file ${a}:`,l)}console.warn("Log clearing process finished.")}catch(t){console.error("Error during log clearing process:",t)}}}var VN=new Qd("stacks");class Kn extends Error{timestamp;context;constructor(e,t={}){super(e);if(this.name=this.constructor.name,this.timestamp=new Date,this.context=t,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,code:this.code,message:this.message,timestamp:this.timestamp.toISOString(),context:this.context,stack:this.stack}}toString(){let e=Object.keys(this.context).length>0?` (${Object.entries(this.context).map(([t,r])=>`${t}: ${r}`).join(", ")})`:"";return`${this.name} [${this.code}]: ${this.message}${e}`}}class Cv extends Kn{code="CONFIG_NOT_FOUND";constructor(e,t,r){let a=r===void 0?[]:Array.isArray(r)?r.filter(Boolean):[r],l="";if(a.length===1)l=` or alias "${a[0]}"`;else if(a.length>1)l=` or aliases ${a.map((m)=>`"${m}"`).join(", ")}`;super(`Configuration "${e}"${l} not found`,{configName:e,alias:r,searchPaths:t,searchPathCount:t.length})}}class Ud extends Kn{code="CONFIG_LOAD_ERROR";constructor(e,t,r){super(`Failed to load configuration from "${e}": ${t.message}`,{configPath:e,configName:r,originalError:t.name,originalMessage:t.message});this.cause=t}}class Pv extends Kn{code="CONFIG_VALIDATION_ERROR";constructor(e,t,r){super(`Configuration validation failed for "${e}"`,{configPath:e,configName:r,validationErrors:t,errorCount:t.length})}}class _v extends Kn{code="CONFIG_MERGE_ERROR";constructor(e,t,r,a){super(`Failed to merge configuration from "${e}" with "${t}": ${r.message}`,{sourcePath:e,targetPath:t,configName:a,originalError:r.name,originalMessage:r.message});this.cause=r}}class Pg extends Kn{code="ENV_VAR_ERROR";constructor(e,t,r,a){super(`Failed to parse environment variable "${e}" with value "${t}" as ${r}`,{envKey:e,envValue:t,expectedType:r,configName:a})}}class Tv extends Kn{code="FILE_SYSTEM_ERROR";constructor(e,t,r){super(`File system ${e} failed for "${t}": ${r.message}`,{operation:e,path:t,originalError:r.name,originalMessage:r.message});this.cause=r}}class xv extends Kn{code="TYPE_GENERATION_ERROR";constructor(e,t,r){super(`Failed to generate types from "${e}" to "${t}": ${r.message}`,{configDir:e,outputPath:t,originalError:r.name,originalMessage:r.message});this.cause=r}}class Vd extends Kn{code="SCHEMA_VALIDATION_ERROR";constructor(e,t,r){super(`Schema validation failed${r?` for config "${r}"`:""}`,{schemaPath:e,configName:r,validationErrors:t,errorCount:t.length})}}class Dv extends Kn{code="BROWSER_CONFIG_ERROR";constructor(e,t,r,a){super(`Failed to fetch configuration from "${e}": ${t} ${r}`,{endpoint:e,status:t,statusText:r,configName:a})}}class Ov extends Kn{code="PLUGIN_ERROR";constructor(e,t,r){super(`Plugin "${e}" failed during ${t}: ${r.message}`,{pluginName:e,operation:t,originalError:r.name,originalMessage:r.message});this.cause=r}}var as={configNotFound(e,t,r){return new Cv(e,t,r)},configLoad(e,t,r){return new Ud(e,t,r)},configValidation(e,t,r){return new Pv(e,t,r)},configMerge(e,t,r,a){return new _v(e,t,r,a)},envVar(e,t,r,a){return new Pg(e,t,r,a)},fileSystem(e,t,r){return new Tv(e,t,r)},typeGeneration(e,t,r){return new xv(e,t,r)},schemaValidation(e,t,r){return new Vd(e,t,r)},browserConfig(e,t,r,a){return new Dv(e,t,r,a)},plugin(e,t,r){return new Ov(e,t,r)}};async function yA(e,t={}){let{maxRetries:r=3,retryDelay:a=1000,isRetryable:l=()=>!0,fallback:m}=t,h=Error("Unknown error occurred");for(let S=0;S<=r;S++)try{return await e()}catch(R){if(h=R instanceof Error?R:Error(String(R)),S===r||!l(h))break;if(a>0)await new Promise((y)=>setTimeout(y,a))}if(m!==void 0)return m;throw h instanceof Error?h:Error(`Unknown error: ${String(h)}`)}class _g{defaultParsers;constructor(){this.defaultParsers=[{name:"boolean",canParse:(e,t)=>t==="boolean"||["true","false","1","0","yes","no"].includes(e.toLowerCase()),parse:(e)=>{let t=e.toLowerCase();return["true","1","yes"].includes(t)}},{name:"number",canParse:(e,t)=>t==="number"||!Number.isNaN(Number(e))&&!Number.isNaN(Number.parseFloat(e)),parse:(e)=>{let t=Number(e);if(Number.isNaN(t))throw TypeError(`Cannot parse "${e}" as number`);return t}},{name:"array",canParse:(e,t)=>t==="array"||e.startsWith("[")||e.includes(","),parse:(e)=>{try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e.split(",").map((t)=>t.trim())}},{name:"json",canParse:(e,t)=>t==="object"||(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]")),parse:(e)=>{try{return JSON.parse(e)}catch(t){throw Error(`Cannot parse "${e}" as JSON: ${t}`)}}}]}async applyEnvironmentVariables(e,t,r={}){let{prefix:a,useCamelCase:l=!0,useBackwardCompatibility:m=!0,customParsers:h={},verbose:S=!1,trackPerformance:R=!0}=r,y=async()=>{if(!e)return{config:t,source:{type:"environment",priority:50,timestamp:new Date}};let C=a||this.generateEnvPrefix(e),T={...t};return this.processObject(T,[],C,{useCamelCase:l,useBackwardCompatibility:m,customParsers:h,verbose:S,configName:e}),{config:T,source:{type:"environment",priority:50,timestamp:new Date}}};if(R)return Sg.track("applyEnvironmentVariables",y,{configName:e});return y()}generateEnvPrefix(e){return e.toUpperCase().replace(/-/g,"_")}formatEnvKey(e,t){if(!t)return e.toUpperCase();return e.replace(/([A-Z])/g,"_$1").toUpperCase()}processObject(e,t,r,a){for(let[l,m]of Object.entries(e)){let h=[...t,l],S=h.map((C)=>this.formatEnvKey(C,a.useCamelCase)),R=`${r}_${S.join("_")}`,y=a.useBackwardCompatibility?`${r}_${h.map((C)=>C.toUpperCase()).join("_")}`:null;if(a.verbose);if(typeof m==="object"&&m!==null&&!Array.isArray(m))this.processObject(m,h,r,a);else{let C=hd.env[R]||(y?hd.env[y]:void 0);if(C!==void 0){if(a.verbose){let T=hd.env[R]?R:y}try{e[l]=this.parseEnvironmentValue(C,typeof m,R,a.customParsers,a.configName)}catch(T){if(T instanceof Pg)throw T;throw as.envVar(R,C,typeof m,a.configName)}}}}}parseEnvironmentValue(e,t,r,a,l){for(let[m,h]of Object.entries(a))try{return h(e)}catch{continue}for(let m of this.defaultParsers)if(m.canParse(e,t))try{return m.parse(e)}catch{throw as.envVar(r,e,`${t} (via ${m.name} parser)`,l)}return e}getEnvironmentVariables(e){let t={},r=e.toUpperCase();for(let[a,l]of Object.entries(hd.env))if(a.startsWith(r)&&l!==void 0)t[a]=l;return t}validateEnvironmentVariable(e,t,r){let a=[];if(!/^[A-Z_][A-Z0-9_]*$/.test(e))a.push(`Environment variable key "${e}" should only contain uppercase letters, numbers, and underscores`);if(r)try{this.parseEnvironmentValue(e,t,r,{})}catch(l){a.push(`Cannot parse value "${t}" as ${r}: ${l}`)}return{isValid:a.length===0,errors:a}}generateEnvVarDocs(e,t,r={}){let{prefix:a,format:l="text"}=r,m=a||this.generateEnvPrefix(e),h=[];switch(this.extractEnvVarInfo(t,[],m,h),l){case"markdown":return this.formatAsMarkdown(h,e);case"json":return JSON.stringify(h,null,2);default:return this.formatAsText(h,e)}}extractEnvVarInfo(e,t,r,a){for(let[l,m]of Object.entries(e)){let h=[...t,l],S=`${r}_${h.map((R)=>this.formatEnvKey(R,!0)).join("_")}`;if(typeof m==="object"&&m!==null&&!Array.isArray(m))this.extractEnvVarInfo(m,h,r,a);else a.push({key:S,type:Array.isArray(m)?"array":typeof m,description:`Configuration for ${h.join(".")}`,example:this.generateExample(m)})}}generateExample(e){if(Array.isArray(e))return JSON.stringify(e);if(typeof e==="object"&&e!==null)return JSON.stringify(e);return String(e)}formatAsText(e,t){let r=`Environment Variables for ${t}:
|
|
150
150
|
|
|
151
151
|
`;for(let a of e)r+=`${a.key}
|
|
152
152
|
`,r+=` Type: ${a.type}
|
|
@@ -158,7 +158,7 @@ export type ConfigOf = Config
|
|
|
158
158
|
`;r+=`| Variable | Type | Description | Example |
|
|
159
159
|
`,r+=`|----------|------|-------------|----------|
|
|
160
160
|
`;for(let a of e)r+=`| \`${a.key}\` | ${a.type} | ${a.description} | \`${a.example}\` |
|
|
161
|
-
`;return r}}function vA(e,t,r={}){return $v(e,t,r,new WeakMap)}function $v(e,t,r,a){let{arrayMergeMode:l="replace",skipNullish:m=!1,customMerger:h}=r;if(t===null||t===void 0)return m?e:t;if(h){let S=h(e,t);if(S!==void 0)return S}if(Array.isArray(t)||Array.isArray(e))return Nv(e,t,l,a);if(!Bn(t)||!Bn(e))return t;return kA(e,t,r,a)}function Nv(e,t,r,a){if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(e)&&!Array.isArray(t))return t;if(Array.isArray(t)&&Array.isArray(e))switch(r){case"replace":return t;case"concat":return bA(e,t);case"smart":return SA(e,t,a);default:return t}return t}function bA(e,t){let r=[...t];for(let a of e)if(!r.some((l)=>bg(l,a)))r.push(a);return r}function SA(e,t,r){if(t.length===0)return e;if(e.length===0)return t;if(Bn(t[0])&&Bn(e[0]))return wA(e,t,r);if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let l of e)if(!a.includes(l))a.push(l);return a}return t}function wA(e,t,r){let a=[...t];for(let l of e){if(!Bn(l)){a.push(l);continue}let m=["id","name","key","path","type"],h=!1;for(let S of m)if(S in l){if(a.find((y)=>Bn(y)&&(S in y)&&y[S]===l[S])){h=!0;break}}if(!h)a.push(l)}return a}function kA(e,t,r,a){let l=t;if(Bn(l)&&a.has(l))return a.get(l);let m={...e};if(Bn(l))a.set(l,m);for(let h in l){if(!Object.prototype.hasOwnProperty.call(l,h))continue;let S=l[h],R=m[h];if(r.skipNullish&&(S===null||S===void 0))continue;if(S===null||S===void 0){m[h]=S;continue}if(Bn(S)&&Bn(R))m[h]=$v(R,S,r,a);else if(Array.isArray(S)||Array.isArray(R))m[h]=Nv(R,S,r.arrayMergeMode||"smart",a);else m[h]=S}return m}function jv(e,t,r="replace"){return vA(e,t,{arrayMergeMode:r==="replace"?"replace":"smart",skipNullish:!0})}function bg(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!bg(e[r],t[r]))return!1;return!0}if(Bn(e)&&Bn(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let l of r){if(!Object.prototype.hasOwnProperty.call(t,l))return!1;if(!bg(e[l],t[l]))return!1}return!0}return!1}function Bn(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}class Bv{extensions=iv;async loadFromPath(e,t,r={}){let{arrayStrategy:a="replace",useCache:l=!0,cacheTtl:m,trackPerformance:h=!0,verbose:S=!1}=r;if(l){let y=Ed.getWithFileCheck("file",e);if(y){if(S)console.log(`Configuration loaded from cache: ${e}`);return y}}let R=async()=>{if(!yd(e))return null;try{let y=`?t=${Date.now()}`,C=await import(e+y),T=C.default||C,j="default"in C,B=Object.keys(C).length>0;if(!j&&!B)throw new Ud(e,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof T!=="object"||T===null||Array.isArray(T))throw new Ud(e,Error("Configuration must export a valid object"),"unknown");let Y={config:jv(t,T,a),source:{type:"file",path:e,priority:100,timestamp:new Date}};if(l)Ed.setWithFileCheck("file",Y,e,m);return Y}catch(y){throw y instanceof Error?as.configLoad(e,y):as.configLoad(e,Error(String(y)))}};if(h)return Sg.track("loadFromPath",R,{path:e});return R()}async tryLoadFromPaths(e,t,r={}){for(let a of e)try{let l=await this.loadFromPath(a,t,r);if(l)return l}catch(l){if(l instanceof Error&&l.name==="ConfigLoadError")throw l;if(r.verbose)console.warn(`Failed to load config from ${a}:`,l)}return null}generateConfigPaths(e,t,r){return hE({name:e,directory:t,alias:r})}generateNamePatterns(e,t){return ov({name:e,alias:t})}checkFileAccess(e){return yA(async()=>yd(e),{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(e,t,r){let a=[];if(!yd(e))return a;if(t||r){let l=this.generateNamePatterns(t||"",r);for(let m of l)for(let h of this.extensions){let S=tv(e,`${m}${h}`);if(await this.checkFileAccess(S))a.push(S)}}else try{let{readdirSync:l}=await import("fs"),m=l(e);for(let h of m)if(this.looksLikeConfigFile(h)){let S=tv(e,h);if(await this.checkFileAccess(S))a.push(S)}}catch{return[]}return a}looksLikeConfigFile(e){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((r)=>r.test(e))}async validateConfigFile(e){let t=[];try{if(!yd(e))return t.push("Configuration file does not exist"),t;let r=await import(e),a=r.default||r;if(a===void 0)t.push("Configuration file must export a default value or named exports");else if(typeof a!=="object"||a===null)t.push("Configuration must be an object");else if(Array.isArray(a))t.push("Configuration cannot be an array at the root level");if(e.endsWith(".json"))try{let{readFileSync:l}=await import("fs"),m=l(e,"utf8");JSON.parse(m)}catch(l){t.push(`Invalid JSON syntax: ${l}`)}}catch(r){t.push(`Failed to load configuration file: ${r}`)}return t}async getFileModificationTime(e){try{let{statSync:t}=await import("fs");return t(e).mtime}catch{return null}}async preloadConfigurations(e,t={}){let r=new Map;return await Promise.allSettled(e.map(async(a)=>{try{let l=await this.loadFromPath(a,{},t);if(l)r.set(a,l.config)}catch(l){if(t.verbose)console.warn(`Failed to preload ${a}:`,l)}})),r}}var EA=/^https?:\/\//;class Mv{async validateConfiguration(e,t,r={}){let{stopOnFirstError:a=!1,validateRequired:l=!0,validateTypes:m=!0,customRules:h=[],trackPerformance:S=!0,verbose:R=!1}=r,y=async()=>{let C=[],T=[],j={stopOnFirstError:a,validateRequired:l,validateTypes:m,customRules:h,trackPerformance:S,verbose:R};try{if(typeof t==="string")return await this.validateWithSchemaFile(e,t,j);else if(Array.isArray(t))return this.validateWithRules(e,[...t,...h],j);else return this.validateWithJSONSchema(e,t,j)}catch(B){return C.push({path:"",message:`Validation failed: ${B}`,rule:"system"}),{isValid:!1,errors:C,warnings:T}}};if(S)return await Sg.track("validateConfiguration",y);return y()}async validateWithSchemaFile(e,t,r){try{if(!IA(t))throw new Vd(t,[{path:"",message:"Schema file does not exist"}]);let a=await import(t),l=a.default||a;if(Array.isArray(l))return this.validateWithRules(e,l,r);else return this.validateWithJSONSchema(e,l,r)}catch(a){throw new Vd(t,[{path:"",message:`Failed to load schema: ${a}`}])}}validateWithJSONSchema(e,t,r){let a=[],l=[];return this.validateObjectAgainstSchema(e,t,"",a,l,r),{isValid:a.length===0,errors:a,warnings:l}}validateObjectAgainstSchema(e,t,r,a,l,m){if(m.validateTypes&&t.type){let h=Array.isArray(e)?"array":typeof e,S=Array.isArray(t.type)?t.type:[t.type];if(!S.includes(h)){if(a.push({path:r,message:`Expected type ${S.join(" or ")}, got ${h}`,expected:S.join(" or "),actual:h,rule:"type"}),m.stopOnFirstError)return}}if(t.enum&&!t.enum.includes(e)){if(a.push({path:r,message:`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"}),m.stopOnFirstError)return}if(typeof e==="string"){if(t.minLength!==void 0&&e.length<t.minLength)a.push({path:r,message:`String length must be at least ${t.minLength}`,expected:`>= ${t.minLength}`,actual:e.length,rule:"minLength"});if(t.maxLength!==void 0&&e.length>t.maxLength)a.push({path:r,message:`String length must not exceed ${t.maxLength}`,expected:`<= ${t.maxLength}`,actual:e.length,rule:"maxLength"});if(t.pattern){if(!new RegExp(t.pattern).test(e))a.push({path:r,message:`String does not match pattern ${t.pattern}`,expected:t.pattern,actual:e,rule:"pattern"})}}if(typeof e==="number"){if(t.minimum!==void 0&&e<t.minimum)a.push({path:r,message:`Value must be at least ${t.minimum}`,expected:`>= ${t.minimum}`,actual:e,rule:"minimum"});if(t.maximum!==void 0&&e>t.maximum)a.push({path:r,message:`Value must not exceed ${t.maximum}`,expected:`<= ${t.maximum}`,actual:e,rule:"maximum"})}if(Array.isArray(e)&&t.items)for(let h=0;h<e.length;h++){let S=r?`${r}[${h}]`:`[${h}]`;if(this.validateObjectAgainstSchema(e[h],t.items,S,a,l,m),m.stopOnFirstError&&a.length>0)return}if(e&&typeof e==="object"&&!Array.isArray(e)){let h=e;if(m.validateRequired&&t.required){for(let S of t.required)if(!(S in h)){if(a.push({path:r?`${r}.${S}`:S,message:`Missing required property '${S}'`,expected:"required",rule:"required"}),m.stopOnFirstError)return}}if(t.properties){for(let[S,R]of Object.entries(t.properties))if(S in h){let y=r?`${r}.${S}`:S;if(this.validateObjectAgainstSchema(h[S],R,y,a,l,m),m.stopOnFirstError&&a.length>0)return}}if(t.additionalProperties===!1){let S=new Set(Object.keys(t.properties||{}));for(let R of Object.keys(h))if(!S.has(R))l.push({path:r?`${r}.${R}`:R,message:`Additional property '${R}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(e,t,r){let a=[],l=[];for(let m of t)try{let h=this.getValueByPath(e,m.path),S=this.validateWithRule(h,m,m.path);if(a.push(...S),r.stopOnFirstError&&a.length>0)break}catch(h){a.push({path:m.path,message:`Rule validation failed: ${h}`,rule:"system"})}return{isValid:a.length===0,errors:a,warnings:l}}validateWithRule(e,t,r){let a=[];if(t.required&&(e===void 0||e===null))return a.push({path:r,message:t.message||`Property '${r}' is required`,expected:"required",rule:"required"}),a;if(e===void 0||e===null)return a;if(t.type){let l=Array.isArray(e)?"array":typeof e;if(l!==t.type)a.push({path:r,message:t.message||`Expected type ${t.type}, got ${l}`,expected:t.type,actual:l,rule:"type"})}if(t.min!==void 0){let l=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(l<t.min)a.push({path:r,message:t.message||`Value must be at least ${t.min}`,expected:`>= ${t.min}`,actual:l,rule:"min"})}if(t.max!==void 0){let l=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(l>t.max)a.push({path:r,message:t.message||`Value must not exceed ${t.max}`,expected:`<= ${t.max}`,actual:l,rule:"max"})}if(t.pattern&&typeof e==="string"){if(!t.pattern.test(e))a.push({path:r,message:t.message||`Value does not match pattern ${t.pattern}`,expected:t.pattern.toString(),actual:e,rule:"pattern"})}if(t.enum&&!t.enum.includes(e))a.push({path:r,message:t.message||`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"});if(t.validator){let l=t.validator(e);if(l)a.push({path:r,message:t.message||l,rule:"custom"})}return a}getValueByPath(e,t){if(!t)return e;let r=t.split("."),a=e;for(let l of r)if(a&&typeof a==="object"&&l in a)a=a[l];else return;return a}generateRulesFromInterface(e){let t=[],r=e.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let a of r){let[,l,m,h]=a;t.push({path:l,required:!m,type:this.mapTypeScriptType(h)})}return t}mapTypeScriptType(e){switch(e.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:EA},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}var Wn=new Qd("bunfig",{showTags:!0});function RA(e){if(!e)return"";let t=Array.isArray(e)?e.filter(Boolean):[e];if(t.length===0)return"";if(t.length===1)return` or alias "${t[0]}"`;return` or aliases ${t.map((r)=>`"${r}"`).join(", ")}`}class Lv{fileLoader=new Bv;envProcessor=new _g;validator=new Mv;async loadConfig(e){let t=Date.now(),{cache:r,performance:a,schema:l,validate:m,...h}=e;try{if(r?.enabled){let R=this.checkCache(h.name||"",h);if(R)return R}let S;try{S=await this.loadConfigurationStrategies(h,!0,r)}catch(R){if(h.configFile)throw R;let y=h.__strictErrorHandling;if(R instanceof Error&&R.name==="ConfigNotFoundError"){if(y)throw R;S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`No configuration file found for "${h.name||"config"}", using defaults with environment variables`]}}else if(R instanceof Error&&R.name==="ConfigLoadError"){let C=R.message.includes("EACCES")||R.message.includes("EPERM")||R.message.includes("permission denied"),T=!C&&(R.message.includes("syntax")||R.message.includes("Expected")||R.message.includes("Unexpected")||R.message.includes("BuildMessage")||R.message.includes("errors building")),j=R.message.includes("Configuration must export a valid object")||R.message.includes("Configuration file is empty and exports nothing");if(y&&(j||C))throw R;if(T&&(!y||!j))S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!y)S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading error, using defaults: ${R.message}`]};else throw R}else S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${R instanceof Error?R.message:String(R)}`]}}if(l||m)await this.validateConfiguration(S.config,l,m,h.name);if(r?.enabled&&S)this.cacheResult(h.name||"",S,r,h);if(a?.enabled){let R={operation:"loadConfig",duration:Date.now()-t,configName:h.name,timestamp:new Date};if(a.onMetrics)a.onMetrics(R);if(a.slowThreshold&&R.duration>a.slowThreshold)Wn.warn(`Slow configuration loading detected: ${R.duration}ms for ${h.name}`);S.metrics=R}return S}catch(S){if(S instanceof Error&&S.name==="ConfigNotFoundError")throw S;let R=Date.now()-t;throw Wn.error(`Configuration loading failed after ${R}ms:`,[S instanceof Error?S:Error(String(S))]),S}}async loadConfigurationStrategies(e,t=!1,r){let{name:a="",alias:l,configFile:m,cwd:h,configDir:S,defaultConfig:R,checkEnv:y=!0,arrayStrategy:C="replace",verbose:T=!1}=e,j=h||Wd.cwd(),B=[];if(m){let le=ti(j,m);B.push(le);let X=y?ac(a,R,T):R,ce=await this.fileLoader.tryLoadFromPaths([le],X,{arrayStrategy:C,verbose:T,cacheTtl:r?.ttl,useCache:!r?.ttl||r.ttl>100});if(!ce)throw as.configNotFound(a||m,B,l);if(T)Wn.success(`Configuration loaded from explicit path: ${le}`);return this.finalizeResult(ce,B,y,a,T)}let V=await this.loadLocalConfiguration(a,l,j,S,R,C,T,y,r);if(V)return B.push(...this.getLocalSearchPaths(a,l,j,S)),this.finalizeResult(V,B,y,a,T);let W=await this.loadHomeConfiguration(a,l,R,C,T,y);if(W)return B.push(...this.getHomeSearchPaths(a,l)),this.finalizeResult(W,B,y,a,T);let Y=await this.loadPackageJsonConfiguration(a,l,j,R,C,T,y);if(Y)return B.push(ti(j,"package.json")),this.finalizeResult(Y,B,y,a,T);if(B.push(...this.getAllSearchPaths(a,l,j,S)),t)throw as.configNotFound(a,B,l);return{...await this.applyEnvironmentVariables(a,R,y,T),warnings:[`No configuration file found for "${a}"${RA(l)}, using defaults with environment variables`]}}async loadLocalConfiguration(e,t,r,a,l,m,h,S,R){let y=S?ac(e,l,h):l,C=this.getLocalDirectories(r,a);for(let T of C){if(h)Wn.info(`Searching for configuration in: ${T}`);let j=this.fileLoader.generateConfigPaths(e,T,t),B=await this.fileLoader.tryLoadFromPaths(j,y,{arrayStrategy:m,verbose:h,cacheTtl:R?.ttl,useCache:!R?.ttl||R.ttl>100});if(B){if(h)Wn.success(`Configuration loaded from: ${B.source.path}`);return B}}return null}async loadHomeConfiguration(e,t,r,a,l,m){if(!e)return null;let h=m?ac(e,r,l):r,S=[ti(Bs(),".config",e),ti(Bs(),".config"),Bs()];for(let R of S){if(l)Wn.info(`Checking home directory: ${R}`);let y=this.fileLoader.generateConfigPaths(e,R,t),C=await this.fileLoader.tryLoadFromPaths(y,h,{arrayStrategy:a,verbose:l});if(C){if(l)Wn.success(`Configuration loaded from home directory: ${C.source.path}`);return C}}return null}async loadPackageJsonConfiguration(e,t,r,a,l,m,h){let S=h?ac(e,a,m):a;try{let R=ti(r,"package.json");if(!vE(R))return null;let y={};try{y=JSON.parse(bE(R,"utf8"))}catch(j){if(m)Wn.warn("Failed to parse package.json:",[j instanceof Error?j:Error(String(j))]);return null}let C=y[e],T=e;if(!C&&t){let j=Array.isArray(t)?t:[t];for(let B of j){if(!B)continue;if(y[B]){C=y[B],T=B;break}}}if(C&&typeof C==="object"&&!Array.isArray(C)){if(m)Wn.success(`Configuration loaded from package.json: ${T}`);return{config:jv(S,C,l),source:{type:"package.json",path:R,priority:30,timestamp:new Date}}}}catch(R){if(m)Wn.warn("Failed to load package.json:",[R instanceof Error?R:Error(String(R))])}return null}async applyEnvironmentVariables(e,t,r,a){if(!r||!e||typeof t!=="object"||t===null||Array.isArray(t))return{config:t,source:{type:"default",priority:10,timestamp:new Date}};return{config:ac(e,t,a),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(e,t,r,a,l){return{config:e.config,source:e.source,path:e.source.path}}async validateConfiguration(e,t,r,a){let l=[];if(r){let m=r(e);if(m)l.push(...m)}if(t){let m=await this.validator.validateConfiguration(e,t);if(!m.isValid)l.push(...m.errors.map((h)=>h.path?`${h.path}: ${h.message}`:h.message))}if(l.length>0)throw as.configValidation(a||"unknown",l,a)}checkCache(e,t){let r=this.generateCacheKey(e,t);return Ed.get(r)||null}cacheResult(e,t,r,a){let l=this.generateCacheKey(e,a);Ed.set(l,t,void 0,r.ttl)}generateCacheKey(e,t){let r=[e];if(t.alias){let a=Array.isArray(t.alias)?t.alias.join(","):t.alias;r.push(`alias:${a}`)}if(t.cwd)r.push(`cwd:${t.cwd}`);if(t.configFile)r.push(`configFile:${t.configFile}`);if(t.configDir)r.push(`configDir:${t.configDir}`);if("checkEnv"in t)r.push(`checkEnv:${t.checkEnv}`);return r.join("|")}getLocalDirectories(e,t){return yE({cwd:e,configDir:t})}getAllSearchPaths(e,t,r,a){let l=[];return l.push(...this.getLocalSearchPaths(e,t,r,a)),l.push(...this.getHomeSearchPaths(e,t)),l.push(ti(r,"package.json")),l}getLocalSearchPaths(e,t,r,a){let l=this.getLocalDirectories(r,a),m=[];for(let h of l)m.push(...this.fileLoader.generateConfigPaths(e,h,t));return m}getHomeSearchPaths(e,t){if(!e)return[];let r=[ti(Bs(),".config",e),ti(Bs(),".config"),Bs()],a=[];for(let l of r)a.push(...this.fileLoader.generateConfigPaths(e,l,t));return a}async loadConfigWithResult(e){return this.loadConfig(e)}}var ag=new Lv;async function Fv(e){let t="defaultConfig"in e&&e.defaultConfig!==void 0?e.defaultConfig:{},r="cache"in e||"performance"in e||"schema"in e||"validate"in e;try{let a;if(r)a=await ag.loadConfig(e);else a=await ag.loadConfig({...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}});return a?.config??t}catch(a){if(e.configFile)throw a;let l=a instanceof Error?a.name:"UnknownError",m=a instanceof Error?a.message:String(a);if(!(l==="ConfigNotFoundError"||l==="ConfigLoadError"||l==="ConfigValidationError"||m.includes("config"))&&e.verbose)Wn.warn("Unexpected error loading config, using defaults:",[a instanceof Error?a:Error(String(a))]);let S=r?{...e,defaultConfig:t}:{...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in e?e.checkEnv!==!1:!0)return(await ag.applyEnvironmentVariables(S.name||"",t,!0,S.verbose||!1))?.config??t;return t}}function ac(e,t,r=!1){let a=new _g,l=e.toUpperCase().replace(/[^A-Z0-9]/g,"_");function m(h,S=[]){let R={...h};for(let[y,C]of Object.entries(h)){let T=[...S,y],j=[`${l}_${T.join("_").toUpperCase()}`,`${l}_${T.map((W)=>W.toUpperCase()).join("")}`,`${l}_${T.map((W)=>W.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],B,V;for(let W of j)if(B=Wd.env[W],B!==void 0){V=W;break}if(B!==void 0&&V)if(typeof C==="boolean")R[y]=["true","1","yes"].includes(B.toLowerCase());else if(typeof C==="number"){let W=Number(B);if(!Number.isNaN(W))R[y]=W}else if(Array.isArray(C))try{R[y]=JSON.parse(B)}catch{R[y]=B.split(",").map((W)=>W.trim())}else R[y]=B;else if(C&&typeof C==="object"&&!Array.isArray(C))R[y]=m(C,T)}return R}return m(t)}var JN=ti(Wd.cwd(),"config"),GN=ti(Wd.cwd(),"src/generated");var _o={project:{name:"my-project",slug:"my-project",region:"us-east-1"},environments:{production:{type:"production"}}},us=null;function PA(e){return e.project?.slug===_o.project?.slug&&Object.keys(e.environments??{}).length===1&&!!e.environments?.production}async function _A(){let e=[zv(process.cwd(),"config","cloud.ts"),zv(process.cwd(),"config","cloud.js")];for(let t of e){if(!AA(t))continue;let r=await import(`${CA(t).href}?t=${Date.now()}`),a=r.tsCloud??r.default?.tsCloud??r.default??r.cloud??r.config;if(a)return a}return null}async function Vm(){if(!us){if(us=await Fv({name:"cloud",defaultConfig:_o}),PA(us))us=await _A()??us;bd(us.stateDir)}return us}var sl=Vm,fy=_o;var mo=(e)=>e==null?void 0:String(e),xg=(e)=>Number(e)===1,qv=(e,t)=>{try{return e==null?t:JSON.parse(String(e))}catch{return t}};function Tg(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),scope:{type:String(e.scope_type),id:String(e.scope_id),environmentId:mo(e.environment_id),resourceId:mo(e.resource_id),previewId:mo(e.preview_id)},key:String(e.key),kind:String(e.kind),value:mo(e.value),valueFingerprint:String(e.value_fingerprint),secretRef:mo(e.secret_ref),backend:String(e.backend),backendVersion:mo(e.backend_version),origin:String(e.origin),required:xg(e.required),metadata:qv(e.metadata,{}),lastUsedAt:mo(e.last_used_at),rotatedAt:mo(e.rotated_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Uv(e){return{entryId:String(e.entry_id),resourceId:String(e.resource_id),injectionTarget:String(e.injection_target),required:xg(e.required),requiresRedeploy:xg(e.requires_redeploy),lastDeployedVersion:e.last_deployed_version==null?void 0:Number(e.last_deployed_version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Ba{controlPlane;now;constructor(e,t=()=>new Date){this.controlPlane=e;this.now=t}get(e){let t=this.controlPlane.database.query("SELECT * FROM configuration_entries WHERE id=?").get(e);return t?Tg(t):void 0}find(e,t,r){let a=this.controlPlane.database.query("SELECT * FROM configuration_entries WHERE project_id=? AND scope_type=? AND scope_id=? AND key=?").get(e,t.type,t.id,r);return a?Tg(a):void 0}list(e){let t=["project_id=?"],r=[e.projectId];if(e.scope)t.push("scope_type=?","scope_id=?"),r.push(e.scope.type,e.scope.id);if(e.kind)t.push("kind=?"),r.push(e.kind);return this.controlPlane.database.query(`SELECT * FROM configuration_entries WHERE ${t.join(" AND ")} ORDER BY key,scope_type,scope_id`).all(...r).map(Tg)}create(e){this.validateScope(e),this.validateEntry(e);let t=crypto.randomUUID(),r=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO configuration_entries (id,organization_id,project_id,scope_type,scope_id,environment_id,resource_id,preview_id,key,kind,value,value_fingerprint,secret_ref,backend,backend_version,origin,required,metadata,last_used_at,rotated_at,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.scope.type,e.scope.id,e.scope.environmentId??null,e.scope.resourceId??null,e.scope.previewId??null,e.key,e.kind,e.value??null,e.valueFingerprint,e.secretRef??null,e.backend,e.backendVersion??null,e.origin,e.required?1:0,JSON.stringify(e.metadata),e.lastUsedAt??null,e.rotatedAt??null,1,r,r]),this.get(t)}update(e,t,r){let a=this.get(e);if(!a)throw Error("Configuration entry was not found.");if(this.validateEntry({...a,...r}),this.controlPlane.database.run("UPDATE configuration_entries SET value=?,value_fingerprint=?,secret_ref=?,backend=?,backend_version=?,required=?,metadata=?,rotated_at=?,version=version+1,updated_at=? WHERE id=? AND version=?",[r.value??null,r.valueFingerprint,r.secretRef??null,r.backend,r.backendVersion??null,r.required?1:0,JSON.stringify(r.metadata),r.rotatedAt??null,this.now().toISOString(),e,t]).changes!==1)throw Error("Configuration entry changed; refresh and retry.");return this.get(e)}remove(e,t){let r=this.get(e);if(!r)throw Error("Configuration entry was not found.");if(r.version!==t)throw Error("Configuration entry changed; refresh and retry.");if(this.controlPlane.database.run("DELETE FROM configuration_entries WHERE id=? AND version=?",[e,t]).changes<1)throw Error("Configuration entry changed; refresh and retry.");return r}setDependency(e){let t=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO configuration_dependencies (entry_id,resource_id,injection_target,required,requires_redeploy,last_deployed_version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?) ON CONFLICT(entry_id,resource_id) DO UPDATE SET injection_target=excluded.injection_target,required=excluded.required,requires_redeploy=excluded.requires_redeploy,last_deployed_version=excluded.last_deployed_version,updated_at=excluded.updated_at",[e.entryId,e.resourceId,e.injectionTarget,e.required?1:0,e.requiresRedeploy?1:0,e.lastDeployedVersion??null,t,t]),this.dependencies(e.entryId).find((r)=>r.resourceId===e.resourceId)}dependencies(e){return this.controlPlane.database.query("SELECT * FROM configuration_dependencies WHERE entry_id=? ORDER BY resource_id").all(e).map(Uv)}dependenciesForResource(e){return this.controlPlane.database.query("SELECT * FROM configuration_dependencies WHERE resource_id=? ORDER BY entry_id").all(e).map(Uv)}mutation(e){let t=this.controlPlane.database.query("SELECT request_hash,result FROM configuration_mutations WHERE idempotency_key=?").get(e);return t?{requestHash:t.request_hash,result:qv(t.result,{})}:void 0}recordMutation(e){this.controlPlane.database.run("INSERT INTO configuration_mutations (id,project_id,idempotency_key,request_hash,result,actor_id,created_at) VALUES (?,?,?,?,?,?,?)",[crypto.randomUUID(),e.projectId,e.idempotencyKey,e.requestHash,JSON.stringify(e.result),e.actorId??null,this.now().toISOString()])}validateEntry(e){if(!/^[A-Za-z_][A-Za-z0-9_]{0,255}$/.test(e.key))throw Error(`Invalid configuration key: ${e.key}`);if(e.kind==="variable"&&(e.value==null||e.secretRef||e.backend!=="plaintext"))throw Error("Variables require a plaintext value and cannot use a secret backend.");if(e.kind==="secret"&&(e.value!=null||!e.secretRef||e.backend==="plaintext"))throw Error("Secrets require a non-plaintext backend reference and cannot store a plaintext value.")}validateScope(e){let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Configuration project does not belong to the organization.");let r=e.scope;if(r.type==="project"){if(r.id!==e.projectId||r.environmentId||r.resourceId||r.previewId)throw Error("Project configuration scope must reference only its project.");return}if(r.type==="environment"){let l=this.controlPlane.database.query("SELECT project_id FROM environments WHERE id=?").get(r.id);if(!l||l.project_id!==e.projectId||r.environmentId&&r.environmentId!==r.id||r.resourceId||r.previewId)throw Error("Environment configuration scope does not belong to the project.");return}if(r.type==="service"||r.type==="function"){let l=this.controlPlane.getResource(r.id);if(!l||l.projectId!==e.projectId||r.type==="function"&&l.kind!=="function"||r.resourceId&&r.resourceId!==r.id||r.environmentId&&l.environmentId!==r.environmentId||r.previewId)throw Error(`${r.type==="function"?"Function":"Service"} configuration scope does not belong to the project.`);return}let a=this.controlPlane.database.query("SELECT project_id,base_environment_id,resource_id FROM preview_instances WHERE id=?").get(r.id);if(!a||a.project_id!==e.projectId||r.previewId&&r.previewId!==r.id||r.environmentId&&r.environmentId!==a.base_environment_id||r.resourceId&&r.resourceId!==a.resource_id)throw Error("Preview configuration scope does not belong to the project.")}}var Vv=/^[A-Za-z_][A-Za-z0-9_]{0,255}$/;function TA(e){let t={n:`
|
|
161
|
+
`;return r}}function vA(e,t,r={}){return $v(e,t,r,new WeakMap)}function $v(e,t,r,a){let{arrayMergeMode:l="replace",skipNullish:m=!1,customMerger:h}=r;if(t===null||t===void 0)return m?e:t;if(h){let S=h(e,t);if(S!==void 0)return S}if(Array.isArray(t)||Array.isArray(e))return Nv(e,t,l,a);if(!Bn(t)||!Bn(e))return t;return kA(e,t,r,a)}function Nv(e,t,r,a){if(Array.isArray(t)&&!Array.isArray(e))return t;if(Array.isArray(e)&&!Array.isArray(t))return t;if(Array.isArray(t)&&Array.isArray(e))switch(r){case"replace":return t;case"concat":return bA(e,t);case"smart":return SA(e,t,a);default:return t}return t}function bA(e,t){let r=[...t];for(let a of e)if(!r.some((l)=>bg(l,a)))r.push(a);return r}function SA(e,t,r){if(t.length===0)return e;if(e.length===0)return t;if(Bn(t[0])&&Bn(e[0]))return wA(e,t,r);if(t.every((a)=>typeof a==="string")&&e.every((a)=>typeof a==="string")){let a=[...t];for(let l of e)if(!a.includes(l))a.push(l);return a}return t}function wA(e,t,r){let a=[...t];for(let l of e){if(!Bn(l)){a.push(l);continue}let m=["id","name","key","path","type"],h=!1;for(let S of m)if(S in l){if(a.find((y)=>Bn(y)&&(S in y)&&y[S]===l[S])){h=!0;break}}if(!h)a.push(l)}return a}function kA(e,t,r,a){let l=t;if(Bn(l)&&a.has(l))return a.get(l);let m={...e};if(Bn(l))a.set(l,m);for(let h in l){if(!Object.prototype.hasOwnProperty.call(l,h))continue;let S=l[h],R=m[h];if(r.skipNullish&&(S===null||S===void 0))continue;if(S===null||S===void 0){m[h]=S;continue}if(Bn(S)&&Bn(R))m[h]=$v(R,S,r,a);else if(Array.isArray(S)||Array.isArray(R))m[h]=Nv(R,S,r.arrayMergeMode||"smart",a);else m[h]=S}return m}function jv(e,t,r="replace"){return vA(e,t,{arrayMergeMode:r==="replace"?"replace":"smart",skipNullish:!0})}function bg(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!bg(e[r],t[r]))return!1;return!0}if(Bn(e)&&Bn(t)){let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(let l of r){if(!Object.prototype.hasOwnProperty.call(t,l))return!1;if(!bg(e[l],t[l]))return!1}return!0}return!1}function Bn(e){return Boolean(e&&typeof e==="object"&&!Array.isArray(e))}class Bv{extensions=iv;async loadFromPath(e,t,r={}){let{arrayStrategy:a="replace",useCache:l=!0,cacheTtl:m,trackPerformance:h=!0,verbose:S=!1}=r;if(l){let y=Ed.getWithFileCheck("file",e);if(y){if(S)console.log(`Configuration loaded from cache: ${e}`);return y}}let R=async()=>{if(!yd(e))return null;try{let y=`?t=${Date.now()}`,C=await import(e+y),T=C.default||C,j="default"in C,B=Object.keys(C).length>0;if(!j&&!B)throw new Ud(e,Error("Configuration file is empty and exports nothing"),"unknown");if(typeof T!=="object"||T===null||Array.isArray(T))throw new Ud(e,Error("Configuration must export a valid object"),"unknown");let Y={config:jv(t,T,a),source:{type:"file",path:e,priority:100,timestamp:new Date}};if(l)Ed.setWithFileCheck("file",Y,e,m);return Y}catch(y){throw y instanceof Error?as.configLoad(e,y):as.configLoad(e,Error(String(y)))}};if(h)return Sg.track("loadFromPath",R,{path:e});return R()}async tryLoadFromPaths(e,t,r={}){for(let a of e)try{let l=await this.loadFromPath(a,t,r);if(l)return l}catch(l){if(l instanceof Error&&l.name==="ConfigLoadError")throw l;if(r.verbose)console.warn(`Failed to load config from ${a}:`,l)}return null}generateConfigPaths(e,t,r){return hE({name:e,directory:t,alias:r})}generateNamePatterns(e,t){return ov({name:e,alias:t})}checkFileAccess(e){return yA(async()=>yd(e),{maxRetries:2,retryDelay:100,fallback:!1})}async discoverConfigFiles(e,t,r){let a=[];if(!yd(e))return a;if(t||r){let l=this.generateNamePatterns(t||"",r);for(let m of l)for(let h of this.extensions){let S=tv(e,`${m}${h}`);if(await this.checkFileAccess(S))a.push(S)}}else try{let{readdirSync:l}=await import("fs"),m=l(e);for(let h of m)if(this.looksLikeConfigFile(h)){let S=tv(e,h);if(await this.checkFileAccess(S))a.push(S)}}catch{return[]}return a}looksLikeConfigFile(e){return[/\.config\.(ts|js|mjs|cjs|json|mts|cts)$/,/^\..*\.(ts|js|mjs|cjs|json|mts|cts)$/,/config\.(ts|js|mjs|cjs|json|mts|cts)$/].some((r)=>r.test(e))}async validateConfigFile(e){let t=[];try{if(!yd(e))return t.push("Configuration file does not exist"),t;let r=await import(e),a=r.default||r;if(a===void 0)t.push("Configuration file must export a default value or named exports");else if(typeof a!=="object"||a===null)t.push("Configuration must be an object");else if(Array.isArray(a))t.push("Configuration cannot be an array at the root level");if(e.endsWith(".json"))try{let{readFileSync:l}=await import("fs"),m=l(e,"utf8");JSON.parse(m)}catch(l){t.push(`Invalid JSON syntax: ${l}`)}}catch(r){t.push(`Failed to load configuration file: ${r}`)}return t}async getFileModificationTime(e){try{let{statSync:t}=await import("fs");return t(e).mtime}catch{return null}}async preloadConfigurations(e,t={}){let r=new Map;return await Promise.allSettled(e.map(async(a)=>{try{let l=await this.loadFromPath(a,{},t);if(l)r.set(a,l.config)}catch(l){if(t.verbose)console.warn(`Failed to preload ${a}:`,l)}})),r}}var EA=/^https?:\/\//;class Mv{async validateConfiguration(e,t,r={}){let{stopOnFirstError:a=!1,validateRequired:l=!0,validateTypes:m=!0,customRules:h=[],trackPerformance:S=!0,verbose:R=!1}=r,y=async()=>{let C=[],T=[],j={stopOnFirstError:a,validateRequired:l,validateTypes:m,customRules:h,trackPerformance:S,verbose:R};try{if(typeof t==="string")return await this.validateWithSchemaFile(e,t,j);else if(Array.isArray(t))return this.validateWithRules(e,[...t,...h],j);else return this.validateWithJSONSchema(e,t,j)}catch(B){return C.push({path:"",message:`Validation failed: ${B}`,rule:"system"}),{isValid:!1,errors:C,warnings:T}}};if(S)return await Sg.track("validateConfiguration",y);return y()}async validateWithSchemaFile(e,t,r){try{if(!IA(t))throw new Vd(t,[{path:"",message:"Schema file does not exist"}]);let a=await import(t),l=a.default||a;if(Array.isArray(l))return this.validateWithRules(e,l,r);else return this.validateWithJSONSchema(e,l,r)}catch(a){throw new Vd(t,[{path:"",message:`Failed to load schema: ${a}`}])}}validateWithJSONSchema(e,t,r){let a=[],l=[];return this.validateObjectAgainstSchema(e,t,"",a,l,r),{isValid:a.length===0,errors:a,warnings:l}}validateObjectAgainstSchema(e,t,r,a,l,m){if(m.validateTypes&&t.type){let h=Array.isArray(e)?"array":typeof e,S=Array.isArray(t.type)?t.type:[t.type];if(!S.includes(h)){if(a.push({path:r,message:`Expected type ${S.join(" or ")}, got ${h}`,expected:S.join(" or "),actual:h,rule:"type"}),m.stopOnFirstError)return}}if(t.enum&&!t.enum.includes(e)){if(a.push({path:r,message:`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"}),m.stopOnFirstError)return}if(typeof e==="string"){if(t.minLength!==void 0&&e.length<t.minLength)a.push({path:r,message:`String length must be at least ${t.minLength}`,expected:`>= ${t.minLength}`,actual:e.length,rule:"minLength"});if(t.maxLength!==void 0&&e.length>t.maxLength)a.push({path:r,message:`String length must not exceed ${t.maxLength}`,expected:`<= ${t.maxLength}`,actual:e.length,rule:"maxLength"});if(t.pattern){if(!new RegExp(t.pattern).test(e))a.push({path:r,message:`String does not match pattern ${t.pattern}`,expected:t.pattern,actual:e,rule:"pattern"})}}if(typeof e==="number"){if(t.minimum!==void 0&&e<t.minimum)a.push({path:r,message:`Value must be at least ${t.minimum}`,expected:`>= ${t.minimum}`,actual:e,rule:"minimum"});if(t.maximum!==void 0&&e>t.maximum)a.push({path:r,message:`Value must not exceed ${t.maximum}`,expected:`<= ${t.maximum}`,actual:e,rule:"maximum"})}if(Array.isArray(e)&&t.items)for(let h=0;h<e.length;h++){let S=r?`${r}[${h}]`:`[${h}]`;if(this.validateObjectAgainstSchema(e[h],t.items,S,a,l,m),m.stopOnFirstError&&a.length>0)return}if(e&&typeof e==="object"&&!Array.isArray(e)){let h=e;if(m.validateRequired&&t.required){for(let S of t.required)if(!(S in h)){if(a.push({path:r?`${r}.${S}`:S,message:`Missing required property '${S}'`,expected:"required",rule:"required"}),m.stopOnFirstError)return}}if(t.properties){for(let[S,R]of Object.entries(t.properties))if(S in h){let y=r?`${r}.${S}`:S;if(this.validateObjectAgainstSchema(h[S],R,y,a,l,m),m.stopOnFirstError&&a.length>0)return}}if(t.additionalProperties===!1){let S=new Set(Object.keys(t.properties||{}));for(let R of Object.keys(h))if(!S.has(R))l.push({path:r?`${r}.${R}`:R,message:`Additional property '${R}' is not allowed`,rule:"additionalProperties"})}}}validateWithRules(e,t,r){let a=[],l=[];for(let m of t)try{let h=this.getValueByPath(e,m.path),S=this.validateWithRule(h,m,m.path);if(a.push(...S),r.stopOnFirstError&&a.length>0)break}catch(h){a.push({path:m.path,message:`Rule validation failed: ${h}`,rule:"system"})}return{isValid:a.length===0,errors:a,warnings:l}}validateWithRule(e,t,r){let a=[];if(t.required&&(e===void 0||e===null))return a.push({path:r,message:t.message||`Property '${r}' is required`,expected:"required",rule:"required"}),a;if(e===void 0||e===null)return a;if(t.type){let l=Array.isArray(e)?"array":typeof e;if(l!==t.type)a.push({path:r,message:t.message||`Expected type ${t.type}, got ${l}`,expected:t.type,actual:l,rule:"type"})}if(t.min!==void 0){let l=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(l<t.min)a.push({path:r,message:t.message||`Value must be at least ${t.min}`,expected:`>= ${t.min}`,actual:l,rule:"min"})}if(t.max!==void 0){let l=Array.isArray(e)?e.length:typeof e==="string"?e.length:typeof e==="number"?e:0;if(l>t.max)a.push({path:r,message:t.message||`Value must not exceed ${t.max}`,expected:`<= ${t.max}`,actual:l,rule:"max"})}if(t.pattern&&typeof e==="string"){if(!t.pattern.test(e))a.push({path:r,message:t.message||`Value does not match pattern ${t.pattern}`,expected:t.pattern.toString(),actual:e,rule:"pattern"})}if(t.enum&&!t.enum.includes(e))a.push({path:r,message:t.message||`Value must be one of: ${t.enum.join(", ")}`,expected:t.enum.join(", "),actual:e,rule:"enum"});if(t.validator){let l=t.validator(e);if(l)a.push({path:r,message:t.message||l,rule:"custom"})}return a}getValueByPath(e,t){if(!t)return e;let r=t.split("."),a=e;for(let l of r)if(a&&typeof a==="object"&&l in a)a=a[l];else return;return a}generateRulesFromInterface(e){let t=[],r=e.matchAll(/(\w+)(\?)?:\s*(\w+)/g);for(let a of r){let[,l,m,h]=a;t.push({path:l,required:!m,type:this.mapTypeScriptType(h)})}return t}mapTypeScriptType(e){switch(e.toLowerCase()){case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"object":return"object";default:return"object"}}static createCommonRules(){return{server:[{path:"port",required:!0,type:"number",min:1,max:65535},{path:"host",required:!0,type:"string",min:1},{path:"ssl",type:"boolean"}],database:[{path:"url",required:!0,type:"string",min:1},{path:"pool",type:"number",min:1,max:100},{path:"timeout",type:"number",min:0}],api:[{path:"baseUrl",required:!0,type:"string",pattern:EA},{path:"timeout",type:"number",min:0},{path:"retries",type:"number",min:0,max:10}]}}}var Wn=new Qd("bunfig",{showTags:!0});function RA(e){if(!e)return"";let t=Array.isArray(e)?e.filter(Boolean):[e];if(t.length===0)return"";if(t.length===1)return` or alias "${t[0]}"`;return` or aliases ${t.map((r)=>`"${r}"`).join(", ")}`}class Lv{fileLoader=new Bv;envProcessor=new _g;validator=new Mv;async loadConfig(e){let t=Date.now(),{cache:r,performance:a,schema:l,validate:m,...h}=e;try{if(r?.enabled){let R=this.checkCache(h.name||"",h);if(R)return R}let S;try{S=await this.loadConfigurationStrategies(h,!0,r)}catch(R){if(h.configFile)throw R;let y=h.__strictErrorHandling;if(R instanceof Error&&R.name==="ConfigNotFoundError"){if(y)throw R;S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`No configuration file found for "${h.name||"config"}", using defaults with environment variables`]}}else if(R instanceof Error&&R.name==="ConfigLoadError"){let C=R.message.includes("EACCES")||R.message.includes("EPERM")||R.message.includes("permission denied"),T=!C&&(R.message.includes("syntax")||R.message.includes("Expected")||R.message.includes("Unexpected")||R.message.includes("BuildMessage")||R.message.includes("errors building")),j=R.message.includes("Configuration must export a valid object")||R.message.includes("Configuration file is empty and exports nothing");if(y&&(j||C))throw R;if(T&&(!y||!j))S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:["Configuration file has syntax errors, using defaults with environment variables"]};else if(!y)S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading error, using defaults: ${R.message}`]};else throw R}else S={...await this.applyEnvironmentVariables(h.name||"",h.defaultConfig,h.checkEnv!==!1,h.verbose||!1),warnings:[`Configuration loading failed, using defaults: ${R instanceof Error?R.message:String(R)}`]}}if(l||m)await this.validateConfiguration(S.config,l,m,h.name);if(r?.enabled&&S)this.cacheResult(h.name||"",S,r,h);if(a?.enabled){let R={operation:"loadConfig",duration:Date.now()-t,configName:h.name,timestamp:new Date};if(a.onMetrics)a.onMetrics(R);if(a.slowThreshold&&R.duration>a.slowThreshold)Wn.warn(`Slow configuration loading detected: ${R.duration}ms for ${h.name}`);S.metrics=R}return S}catch(S){if(S instanceof Error&&S.name==="ConfigNotFoundError")throw S;let R=Date.now()-t;throw Wn.error(`Configuration loading failed after ${R}ms:`,[S instanceof Error?S:Error(String(S))]),S}}async loadConfigurationStrategies(e,t=!1,r){let{name:a="",alias:l,configFile:m,cwd:h,configDir:S,defaultConfig:R,checkEnv:y=!0,arrayStrategy:C="replace",verbose:T=!1}=e,j=h||Wd.cwd(),B=[];if(m){let le=ti(j,m);B.push(le);let X=y?ac(a,R,T):R,ce=await this.fileLoader.tryLoadFromPaths([le],X,{arrayStrategy:C,verbose:T,cacheTtl:r?.ttl,useCache:!r?.ttl||r.ttl>100});if(!ce)throw as.configNotFound(a||m,B,l);if(T)Wn.success(`Configuration loaded from explicit path: ${le}`);return this.finalizeResult(ce,B,y,a,T)}let V=await this.loadLocalConfiguration(a,l,j,S,R,C,T,y,r);if(V)return B.push(...this.getLocalSearchPaths(a,l,j,S)),this.finalizeResult(V,B,y,a,T);let W=await this.loadHomeConfiguration(a,l,R,C,T,y);if(W)return B.push(...this.getHomeSearchPaths(a,l)),this.finalizeResult(W,B,y,a,T);let Y=await this.loadPackageJsonConfiguration(a,l,j,R,C,T,y);if(Y)return B.push(ti(j,"package.json")),this.finalizeResult(Y,B,y,a,T);if(B.push(...this.getAllSearchPaths(a,l,j,S)),t)throw as.configNotFound(a,B,l);return{...await this.applyEnvironmentVariables(a,R,y,T),warnings:[`No configuration file found for "${a}"${RA(l)}, using defaults with environment variables`]}}async loadLocalConfiguration(e,t,r,a,l,m,h,S,R){let y=S?ac(e,l,h):l,C=this.getLocalDirectories(r,a);for(let T of C){if(h)Wn.info(`Searching for configuration in: ${T}`);let j=this.fileLoader.generateConfigPaths(e,T,t),B=await this.fileLoader.tryLoadFromPaths(j,y,{arrayStrategy:m,verbose:h,cacheTtl:R?.ttl,useCache:!R?.ttl||R.ttl>100});if(B){if(h)Wn.success(`Configuration loaded from: ${B.source.path}`);return B}}return null}async loadHomeConfiguration(e,t,r,a,l,m){if(!e)return null;let h=m?ac(e,r,l):r,S=[ti(Bs(),".config",e),ti(Bs(),".config"),Bs()];for(let R of S){if(l)Wn.info(`Checking home directory: ${R}`);let y=this.fileLoader.generateConfigPaths(e,R,t),C=await this.fileLoader.tryLoadFromPaths(y,h,{arrayStrategy:a,verbose:l});if(C){if(l)Wn.success(`Configuration loaded from home directory: ${C.source.path}`);return C}}return null}async loadPackageJsonConfiguration(e,t,r,a,l,m,h){let S=h?ac(e,a,m):a;try{let R=ti(r,"package.json");if(!vE(R))return null;let y={};try{y=JSON.parse(bE(R,"utf8"))}catch(j){if(m)Wn.warn("Failed to parse package.json:",[j instanceof Error?j:Error(String(j))]);return null}let C=y[e],T=e;if(!C&&t){let j=Array.isArray(t)?t:[t];for(let B of j){if(!B)continue;if(y[B]){C=y[B],T=B;break}}}if(C&&typeof C==="object"&&!Array.isArray(C)){if(m)Wn.success(`Configuration loaded from package.json: ${T}`);return{config:jv(S,C,l),source:{type:"package.json",path:R,priority:30,timestamp:new Date}}}}catch(R){if(m)Wn.warn("Failed to load package.json:",[R instanceof Error?R:Error(String(R))])}return null}async applyEnvironmentVariables(e,t,r,a){if(!r||!e||typeof t!=="object"||t===null||Array.isArray(t))return{config:t,source:{type:"default",priority:10,timestamp:new Date}};return{config:ac(e,t,a),source:{type:"environment",priority:20,timestamp:new Date}}}async finalizeResult(e,t,r,a,l){return{config:e.config,source:e.source,path:e.source.path}}async validateConfiguration(e,t,r,a){let l=[];if(r){let m=r(e);if(m)l.push(...m)}if(t){let m=await this.validator.validateConfiguration(e,t);if(!m.isValid)l.push(...m.errors.map((h)=>h.path?`${h.path}: ${h.message}`:h.message))}if(l.length>0)throw as.configValidation(a||"unknown",l,a)}checkCache(e,t){let r=this.generateCacheKey(e,t);return Ed.get(r)||null}cacheResult(e,t,r,a){let l=this.generateCacheKey(e,a);Ed.set(l,t,void 0,r.ttl)}generateCacheKey(e,t){let r=[e];if(t.alias){let a=Array.isArray(t.alias)?t.alias.join(","):t.alias;r.push(`alias:${a}`)}if(t.cwd)r.push(`cwd:${t.cwd}`);if(t.configFile)r.push(`configFile:${t.configFile}`);if(t.configDir)r.push(`configDir:${t.configDir}`);if("checkEnv"in t)r.push(`checkEnv:${t.checkEnv}`);return r.join("|")}getLocalDirectories(e,t){return yE({cwd:e,configDir:t})}getAllSearchPaths(e,t,r,a){let l=[];return l.push(...this.getLocalSearchPaths(e,t,r,a)),l.push(...this.getHomeSearchPaths(e,t)),l.push(ti(r,"package.json")),l}getLocalSearchPaths(e,t,r,a){let l=this.getLocalDirectories(r,a),m=[];for(let h of l)m.push(...this.fileLoader.generateConfigPaths(e,h,t));return m}getHomeSearchPaths(e,t){if(!e)return[];let r=[ti(Bs(),".config",e),ti(Bs(),".config"),Bs()],a=[];for(let l of r)a.push(...this.fileLoader.generateConfigPaths(e,l,t));return a}async loadConfigWithResult(e){return this.loadConfig(e)}}var ag=new Lv;async function Fv(e){let t="defaultConfig"in e&&e.defaultConfig!==void 0?e.defaultConfig:{},r="cache"in e||"performance"in e||"schema"in e||"validate"in e;try{let a;if(r)a=await ag.loadConfig(e);else a=await ag.loadConfig({...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}});return a?.config??t}catch(a){if(e.configFile)throw a;let l=a instanceof Error?a.name:"UnknownError",m=a instanceof Error?a.message:String(a);if(!(l==="ConfigNotFoundError"||l==="ConfigLoadError"||l==="ConfigValidationError"||m.includes("config"))&&e.verbose)Wn.warn("Unexpected error loading config, using defaults:",[a instanceof Error?a:Error(String(a))]);let S=r?{...e,defaultConfig:t}:{...e,defaultConfig:t,cache:{enabled:!0},performance:{enabled:!1}};if("checkEnv"in e?e.checkEnv!==!1:!0)return(await ag.applyEnvironmentVariables(S.name||"",t,!0,S.verbose||!1))?.config??t;return t}}function ac(e,t,r=!1){let a=new _g,l=e.toUpperCase().replace(/[^A-Z0-9]/g,"_");function m(h,S=[]){let R={...h};for(let[y,C]of Object.entries(h)){let T=[...S,y],j=[`${l}_${T.join("_").toUpperCase()}`,`${l}_${T.map((W)=>W.toUpperCase()).join("")}`,`${l}_${T.map((W)=>W.replace(/([A-Z])/g,"_$1").toUpperCase()).join("")}`],B,V;for(let W of j)if(B=Wd.env[W],B!==void 0){V=W;break}if(B!==void 0&&V)if(typeof C==="boolean")R[y]=["true","1","yes"].includes(B.toLowerCase());else if(typeof C==="number"){let W=Number(B);if(!Number.isNaN(W))R[y]=W}else if(Array.isArray(C))try{R[y]=JSON.parse(B)}catch{R[y]=B.split(",").map((W)=>W.trim())}else R[y]=B;else if(C&&typeof C==="object"&&!Array.isArray(C))R[y]=m(C,T)}return R}return m(t)}var GN=ti(Wd.cwd(),"config"),QN=ti(Wd.cwd(),"src/generated");var _o={project:{name:"my-project",slug:"my-project",region:"us-east-1"},environments:{production:{type:"production"}}},us=null;function PA(e){return e.project?.slug===_o.project?.slug&&Object.keys(e.environments??{}).length===1&&!!e.environments?.production}async function _A(){let e=[zv(process.cwd(),"config","cloud.ts"),zv(process.cwd(),"config","cloud.js")];for(let t of e){if(!AA(t))continue;let r=await import(`${CA(t).href}?t=${Date.now()}`),a=r.tsCloud??r.default?.tsCloud??r.default??r.cloud??r.config;if(a)return a}return null}async function Vm(){if(!us){if(us=await Fv({name:"cloud",defaultConfig:_o}),PA(us))us=await _A()??us;bd(us.stateDir)}return us}var sl=Vm,fy=_o;var mo=(e)=>e==null?void 0:String(e),xg=(e)=>Number(e)===1,qv=(e,t)=>{try{return e==null?t:JSON.parse(String(e))}catch{return t}};function Tg(e){return{id:String(e.id),organizationId:String(e.organization_id),projectId:String(e.project_id),scope:{type:String(e.scope_type),id:String(e.scope_id),environmentId:mo(e.environment_id),resourceId:mo(e.resource_id),previewId:mo(e.preview_id)},key:String(e.key),kind:String(e.kind),value:mo(e.value),valueFingerprint:String(e.value_fingerprint),secretRef:mo(e.secret_ref),backend:String(e.backend),backendVersion:mo(e.backend_version),origin:String(e.origin),required:xg(e.required),metadata:qv(e.metadata,{}),lastUsedAt:mo(e.last_used_at),rotatedAt:mo(e.rotated_at),version:Number(e.version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}function Uv(e){return{entryId:String(e.entry_id),resourceId:String(e.resource_id),injectionTarget:String(e.injection_target),required:xg(e.required),requiresRedeploy:xg(e.requires_redeploy),lastDeployedVersion:e.last_deployed_version==null?void 0:Number(e.last_deployed_version),createdAt:String(e.created_at),updatedAt:String(e.updated_at)}}class Ba{controlPlane;now;constructor(e,t=()=>new Date){this.controlPlane=e;this.now=t}get(e){let t=this.controlPlane.database.query("SELECT * FROM configuration_entries WHERE id=?").get(e);return t?Tg(t):void 0}find(e,t,r){let a=this.controlPlane.database.query("SELECT * FROM configuration_entries WHERE project_id=? AND scope_type=? AND scope_id=? AND key=?").get(e,t.type,t.id,r);return a?Tg(a):void 0}list(e){let t=["project_id=?"],r=[e.projectId];if(e.scope)t.push("scope_type=?","scope_id=?"),r.push(e.scope.type,e.scope.id);if(e.kind)t.push("kind=?"),r.push(e.kind);return this.controlPlane.database.query(`SELECT * FROM configuration_entries WHERE ${t.join(" AND ")} ORDER BY key,scope_type,scope_id`).all(...r).map(Tg)}create(e){this.validateScope(e),this.validateEntry(e);let t=crypto.randomUUID(),r=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO configuration_entries (id,organization_id,project_id,scope_type,scope_id,environment_id,resource_id,preview_id,key,kind,value,value_fingerprint,secret_ref,backend,backend_version,origin,required,metadata,last_used_at,rotated_at,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",[t,e.organizationId,e.projectId,e.scope.type,e.scope.id,e.scope.environmentId??null,e.scope.resourceId??null,e.scope.previewId??null,e.key,e.kind,e.value??null,e.valueFingerprint,e.secretRef??null,e.backend,e.backendVersion??null,e.origin,e.required?1:0,JSON.stringify(e.metadata),e.lastUsedAt??null,e.rotatedAt??null,1,r,r]),this.get(t)}update(e,t,r){let a=this.get(e);if(!a)throw Error("Configuration entry was not found.");if(this.validateEntry({...a,...r}),this.controlPlane.database.run("UPDATE configuration_entries SET value=?,value_fingerprint=?,secret_ref=?,backend=?,backend_version=?,required=?,metadata=?,rotated_at=?,version=version+1,updated_at=? WHERE id=? AND version=?",[r.value??null,r.valueFingerprint,r.secretRef??null,r.backend,r.backendVersion??null,r.required?1:0,JSON.stringify(r.metadata),r.rotatedAt??null,this.now().toISOString(),e,t]).changes!==1)throw Error("Configuration entry changed; refresh and retry.");return this.get(e)}remove(e,t){let r=this.get(e);if(!r)throw Error("Configuration entry was not found.");if(r.version!==t)throw Error("Configuration entry changed; refresh and retry.");if(this.controlPlane.database.run("DELETE FROM configuration_entries WHERE id=? AND version=?",[e,t]).changes<1)throw Error("Configuration entry changed; refresh and retry.");return r}setDependency(e){let t=this.now().toISOString();return this.controlPlane.database.run("INSERT INTO configuration_dependencies (entry_id,resource_id,injection_target,required,requires_redeploy,last_deployed_version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?) ON CONFLICT(entry_id,resource_id) DO UPDATE SET injection_target=excluded.injection_target,required=excluded.required,requires_redeploy=excluded.requires_redeploy,last_deployed_version=excluded.last_deployed_version,updated_at=excluded.updated_at",[e.entryId,e.resourceId,e.injectionTarget,e.required?1:0,e.requiresRedeploy?1:0,e.lastDeployedVersion??null,t,t]),this.dependencies(e.entryId).find((r)=>r.resourceId===e.resourceId)}dependencies(e){return this.controlPlane.database.query("SELECT * FROM configuration_dependencies WHERE entry_id=? ORDER BY resource_id").all(e).map(Uv)}dependenciesForResource(e){return this.controlPlane.database.query("SELECT * FROM configuration_dependencies WHERE resource_id=? ORDER BY entry_id").all(e).map(Uv)}mutation(e){let t=this.controlPlane.database.query("SELECT request_hash,result FROM configuration_mutations WHERE idempotency_key=?").get(e);return t?{requestHash:t.request_hash,result:qv(t.result,{})}:void 0}recordMutation(e){this.controlPlane.database.run("INSERT INTO configuration_mutations (id,project_id,idempotency_key,request_hash,result,actor_id,created_at) VALUES (?,?,?,?,?,?,?)",[crypto.randomUUID(),e.projectId,e.idempotencyKey,e.requestHash,JSON.stringify(e.result),e.actorId??null,this.now().toISOString()])}validateEntry(e){if(!/^[A-Za-z_][A-Za-z0-9_]{0,255}$/.test(e.key))throw Error(`Invalid configuration key: ${e.key}`);if(e.kind==="variable"&&(e.value==null||e.secretRef||e.backend!=="plaintext"))throw Error("Variables require a plaintext value and cannot use a secret backend.");if(e.kind==="secret"&&(e.value!=null||!e.secretRef||e.backend==="plaintext"))throw Error("Secrets require a non-plaintext backend reference and cannot store a plaintext value.")}validateScope(e){let t=this.controlPlane.getProject(e.projectId);if(!t||t.organizationId!==e.organizationId)throw Error("Configuration project does not belong to the organization.");let r=e.scope;if(r.type==="project"){if(r.id!==e.projectId||r.environmentId||r.resourceId||r.previewId)throw Error("Project configuration scope must reference only its project.");return}if(r.type==="environment"){let l=this.controlPlane.database.query("SELECT project_id FROM environments WHERE id=?").get(r.id);if(!l||l.project_id!==e.projectId||r.environmentId&&r.environmentId!==r.id||r.resourceId||r.previewId)throw Error("Environment configuration scope does not belong to the project.");return}if(r.type==="service"||r.type==="function"){let l=this.controlPlane.getResource(r.id);if(!l||l.projectId!==e.projectId||r.type==="function"&&l.kind!=="function"||r.resourceId&&r.resourceId!==r.id||r.environmentId&&l.environmentId!==r.environmentId||r.previewId)throw Error(`${r.type==="function"?"Function":"Service"} configuration scope does not belong to the project.`);return}let a=this.controlPlane.database.query("SELECT project_id,base_environment_id,resource_id FROM preview_instances WHERE id=?").get(r.id);if(!a||a.project_id!==e.projectId||r.previewId&&r.previewId!==r.id||r.environmentId&&r.environmentId!==a.base_environment_id||r.resourceId&&r.resourceId!==a.resource_id)throw Error("Preview configuration scope does not belong to the project.")}}var Vv=/^[A-Za-z_][A-Za-z0-9_]{0,255}$/;function TA(e){let t={n:`
|
|
162
162
|
`,r:"\r",t:"\t","\\":"\\",'"':'"',$:"$"};return e.replace(/\\(n|r|t|\\|"|\$)/g,(r,a)=>t[a])}function Su(e){let t={},r=[],a=e.replace(/\r\n?/g,`
|
|
163
163
|
`).split(`
|
|
164
164
|
`);for(let l=0;l<a.length;l++){let m=l+1,h=a[l];if(!h.trim()||h.trimStart().startsWith("#"))continue;if(/^\s*export\s+/.test(h))h=h.replace(/^\s*export\s+/,"");let S=h.match(/^\s*([^=\s]+)\s*=\s*(.*)$/);if(!S){r.push({line:m,severity:"error",code:"invalid_line",message:"Expected KEY=VALUE."});continue}let R=S[1],y=S[2];if(!Vv.test(R)){r.push({line:m,key:R,severity:"error",code:"invalid_key",message:`Invalid environment variable name: ${R}`});continue}let C=y;if(y.startsWith('"')||y.startsWith("'")){let T=y[0],j=[y.slice(1)],B=!1;while(!0){let V=j[j.length-1],W=!1,Y=-1;for(let te=0;te<V.length;te++){if(T==='"'&&V[te]==="\\"&&!W){W=!0;continue}if(V[te]===T&&!W){Y=te;break}W=!1}if(Y>=0){j[j.length-1]=V.slice(0,Y),B=!0;break}if(++l>=a.length)break;j.push(a[l])}if(!B){r.push({line:m,key:R,severity:"error",code:"unterminated_quote",message:`Unterminated quoted value for ${R}.`});continue}if(C=j.join(`
|
|
@@ -643,9 +643,9 @@ EOF`,'echo "DISKPCT=${DISKPCT:-0}"','echo "DISKUSEDG=${DISKUSEDG:-0}"','echo "DI
|
|
|
643
643
|
})
|
|
644
644
|
</script>
|
|
645
645
|
</body>
|
|
646
|
-
</html>`}var dS={info:()=>{},warn:()=>{},error:()=>{},step:()=>{},success:()=>{}};async function lS(e){return await e.driver.findComputeTargets({slug:e.slug,environment:e.environment,role:e.role||"app"})}async function uS(e,t){let r=e.logger||dS,a=await lS(e);if(a.length===0)return{success:!1,error:`No '${e.role||"app"}' servers found for ${e.slug}/${e.environment}.`};let l=O(e.slug,t.siteName),m=xt(l,t.to||"unused");if(t.dryRun){let
|
|
646
|
+
</html>`}var dS={info:()=>{},warn:()=>{},error:()=>{},step:()=>{},success:()=>{}};async function lS(e){return await e.driver.findComputeTargets({slug:e.slug,environment:e.environment,role:e.role||"app"})}async function uS(e,t){let r=e.logger||dS,a=await lS(e);if(a.length===0)return{success:!1,error:`No '${e.role||"app"}' servers found for ${e.slug}/${e.environment}.`};let l=O(e.slug,t.siteName),m=xt(l,t.to||"unused"),h=t.onlyIfLive?u_(m.current,t.siteName,t.onlyIfLive):[];if(t.dryRun){let y=await e.driver.runRemoteDeploy({targets:a,commands:["set -uo pipefail",...h,...Mu(m,t.to?{to:t.to}:{})],comment:`ts-cloud rollback plan ${e.slug}/${t.siteName}`,tags:{Project:e.slug,Environment:e.environment,Role:e.role||"app"}});return{success:y.success,error:y.error,perInstance:y.perInstance}}let S=["set -uo pipefail",...h,...Fu(m,{...t.to?{to:t.to}:{},unitBase:`${e.slug}-${t.siteName}`}),`(cd ${v} && pantry restart php-fpm) 2>/dev/null || true`,`(cd ${m.current} && eval "$(cd ${v} && pantry env 2>/dev/null)" && php artisan queue:restart) 2>/dev/null || true`];r.step(`Rolling back ${t.siteName}${t.to?` to ${t.to}`:" to the previous release"} on ${a.length} server(s)...`);let R=await e.driver.runRemoteDeploy({targets:a,commands:S,comment:`ts-cloud rollback ${e.slug}/${t.siteName}`,tags:{Project:e.slug,Environment:e.environment,Role:e.role||"app"}});if(!R.success)r.error(`Rollback failed: ${R.error||"unknown error"}`);else r.success(`Rolled back ${t.siteName}.`);return{success:R.success,error:R.error,perInstance:R.perInstance}}function u_(e,t,r){let a=r.replace(/[^0-9A-Za-z._-]/g,"");return[`TS_CLOUD_LIVE_ID=$(basename "$(readlink -f ${e} 2>/dev/null)" 2>/dev/null || true)`,`if [ -z "$TS_CLOUD_LIVE_ID" ] || [ "$TS_CLOUD_LIVE_ID" = "." ]; then echo "${t}: no live release here; left alone"; exit 0; fi`,`case "${a}" in "$TS_CLOUD_LIVE_ID"*) ;; *) echo "${t} serves $TS_CLOUD_LIVE_ID, not ${a}; left alone"; exit 0 ;; esac`]}async function pS(e,t){let r=e.logger||dS;if(!t.database?.name)return{success:!1,error:"No appDatabase configured to restore."};let a=await lS(e);if(a.length===0)return{success:!1,error:`No '${e.role||"app"}' servers found for ${e.slug}/${e.environment}.`};r.step(`Restoring database '${t.database.name}'${t.from?` from ${t.from}`:" from the latest backup"} on ${a.length} server(s)...`);let l=await e.driver.runRemoteDeploy({targets:a,commands:Lu(t.database,{from:t.from}),comment:`ts-cloud db:restore ${e.slug}/${t.database.name}`,tags:{Project:e.slug,Environment:e.environment,Role:e.role||"app"}});if(!l.success)r.error(`Restore failed: ${l.error||"unknown error"}`);else r.success(`Restored ${t.database.name}.`);return{success:l.success,error:l.error,perInstance:l.perInstance}}var p_=["restart","reload","start","stop","enable","disable"],gS=65536;function Va(e){return e.length<=gS?e:`${e.slice(0,gS)}
|
|
647
647
|
|
|
648
|
-
[output truncated]`}function p_(e){return/^[A-Za-z0-9_.@:-]+$/.test(e)}function cm(e){return/^[A-Za-z0-9_-]+$/.test(e)}function g_(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ju(e,t){let r=[],a=t.servicesDetail??t.services??[];for(let h of a){let S=String(h?.name??"");if(!S||!p_(S))continue;for(let R of u_)r.push({id:`${R}:${S}`,label:`${g_(R)} ${S}`,group:"service",target:S,mutates:!0,confirm:S,danger:R==="stop"||R==="disable"})}for(let[h,S]of Object.entries(e.sites??{})){if(!S||!cm(h))continue;let R=u(S);if(R==="server-app"||R==="server-php")r.push({id:`rollback:${h}`,label:`Rollback ${h}`,group:"deploy",target:h,mutates:!0,confirm:h,danger:!0})}let l=new Set;for(let h of t.workers??[]){let S=String(h?.name??"").split(":")[0];if(S&&cm(S))l.add(S)}for(let h of l)r.push({id:`worker:restart:${h}`,label:`Restart workers (${h})`,group:"worker",target:h,mutates:!0,confirm:h});for(let[h,S]of Object.entries(e.sites??{})){if(!S||!cm(h))continue;if(S.scheduler||S.schedule){let R=Tr(S)==="laravel";r.push({id:`scheduler:run:${h}`,label:`${R?"Run":"Restart"} scheduler (${h})`,group:"scheduler",target:h,mutates:!0,confirm:h})}}if(e.infrastructure?.compute?.backups?.enabled){if(r.push({id:"backup:run",label:"Run backup now",group:"backup",target:"backup",mutates:!0,confirm:"backup"}),p(e))r.push({id:"backup:restore",label:"Restore latest DB backup",group:"backup",target:"database",mutates:!0,confirm:"restore",danger:!0})}return r}function dm(e,t,r){return ju(t,r).find((a)=>a.id===e)}function m_(e,t){let r=e==="enable"||e==="disable"?`systemctl is-enabled ${t} 2>/dev/null || true`:`systemctl is-active ${t} 2>/dev/null || true`;return["set -o pipefail",`systemctl ${e} ${t}`,r]}function f_(){return`eval "$(cd ${v} && pantry env 2>/dev/null)"`}function fS(e,t,r){let a=`${O(e,t)}/current`;return["set -uo pipefail",`[ -d ${a} ] || { echo "site ${t} has no current release" >&2; exit 1; }`,`cd ${a} && ${f_()} && php artisan ${r}`]}function h_(e,t,r){if(e==="laravel")return fS(t,r,"queue:restart");let a=`${t}-${r}-queue-*.service`;return["set -uo pipefail",`units=$(systemctl list-units --type=service --all --no-legend '${a}' 2>/dev/null | awk '{print $1}')`,`[ -n "$units" ] || { echo "no queue-worker units found for ${r} (${a})" >&2; exit 1; }`,"systemctl restart $units",`systemctl --no-legend --type=service list-units '${a}' 2>/dev/null || true`]}function y_(e,t,r){if(e==="laravel")return fS(t,r,"schedule:run");let a=`${t}-${r}-scheduler.service`;return["set -uo pipefail",`systemctl restart ${a}`,`systemctl is-active ${a} 2>/dev/null || true`]}function v_(){return["set -uo pipefail",`[ -x ${fr} ] || { echo "scheduled backups are not provisioned on this server" >&2; exit 1; }`,fr]}function mS(e,t,r){return{operation:e,command:t,ok:r.success,stdout:Va(r.perInstance?.[0]?.output??""),stderr:Va(r.perInstance?.[0]?.error??r.error??"")}}async function Bu(e,t,r,a={}){let l=e.project.slug,m;try{m=_({config:e})}catch(T){return{operation:r.id,ok:!1,error:`Could not initialize the cloud driver: ${T?.message??T}`}}let h={driver:m,slug:l,environment:t,role:"app"};if(r.group==="deploy"){let T=a.to&&/^[A-Za-z0-9._-]+$/.test(a.to)?a.to:void 0,j=await uS(h,{siteName:r.target,to:T});return mS(r.id,`rollback ${r.target}${T?` → ${T}`:""}`,j)}if(r.id==="backup:restore"){let T=await pS(h,{database:p(e)});return mS(r.id,"db restore",T)}let S=await m.findComputeTargets({slug:l,environment:t,role:"app"});if(!S.length)return{operation:r.id,ok:!1,error:"No app server target was found for this environment."};let R,y;if(r.group==="service"){let[T,...j]=r.id.split(":");R=m_(T,j.join(":")),y=`systemctl ${T} ${r.target}`}else if(r.group==="worker"){let T=Tr(e.sites?.[r.target]??{});R=h_(T,l,r.target),y=T==="laravel"?`queue:restart (${r.target})`:`restart queue units (${r.target})`}else if(r.group==="scheduler"){let T=Tr(e.sites?.[r.target]??{});R=y_(T,l,r.target),y=T==="laravel"?`schedule:run (${r.target})`:`restart scheduler (${r.target})`}else if(r.id==="backup:run")R=v_(),y="ts-cloud backup";else return{operation:r.id,ok:!1,error:"Unknown operation."};let C=await m.runRemoteDeploy({targets:[S[0]],commands:R,comment:`ts-cloud dashboard:${r.id}`,tags:{Project:l,Environment:t,Role:"app"}});return{operation:r.id,command:y,ok:C.success,stdout:Va(C.perInstance?.[0]?.output??""),stderr:Va(C.perInstance?.[0]?.error??C.error??"")}}async function bc(e,t,r){let a=r.trim();if(!a)return{operation:"command",ok:!1,error:"A command is required."};let l;try{l=_({config:e})}catch(R){return{operation:"command",ok:!1,error:`Could not initialize the cloud driver: ${R?.message??R}`}}let m=e.project.slug,h=await l.findComputeTargets({slug:m,environment:t,role:"app"});if(!h.length)return{operation:"command",ok:!1,error:"No app server target was found for this environment."};let S=await l.runRemoteDeploy({targets:[h[0]],commands:["set -o pipefail",a],comment:"ts-cloud dashboard:command",tags:{Project:m,Environment:t,Role:"app"}});return{operation:"command",command:a,ok:S.success,stdout:Va(S.perInstance?.[0]?.output??""),stderr:Va(S.perInstance?.[0]?.error??S.error??"")}}function b_(e,t){return[`${e}-${t}`,`${e}-${t}-queues`,`${e}-${t}-daemons`]}function hS(e,t,r){return r.some((a)=>b_(t,a).includes(e))}function lm(e,t){let{user:r,slug:a}=t;if(r.role==="admin")return e;let l=(e.sites??[]).map((V)=>V.name).filter(Boolean),m=Kg(r,l),h=new Set(m),S=(e.sites??[]).filter((V)=>h.has(V.name)),R=(e.sitesDetail??[]).filter((V)=>h.has(V.name)),y=new Set(R.map((V)=>V.domain).filter(Boolean)),C=(e.serverDeploymentsDetail??e.serverDeployments??[]).filter((V)=>h.has(V.site)),T=(e.serverLogs??[]).filter((V)=>hS(V.source,a,m)),j=(e.security?.tlsCertificates??[]).filter((V)=>y.has(V.domain)),B=(e.activity??[]).filter((V)=>{if(V.type==="deploy")return m.some((W)=>String(V.title??"").startsWith(`${W} `));if(V.type==="log")return hS(String(V.title??"").split(" ")[0],a,m);return!1});return{mode:e.mode,environment:e.environment,environments:e.environments,scoped:!0,server:{name:""},sites:S,sitesDetail:R,workers:(e.workers??[]).filter((V)=>h.has(V.site)),serverDeployments:C.slice(0,5),serverDeploymentsDetail:C.slice(0,50),deploymentsEmptyReason:C.length?void 0:"No deployments have been recorded for your sites yet.",serverLogs:T,serverLogsEmptyReason:T.length?void 0:"No recent log entries for your sites.",security:{tlsCertificates:j,ports:[],firewall:null,authEvents:[]},diagnostics:(e.diagnostics??[]).filter((V)=>["Route conflicts","TLS certificates"].includes(V.name)),activity:B}}function yS(e,t){if(t.role==="admin")return e;let r=new Set(Kg(t,Object.keys(e.sites??{})));return{project:{name:e.project?.name},environment:e.environment,environments:e.environments,sites:Object.fromEntries(Object.entries(e.sites??{}).filter(([a])=>r.has(a)))}}function vS(e){let t=new RegExp("[\\u007F-\\uFFFF]","g");return JSON.stringify(e).replace(t,(r)=>`\\u${r.charCodeAt(0).toString(16).padStart(4,"0")}`)}var S_=new Set(["name","ssl","env","redirects","aliases","domain","path"]),bS={build:"build runs as a shell command on the server",start:"start runs as a shell command on the server",root:"root is a filesystem path on the shared server",port:"ports are allocated by the server owner",type:"the deploy type is set by the server owner",php:"the PHP runtime is set by the server owner"};function wS(e){let t=Object.keys(e).filter((l)=>e[l]!==void 0),r=t.filter((l)=>(l in bS));if(r.length)return{ok:!1,error:`Only the server owner can change ${r.map((m)=>`${m} (${bS[m]})`).join(", ")}.`};let a=t.filter((l)=>!S_.has(l));if(a.length)return{ok:!1,error:`Only the server owner can change ${a.join(", ")}.`};return{ok:!0}}function zu(e){return String(e??"").trim().toLowerCase().replace(/\.$/,"")}function SS(e){let t=String(e??"/").trim();if(!t||t==="/")return"/";return(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")||"/"}function w_(e){let t=[zu(e?.domain)];if(Array.isArray(e?.aliases))t.push(...e.aliases.map(zu));return t.filter(Boolean)}function kS({siteName:e,body:t,sites:r,ownSites:a}){let l=r[e]??{},m=new Set(a),h=new Set;if(t.domain!==void 0)h.add(zu(t.domain));if(Array.isArray(t.aliases))for(let R of t.aliases)h.add(zu(R));if(h.delete(""),h.size===0)return{ok:!0};let S=SS(t.path!==void 0?t.path:l.path);for(let[R,y]of Object.entries(r)){if(R===e||m.has(R))continue;let C=SS(y?.path);for(let T of w_(y)){if(!h.has(T))continue;if(C===S)return{ok:!1,error:`${T}${S==="/"?"":S} is already served by another site on this server.`}}}return{ok:!0}}class Sc{maxAttempts;lockoutMs;windowMs;attempts=new Map;constructor(e=8,t=900000,r=900000){this.maxAttempts=e;this.lockoutMs=t;this.windowMs=r}key(e,t){return`${e.trim().toLowerCase()}\x00${t}`}check(e,t,r=Date.now()){let a=this.attempts.get(this.key(e,t));if(!a?.until)return{allowed:!0};if(r>=a.until)return this.attempts.delete(this.key(e,t)),{allowed:!0};return{allowed:!1,retryAfterSeconds:Math.ceil((a.until-r)/1000)}}recordFailure(e,t,r=Date.now()){let a=this.key(e,t),l=this.attempts.get(a),h=!l||r-l.last>this.windowMs?1:l.count+1,S={count:h,last:r};if(h>=this.maxAttempts)S.until=r+this.lockoutMs;this.attempts.set(a,S)}recordSuccess(e,t){this.attempts.delete(this.key(e,t))}prune(e=Date.now()){for(let[t,r]of this.attempts)if(r.until?e>=r.until:e-r.last>this.windowMs)this.attempts.delete(t)}get size(){return this.attempts.size}}var ES=new Set([22,80,443]);function wc(e){return Number.isInteger(e)&&e>=1&&e<=65535}function hs(e){return[...new Set(e.filter((t)=>wc(t)&&!ES.has(t)))].sort((t,r)=>t-r)}function RS(e,t,r=[]){if(!wc(t))throw Error("Port must be an integer between 1 and 65535.");if(ES.has(t))throw Error(`Port ${t} (SSH/HTTP/HTTPS) is always open and is not managed here.`);return CS({configText:e,ports:hs([...r,t])})}function AS(e,t,r=[]){return CS({configText:e,ports:hs(r.filter((a)=>a!==t))})}function IS(e,t,r,a,l){let m=e.slice(t,r),h=new RegExp(`\\b${a}\\s*:\\s*\\${l}`).exec(m);if(!h)return null;let S=t+h.index,R=e.indexOf(l,S);return{propStart:S,open:R,close:hc(e,R,l,l==="{"?"}":"]")}}function um(e){return`allowedPorts: [${e.join(", ")}]`}function CS(e){let{configText:t}=e,r=hs(e.ports),a=/\bcompute\s*:\s*{/.exec(t);if(!a)throw Error("Could not find infrastructure.compute in the cloud config.");let l=t.indexOf("{",a.index),m=hc(t,l,"{","}"),h=IS(t,l+1,m,"firewall","{");if(h){let C=IS(t,h.open+1,h.close,"allowedPorts","[");if(C){let V=C.propStart;while(V>0&&t[V-1]!==`
|
|
648
|
+
[output truncated]`}function g_(e){return/^[A-Za-z0-9_.@:-]+$/.test(e)}function cm(e){return/^[A-Za-z0-9_-]+$/.test(e)}function m_(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ju(e,t){let r=[],a=t.servicesDetail??t.services??[];for(let h of a){let S=String(h?.name??"");if(!S||!g_(S))continue;for(let R of p_)r.push({id:`${R}:${S}`,label:`${m_(R)} ${S}`,group:"service",target:S,mutates:!0,confirm:S,danger:R==="stop"||R==="disable"})}for(let[h,S]of Object.entries(e.sites??{})){if(!S||!cm(h))continue;let R=u(S);if(R==="server-app"||R==="server-php")r.push({id:`rollback:${h}`,label:`Rollback ${h}`,group:"deploy",target:h,mutates:!0,confirm:h,danger:!0})}let l=new Set;for(let h of t.workers??[]){let S=String(h?.name??"").split(":")[0];if(S&&cm(S))l.add(S)}for(let h of l)r.push({id:`worker:restart:${h}`,label:`Restart workers (${h})`,group:"worker",target:h,mutates:!0,confirm:h});for(let[h,S]of Object.entries(e.sites??{})){if(!S||!cm(h))continue;if(S.scheduler||S.schedule){let R=Tr(S)==="laravel";r.push({id:`scheduler:run:${h}`,label:`${R?"Run":"Restart"} scheduler (${h})`,group:"scheduler",target:h,mutates:!0,confirm:h})}}if(e.infrastructure?.compute?.backups?.enabled){if(r.push({id:"backup:run",label:"Run backup now",group:"backup",target:"backup",mutates:!0,confirm:"backup"}),p(e))r.push({id:"backup:restore",label:"Restore latest DB backup",group:"backup",target:"database",mutates:!0,confirm:"restore",danger:!0})}return r}function dm(e,t,r){return ju(t,r).find((a)=>a.id===e)}function f_(e,t){let r=e==="enable"||e==="disable"?`systemctl is-enabled ${t} 2>/dev/null || true`:`systemctl is-active ${t} 2>/dev/null || true`;return["set -o pipefail",`systemctl ${e} ${t}`,r]}function h_(){return`eval "$(cd ${v} && pantry env 2>/dev/null)"`}function fS(e,t,r){let a=`${O(e,t)}/current`;return["set -uo pipefail",`[ -d ${a} ] || { echo "site ${t} has no current release" >&2; exit 1; }`,`cd ${a} && ${h_()} && php artisan ${r}`]}function y_(e,t,r){if(e==="laravel")return fS(t,r,"queue:restart");let a=`${t}-${r}-queue-*.service`;return["set -uo pipefail",`units=$(systemctl list-units --type=service --all --no-legend '${a}' 2>/dev/null | awk '{print $1}')`,`[ -n "$units" ] || { echo "no queue-worker units found for ${r} (${a})" >&2; exit 1; }`,"systemctl restart $units",`systemctl --no-legend --type=service list-units '${a}' 2>/dev/null || true`]}function v_(e,t,r){if(e==="laravel")return fS(t,r,"schedule:run");let a=`${t}-${r}-scheduler.service`;return["set -uo pipefail",`systemctl restart ${a}`,`systemctl is-active ${a} 2>/dev/null || true`]}function b_(){return["set -uo pipefail",`[ -x ${fr} ] || { echo "scheduled backups are not provisioned on this server" >&2; exit 1; }`,fr]}function mS(e,t,r){return{operation:e,command:t,ok:r.success,stdout:Va(r.perInstance?.[0]?.output??""),stderr:Va(r.perInstance?.[0]?.error??r.error??"")}}async function Bu(e,t,r,a={}){let l=e.project.slug,m;try{m=_({config:e})}catch(T){return{operation:r.id,ok:!1,error:`Could not initialize the cloud driver: ${T?.message??T}`}}let h={driver:m,slug:l,environment:t,role:"app"};if(r.group==="deploy"){let T=a.to&&/^[A-Za-z0-9._-]+$/.test(a.to)?a.to:void 0,j=await uS(h,{siteName:r.target,to:T});return mS(r.id,`rollback ${r.target}${T?` → ${T}`:""}`,j)}if(r.id==="backup:restore"){let T=await pS(h,{database:p(e)});return mS(r.id,"db restore",T)}let S=await m.findComputeTargets({slug:l,environment:t,role:"app"});if(!S.length)return{operation:r.id,ok:!1,error:"No app server target was found for this environment."};let R,y;if(r.group==="service"){let[T,...j]=r.id.split(":");R=f_(T,j.join(":")),y=`systemctl ${T} ${r.target}`}else if(r.group==="worker"){let T=Tr(e.sites?.[r.target]??{});R=y_(T,l,r.target),y=T==="laravel"?`queue:restart (${r.target})`:`restart queue units (${r.target})`}else if(r.group==="scheduler"){let T=Tr(e.sites?.[r.target]??{});R=v_(T,l,r.target),y=T==="laravel"?`schedule:run (${r.target})`:`restart scheduler (${r.target})`}else if(r.id==="backup:run")R=b_(),y="ts-cloud backup";else return{operation:r.id,ok:!1,error:"Unknown operation."};let C=await m.runRemoteDeploy({targets:[S[0]],commands:R,comment:`ts-cloud dashboard:${r.id}`,tags:{Project:l,Environment:t,Role:"app"}});return{operation:r.id,command:y,ok:C.success,stdout:Va(C.perInstance?.[0]?.output??""),stderr:Va(C.perInstance?.[0]?.error??C.error??"")}}async function bc(e,t,r){let a=r.trim();if(!a)return{operation:"command",ok:!1,error:"A command is required."};let l;try{l=_({config:e})}catch(R){return{operation:"command",ok:!1,error:`Could not initialize the cloud driver: ${R?.message??R}`}}let m=e.project.slug,h=await l.findComputeTargets({slug:m,environment:t,role:"app"});if(!h.length)return{operation:"command",ok:!1,error:"No app server target was found for this environment."};let S=await l.runRemoteDeploy({targets:[h[0]],commands:["set -o pipefail",a],comment:"ts-cloud dashboard:command",tags:{Project:m,Environment:t,Role:"app"}});return{operation:"command",command:a,ok:S.success,stdout:Va(S.perInstance?.[0]?.output??""),stderr:Va(S.perInstance?.[0]?.error??S.error??"")}}function S_(e,t){return[`${e}-${t}`,`${e}-${t}-queues`,`${e}-${t}-daemons`]}function hS(e,t,r){return r.some((a)=>S_(t,a).includes(e))}function lm(e,t){let{user:r,slug:a}=t;if(r.role==="admin")return e;let l=(e.sites??[]).map((V)=>V.name).filter(Boolean),m=Kg(r,l),h=new Set(m),S=(e.sites??[]).filter((V)=>h.has(V.name)),R=(e.sitesDetail??[]).filter((V)=>h.has(V.name)),y=new Set(R.map((V)=>V.domain).filter(Boolean)),C=(e.serverDeploymentsDetail??e.serverDeployments??[]).filter((V)=>h.has(V.site)),T=(e.serverLogs??[]).filter((V)=>hS(V.source,a,m)),j=(e.security?.tlsCertificates??[]).filter((V)=>y.has(V.domain)),B=(e.activity??[]).filter((V)=>{if(V.type==="deploy")return m.some((W)=>String(V.title??"").startsWith(`${W} `));if(V.type==="log")return hS(String(V.title??"").split(" ")[0],a,m);return!1});return{mode:e.mode,environment:e.environment,environments:e.environments,scoped:!0,server:{name:""},sites:S,sitesDetail:R,workers:(e.workers??[]).filter((V)=>h.has(V.site)),serverDeployments:C.slice(0,5),serverDeploymentsDetail:C.slice(0,50),deploymentsEmptyReason:C.length?void 0:"No deployments have been recorded for your sites yet.",serverLogs:T,serverLogsEmptyReason:T.length?void 0:"No recent log entries for your sites.",security:{tlsCertificates:j,ports:[],firewall:null,authEvents:[]},diagnostics:(e.diagnostics??[]).filter((V)=>["Route conflicts","TLS certificates"].includes(V.name)),activity:B}}function yS(e,t){if(t.role==="admin")return e;let r=new Set(Kg(t,Object.keys(e.sites??{})));return{project:{name:e.project?.name},environment:e.environment,environments:e.environments,sites:Object.fromEntries(Object.entries(e.sites??{}).filter(([a])=>r.has(a)))}}function vS(e){let t=new RegExp("[\\u007F-\\uFFFF]","g");return JSON.stringify(e).replace(t,(r)=>`\\u${r.charCodeAt(0).toString(16).padStart(4,"0")}`)}var w_=new Set(["name","ssl","env","redirects","aliases","domain","path"]),bS={build:"build runs as a shell command on the server",start:"start runs as a shell command on the server",root:"root is a filesystem path on the shared server",port:"ports are allocated by the server owner",type:"the deploy type is set by the server owner",php:"the PHP runtime is set by the server owner"};function wS(e){let t=Object.keys(e).filter((l)=>e[l]!==void 0),r=t.filter((l)=>(l in bS));if(r.length)return{ok:!1,error:`Only the server owner can change ${r.map((m)=>`${m} (${bS[m]})`).join(", ")}.`};let a=t.filter((l)=>!w_.has(l));if(a.length)return{ok:!1,error:`Only the server owner can change ${a.join(", ")}.`};return{ok:!0}}function zu(e){return String(e??"").trim().toLowerCase().replace(/\.$/,"")}function SS(e){let t=String(e??"/").trim();if(!t||t==="/")return"/";return(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")||"/"}function k_(e){let t=[zu(e?.domain)];if(Array.isArray(e?.aliases))t.push(...e.aliases.map(zu));return t.filter(Boolean)}function kS({siteName:e,body:t,sites:r,ownSites:a}){let l=r[e]??{},m=new Set(a),h=new Set;if(t.domain!==void 0)h.add(zu(t.domain));if(Array.isArray(t.aliases))for(let R of t.aliases)h.add(zu(R));if(h.delete(""),h.size===0)return{ok:!0};let S=SS(t.path!==void 0?t.path:l.path);for(let[R,y]of Object.entries(r)){if(R===e||m.has(R))continue;let C=SS(y?.path);for(let T of k_(y)){if(!h.has(T))continue;if(C===S)return{ok:!1,error:`${T}${S==="/"?"":S} is already served by another site on this server.`}}}return{ok:!0}}class Sc{maxAttempts;lockoutMs;windowMs;attempts=new Map;constructor(e=8,t=900000,r=900000){this.maxAttempts=e;this.lockoutMs=t;this.windowMs=r}key(e,t){return`${e.trim().toLowerCase()}\x00${t}`}check(e,t,r=Date.now()){let a=this.attempts.get(this.key(e,t));if(!a?.until)return{allowed:!0};if(r>=a.until)return this.attempts.delete(this.key(e,t)),{allowed:!0};return{allowed:!1,retryAfterSeconds:Math.ceil((a.until-r)/1000)}}recordFailure(e,t,r=Date.now()){let a=this.key(e,t),l=this.attempts.get(a),h=!l||r-l.last>this.windowMs?1:l.count+1,S={count:h,last:r};if(h>=this.maxAttempts)S.until=r+this.lockoutMs;this.attempts.set(a,S)}recordSuccess(e,t){this.attempts.delete(this.key(e,t))}prune(e=Date.now()){for(let[t,r]of this.attempts)if(r.until?e>=r.until:e-r.last>this.windowMs)this.attempts.delete(t)}get size(){return this.attempts.size}}var ES=new Set([22,80,443]);function wc(e){return Number.isInteger(e)&&e>=1&&e<=65535}function hs(e){return[...new Set(e.filter((t)=>wc(t)&&!ES.has(t)))].sort((t,r)=>t-r)}function RS(e,t,r=[]){if(!wc(t))throw Error("Port must be an integer between 1 and 65535.");if(ES.has(t))throw Error(`Port ${t} (SSH/HTTP/HTTPS) is always open and is not managed here.`);return CS({configText:e,ports:hs([...r,t])})}function AS(e,t,r=[]){return CS({configText:e,ports:hs(r.filter((a)=>a!==t))})}function IS(e,t,r,a,l){let m=e.slice(t,r),h=new RegExp(`\\b${a}\\s*:\\s*\\${l}`).exec(m);if(!h)return null;let S=t+h.index,R=e.indexOf(l,S);return{propStart:S,open:R,close:hc(e,R,l,l==="{"?"}":"]")}}function um(e){return`allowedPorts: [${e.join(", ")}]`}function CS(e){let{configText:t}=e,r=hs(e.ports),a=/\bcompute\s*:\s*{/.exec(t);if(!a)throw Error("Could not find infrastructure.compute in the cloud config.");let l=t.indexOf("{",a.index),m=hc(t,l,"{","}"),h=IS(t,l+1,m,"firewall","{");if(h){let C=IS(t,h.open+1,h.close,"allowedPorts","[");if(C){let V=C.propStart;while(V>0&&t[V-1]!==`
|
|
649
649
|
`&&/\s/.test(t[V-1]))V--;let W=t.slice(V,C.propStart);return`${t.slice(0,V)}${W}${um(r)}${t.slice(C.close+1)}`}let T=t.slice(0,h.close).trimEnd(),j=t.slice(h.close),B=T.endsWith(",")||T.endsWith("{")?"":",";return`${T}${B}
|
|
650
650
|
${um(r)},
|
|
651
651
|
${j}`}let S=t.slice(0,m).trimEnd(),R=t.slice(m),y=S.endsWith(",")||S.endsWith("{")?"":",";return`${S}${y}
|
|
@@ -655,7 +655,7 @@ EOF`,'echo "DISKPCT=${DISKPCT:-0}"','echo "DISKUSEDG=${DISKUSEDG:-0}"','echo "DI
|
|
|
655
655
|
},
|
|
656
656
|
${R}`}class pm{client;region;constructor(e="us-east-1"){this.region=e,this.client=new n}async getTraceSummaries(e){let t={StartTime:Math.floor(e.startTime.getTime()/1000),EndTime:Math.floor(e.endTime.getTime()/1000),TimeRangeType:"Event",Sampling:!1};if(e.filterExpression)t.FilterExpression=e.filterExpression;if(e.nextToken)t.NextToken=e.nextToken;let r=await this.client.request({service:"xray",region:this.region,method:"POST",path:"/TraceSummaries",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return{summaries:r?.TraceSummaries??[],nextToken:r?.NextToken}}async batchGetTraces(e){if(!e.length)return[];return(await this.client.request({service:"xray",region:this.region,method:"POST",path:"/Traces",headers:{"Content-Type":"application/json"},body:JSON.stringify({TraceIds:e.slice(0,5)})}))?.Traces??[]}}var PS=65536;function Hr(e){return e.length<=PS?e:`${e.slice(0,PS)}
|
|
657
657
|
|
|
658
|
-
[output truncated]`}function mm(e,t){return e.environments?.[t]?.app}function fm(e,t,r){let a=[],l=mm(e,t);a.push({id:"redeploy",label:"Redeploy current build",group:"deploy",target:"app",mutates:!0,confirm:"redeploy"}),a.push({id:"rollback",label:"Roll back to previous build",group:"deploy",target:"app",mutates:!0,confirm:"rollback",danger:!0});let m=r.maintenance?.enabled;if(m!==!0)a.push({id:"maintenance:on",label:"Enable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"maintenance",danger:!0});if(m!==!1)a.push({id:"maintenance:off",label:"Disable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"live"});if(l?.assets||r.assetsInfo)a.push({id:"assets:invalidate",label:"Invalidate CDN cache",group:"assets",target:"assets",mutates:!0,confirm:"invalidate"});if(l?.database?.connection==="aurora-serverless")a.push({id:"db:scale",label:"Scale Aurora capacity",group:"database",target:"database",mutates:!0,confirm:"scale",inputs:[{name:"min",label:"Min ACUs",placeholder:String(l.database.minCapacity??0.5)},{name:"max",label:"Max ACUs",placeholder:String(l.database.maxCapacity??4)}]});for(let h of r.queues??[]){let S=String(h?.name??"").trim();if(S&&/^[A-Za-z0-9_-]+$/.test(S))a.push({id:`queue:purge:${S}`,label:`Purge queue (${S})`,group:"queue",target:S,mutates:!0,confirm:S,danger:!0})}return a}function _S(e,t,r,a){return fm(t,r,a).find((l)=>l.id===e)}async function k_(e,t,r){try{let a=new f(r),{Stacks:l}=await a.describeStacks({stackName:qt(e,t)}),m={};for(let R of l?.[0]?.Outputs??[])if(R.OutputKey)m[R.OutputKey]=R.OutputValue??"";let h=m.AssetsCdnDomain;if(!h)return null;return(await new I(r).findDistributionByDomain(h))?.Id??null}catch{return null}}async function TS(e,t,r,a={}){try{if(r.id==="redeploy")return await ln(e,t),{operation:r.id,command:"serverless redeploy",ok:!0,stdout:"Redeploy complete."};if(r.id==="rollback")return await un(e,t),{operation:r.id,command:"serverless rollback",ok:!0,stdout:"Rollback complete."};if(r.id==="maintenance:on")return await nr(e,t,!0),{operation:r.id,command:"maintenance on",ok:!0,stdout:"Application is now in maintenance mode."};if(r.id==="maintenance:off")return await nr(e,t,!1),{operation:r.id,command:"maintenance off",ok:!0,stdout:"Application is live."};if(r.id==="db:scale"){let l=Number(a.min),m=Number(a.max);if(!Number.isFinite(l)||!Number.isFinite(m)||l<=0||m<l)return{operation:r.id,ok:!1,error:"Provide valid Aurora capacities (0 < min ≤ max)."};return await mf(e,t,l,m),{operation:r.id,command:`db:scale ${l}-${m} ACU`,ok:!0,stdout:`Scaling applied (${l}-${m} ACUs); takes effect shortly.`}}if(r.id==="assets:invalidate"){let l=await Ar(e,t),m=await k_(e,t,l.region);if(!m)return{operation:r.id,ok:!1,error:"Could not resolve the asset CloudFront distribution for this environment."};let S=await new I(l.region).invalidateAll(m);return{operation:r.id,command:`cloudfront invalidate ${m} /*`,ok:!0,stdout:`Invalidation ${S?.Id??"created"} for ${m} (/*).`}}if(r.group==="queue"&&r.id.startsWith("queue:purge:")){let l=r.target,m=await Ar(e,t),h=new se(m.region),S=`${m.slug}-${t}-${l}`,{QueueUrl:R}=await h.getQueueUrl(S);return await h.purgeQueue(R),{operation:r.id,command:`sqs purge ${S}`,ok:!0,stdout:`Purged queue ${S}.`}}return{operation:r.id,ok:!1,error:"Unknown or unavailable serverless operation."}}catch(l){return{operation:r.id,ok:!1,error:Hr(l?.message??String(l))}}}async function xS(e,t,r){let a=r.trim();if(!a)return{operation:"command",ok:!1,error:"A command is required."};try{let l=await tt(e,t,a);return{operation:"command",command:a,ok:!0,stdout:Hr(l||"(no output)")}}catch(l){return{operation:"command",command:a,ok:!1,error:Hr(l?.message??String(l))}}}var hm="No dead-letter queue is provisioned for this environment.";async function ym(e,t,r){try{let{QueueUrl:a}=await e.getQueueUrl(`${t}-${r}-dlq`);return a}catch{return null}}async function DS(e,t,r=10){try{let a=await Ar(e,t),l=new se(a.region),m=await ym(l,a.slug,t);if(!m)return{ok:!1,messages:[],error:hm};return{ok:!0,messages:((await l.receiveMessages({queueUrl:m,maxMessages:Math.min(10,Math.max(1,r)),waitTimeSeconds:1,visibilityTimeout:2})).Messages??[]).map((R)=>({id:R.MessageId,receiptHandle:R.ReceiptHandle,body:Hr(String(R.Body??""))}))}}catch(a){return{ok:!1,messages:[],error:Hr(a?.message??String(a))}}}async function OS(e,t,r={}){try{let a=await Ar(e,t),l=mm(e,t),h=(l?Xt(l,a.slug,t):[]).map((B)=>B.name.replace(`${a.slug}-${t}-`,"")),S=r.targetQueue&&h.includes(r.targetQueue)?r.targetQueue:h[0];if(!S)return{operation:"dlq:redrive",ok:!1,error:"No source queue is configured to redrive into."};let R=new se(a.region),y=await ym(R,a.slug,t);if(!y)return{operation:"dlq:redrive",ok:!1,error:hm};let{QueueUrl:C}=await R.getQueueUrl(`${a.slug}-${t}-${S}`),T=Math.min(50,Math.max(1,r.max??10)),j=0;while(j<T){let V=(await R.receiveMessages({queueUrl:y,maxMessages:Math.min(10,T-j),waitTimeSeconds:1,visibilityTimeout:30})).Messages??[];if(!V.length)break;for(let W of V)await R.sendMessage({queueUrl:C,messageBody:String(W.Body??"")}),await R.deleteMessage(y,W.ReceiptHandle),j++}return{operation:"dlq:redrive",command:`redrive → ${S}`,ok:!0,stdout:`Moved ${j} message(s) from the DLQ to ${S}.`}}catch(a){return{operation:"dlq:redrive",ok:!1,error:Hr(a?.message??String(a))}}}async function $S(e,t){try{let r=await Ar(e,t),a=new se(r.region),l=await ym(a,r.slug,t);if(!l)return{operation:"dlq:purge",ok:!1,error:hm};return await a.purgeQueue(l),{operation:"dlq:purge",command:"sqs purge dlq",ok:!0,stdout:"Dead-letter queue purged."}}catch(r){return{operation:"dlq:purge",ok:!1,error:Hr(r?.message??String(r))}}}function NS(e,t){let r=mm(e,t);if(!r?.secrets)return[];return Array.isArray(r.secrets)?r.secrets.map((a)=>({key:a.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),secretId:a})):Object.entries(r.secrets).map(([a,l])=>({key:a,secretId:String(l)}))}async function jS(e,t,r,a){if(!r.trim())return{operation:"secret:set",ok:!1,error:"A secret id is required."};try{let l=await Ar(e,t),m=new z(l.region);try{await m.putSecretValue({SecretId:r,SecretString:a})}catch{await m.createSecret({Name:r,SecretString:a})}return{operation:"secret:set",command:`secret set ${r}`,ok:!0,stdout:`Secret ${r} updated. Redeploy to apply it to the functions.`}}catch(l){return{operation:"secret:set",ok:!1,error:Hr(l?.message??String(l))}}}async function BS(e,t,r){if(!r.trim())return{operation:"secret:delete",ok:!1,error:"A secret id is required."};try{let a=await Ar(e,t);return await new z(a.region).deleteSecret({SecretId:r,RecoveryWindowInDays:7}),{operation:"secret:delete",command:`secret delete ${r}`,ok:!0,stdout:`Secret ${r} scheduled for deletion (recoverable for 7 days).`}}catch(a){return{operation:"secret:delete",ok:!1,error:Hr(a?.message??String(a))}}}var I_=new Set(["http","queue","cli"]);async function MS(e,t,r,a){if(!I_.has(r))return{operation:"function:config",ok:!1,error:`Unknown function mode '${r}'.`};let l=a.memory==null?void 0:Number(a.memory),m=a.timeout==null?void 0:Number(a.timeout);if(l!=null&&(!Number.isInteger(l)||l<128||l>10240))return{operation:"function:config",ok:!1,error:"Memory must be an integer between 128 and 10240 MB."};if(m!=null&&(!Number.isInteger(m)||m<1||m>900))return{operation:"function:config",ok:!1,error:"Timeout must be an integer between 1 and 900 seconds."};if(l==null&&m==null)return{operation:"function:config",ok:!1,error:"Provide a memory and/or timeout value."};try{let h=await Ar(e,t),S=new b(h.region),R=`${h.slug}-${t}-${r}`;await S.updateFunctionConfiguration({FunctionName:R,...l!=null?{MemorySize:l}:{},...m!=null?{Timeout:m}:{}});let y=[l!=null?`${l} MB`:"",m!=null?`${m}s`:""].filter(Boolean).join(", ");return{operation:"function:config",command:`update ${R} (${y})`,ok:!0,stdout:`Updated ${R}: ${y}.`}}catch(h){return{operation:"function:config",ok:!1,error:Hr(h?.message??String(h))}}}var gm=[{key:"http-errors",label:"HTTP function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"errors / 5 min"},{key:"http-throttles",label:"HTTP function throttles",namespace:"AWS/Lambda",metricName:"Throttles",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"throttles / 5 min"},{key:"http-duration",label:"HTTP function duration (avg)",namespace:"AWS/Lambda",metricName:"Duration",statistic:"Average",comparison:"GreaterThanThreshold",fnMode:"http",unit:"ms"},{key:"http-concurrency",label:"HTTP concurrent executions",namespace:"AWS/Lambda",metricName:"ConcurrentExecutions",statistic:"Maximum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"concurrent"},{key:"queue-errors",label:"Queue function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"queue",unit:"errors / 5 min"}];function E_(e){return gm.find((t)=>t.key===e)}async function LS(e,t){try{let r=await Ar(e,t);return{ok:!0,alarms:await new oe(r.region).describeAlarms({AlarmNamePrefix:`${r.slug}-${t}-`,MaxRecords:100}),presets:gm}}catch(r){return{ok:!1,alarms:[],presets:gm,error:Hr(r?.message??String(r))}}}async function FS(e,t,r,a){let l=E_(r);if(!l)return{operation:"alarm:create",ok:!1,error:`Unknown alarm metric '${r}'.`};if(!Number.isFinite(a)||a<0)return{operation:"alarm:create",ok:!1,error:"Provide a non-negative threshold."};try{let m=await Ar(e,t),h=new oe(m.region),S=`${m.slug}-${t}-${l.key}`,R=l.fnMode?[{Name:"FunctionName",Value:`${m.slug}-${t}-${l.fnMode}`}]:[];return await h.putMetricAlarm({AlarmName:S,Namespace:l.namespace,MetricName:l.metricName,ComparisonOperator:l.comparison,Threshold:a,EvaluationPeriods:1,Period:300,Statistic:l.statistic,Dimensions:R,AlarmDescription:`ts-cloud: ${l.label} > ${a} ${l.unit}`}),{operation:"alarm:create",command:`alarm ${S}`,ok:!0,stdout:`Alarm ${S} armed at ${a} ${l.unit}.`}}catch(m){return{operation:"alarm:create",ok:!1,error:Hr(m?.message??String(m))}}}async function zS(e,t,r){try{let a=await Ar(e,t);if(!r.startsWith(`${a.slug}-${t}-`))return{operation:"alarm:delete",ok:!1,error:"Refusing to delete an alarm outside this environment."};return await new oe(a.region).deleteAlarms([r]),{operation:"alarm:delete",command:`delete alarm ${r}`,ok:!0,stdout:`Alarm ${r} deleted.`}}catch(a){return{operation:"alarm:delete",ok:!1,error:Hr(a?.message??String(a))}}}function R_(e){let t=e.HasFault?"fault":e.HasError?"error":e.HasThrottle?"throttle":"ok";return{id:String(e.Id??""),timestamp:Number.isFinite(Number(e.StartTime))?new Date(Number(e.StartTime)*1000).toISOString():void 0,durationMs:Math.round((e.Duration??0)*1000),responseMs:Math.round((e.ResponseTime??0)*1000),status:t,method:e.Http?.HttpMethod??"-",url:e.Http?.HttpURL??"-",httpStatus:e.Http?.HttpStatus??0}}async function Uu(e,t,r=30){try{let a=await Ar(e,t),l=new pm(a.region),m=new Date,h=new Date(m.getTime()-Math.min(360,Math.max(1,r))*60000),S=`${a.slug}-${t}-http`,R=await l.getTraceSummaries({startTime:h,endTime:m,filterExpression:`service("${S}")`});if(!R.summaries.length)R=await l.getTraceSummaries({startTime:h,endTime:m});return{ok:!0,traces:R.summaries.slice(0,100).map(R_)}}catch(a){return{ok:!1,traces:[],error:Hr(a?.message??String(a))}}}async function vm(e,t,r){try{let a=await Ar(e,t),l=`${a.slug}-${t}-scheduler`;if(r==="run"){let h=await tt(e,t,"schedule:run");return{operation:"scheduler:run",command:"schedule:run",ok:!0,stdout:Hr(h||"Scheduler run triggered.")}}let m=new ar(a.region);if(r==="enable")await m.enableRule({Name:l});else await m.disableRule({Name:l});return{operation:`scheduler:${r}`,command:`${r} ${l}`,ok:!0,stdout:`Scheduler rule ${l} ${r}d.`}}catch(a){return{operation:`scheduler:${r}`,ok:!1,error:Hr(a?.message??String(a))}}}function US(e,t,r){let a=(Array.isArray(r)?r:String(r??"").split(",")).map(String).filter(Boolean);if(!a.length){if(t)return;let m=e.map((h)=>h.id);return m.length?m:["__no_authorized_telemetry_resources__"]}let l=a.map((m)=>e.find((h)=>h.id===m||h.slug===m)?.id).filter((m)=>!!m);if(l.length!==a.length)throw Error("One or more telemetry resources are outside your authorized scope.");return[...new Set(l)]}import{createHash as VS}from"node:crypto";class WS{now;entries=new Map;constructor(e=Date.now){this.now=e}async getOrCreate(e,t,r,a){let l=this.entries.get(e);if(!r&&l&&l.expiresAt>this.now())return{value:await l.promise,cached:!0};let m=a().catch((h)=>{throw this.entries.delete(e),h});return this.entries.set(e,{expiresAt:this.now()+t,promise:m}),{value:await m,cached:!1}}invalidate(e){for(let t of this.entries.keys())if(t.startsWith(e))this.entries.delete(t)}}class HS{now;lastRun=new Map;constructor(e=Date.now){this.now=e}shouldRun(e,t,r=!1){let a=this.now(),l=this.lastRun.get(e);if(!r&&l!=null&&a-l<t)return!1;return this.lastRun.set(e,a),!0}}var KS=new WS,A_=new HS,C_=2000,P_=3600000;function __(e,t){if(e.kind==="log"&&!t.collectLogs)return!1;if(e.kind==="trace"&&!t.collectTraces)return!1;if((e.kind==="request"||e.name.startsWith("request."))&&!t.collectRequestAnalytics)return!1;if(!["log","trace","request"].includes(e.kind)&&!e.name.startsWith("request."))return!0;let r=e.requestId??e.traceId??`${e.source}\x00${e.workloadId??""}\x00${e.timestamp}`;return Number.parseInt(VS("sha256").update(r).digest("hex").slice(0,8),16)/4294967295<=t.samplingRate}function Kr(...e){return`telemetry:${VS("sha256").update(e.map((t)=>String(t??"")).join("\x00")).digest("hex").slice(0,40)}`}function kc(e,t,r,a){if(!a)return;return e.listResources(t,r).find((l)=>l.slug===a)?.id}function T_(e,t){let r=String(t??"").toLowerCase();if(["debug","info","warn","warning","error","fatal"].includes(r))return r==="fatal"?"error":r;return/fatal|panic|exception|error/i.test(e)?"error":/warn|timeout|throttl|retr(?:y|ies)/i.test(e)?"warning":"info"}function qS(e){let t=e.timestamp&&Number.isFinite(new Date(e.timestamp).getTime())?new Date(e.timestamp).toISOString():new Date().toISOString(),r={};try{let W=JSON.parse(e.message);if(W&&typeof W==="object"&&!Array.isArray(W))r=W}catch{}let a=Object.fromEntries(Object.entries(r).filter(([W])=>!/^(?:body|requestBody|responseBody|headers|authorization|cookie|cookies|query|queryString)$/i.test(W))),l=String(r.requestId??r.request_id??r["x-request-id"]??"")||void 0,m=String(r.traceId??r.trace_id??r["x-amzn-trace-id"]??"")||void 0,h=Number(r.durationMs??r.duration_ms??r.latencyMs??r.latency_ms),S=Number(r.statusCode??r.status_code??r.status),R=String(r.method??r.httpMethod??"")||void 0,y=Ti(String(r.pathTemplate??r.path??r.url??"")||void 0),C=String(r.releaseId??r.release_id??"")||void 0,T=String(r.deploymentId??r.deployment_id??"")||void 0,j={projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,source:e.source,timestamp:t,requestId:l,traceId:m,releaseId:C,deploymentId:T,workloadId:e.workloadId},B=Object.keys(r).length?JSON.stringify(a):e.message,V=[{...j,id:Kr(e.source,e.name,t,B),kind:"log",name:e.name,level:T_(B,r.level),message:B,attributes:a}];if(R&&y&&Number.isFinite(S)){if(V.push({...j,id:Kr("request",l,t,R,y,S),kind:"request",name:"http.request",method:R,pathTemplate:y,host:r.host,statusCode:S,durationMs:Number.isFinite(h)?h:void 0,bytesIn:Number(r.bytesIn)||void 0,bytesOut:Number(r.bytesOut)||void 0,region:r.region,cacheResult:r.cacheResult??r.cache,upstream:r.upstream,attributes:{userAgentFamily:r.userAgentFamily??"",protocol:r.protocol??""}}),Number.isFinite(h))V.push({...j,id:Kr("request-duration",l,t),kind:"metric",name:"request.duration",value:h,unit:"ms",attributes:{method:R,pathTemplate:y,statusCode:S}});if(V.push({...j,id:Kr("request-count",l,t),kind:"metric",name:"request.count",value:1,unit:"count",attributes:{method:R,pathTemplate:y,statusCode:S}}),S>=500)V.push({...j,id:Kr("request-error",l,t),kind:"metric",name:"request.error",value:1,unit:"count",attributes:{method:R,pathTemplate:y,statusCode:S}})}return V}async function x_(e){let t=new ft(e.controlPlane),r=Gt(e.controlPlane,e.projectId),a=new Date,l=[],m=[],h={projectId:e.projectId,environmentId:e.environmentId},S=M(e.config);try{let j=(S==="serverless"?await pn(e.config,e.environment):await il(e.config,e.environment,{includeSiteHealth:e.includeSiteHealth,telemetryOnly:e.lightweight}))??{};if(S==="serverless"){for(let V of j.functionsDetail??[]){let W=kc(e.controlPlane,e.projectId,e.environmentId,V.key),Y={...h,resourceId:W,source:"cloudwatch",timestamp:a.toISOString(),workloadId:V.name,attributes:{provider:"aws",functionName:V.name,aggregationWindow:"24h"}};for(let[te,le,X]of[["snapshot.traffic.requests_24h",V.invocations,"count"],["snapshot.errors.count_24h",V.errors,"count"],["snapshot.latency.p50_24h",V.p50,"ms"],["snapshot.latency.p95_24h",V.p95,"ms"],["snapshot.latency.p99_24h",V.p99,"ms"],["snapshot.saturation.throttles_24h",V.throttles,"count"],["snapshot.memory.max_24h",V.maxMem,"MB"]])if(Number.isFinite(Number(le)))l.push({...Y,id:Kr("cloudwatch",V.name,te,a.toISOString()),kind:"metric",name:te,value:Number(le),unit:X})}try{let V=await Ar(e.config,e.environment),W=new oe(V.region),Y=new Date(a.getTime()-3600000),te=300;for(let le of V.functions){let X=[{Name:"FunctionName",Value:le.name}],[ce,Ee,Re,de,Me]=await Promise.all([W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Sum"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Errors",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Sum"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Duration",Dimensions:X,StartTime:Y,EndTime:a,Period:300,ExtendedStatistics:["p50","p95","p99"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Throttles",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Sum"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"ConcurrentExecutions",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Maximum"]})]),ae=kc(e.controlPlane,e.projectId,e.environmentId,le.mode),Le=(Je,gt,Jt,ot)=>{for(let Pt of Je){let Qt=Pt.Timestamp&&Number.isFinite(new Date(Pt.Timestamp).getTime())?new Date(Pt.Timestamp).toISOString():void 0,lt=Jt(Pt);if(Qt&<!=null&&Number.isFinite(lt))l.push({...h,resourceId:ae,id:Kr("cloudwatch-series",le.name,gt,Qt),kind:"metric",source:"cloudwatch",name:gt,timestamp:Qt,value:lt,unit:ot,workloadId:le.name,region:V.region,attributes:{provider:"aws",functionName:le.name,aggregationWindow:"300s"}})}};Le(ce,"traffic.requests",(Je)=>Je.Sum,"count"),Le(Ee,"errors.count",(Je)=>Je.Sum,"count"),Le(Re,"latency.p50",(Je)=>Je.Percentiles?.p50,"ms"),Le(Re,"latency.p95",(Je)=>Je.Percentiles?.p95,"ms"),Le(Re,"latency.p99",(Je)=>Je.Percentiles?.p99,"ms"),Le(de,"saturation.throttles",(Je)=>Je.Sum,"count"),Le(Me,"saturation.concurrency",(Je)=>Je.Maximum,"count")}}catch(V){m.push({source:"cloudwatch:series",message:V instanceof Error?V.message:String(V)})}for(let V of(j.serverlessLogs??[]).slice(0,C_))l.push(...qS({...h,source:`cloudwatch:${V.source}`,name:`${V.source}.log`,timestamp:V.timestamp,message:String(V.message),resourceId:kc(e.controlPlane,e.projectId,e.environmentId,V.source)}));for(let V of j.queuesDetail??[]){let W={...h,source:"cloudwatch",timestamp:a.toISOString(),attributes:{queue:V.name}};l.push({...W,id:Kr("queue-depth",V.name,a.toISOString()),kind:"metric",name:"queue.depth",value:Number(V.visible??V.depth??0),unit:"count"}),l.push({...W,id:Kr("queue-inflight",V.name,a.toISOString()),kind:"metric",name:"queue.inflight",value:Number(V.inFlight??0),unit:"count"})}let B=await Uu(e.config,e.environment,30);if(!B.ok)m.push({source:"xray",message:B.error??"X-Ray traces are unavailable."});for(let V of B.traces)l.push({...h,id:Kr("xray",V.id),kind:"trace",source:"xray",name:"http.trace",timestamp:V.timestamp??a.toISOString(),traceId:V.id,durationMs:V.durationMs,statusCode:V.httpStatus,method:V.method,pathTemplate:V.url,attributes:{status:V.status,responseMs:V.responseMs}})}else{let B=j.systemMetrics;if(j.metricsUnavailable||!B)m.push({source:"host",message:"The host metrics probe is unavailable."});else{let V=Number(B.memTotalMb)>0?Number(B.memUsedMb)/Number(B.memTotalMb)*100:0,W=Number(B.swapTotalMb)>0?Number(B.swapUsedMb)/Number(B.swapTotalMb)*100:0,Y=[["host.load",Number(B.load),"load"],["host.load.5m",Number(B.load5),"load"],["host.load.15m",Number(B.load15),"load"],["host.cpu.capacity",Number(B.cpus),"count"],["host.cpu.used_percent",Number(B.cpuUsedPct),"percent"],["host.memory.used",Number(B.memUsedMb)*1024*1024,"bytes"],["host.memory.total",Number(B.memTotalMb)*1024*1024,"bytes"],["host.memory.available",Number(B.memAvailableMb)*1024*1024,"bytes"],["host.memory.cache",Number(B.memCacheMb)*1024*1024,"bytes"],["host.memory.used_percent",V,"percent"],["host.swap.used",Number(B.swapUsedMb)*1024*1024,"bytes"],["host.swap.total",Number(B.swapTotalMb)*1024*1024,"bytes"],["host.swap.used_percent",W,"percent"],["host.disk.used_percent",Number(B.diskUsedPct),"percent"],["host.disk.used",Number(B.diskUsedGb)*1073741824,"bytes"],["host.disk.total",Number(B.diskTotalGb)*1073741824,"bytes"],["host.disk.inode_used_percent",Number(B.inodeUsedPct),"percent"],["host.network.rx",Number(B.networkRxBytes),"bytes"],["host.network.tx",Number(B.networkTxBytes),"bytes"],["host.network.rx_rate",Number(B.networkRxBytesPerSec),"bytes_per_second"],["host.network.tx_rate",Number(B.networkTxBytesPerSec),"bytes_per_second"],["host.network.rx_today",Number(B.networkRxBytesToday),"bytes"],["host.network.tx_today",Number(B.networkTxBytesToday),"bytes"],["host.network.rx_month",Number(B.networkRxBytesMonth),"bytes"],["host.network.tx_month",Number(B.networkTxBytesMonth),"bytes"],["host.processes",Number(B.processes),"count"],["host.uptime",Number(B.uptimeSeconds),"seconds"]];for(let[te,le,X]of Y)if(Number.isFinite(le))l.push({...h,id:Kr("host",te,a.toISOString()),kind:"metric",source:"host",name:te,timestamp:a.toISOString(),value:le,unit:X});for(let te of j.siteHealth??[]){let le=String(te.project??e.config.project.slug),X=String(te.name),ce=X.startsWith(`${le}:`)?X.slice(le.length+1):X,Ee=`site:${le}:${ce}`,Re=kc(e.controlPlane,e.projectId,e.environmentId,X),de={...h,resourceId:Re,source:Ee,timestamp:te.checkedAt||a.toISOString(),host:te.route,attributes:{project:le,site:ce,route:String(te.route),status:String(te.status)}},Me=[["site.health.up",te.status==="live"?1:0,"boolean"],["site.http.status",Number(te.httpStatus),"status"],["site.response.time",Number(te.responseMs),"ms"]];if(te.tlsDaysRemaining!=null)Me.push(["site.tls.days_remaining",Number(te.tlsDaysRemaining),"days"]);for(let[ae,Le,Je]of Me)if(Number.isFinite(Le))l.push({...de,id:Kr(Ee,ae,de.timestamp),kind:"metric",name:ae,value:Le,unit:Je})}}}}catch(j){m.push({source:S==="serverless"?"aws":"host",message:j instanceof Error?j.message:String(j)})}{let j=e.config.infrastructure?.compute?.monitoring,B=typeof j==="object"?j?.egressEndpoints:void 0,V=await ba(B,{now:a.toISOString()});m.push(...V.errors);for(let W of V.metrics)l.push({...h,id:Kr(W.attributes.source,W.name,W.timestamp),kind:"metric",source:`egress:${W.attributes.source}`,name:W.name,timestamp:W.timestamp,value:W.value,unit:W.unit,attributes:W.attributes})}if(!e.lightweight)try{let j=await ie(e.config,e.environment),B=new fe(e.config,e.environment,{inventory:async()=>j});for(let V of j.workloads){let W=kc(e.controlPlane,e.projectId,e.environmentId,V.links.service),Y={...h,resourceId:W,source:`runtime:${V.provider}`,timestamp:a.toISOString(),workloadId:V.id,releaseId:V.links.release,attributes:{status:V.status,provider:V.provider,service:V.links.service??""}};if(l.push({...Y,id:Kr(V.id,"health",a.toISOString()),kind:"metric",name:"health.up",value:V.status==="running"?1:0,unit:"boolean"}),l.push({...Y,id:Kr(V.id,"restarts",a.toISOString()),kind:"metric",name:"saturation.restarts",value:V.restartCount??0,unit:"count"}),V.resources?.memoryBytes!=null)l.push({...Y,id:Kr(V.id,"memory",a.toISOString()),kind:"metric",name:"runtime.memory.used",value:V.resources.memoryBytes,unit:"bytes"});if(!V.capabilities.logs.supported)continue;try{let te=await B.logs(V.id,{limit:100,since:new Date(a.getTime()-300000)});for(let le of te.lines)l.push(...qS({...h,resourceId:W,source:`runtime:${V.provider}`,name:`${V.links.service??V.name}.log`,timestamp:le.timestamp,message:le.message,workloadId:V.id}))}catch(te){m.push({source:`runtime:${V.provider}`,message:te instanceof Error?te.message:String(te)})}}for(let V of j.sources.filter((W)=>W.status!=="fresh"))m.push({source:V.id,message:V.message??`Runtime source is ${V.status}.`})}catch(j){m.push({source:"runtime",message:j instanceof Error?j.message:String(j)})}if(!e.lightweight)for(let j of e.controlPlane.listEvents({projectId:e.projectId,limit:1000})){let B=j.payload;l.push({...h,id:`telemetry:event:${j.id}`,resourceId:j.resourceId,kind:"event",source:"control-plane",name:j.type,timestamp:j.createdAt,level:j.level,message:j.type,deploymentId:j.operationId,releaseId:typeof B.releaseId==="string"?B.releaseId:void 0,traceId:j.correlationId,attributes:B})}let R=l.filter((j)=>__(j,r)).map((j)=>({...j,sampled:r.samplingRate<1&&(j.kind==="log"||j.kind==="trace"||j.kind==="request"||j.name.startsWith("request."))})),y=t.appendMany(R).length;if(A_.shouldRun(e.projectId,P_,!e.lightweight))t.enforceRetention(r,e.projectId);let C=t.status(e.projectId,e.environmentId,r.rawDays,r.samplingRate);for(let j of m)if(!C.some((B)=>B.source===j.source))C.push({source:j.source,freshness:"unavailable",samplingRate:r.samplingRate,retentionDays:r.rawDays,estimatedDailyBytes:0,message:j.message});let T=a.toISOString();return e.controlPlane.setSetting(`telemetry.collection:${e.projectId}:${e.environmentId??"all"}`,{generatedAt:T,errors:m,statuses:C,policy:r}),{collected:y,cached:!1,generatedAt:T,statuses:C,errors:m,policy:r}}async function bm(e){let r=`${`${e.projectId}:${e.environmentId??"all"}:${e.environment}`}:${e.lightweight?"lightweight":"full"}`,a=M(e.config)==="serverless"?300000:60000,l=await KS.getOrCreate(r,a,!!e.force,()=>x_(e));return{...l.value,cached:l.cached}}function JS(e){KS.invalidate(`${e}:`)}function GS(e,t={}){let r=t.shell||(process.platform==="win32"?"powershell.exe":"bash"),a=Bun.spawn([r,"-i"],{stdin:"pipe",stdout:"pipe",stderr:"pipe",cwd:t.cwd,env:{...process.env,TERM:"xterm-256color",PS1:"\\w $ "}}),l=new TextDecoder,m=async(h)=>{if(!h)return;let S=h.getReader();try{for(;;){let{done:R,value:y}=await S.read();if(R)break;if(y)e(l.decode(y))}}catch{}};if(m(a.stdout),m(a.stderr),t.onExit)a.exited.then((h)=>t.onExit(h)).catch(()=>{});return{write(h){try{a.stdin.write(h),a.stdin.flush()}catch{}},close(){try{a.stdin.end()}catch{}try{a.kill()}catch{}}}}var L_="127.0.0.1",F_=7676,YS=65536,cw="ts-cloud-dashboard-",Ha=O_(M_(import.meta.url));function z_(e){try{return process.kill(e,0),!0}catch(t){return t?.code!=="ESRCH"}}function U_(e=Wu(),t=z_){let r=0;for(let a of QS(e,{withFileTypes:!0})){if(!a.isDirectory()||!a.name.startsWith(cw))continue;let l=Ut(e,a.name),m=a.name.match(/^ts-cloud-dashboard-(\d+)-/);if(m){let h=Number(m[1]);if(h===process.pid||t(h))continue}else if(QS(l).length>0)continue;bs(l,{recursive:!0,force:!0}),r+=1}return r}var q_={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".ico":"image/x-icon"};function x(e,t=200,r={}){return new Response(JSON.stringify(e,null,2),{status:t,headers:{"content-type":"application/json; charset=utf-8",...r}})}function V_(e,t,r,a){let l=new TextEncoder,m=Math.max(0,Math.floor(r)),h,S,R=!1,y=new ReadableStream({start(C){let T=()=>{if(R)return;if(R=!0,h?.(),S)clearInterval(S);a.removeEventListener("abort",T);try{C.close()}catch{}},j=(V)=>{if(R)return;if(V.reset)C.enqueue(l.encode(`event: reset
|
|
658
|
+
[output truncated]`}function mm(e,t){return e.environments?.[t]?.app}function fm(e,t,r){let a=[],l=mm(e,t);a.push({id:"redeploy",label:"Redeploy current build",group:"deploy",target:"app",mutates:!0,confirm:"redeploy"}),a.push({id:"rollback",label:"Roll back to previous build",group:"deploy",target:"app",mutates:!0,confirm:"rollback",danger:!0});let m=r.maintenance?.enabled;if(m!==!0)a.push({id:"maintenance:on",label:"Enable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"maintenance",danger:!0});if(m!==!1)a.push({id:"maintenance:off",label:"Disable maintenance mode",group:"maintenance",target:"app",mutates:!0,confirm:"live"});if(l?.assets||r.assetsInfo)a.push({id:"assets:invalidate",label:"Invalidate CDN cache",group:"assets",target:"assets",mutates:!0,confirm:"invalidate"});if(l?.database?.connection==="aurora-serverless")a.push({id:"db:scale",label:"Scale Aurora capacity",group:"database",target:"database",mutates:!0,confirm:"scale",inputs:[{name:"min",label:"Min ACUs",placeholder:String(l.database.minCapacity??0.5)},{name:"max",label:"Max ACUs",placeholder:String(l.database.maxCapacity??4)}]});for(let h of r.queues??[]){let S=String(h?.name??"").trim();if(S&&/^[A-Za-z0-9_-]+$/.test(S))a.push({id:`queue:purge:${S}`,label:`Purge queue (${S})`,group:"queue",target:S,mutates:!0,confirm:S,danger:!0})}return a}function _S(e,t,r,a){return fm(t,r,a).find((l)=>l.id===e)}async function I_(e,t,r){try{let a=new f(r),{Stacks:l}=await a.describeStacks({stackName:qt(e,t)}),m={};for(let R of l?.[0]?.Outputs??[])if(R.OutputKey)m[R.OutputKey]=R.OutputValue??"";let h=m.AssetsCdnDomain;if(!h)return null;return(await new I(r).findDistributionByDomain(h))?.Id??null}catch{return null}}async function TS(e,t,r,a={}){try{if(r.id==="redeploy")return await ln(e,t),{operation:r.id,command:"serverless redeploy",ok:!0,stdout:"Redeploy complete."};if(r.id==="rollback")return await un(e,t),{operation:r.id,command:"serverless rollback",ok:!0,stdout:"Rollback complete."};if(r.id==="maintenance:on")return await nr(e,t,!0),{operation:r.id,command:"maintenance on",ok:!0,stdout:"Application is now in maintenance mode."};if(r.id==="maintenance:off")return await nr(e,t,!1),{operation:r.id,command:"maintenance off",ok:!0,stdout:"Application is live."};if(r.id==="db:scale"){let l=Number(a.min),m=Number(a.max);if(!Number.isFinite(l)||!Number.isFinite(m)||l<=0||m<l)return{operation:r.id,ok:!1,error:"Provide valid Aurora capacities (0 < min ≤ max)."};return await mf(e,t,l,m),{operation:r.id,command:`db:scale ${l}-${m} ACU`,ok:!0,stdout:`Scaling applied (${l}-${m} ACUs); takes effect shortly.`}}if(r.id==="assets:invalidate"){let l=await Ar(e,t),m=await I_(e,t,l.region);if(!m)return{operation:r.id,ok:!1,error:"Could not resolve the asset CloudFront distribution for this environment."};let S=await new I(l.region).invalidateAll(m);return{operation:r.id,command:`cloudfront invalidate ${m} /*`,ok:!0,stdout:`Invalidation ${S?.Id??"created"} for ${m} (/*).`}}if(r.group==="queue"&&r.id.startsWith("queue:purge:")){let l=r.target,m=await Ar(e,t),h=new se(m.region),S=`${m.slug}-${t}-${l}`,{QueueUrl:R}=await h.getQueueUrl(S);return await h.purgeQueue(R),{operation:r.id,command:`sqs purge ${S}`,ok:!0,stdout:`Purged queue ${S}.`}}return{operation:r.id,ok:!1,error:"Unknown or unavailable serverless operation."}}catch(l){return{operation:r.id,ok:!1,error:Hr(l?.message??String(l))}}}async function xS(e,t,r){let a=r.trim();if(!a)return{operation:"command",ok:!1,error:"A command is required."};try{let l=await tt(e,t,a);return{operation:"command",command:a,ok:!0,stdout:Hr(l||"(no output)")}}catch(l){return{operation:"command",command:a,ok:!1,error:Hr(l?.message??String(l))}}}var hm="No dead-letter queue is provisioned for this environment.";async function ym(e,t,r){try{let{QueueUrl:a}=await e.getQueueUrl(`${t}-${r}-dlq`);return a}catch{return null}}async function DS(e,t,r=10){try{let a=await Ar(e,t),l=new se(a.region),m=await ym(l,a.slug,t);if(!m)return{ok:!1,messages:[],error:hm};return{ok:!0,messages:((await l.receiveMessages({queueUrl:m,maxMessages:Math.min(10,Math.max(1,r)),waitTimeSeconds:1,visibilityTimeout:2})).Messages??[]).map((R)=>({id:R.MessageId,receiptHandle:R.ReceiptHandle,body:Hr(String(R.Body??""))}))}}catch(a){return{ok:!1,messages:[],error:Hr(a?.message??String(a))}}}async function OS(e,t,r={}){try{let a=await Ar(e,t),l=mm(e,t),h=(l?Xt(l,a.slug,t):[]).map((B)=>B.name.replace(`${a.slug}-${t}-`,"")),S=r.targetQueue&&h.includes(r.targetQueue)?r.targetQueue:h[0];if(!S)return{operation:"dlq:redrive",ok:!1,error:"No source queue is configured to redrive into."};let R=new se(a.region),y=await ym(R,a.slug,t);if(!y)return{operation:"dlq:redrive",ok:!1,error:hm};let{QueueUrl:C}=await R.getQueueUrl(`${a.slug}-${t}-${S}`),T=Math.min(50,Math.max(1,r.max??10)),j=0;while(j<T){let V=(await R.receiveMessages({queueUrl:y,maxMessages:Math.min(10,T-j),waitTimeSeconds:1,visibilityTimeout:30})).Messages??[];if(!V.length)break;for(let W of V)await R.sendMessage({queueUrl:C,messageBody:String(W.Body??"")}),await R.deleteMessage(y,W.ReceiptHandle),j++}return{operation:"dlq:redrive",command:`redrive → ${S}`,ok:!0,stdout:`Moved ${j} message(s) from the DLQ to ${S}.`}}catch(a){return{operation:"dlq:redrive",ok:!1,error:Hr(a?.message??String(a))}}}async function $S(e,t){try{let r=await Ar(e,t),a=new se(r.region),l=await ym(a,r.slug,t);if(!l)return{operation:"dlq:purge",ok:!1,error:hm};return await a.purgeQueue(l),{operation:"dlq:purge",command:"sqs purge dlq",ok:!0,stdout:"Dead-letter queue purged."}}catch(r){return{operation:"dlq:purge",ok:!1,error:Hr(r?.message??String(r))}}}function NS(e,t){let r=mm(e,t);if(!r?.secrets)return[];return Array.isArray(r.secrets)?r.secrets.map((a)=>({key:a.split("/").pop().toUpperCase().replace(/[^A-Z0-9_]/g,"_"),secretId:a})):Object.entries(r.secrets).map(([a,l])=>({key:a,secretId:String(l)}))}async function jS(e,t,r,a){if(!r.trim())return{operation:"secret:set",ok:!1,error:"A secret id is required."};try{let l=await Ar(e,t),m=new z(l.region);try{await m.putSecretValue({SecretId:r,SecretString:a})}catch{await m.createSecret({Name:r,SecretString:a})}return{operation:"secret:set",command:`secret set ${r}`,ok:!0,stdout:`Secret ${r} updated. Redeploy to apply it to the functions.`}}catch(l){return{operation:"secret:set",ok:!1,error:Hr(l?.message??String(l))}}}async function BS(e,t,r){if(!r.trim())return{operation:"secret:delete",ok:!1,error:"A secret id is required."};try{let a=await Ar(e,t);return await new z(a.region).deleteSecret({SecretId:r,RecoveryWindowInDays:7}),{operation:"secret:delete",command:`secret delete ${r}`,ok:!0,stdout:`Secret ${r} scheduled for deletion (recoverable for 7 days).`}}catch(a){return{operation:"secret:delete",ok:!1,error:Hr(a?.message??String(a))}}}var E_=new Set(["http","queue","cli"]);async function MS(e,t,r,a){if(!E_.has(r))return{operation:"function:config",ok:!1,error:`Unknown function mode '${r}'.`};let l=a.memory==null?void 0:Number(a.memory),m=a.timeout==null?void 0:Number(a.timeout);if(l!=null&&(!Number.isInteger(l)||l<128||l>10240))return{operation:"function:config",ok:!1,error:"Memory must be an integer between 128 and 10240 MB."};if(m!=null&&(!Number.isInteger(m)||m<1||m>900))return{operation:"function:config",ok:!1,error:"Timeout must be an integer between 1 and 900 seconds."};if(l==null&&m==null)return{operation:"function:config",ok:!1,error:"Provide a memory and/or timeout value."};try{let h=await Ar(e,t),S=new b(h.region),R=`${h.slug}-${t}-${r}`;await S.updateFunctionConfiguration({FunctionName:R,...l!=null?{MemorySize:l}:{},...m!=null?{Timeout:m}:{}});let y=[l!=null?`${l} MB`:"",m!=null?`${m}s`:""].filter(Boolean).join(", ");return{operation:"function:config",command:`update ${R} (${y})`,ok:!0,stdout:`Updated ${R}: ${y}.`}}catch(h){return{operation:"function:config",ok:!1,error:Hr(h?.message??String(h))}}}var gm=[{key:"http-errors",label:"HTTP function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"errors / 5 min"},{key:"http-throttles",label:"HTTP function throttles",namespace:"AWS/Lambda",metricName:"Throttles",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"throttles / 5 min"},{key:"http-duration",label:"HTTP function duration (avg)",namespace:"AWS/Lambda",metricName:"Duration",statistic:"Average",comparison:"GreaterThanThreshold",fnMode:"http",unit:"ms"},{key:"http-concurrency",label:"HTTP concurrent executions",namespace:"AWS/Lambda",metricName:"ConcurrentExecutions",statistic:"Maximum",comparison:"GreaterThanThreshold",fnMode:"http",unit:"concurrent"},{key:"queue-errors",label:"Queue function errors",namespace:"AWS/Lambda",metricName:"Errors",statistic:"Sum",comparison:"GreaterThanThreshold",fnMode:"queue",unit:"errors / 5 min"}];function R_(e){return gm.find((t)=>t.key===e)}async function LS(e,t){try{let r=await Ar(e,t);return{ok:!0,alarms:await new oe(r.region).describeAlarms({AlarmNamePrefix:`${r.slug}-${t}-`,MaxRecords:100}),presets:gm}}catch(r){return{ok:!1,alarms:[],presets:gm,error:Hr(r?.message??String(r))}}}async function FS(e,t,r,a){let l=R_(r);if(!l)return{operation:"alarm:create",ok:!1,error:`Unknown alarm metric '${r}'.`};if(!Number.isFinite(a)||a<0)return{operation:"alarm:create",ok:!1,error:"Provide a non-negative threshold."};try{let m=await Ar(e,t),h=new oe(m.region),S=`${m.slug}-${t}-${l.key}`,R=l.fnMode?[{Name:"FunctionName",Value:`${m.slug}-${t}-${l.fnMode}`}]:[];return await h.putMetricAlarm({AlarmName:S,Namespace:l.namespace,MetricName:l.metricName,ComparisonOperator:l.comparison,Threshold:a,EvaluationPeriods:1,Period:300,Statistic:l.statistic,Dimensions:R,AlarmDescription:`ts-cloud: ${l.label} > ${a} ${l.unit}`}),{operation:"alarm:create",command:`alarm ${S}`,ok:!0,stdout:`Alarm ${S} armed at ${a} ${l.unit}.`}}catch(m){return{operation:"alarm:create",ok:!1,error:Hr(m?.message??String(m))}}}async function zS(e,t,r){try{let a=await Ar(e,t);if(!r.startsWith(`${a.slug}-${t}-`))return{operation:"alarm:delete",ok:!1,error:"Refusing to delete an alarm outside this environment."};return await new oe(a.region).deleteAlarms([r]),{operation:"alarm:delete",command:`delete alarm ${r}`,ok:!0,stdout:`Alarm ${r} deleted.`}}catch(a){return{operation:"alarm:delete",ok:!1,error:Hr(a?.message??String(a))}}}function A_(e){let t=e.HasFault?"fault":e.HasError?"error":e.HasThrottle?"throttle":"ok";return{id:String(e.Id??""),timestamp:Number.isFinite(Number(e.StartTime))?new Date(Number(e.StartTime)*1000).toISOString():void 0,durationMs:Math.round((e.Duration??0)*1000),responseMs:Math.round((e.ResponseTime??0)*1000),status:t,method:e.Http?.HttpMethod??"-",url:e.Http?.HttpURL??"-",httpStatus:e.Http?.HttpStatus??0}}async function Uu(e,t,r=30){try{let a=await Ar(e,t),l=new pm(a.region),m=new Date,h=new Date(m.getTime()-Math.min(360,Math.max(1,r))*60000),S=`${a.slug}-${t}-http`,R=await l.getTraceSummaries({startTime:h,endTime:m,filterExpression:`service("${S}")`});if(!R.summaries.length)R=await l.getTraceSummaries({startTime:h,endTime:m});return{ok:!0,traces:R.summaries.slice(0,100).map(A_)}}catch(a){return{ok:!1,traces:[],error:Hr(a?.message??String(a))}}}async function vm(e,t,r){try{let a=await Ar(e,t),l=`${a.slug}-${t}-scheduler`;if(r==="run"){let h=await tt(e,t,"schedule:run");return{operation:"scheduler:run",command:"schedule:run",ok:!0,stdout:Hr(h||"Scheduler run triggered.")}}let m=new ar(a.region);if(r==="enable")await m.enableRule({Name:l});else await m.disableRule({Name:l});return{operation:`scheduler:${r}`,command:`${r} ${l}`,ok:!0,stdout:`Scheduler rule ${l} ${r}d.`}}catch(a){return{operation:`scheduler:${r}`,ok:!1,error:Hr(a?.message??String(a))}}}function US(e,t,r){let a=(Array.isArray(r)?r:String(r??"").split(",")).map(String).filter(Boolean);if(!a.length){if(t)return;let m=e.map((h)=>h.id);return m.length?m:["__no_authorized_telemetry_resources__"]}let l=a.map((m)=>e.find((h)=>h.id===m||h.slug===m)?.id).filter((m)=>!!m);if(l.length!==a.length)throw Error("One or more telemetry resources are outside your authorized scope.");return[...new Set(l)]}import{createHash as VS}from"node:crypto";class WS{now;entries=new Map;constructor(e=Date.now){this.now=e}async getOrCreate(e,t,r,a){let l=this.entries.get(e);if(!r&&l&&l.expiresAt>this.now())return{value:await l.promise,cached:!0};let m=a().catch((h)=>{throw this.entries.delete(e),h});return this.entries.set(e,{expiresAt:this.now()+t,promise:m}),{value:await m,cached:!1}}invalidate(e){for(let t of this.entries.keys())if(t.startsWith(e))this.entries.delete(t)}}class HS{now;lastRun=new Map;constructor(e=Date.now){this.now=e}shouldRun(e,t,r=!1){let a=this.now(),l=this.lastRun.get(e);if(!r&&l!=null&&a-l<t)return!1;return this.lastRun.set(e,a),!0}}var KS=new WS,C_=new HS,P_=2000,__=3600000;function T_(e,t){if(e.kind==="log"&&!t.collectLogs)return!1;if(e.kind==="trace"&&!t.collectTraces)return!1;if((e.kind==="request"||e.name.startsWith("request."))&&!t.collectRequestAnalytics)return!1;if(!["log","trace","request"].includes(e.kind)&&!e.name.startsWith("request."))return!0;let r=e.requestId??e.traceId??`${e.source}\x00${e.workloadId??""}\x00${e.timestamp}`;return Number.parseInt(VS("sha256").update(r).digest("hex").slice(0,8),16)/4294967295<=t.samplingRate}function Kr(...e){return`telemetry:${VS("sha256").update(e.map((t)=>String(t??"")).join("\x00")).digest("hex").slice(0,40)}`}function kc(e,t,r,a){if(!a)return;return e.listResources(t,r).find((l)=>l.slug===a)?.id}function x_(e,t){let r=String(t??"").toLowerCase();if(["debug","info","warn","warning","error","fatal"].includes(r))return r==="fatal"?"error":r;return/fatal|panic|exception|error/i.test(e)?"error":/warn|timeout|throttl|retr(?:y|ies)/i.test(e)?"warning":"info"}function qS(e){let t=e.timestamp&&Number.isFinite(new Date(e.timestamp).getTime())?new Date(e.timestamp).toISOString():new Date().toISOString(),r={};try{let W=JSON.parse(e.message);if(W&&typeof W==="object"&&!Array.isArray(W))r=W}catch{}let a=Object.fromEntries(Object.entries(r).filter(([W])=>!/^(?:body|requestBody|responseBody|headers|authorization|cookie|cookies|query|queryString)$/i.test(W))),l=String(r.requestId??r.request_id??r["x-request-id"]??"")||void 0,m=String(r.traceId??r.trace_id??r["x-amzn-trace-id"]??"")||void 0,h=Number(r.durationMs??r.duration_ms??r.latencyMs??r.latency_ms),S=Number(r.statusCode??r.status_code??r.status),R=String(r.method??r.httpMethod??"")||void 0,y=Ti(String(r.pathTemplate??r.path??r.url??"")||void 0),C=String(r.releaseId??r.release_id??"")||void 0,T=String(r.deploymentId??r.deployment_id??"")||void 0,j={projectId:e.projectId,environmentId:e.environmentId,resourceId:e.resourceId,source:e.source,timestamp:t,requestId:l,traceId:m,releaseId:C,deploymentId:T,workloadId:e.workloadId},B=Object.keys(r).length?JSON.stringify(a):e.message,V=[{...j,id:Kr(e.source,e.name,t,B),kind:"log",name:e.name,level:x_(B,r.level),message:B,attributes:a}];if(R&&y&&Number.isFinite(S)){if(V.push({...j,id:Kr("request",l,t,R,y,S),kind:"request",name:"http.request",method:R,pathTemplate:y,host:r.host,statusCode:S,durationMs:Number.isFinite(h)?h:void 0,bytesIn:Number(r.bytesIn)||void 0,bytesOut:Number(r.bytesOut)||void 0,region:r.region,cacheResult:r.cacheResult??r.cache,upstream:r.upstream,attributes:{userAgentFamily:r.userAgentFamily??"",protocol:r.protocol??""}}),Number.isFinite(h))V.push({...j,id:Kr("request-duration",l,t),kind:"metric",name:"request.duration",value:h,unit:"ms",attributes:{method:R,pathTemplate:y,statusCode:S}});if(V.push({...j,id:Kr("request-count",l,t),kind:"metric",name:"request.count",value:1,unit:"count",attributes:{method:R,pathTemplate:y,statusCode:S}}),S>=500)V.push({...j,id:Kr("request-error",l,t),kind:"metric",name:"request.error",value:1,unit:"count",attributes:{method:R,pathTemplate:y,statusCode:S}})}return V}async function D_(e){let t=new ft(e.controlPlane),r=Gt(e.controlPlane,e.projectId),a=new Date,l=[],m=[],h={projectId:e.projectId,environmentId:e.environmentId},S=M(e.config);try{let j=(S==="serverless"?await pn(e.config,e.environment):await il(e.config,e.environment,{includeSiteHealth:e.includeSiteHealth,telemetryOnly:e.lightweight}))??{};if(S==="serverless"){for(let V of j.functionsDetail??[]){let W=kc(e.controlPlane,e.projectId,e.environmentId,V.key),Y={...h,resourceId:W,source:"cloudwatch",timestamp:a.toISOString(),workloadId:V.name,attributes:{provider:"aws",functionName:V.name,aggregationWindow:"24h"}};for(let[te,le,X]of[["snapshot.traffic.requests_24h",V.invocations,"count"],["snapshot.errors.count_24h",V.errors,"count"],["snapshot.latency.p50_24h",V.p50,"ms"],["snapshot.latency.p95_24h",V.p95,"ms"],["snapshot.latency.p99_24h",V.p99,"ms"],["snapshot.saturation.throttles_24h",V.throttles,"count"],["snapshot.memory.max_24h",V.maxMem,"MB"]])if(Number.isFinite(Number(le)))l.push({...Y,id:Kr("cloudwatch",V.name,te,a.toISOString()),kind:"metric",name:te,value:Number(le),unit:X})}try{let V=await Ar(e.config,e.environment),W=new oe(V.region),Y=new Date(a.getTime()-3600000),te=300;for(let le of V.functions){let X=[{Name:"FunctionName",Value:le.name}],[ce,Ee,Re,de,Me]=await Promise.all([W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Invocations",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Sum"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Errors",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Sum"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Duration",Dimensions:X,StartTime:Y,EndTime:a,Period:300,ExtendedStatistics:["p50","p95","p99"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"Throttles",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Sum"]}),W.getMetricStatistics({Namespace:"AWS/Lambda",MetricName:"ConcurrentExecutions",Dimensions:X,StartTime:Y,EndTime:a,Period:300,Statistics:["Maximum"]})]),ae=kc(e.controlPlane,e.projectId,e.environmentId,le.mode),Le=(Je,gt,Jt,ot)=>{for(let Pt of Je){let Qt=Pt.Timestamp&&Number.isFinite(new Date(Pt.Timestamp).getTime())?new Date(Pt.Timestamp).toISOString():void 0,lt=Jt(Pt);if(Qt&<!=null&&Number.isFinite(lt))l.push({...h,resourceId:ae,id:Kr("cloudwatch-series",le.name,gt,Qt),kind:"metric",source:"cloudwatch",name:gt,timestamp:Qt,value:lt,unit:ot,workloadId:le.name,region:V.region,attributes:{provider:"aws",functionName:le.name,aggregationWindow:"300s"}})}};Le(ce,"traffic.requests",(Je)=>Je.Sum,"count"),Le(Ee,"errors.count",(Je)=>Je.Sum,"count"),Le(Re,"latency.p50",(Je)=>Je.Percentiles?.p50,"ms"),Le(Re,"latency.p95",(Je)=>Je.Percentiles?.p95,"ms"),Le(Re,"latency.p99",(Je)=>Je.Percentiles?.p99,"ms"),Le(de,"saturation.throttles",(Je)=>Je.Sum,"count"),Le(Me,"saturation.concurrency",(Je)=>Je.Maximum,"count")}}catch(V){m.push({source:"cloudwatch:series",message:V instanceof Error?V.message:String(V)})}for(let V of(j.serverlessLogs??[]).slice(0,P_))l.push(...qS({...h,source:`cloudwatch:${V.source}`,name:`${V.source}.log`,timestamp:V.timestamp,message:String(V.message),resourceId:kc(e.controlPlane,e.projectId,e.environmentId,V.source)}));for(let V of j.queuesDetail??[]){let W={...h,source:"cloudwatch",timestamp:a.toISOString(),attributes:{queue:V.name}};l.push({...W,id:Kr("queue-depth",V.name,a.toISOString()),kind:"metric",name:"queue.depth",value:Number(V.visible??V.depth??0),unit:"count"}),l.push({...W,id:Kr("queue-inflight",V.name,a.toISOString()),kind:"metric",name:"queue.inflight",value:Number(V.inFlight??0),unit:"count"})}let B=await Uu(e.config,e.environment,30);if(!B.ok)m.push({source:"xray",message:B.error??"X-Ray traces are unavailable."});for(let V of B.traces)l.push({...h,id:Kr("xray",V.id),kind:"trace",source:"xray",name:"http.trace",timestamp:V.timestamp??a.toISOString(),traceId:V.id,durationMs:V.durationMs,statusCode:V.httpStatus,method:V.method,pathTemplate:V.url,attributes:{status:V.status,responseMs:V.responseMs}})}else{let B=j.systemMetrics;if(j.metricsUnavailable||!B)m.push({source:"host",message:"The host metrics probe is unavailable."});else{let V=Number(B.memTotalMb)>0?Number(B.memUsedMb)/Number(B.memTotalMb)*100:0,W=Number(B.swapTotalMb)>0?Number(B.swapUsedMb)/Number(B.swapTotalMb)*100:0,Y=[["host.load",Number(B.load),"load"],["host.load.5m",Number(B.load5),"load"],["host.load.15m",Number(B.load15),"load"],["host.cpu.capacity",Number(B.cpus),"count"],["host.cpu.used_percent",Number(B.cpuUsedPct),"percent"],["host.memory.used",Number(B.memUsedMb)*1024*1024,"bytes"],["host.memory.total",Number(B.memTotalMb)*1024*1024,"bytes"],["host.memory.available",Number(B.memAvailableMb)*1024*1024,"bytes"],["host.memory.cache",Number(B.memCacheMb)*1024*1024,"bytes"],["host.memory.used_percent",V,"percent"],["host.swap.used",Number(B.swapUsedMb)*1024*1024,"bytes"],["host.swap.total",Number(B.swapTotalMb)*1024*1024,"bytes"],["host.swap.used_percent",W,"percent"],["host.disk.used_percent",Number(B.diskUsedPct),"percent"],["host.disk.used",Number(B.diskUsedGb)*1073741824,"bytes"],["host.disk.total",Number(B.diskTotalGb)*1073741824,"bytes"],["host.disk.inode_used_percent",Number(B.inodeUsedPct),"percent"],["host.network.rx",Number(B.networkRxBytes),"bytes"],["host.network.tx",Number(B.networkTxBytes),"bytes"],["host.network.rx_rate",Number(B.networkRxBytesPerSec),"bytes_per_second"],["host.network.tx_rate",Number(B.networkTxBytesPerSec),"bytes_per_second"],["host.network.rx_today",Number(B.networkRxBytesToday),"bytes"],["host.network.tx_today",Number(B.networkTxBytesToday),"bytes"],["host.network.rx_month",Number(B.networkRxBytesMonth),"bytes"],["host.network.tx_month",Number(B.networkTxBytesMonth),"bytes"],["host.processes",Number(B.processes),"count"],["host.uptime",Number(B.uptimeSeconds),"seconds"]];for(let[te,le,X]of Y)if(Number.isFinite(le))l.push({...h,id:Kr("host",te,a.toISOString()),kind:"metric",source:"host",name:te,timestamp:a.toISOString(),value:le,unit:X});for(let te of j.siteHealth??[]){let le=String(te.project??e.config.project.slug),X=String(te.name),ce=X.startsWith(`${le}:`)?X.slice(le.length+1):X,Ee=`site:${le}:${ce}`,Re=kc(e.controlPlane,e.projectId,e.environmentId,X),de={...h,resourceId:Re,source:Ee,timestamp:te.checkedAt||a.toISOString(),host:te.route,attributes:{project:le,site:ce,route:String(te.route),status:String(te.status)}},Me=[["site.health.up",te.status==="live"?1:0,"boolean"],["site.http.status",Number(te.httpStatus),"status"],["site.response.time",Number(te.responseMs),"ms"]];if(te.tlsDaysRemaining!=null)Me.push(["site.tls.days_remaining",Number(te.tlsDaysRemaining),"days"]);for(let[ae,Le,Je]of Me)if(Number.isFinite(Le))l.push({...de,id:Kr(Ee,ae,de.timestamp),kind:"metric",name:ae,value:Le,unit:Je})}}}}catch(j){m.push({source:S==="serverless"?"aws":"host",message:j instanceof Error?j.message:String(j)})}{let j=e.config.infrastructure?.compute?.monitoring,B=typeof j==="object"?j?.egressEndpoints:void 0,V=await ba(B,{now:a.toISOString()});m.push(...V.errors);for(let W of V.metrics)l.push({...h,id:Kr(W.attributes.source,W.name,W.timestamp),kind:"metric",source:`egress:${W.attributes.source}`,name:W.name,timestamp:W.timestamp,value:W.value,unit:W.unit,attributes:W.attributes})}if(!e.lightweight)try{let j=await ie(e.config,e.environment),B=new fe(e.config,e.environment,{inventory:async()=>j});for(let V of j.workloads){let W=kc(e.controlPlane,e.projectId,e.environmentId,V.links.service),Y={...h,resourceId:W,source:`runtime:${V.provider}`,timestamp:a.toISOString(),workloadId:V.id,releaseId:V.links.release,attributes:{status:V.status,provider:V.provider,service:V.links.service??""}};if(l.push({...Y,id:Kr(V.id,"health",a.toISOString()),kind:"metric",name:"health.up",value:V.status==="running"?1:0,unit:"boolean"}),l.push({...Y,id:Kr(V.id,"restarts",a.toISOString()),kind:"metric",name:"saturation.restarts",value:V.restartCount??0,unit:"count"}),V.resources?.memoryBytes!=null)l.push({...Y,id:Kr(V.id,"memory",a.toISOString()),kind:"metric",name:"runtime.memory.used",value:V.resources.memoryBytes,unit:"bytes"});if(!V.capabilities.logs.supported)continue;try{let te=await B.logs(V.id,{limit:100,since:new Date(a.getTime()-300000)});for(let le of te.lines)l.push(...qS({...h,resourceId:W,source:`runtime:${V.provider}`,name:`${V.links.service??V.name}.log`,timestamp:le.timestamp,message:le.message,workloadId:V.id}))}catch(te){m.push({source:`runtime:${V.provider}`,message:te instanceof Error?te.message:String(te)})}}for(let V of j.sources.filter((W)=>W.status!=="fresh"))m.push({source:V.id,message:V.message??`Runtime source is ${V.status}.`})}catch(j){m.push({source:"runtime",message:j instanceof Error?j.message:String(j)})}if(!e.lightweight)for(let j of e.controlPlane.listEvents({projectId:e.projectId,limit:1000})){let B=j.payload;l.push({...h,id:`telemetry:event:${j.id}`,resourceId:j.resourceId,kind:"event",source:"control-plane",name:j.type,timestamp:j.createdAt,level:j.level,message:j.type,deploymentId:j.operationId,releaseId:typeof B.releaseId==="string"?B.releaseId:void 0,traceId:j.correlationId,attributes:B})}let R=l.filter((j)=>T_(j,r)).map((j)=>({...j,sampled:r.samplingRate<1&&(j.kind==="log"||j.kind==="trace"||j.kind==="request"||j.name.startsWith("request."))})),y=t.appendMany(R).length;if(C_.shouldRun(e.projectId,__,!e.lightweight))t.enforceRetention(r,e.projectId);let C=t.status(e.projectId,e.environmentId,r.rawDays,r.samplingRate);for(let j of m)if(!C.some((B)=>B.source===j.source))C.push({source:j.source,freshness:"unavailable",samplingRate:r.samplingRate,retentionDays:r.rawDays,estimatedDailyBytes:0,message:j.message});let T=a.toISOString();return e.controlPlane.setSetting(`telemetry.collection:${e.projectId}:${e.environmentId??"all"}`,{generatedAt:T,errors:m,statuses:C,policy:r}),{collected:y,cached:!1,generatedAt:T,statuses:C,errors:m,policy:r}}async function bm(e){let r=`${`${e.projectId}:${e.environmentId??"all"}:${e.environment}`}:${e.lightweight?"lightweight":"full"}`,a=M(e.config)==="serverless"?300000:60000,l=await KS.getOrCreate(r,a,!!e.force,()=>D_(e));return{...l.value,cached:l.cached}}function JS(e){KS.invalidate(`${e}:`)}function GS(e,t={}){let r=t.shell||(process.platform==="win32"?"powershell.exe":"bash"),a=Bun.spawn([r,"-i"],{stdin:"pipe",stdout:"pipe",stderr:"pipe",cwd:t.cwd,env:{...process.env,TERM:"xterm-256color",PS1:"\\w $ "}}),l=new TextDecoder,m=async(h)=>{if(!h)return;let S=h.getReader();try{for(;;){let{done:R,value:y}=await S.read();if(R)break;if(y)e(l.decode(y))}}catch{}};if(m(a.stdout),m(a.stderr),t.onExit)a.exited.then((h)=>t.onExit(h)).catch(()=>{});return{write(h){try{a.stdin.write(h),a.stdin.flush()}catch{}},close(){try{a.stdin.end()}catch{}try{a.kill()}catch{}}}}var F_="127.0.0.1",z_=7676,YS=65536,cw="ts-cloud-dashboard-",Ha=$_(L_(import.meta.url));function U_(e){try{return process.kill(e,0),!0}catch(t){return t?.code!=="ESRCH"}}function q_(e=Wu(),t=U_){let r=0;for(let a of QS(e,{withFileTypes:!0})){if(!a.isDirectory()||!a.name.startsWith(cw))continue;let l=Ut(e,a.name),m=a.name.match(/^ts-cloud-dashboard-(\d+)-/);if(m){let h=Number(m[1]);if(h===process.pid||t(h))continue}else if(QS(l).length>0)continue;bs(l,{recursive:!0,force:!0}),r+=1}return r}var V_={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".ico":"image/x-icon"};function x(e,t=200,r={}){return new Response(JSON.stringify(e,null,2),{status:t,headers:{"content-type":"application/json; charset=utf-8",...r}})}function W_(e,t,r,a){let l=new TextEncoder,m=Math.max(0,Math.floor(r)),h,S,R=!1,y=new ReadableStream({start(C){let T=()=>{if(R)return;if(R=!0,h?.(),S)clearInterval(S);a.removeEventListener("abort",T);try{C.close()}catch{}},j=(V)=>{if(R)return;if(V.reset)C.enqueue(l.encode(`event: reset
|
|
659
659
|
data: ${JSON.stringify({cursor:V.cursor,droppedBytes:V.droppedBytes})}
|
|
660
660
|
|
|
661
661
|
`));for(let W of V.chunks.filter((Y)=>Y.cursor>m))m=W.cursor,C.enqueue(l.encode(`id: ${W.cursor}
|
|
@@ -668,21 +668,21 @@ data: ${JSON.stringify({state:V.state,error:V.error,cursor:V.cursor})}
|
|
|
668
668
|
`)),T()};h=e.subscribe(t.id,t.workloadId,(V)=>j(e.read(V.id,V.workloadId,m)??V));let B=e.read(t.id,t.workloadId,m);if(!B)return T();if(j(B),R)return;S=setInterval(()=>{if(!R)C.enqueue(l.encode(`event: heartbeat
|
|
669
669
|
data: ${JSON.stringify({cursor:m,at:new Date().toISOString()})}
|
|
670
670
|
|
|
671
|
-
`))},15000),S.unref?.(),a.addEventListener("abort",T,{once:!0})},cancel(){if(R=!0,h?.(),S)clearInterval(S)}});return new Response(y,{headers:{"cache-control":"no-cache, no-transform",connection:"keep-alive","content-type":"text/event-stream; charset=utf-8","x-accel-buffering":"no"}})}var
|
|
672
|
-
`)){let m=l.trim();if(!m||m.startsWith("#")||!m.includes("="))continue;let h=m.indexOf("="),S=m.slice(0,h).trim(),R=m.slice(h+1).trim();if(!/^[A-Z_][A-Z0-9_]*$/i.test(S)||process.env[S]!=null)continue;if(R.startsWith('"')&&R.endsWith('"')||R.startsWith("'")&&R.endsWith("'"))R=R.slice(1,-1);process.env[S]=R}}}function
|
|
671
|
+
`))},15000),S.unref?.(),a.addEventListener("abort",T,{once:!0})},cancel(){if(R=!0,h?.(),S)clearInterval(S)}});return new Response(y,{headers:{"cache-control":"no-cache, no-transform",connection:"keep-alive","content-type":"text/event-stream; charset=utf-8","x-accel-buffering":"no"}})}var H_=new Set(["action","operation","site","name","username","database","secretId","port","key","resourceId","environmentId"]);function K_(e,t,r,a,l){let m={};if(r&&typeof r==="object"&&!Array.isArray(r))for(let[S,R]of Object.entries(r)){if(!H_.has(S)||!["string","number","boolean"].includes(typeof R))continue;m[S]=typeof R==="string"?R.slice(0,256):R}let h=String(m.resourceId||m.site||m.secretId||m.database||m.name||t);return{method:e.toUpperCase(),path:t,target:h,status:a,outcome:a<400?"succeeded":"failed",durationMs:Math.max(0,Math.round(l)),input:m}}var J_=ho("ts-cloud-dummy-password");function Hu(e,t=200){return new Response(e,{status:t,headers:{"content-type":"text/plain; charset=utf-8"}})}function G_(e,t,r=process.env){let a=r.TS_CLOUD_DASHBOARD_ORIGIN?.trim()||(r.TS_CLOUD_UI_DOMAIN?.trim()?`https://${r.TS_CLOUD_UI_DOMAIN.trim().replace(/^https?:\/\//,"")}`:""),l=["0.0.0.0","::"].includes(e)?void 0:e,m=a||(l&&["127.0.0.1","localhost","::1"].includes(l)?`http://${l.includes(":")?`[${l}]`:l}:${t}`:"");if(!m)return;try{let h=new URL(m),S=["127.0.0.1","localhost","::1"].includes(h.hostname);if(h.protocol!=="https:"&&!(h.protocol==="http:"&&S)||h.username||h.password||h.search||h.hash||h.pathname!=="/"&&h.pathname!=="")return;return h.origin}catch{return}}function Q_(e,t){if(t&&Object.hasOwn(e.environments??{},t))return t;return Object.keys(e.environments??{})[0]??"production"}function Y_(e,t,r){return r&&e.includes(r)?r:t}function ZS(e,t,r){return e==null||t-e>=r}async function Z_(e){let t=[Ut(Ha,"..","..","..","..",".env"),Ut(e,".env"),Ut(e,".env.local"),Ut(e,".env.production")];for(let r of t){if(!Ai(r))continue;let a=await ii(r,"utf8").catch(()=>"");for(let l of a.split(`
|
|
672
|
+
`)){let m=l.trim();if(!m||m.startsWith("#")||!m.includes("="))continue;let h=m.indexOf("="),S=m.slice(0,h).trim(),R=m.slice(h+1).trim();if(!/^[A-Z_][A-Z0-9_]*$/i.test(S)||process.env[S]!=null)continue;if(R.startsWith('"')&&R.endsWith('"')||R.startsWith("'")&&R.endsWith("'"))R=R.slice(1,-1);process.env[S]=R}}}function X_(e){return[Ut(e,"config","cloud.ts"),Ut(e,"config","cloud.js"),Ut(e,"cloud.config.ts"),Ut(e,"cloud.config.js")].find((r)=>Ai(r))??null}function Ka(e){return e.infrastructure?.compute?.sshKeys??[]}function XS(e,t){let r=e.infrastructure??(e.infrastructure={}),a=r.compute??(r.compute={});a.sshKeys=t}function eT(e,t,r){let a=e.sites??(e.sites={});a[t]=r}function Sm(e){return hs(e.infrastructure?.compute?.firewall?.allowedPorts??[])}function ew(e,t){let r=e.infrastructure??(e.infrastructure={}),a=r.compute??(r.compute={}),l=a.firewall??(a.firewall={});l.allowedPorts=t}async function re(e){return await e.json().catch(()=>({}))}function Wa(e,t){let r=String(e.scopeType??"environment");if(!["project","environment","service","function","preview"].includes(r))throw Error("Configuration scopeType must be project, environment, service, function, or preview.");let a=String(e.scopeId??(r==="project"?t.projectId:r==="environment"?t.environmentId??"":""));if(!a)throw Error("Configuration scopeId is required.");if(r==="project")return{type:r,id:a};if(r==="environment")return{type:r,id:a,environmentId:a};if(r==="service"||r==="function")return{type:r,id:a,environmentId:String(e.environmentId??t.environmentId??"")||void 0,resourceId:a};return{type:r,id:a,environmentId:String(e.environmentId??t.environmentId??"")||void 0,resourceId:String(e.resourceId??"")||void 0,previewId:a}}function tT(e){if(["GET","HEAD","OPTIONS"].includes(e.method.toUpperCase()))return!0;let t=e.headers.get("sec-fetch-site");if(t==="cross-site")return!1;let r=e.headers.get("origin");if(!r)return!0;let a=new URL(e.url);if(r===a.origin)return!0;if(t!=="same-origin")return!1;try{let l=new URL(r),m=(e.headers.get("x-forwarded-host")??e.headers.get("host")??a.host).split(",")[0].trim(),h=e.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();if(!/^[A-Za-z0-9.-]+(?::\d{1,5})?$/.test(m)||l.host!==m)return!1;return!h||l.protocol===`${h}:`}catch{return!1}}var rT=new Set(["owner","admin","deployer","operator","viewer","auditor"]),nT=new Set(["organization","project","environment","resource"]),iT=new Set(["POST /api/organization/invitations","DELETE /api/organization/invitations","POST /api/organization/invitations/resend","PATCH /api/organization/memberships","DELETE /api/organization/memberships","POST /api/organization/grants","DELETE /api/organization/grants","POST /api/auth/oidc/providers","PATCH /api/auth/oidc/providers","POST /api/automation/service-accounts","PATCH /api/automation/service-accounts","POST /api/automation/tokens","POST /api/automation/tokens/rotate","DELETE /api/automation/tokens","POST /api/security/policies","PATCH /api/security/policies","POST /api/security/waivers","DELETE /api/security/waivers","POST /api/sources/connections","PATCH /api/sources/connections","DELETE /api/sources/connections","POST /api/sources/deploy-keys","DELETE /api/sources/deploy-keys","PATCH /api/telemetry/settings","POST /api/health/checks","PATCH /api/health/checks","POST /api/alerts/rules","PATCH /api/alerts/rules","POST /api/alerts/silences","POST /api/spend/budgets","PATCH /api/spend/budgets","DELETE /api/spend/budgets","POST /api/spend/check","POST /api/spend/release","POST /api/spend/anomalies/acknowledge","POST /api/protection/attack-mode","POST /api/protection/pause","POST /api/protection/ip-rules","DELETE /api/protection/ip-rules","POST /api/notifications/channels","PATCH /api/notifications/channels","POST /api/notifications/routes","PATCH /api/notifications/routes","POST /api/jobs","PATCH /api/jobs","POST /api/jobs/reconcile","POST /api/workers/action","POST /api/data-services","POST /api/data-services/action","POST /api/data-services/dependencies","POST /api/data-services/management","POST /api/data-services/reveal","POST /api/backups/destinations","POST /api/backups/destinations/test","POST /api/backups/policies","POST /api/backups/run","POST /api/backups/verify","POST /api/backups/restore","POST /api/backups/recovery-points","POST /api/backups/retention","POST /api/configuration/reveal","POST /api/configuration/transfer","POST /api/configuration/bulk","DELETE /api/configuration","POST /api/volumes","POST /api/volumes/attach","POST /api/volumes/detach","POST /api/volumes/resize","POST /api/volumes/snapshot","POST /api/volumes/restore","POST /api/volumes/adopt","POST /api/volumes/discover","DELETE /api/volumes","POST /api/fleet","POST /api/fleet/action","POST /api/capacity","POST /api/capacity/member","POST /api/capacity/action","POST /api/capacity/explain","POST /api/regions","POST /api/regions/action","POST /api/maintenance/cleanup-preview","POST /api/maintenance/cleanup-apply","POST /api/maintenance/drill","POST /api/maintenance/drill-run","POST /api/sources/webhooks","PATCH /api/sources/webhooks","DELETE /api/sources/webhooks","POST /api/onboarding/registries","PATCH /api/onboarding/registries","DELETE /api/onboarding/registries","POST /api/runtime/exec-sessions","POST /api/runtime/files/read","POST /api/runtime/files/write","POST /api/onboarding/apply","PATCH /api/queue/settings","DELETE /api/queue/history","POST /api/serverless/secrets","DELETE /api/serverless/secrets"]);function qu(e){let t=String(e??"");return rT.has(t)?t:void 0}function Ic(e){let t=String(e.scopeType??"organization");if(!nT.has(t))return;if(t==="organization")return{type:"organization"};let r=String(e.scopeId??"").trim();return r?{type:t,id:r}:void 0}async function vs(e,t,r={}){let a=M(e),l={mode:a,environment:t,environments:Object.keys(e.environments??{}),project:{name:e.project.name,slug:e.project.slug,region:e.project.region}};try{return{...(a==="serverless"?await pn(e,t):await il(e,t,{includeSiteHealth:r.includeSiteHealth}))??{},...l}}catch{return{...l}}}function oT(e,t){if(!e)return t;let r={...t,...Array.isArray(e.sites)?{sites:e.sites}:{},...Array.isArray(e.sitesDetail)?{sitesDetail:e.sitesDetail}:{},...Array.isArray(e.siteHealth)?{siteHealth:e.siteHealth}:{}};if(r.mode!=="serverless"&&Array.isArray(r.sites))r.topology=Tt(r,{project:r.project?.name,environment:r.environment});return r}function sT(e){let t=[Ut(e,"packages","ui"),Ut(Ha,"..","..","..","ui"),Ut(Ha,"..","..","ui"),Ut(Ha,"..","ui-src"),Ut(Ha,"..","..","ui-src"),Ut(Ha,"..","..","dist","ui-src")];for(let r of t)if(Ai(Ut(r,"pages"))&&Ai(Ut(r,"package.json")))return r;return null}async function aT(e,t){let r=sT(e);if(!r)return null;let a;try{a=km(Ut(Wu(),`${cw}${process.pid}-`));let l=Ut(r,"node_modules",".bin","stx"),m=Ai(l)?[l,"build","--pages","pages","--out",a,"--no-sitemap","--no-cache"]:["bunx","--bun","@stacksjs/stx","build","--pages","pages","--out",a,"--no-sitemap","--no-cache"],h=Bun.spawn(m,{cwd:r,stdout:"pipe",stderr:"pipe",env:{...process.env,TSCLOUD_DASHBOARD_DATA:vS(t)}}),[S,R,y]=await Promise.all([new Response(h.stdout).text(),new Response(h.stderr).text(),h.exited]);if(y!==0){if(bs(a,{recursive:!0,force:!0}),process.env.TSCLOUD_DASHBOARD_VERBOSE)console.warn(`ts-cloud dashboard: live UI build failed; serving the pre-built UI.
|
|
673
673
|
${S}
|
|
674
674
|
${R}`);return null}return a}catch(l){if(a)bs(a,{recursive:!0,force:!0});if(process.env.TSCLOUD_DASHBOARD_VERBOSE)console.warn(`ts-cloud dashboard: live UI build errored; serving the pre-built UI. ${l.message}`);return null}}function ns(e){let t=e.infrastructure?.compute?.managedServices?JSON.parse(JSON.stringify(e.infrastructure.compute.managedServices)):void 0;if(t?.vitess?.password)t.vitess.password="";return{project:{name:e.project?.name,slug:e.project?.slug,region:e.project?.region},provider:e.provider,environments:Object.keys(e.environments??{}),compute:e.infrastructure?.compute?{provider:e.infrastructure.compute.provider,runtime:e.infrastructure.compute.runtime,webServer:e.infrastructure.compute.webServer,proxy:e.infrastructure.compute.proxy?{engine:e.infrastructure.compute.proxy.engine,onDemandTls:e.infrastructure.compute.proxy.onDemandTls,cdn:!!e.infrastructure.compute.proxy.cdn}:void 0,managedServices:t,sshKeys:yo(Ka(e)).map((r)=>({name:r.name,type:r.type,fingerprint:r.fingerprint,added:r.added}))}:void 0,sites:Object.fromEntries(Object.entries(e.sites??{}).map(([r,a])=>[r,{domain:a.domain,path:a.path,type:a.type,deploy:a.deploy,root:a.root,port:a.port,ssl:a.ssl}]))}}function mn(e){return[{id:"status",label:"Refresh Cloud Status",description:"Runs the local ts-cloud status checks against configured providers.",command:["status","--env",e],mutates:!1},{id:"doctor",label:"Run Doctor",description:"Checks local tooling, credentials, and provider access.",command:["doctor"],mutates:!1},{id:"security-scan",label:"Security Scan",description:"Runs the pre-deploy scanner from this checkout.",command:["deploy:security-scan","--source",".","--fail-on","critical"],mutates:!1},{id:"deploy",label:"Deploy Environment",description:"Deploys the selected environment from the local checkout.",command:["deploy","--env",e,"--yes"],mutates:!0,confirm:"deploy"}]}function is(e,t){return mn(t).find((r)=>r.id===e)}function tw(e){if(e.length<=YS)return e;return`${e.slice(0,YS)}
|
|
675
675
|
|
|
676
|
-
[output truncated]`}async function rw(e,t,r){let a=e.getReader(),l=new TextDecoder,m="";while(!0){let{done:S,value:R}=await a.read();if(S)break;let y=l.decode(R,{stream:!0});if(m+=y,y)r?.(t,y)}let h=l.decode();if(h)m+=h,r?.(t,h);return m}async function wm(e,t){let r=Bun.spawn([process.execPath,t.cliEntry,...e.command],{cwd:t.cwd,stdout:"pipe",stderr:"pipe",env:{...process.env,...t.env}}),a=()=>{try{r.kill()}catch{}};if(t.signal?.aborted)a();else t.signal?.addEventListener("abort",a,{once:!0});try{let[l,m,h]=await Promise.all([rw(r.stdout,"stdout",t.onOutput),rw(r.stderr,"stderr",t.onOutput),r.exited]);return{action:e.id,command:["cloud",...e.command].join(" "),exitCode:h,ok:h===0,stdout:tw(l),stderr:tw(m)}}finally{t.signal?.removeEventListener("abort",a)}}function aT(){return Object.entries(process.env).filter(([e,t])=>!!t&&t.length>=8&&/(?:secret|token|password|passwd|private|credential|api.?key|access.?key)/i.test(e)).map(([,e])=>e)}var cT=new Set(["/server/sites","/server/deployments","/server/logs","/integrations","/applications/new","/applications/compose","/operations/queue","/operations/previews","/operations/releases","/operations/workloads","/operations/observability","/operations/alerts","/operations/jobs","/data/backups","/account/security","/security","/access-denied"]);function dT(e){let t=Ec(e);if(t&&t!==".html")return!1;let r=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(r==="/")return!1;return!cT.has(r)}var lT={"/":"runtime:read","/server/activity":"audit:read","/server/sites":"project:read","/server/deployments":"deployments:read","/server/logs":"runtime:logs","/server/metrics":"runtime:read","/server/services":"runtime:read","/data/backups":"backups:read","/data/volumes":"data:read","/server/fleet":"fleet:read","/server/capacity":"fleet:read","/server/actions":"runtime:restart","/server/database":"data:read","/server/firewall":"fleet:read","/infrastructure/topology":"fleet:read","/server/security":"security:read","/security":"security:read","/integrations":"sources:read","/applications/new":"applications:read","/applications/compose":"applications:read","/operations/queue":"deployments:read","/operations/previews":"deployments:read","/operations/releases":"deployments:read","/operations/regions":"deployments:read","/operations/maintenance":"deployments:read","/operations/workloads":"runtime:read","/operations/observability":"runtime:logs","/operations/alerts":"runtime:read","/operations/jobs":"automation:read","/operations/configuration":"config:read","/server/ssh-keys":"fleet:read","/server/terminal":"runtime:terminal","/server/team":"users:read","/account/security":"project:read","/account/automation":"users:read","/serverless":"project:read","/serverless/deployments":"deployments:read","/serverless/logs":"runtime:logs","/serverless/metrics":"runtime:read","/serverless/traces":"runtime:read","/serverless/functions":"config:read","/serverless/queues":"data:read","/serverless/data":"data:read","/serverless/assets":"project:read","/serverless/secrets":"secrets:read","/serverless/firewall":"fleet:read","/serverless/alarms":"runtime:read","/serverless/cost":"project:read"};function nw(e,t){if(t.role==="admin")return!0;let r=Ec(e);if(r&&r!==".html")return!0;if(t.organizationSource==="legacy")return!dT(e);let a=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(a==="/access-denied")return!0;let l=lT[a];return!!l&&!!t.capabilities?.includes(l)}function uT(e,t){let r=decodeURIComponent(t).replace(/^\/+/,""),l=$_(r===""?"index.html":r);if(l.startsWith("..")||l.includes("/../"))return null;let m=Ut(e,l);if(Ai(m)&&!aw(m).isDirectory())return m;if(!Ec(m)&&Ai(`${m}.html`))return`${m}.html`;if(!Ec(m)&&Ai(Ut(m,"index.html")))return Ut(m,"index.html");return null}async function iw(e,t){let r=uT(e,t);if(!r){let m=Ut(e,"404.html");if(Ai(m))return new Response(await ii(m),{status:404,headers:{"content-type":"text/html; charset=utf-8"}});return Hu("Not found",404)}if(aw(r).isDirectory())return Hu("Not found",404);let a=await ii(r),l=q_[Ec(r)]??"application/octet-stream";return new Response(a,{headers:{"content-type":l}})}var Vu=["observe","backup","restore","restart","resize","version","rotate","expose","delete","logs","slow_queries","users","databases"],ow=new WeakMap;async function sw(e){let t=ow.get(e);if(t)return t;let r=await import("./spend/index.js"),a=new r.SpendStore(e),l={store:a,service:new r.SpendService(a),gate:new r.SpendGate(e)};return ow.set(e,l),l}async function $a(e={}){U_();let t=e.cwd??process.cwd(),r=e.host??L_,a=e.port??F_,l=e.cliEntry??process.argv[1];if(e.box)process.env.TS_CLOUD_DASHBOARD_BOX="1";await Y_(t);let m=e.config??await sl(),h=process.env.TS_CLOUD_DASHBOARD_DB_PASSWORD,S=p(m);if(h&&S&&!S.password)S.password=h;let R=m.infrastructure?.compute?.managedServices?.vitess;if(h&&R&&typeof R==="object"&&!R.password)R.password=h;let y=ou(t,m);if(y.reconciliation.failed>0)console.warn(` ts-cloud dashboard: marked ${y.reconciliation.failed} orphaned operation(s) as failed after restart.`);let C=Object.keys(m.environments??{}),T=G_(m,e.environment),j=Z_(t),B=await vs(m,T),V=new Map([[T,B]]),W=new Map([[T,Date.now()]]),Y=new Map([[T,Date.now()]]),te=new Map,le=Math.min(300000,Math.max(5000,Number(process.env.TS_CLOUD_DASHBOARD_REFRESH_MS)||30000)),X=Math.min(1800000,Math.max(60000,Number(process.env.TS_CLOUD_DASHBOARD_SITE_REFRESH_MS)||300000)),ce=M(m)!=="serverless",Ee=(N)=>{let ze=V.get(N);if(ze&&!ZS(W.get(N),Date.now(),le))return Promise.resolve(ze);let qe=te.get(N);if(qe)return qe;let Fe=!ce||ZS(Y.get(N),Date.now(),X),Ge=vs(m,N,{includeSiteHealth:Fe}).then((Rt)=>{let q=V.get(N),Ur=Fe?Rt:iT(q,Rt);if(V.set(N,Ur),W.set(N,Date.now()),Fe)Y.set(N,Date.now());if(q?._serverReachable!==Ur._serverReachable||q?._metricsStatus!==Ur._metricsStatus||(q?.sitesDetail?.length??0)!==(Ur.sitesDetail?.length??0))ot();return Ur}).finally(()=>te.delete(N));return te.set(N,Ge),Ge},Re=Lt(t),de=process.env.TS_CLOUD_DASHBOARD_TELEMETRY?.trim();if(e.box&&de!=="0"&&(de==="1"||!m.cloud?.attachTo)){let N=!1,ze=Date.now()+300000,qe=async()=>{if(N)return;N=!0;try{let Ge=Date.now(),Rt=Ge>=ze;if(Rt)ze=Ge+300000;let q=y.environments.get(T);await bm({controlPlane:y.store,projectId:y.project.id,environmentId:q?.id,config:m,environment:T,force:!0,lightweight:!0,includeSiteHealth:Rt})}catch(Ge){if(e.verbose)console.warn(` ts-cloud dashboard: background telemetry collection failed: ${Ge instanceof Error?Ge.message:String(Ge)}`)}finally{N=!1}};qe(),setInterval(()=>void qe(),60000).unref?.()}let ae=new Map,Le=new Map,Je=new Set,gt=0;function Jt(N,ze){if(N.role==="admin"&&!y.store.getActorByExternalId("user",`dashboard:${N.username.toLowerCase()}`))return N;let qe=y.store.getActorByExternalId("user",`dashboard:${N.username.toLowerCase()}`),Fe=qe?y.store.getMembershipForActor(y.organization.id,qe.id):void 0;if(!Fe||Fe.status!=="active")return{...N,role:"member",sites:{},capabilities:[]};let Ge=y.store.listGrants(Fe.id),Rt=y.store.resolveAuthorizationTarget(y.organization.id,Fe.scope)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),q=Mt({membership:Fe,grants:Ge,target:Rt});if(Fe.roleTemplate==="owner"||Fe.roleTemplate==="admin")return{...N,role:"admin",sites:{},organizationRole:Fe.roleTemplate,organizationSource:Fe.source,capabilities:q};let Ur=y.environments.get(ze),vr={};for(let at of y.store.listResources(y.project.id,Ur?.id).filter((pt)=>pt.kind==="application")){let pt=y.store.resolveAuthorizationTarget(y.organization.id,{type:"resource",id:at.id});if(!pt||!D({membership:Fe,grants:Ge,capability:"project:read",target:pt}).allowed)continue;vr[at.slug]=D({membership:Fe,grants:Ge,capability:"config:write",target:pt}).allowed?"owner":"collaborator"}return{...N,role:"member",sites:vr,organizationRole:Fe.roleTemplate,organizationSource:Fe.source,capabilities:q}}function ot(){gt+=1,ae.clear();for(let N of Je)bs(N,{recursive:!0,force:!0});Je.clear()}let Pt=(N,ze)=>`${ze}:${N.role==="admin"?"admin":`member:${Object.entries(N.sites).sort(([qe],[Fe])=>qe.localeCompare(Fe)).map(([qe,Fe])=>`${qe}=${Fe}`).join(",")}`}:${[...N.capabilities??[]].sort().join(",")}`;async function Qt(N,ze){let qe=Jt(N,ze),Fe=Pt(qe,ze),Ge=ae.get(Fe);if(Ge)return Ge;let Rt=Le.get(Fe);if(Rt)return Rt;let q=gt,Ur=(async()=>{let vr=V.get(ze)??await vs(m,ze);V.set(ze,vr);let at={...lm(vr,{user:qe,slug:m.project.slug}),viewer:{role:qe.role,organizationRole:qe.organizationRole,organizationSource:qe.organizationSource,capabilities:qe.capabilities??[]}},pt=await sT(t,at);if(pt&&q!==gt)return bs(pt,{recursive:!0,force:!0}),Re?.uiRoot;if(pt)Je.add(pt);let $r=pt??Re?.uiRoot;if($r)ae.set(Fe,$r);return $r})();Le.set(Fe,Ur);try{return await Ur}finally{Le.delete(Fe)}}let lt=await Qt({username:"",passwordHash:"",role:"admin",sites:{}},T);if(!lt)throw Error("ts-cloud dashboard UI not found. Run `bun run build` in ts-cloud or reinstall the package.");let G=new WeakMap,ue=process.env.TS_CLOUD_DASHBOARD_TERMINAL!=="0",be=process.env.TS_CLOUD_DASHBOARD_AUTH==="0";if(be&&e.box)throw Error("TS_CLOUD_DASHBOARD_AUTH=0 is refused in box mode: the dashboard is internet-facing there, and disabling auth would expose a root shell.");let xe=!be,mt=Yb(t),_t=xe?tS(t,process.env.TS_CLOUD_UI_USERNAME?.trim()||"admin"):void 0,Ne=new Ui(y.store,{encryptionKey:Ye(t)}),yt=new Qi(y.store),ut=new en(y.store),Ke=new Qo(y.store,{encryptionKey:Ye(t)}),zr=new lp(y.store),Ss=new mp(y.store,{cwd:t}),Yn=new pp(y.store,{encryptionKey:Ye(t)}),Vt=new c(y.store,{workerId:`dashboard:${process.pid}`}),or=new ta(y.store),oi=new la(y.store,Ye(t)),Ci=new Ba(y.store),Rc=new Wi(or,Vt,oi),Pi=m.project?.region??"us-east-1",Im=Ye(t),kn=new La(Ci,{encryptionKey:Im,backends:[new gn(y.store,Im),new _a(new z(Pi),Pi),new Oa(new we(Pi),Pi),new xa]});await Eu(kn,y,m);let Ku=new K(Pi),dw={aws_rds:new ra(new aa(Ku)),aws_aurora:new na(new ca(Ku)),aws_elasticache:new ia(new da(new it(Pi))),server:new sa(new er),container:new oa(new er)},Em=(N)=>dw[N.provider],br=new va(y.store),vo=new rs(br,Vt),Rm=new Ta(oi),lw={managed_database:new wa(or,Ku),logical_database:new Da(or,oi),volume:new Pa,files:new Ra(t),control_plane:new Na(y.store,t),infrastructure:new ka(new ir(Pi))},uw=(N)=>lw[N.resourceKind],pw=(N)=>N.provider==="aws_backup"?void 0:Rm,Ju=new Ft(y.store),Gu=[new Or,new zs(d(t,"volumes"))],si=new js(Ju,Gu,Vt),Ja=new ua(y.store),Zn=new pa(Ja,[new on("aws"),new on("hetzner"),new on("ssh")],Vt),_i=new ga(y.store),Am=new ma(_i,Ja),bo=new ha(y.store),Cm=new fa(bo,Vt),ai=new ya(y.store),Qu=new Ia(ai,Vt),Pm=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((N)=>new Sa(N,y.store,y.project.id,y.organization.id)),Pr=new Yo(y.store),_m=new ea(Pr,{queue:Vt}),yr=new _r(y.store),xi=new xr(y.store),Dn=new It(y.store),st=new Ei(y.store,{encryptionKey:Ye(t)}),gw=()=>sw(y.store);for(let N of y.environments.values())Zo(Pr,m,{organization:y.organization,project:y.project,environment:N,resources:y.store.listResources(y.project.id,N.id)});let On=new bi(st,{emailImpl:async(N)=>{let{email:ze}=await import("./chunk-e3831mvy.js");return ze.send(N)}}),Tm=async(N)=>{let ze=oo(st,y.project.id,N),qe=[];for(let Fe of ze.filter((Ge)=>Ge.notify&&Ge.alert))qe.push(...await On.deliverAll(On.enqueue(y.organization.id,Fe.alert,Fe.transition)));return qe.push(...await On.deliverAll(On.enqueueRemindersAndEscalations(y.organization.id,st.listAlerts(y.project.id,{environmentId:N,states:["firing"]})))),qe.push(...await On.retryDue()),{evaluations:ze,deliveries:qe}},Yu=!1,mw=async()=>{if(Yu)return;Yu=!0;try{for(let N of y.environments.values())for(let ze of st.listHealthChecks(y.project.id,N.id).filter((qe)=>qe.enabled)){let qe=st.listHealthResults(ze.id,1)[0];if(qe&&Date.now()-new Date(qe.checkedAt).getTime()<ze.intervalSeconds*1000)continue;let Fe=await new je(st).runAndEvaluate(ze);for(let Ge of Fe.evaluations.filter((Rt)=>Rt.notify&&Rt.alert))await On.deliverAll(On.enqueue(y.organization.id,Ge.alert,Ge.transition))}}finally{Yu=!1}},xm=setInterval(()=>{for(let N of y.environments.values())Tm(N.id).catch((ze)=>console.error("ts-cloud alert evaluation failed:",ze))},60000);xm.unref?.();let Dm=setInterval(()=>{mw().catch((N)=>console.error("ts-cloud health check evaluation failed:",N))},30000);Dm.unref?.();let Om=setInterval(()=>{try{_m.tick()}catch(N){console.error("ts-cloud scheduled job evaluation failed:",N)}},30000);Om.unref?.();let $m=setInterval(()=>{try{vo.enqueueDue(),vo.enqueueRetention()}catch(N){console.error("ts-cloud backup policy evaluation failed:",N)}},30000);$m.unref?.(),yr.cleanup();let Nm=setInterval(()=>{try{yr.cleanup()}catch(N){console.error("ts-cloud preview cleanup failed:",N)}},3600000);Nm.unref?.();let fw=e.queueWorker??!0,hw=aT(),yw=async(N,ze)=>{let Fe=(N.environmentId?y.store.listEnvironments(N.projectId).find((Ge)=>Ge.id===N.environmentId):void 0)?.slug??String(T);if(ze.kind==="dashboard_operation"&&ze.operationId){let Ge=V.get(Fe)??B,Rt=dm(ze.operationId,m,Ge);if(!Rt||Rt.danger||!["scheduler","backup","worker"].includes(Rt.group))return{ok:!1,stderr:"The allowlisted dashboard operation is no longer available."};let q=await Bu(m,Fe,Rt);return{ok:q.ok,stdout:q.stdout,stderr:q.stderr??q.error,retryable:/temporar|unavailable|timeout|network/i.test(q.stderr??q.error??""),output:{command:q.command??null,operation:q.operation}}}if(ze.kind==="serverless_scheduler"){let Ge=await vm(m,Fe,"run");return{ok:Ge.ok,stdout:Ge.stdout,stderr:Ge.error,retryable:/temporar|unavailable|timeout|network/i.test(Ge.error??""),output:{command:Ge.command??null,operation:"serverless_scheduler"}}}return{ok:!1,stderr:`No safe executor is configured for ${ze.kind}.`}},Ac=fw?new qs(Vt,{...Kc({store:y.store,execute:async(N,ze)=>{let qe=ze.operation.input&&typeof ze.operation.input==="object"&&!Array.isArray(ze.operation.input)?ze.operation.input:{},Fe=qe.source&&typeof qe.source==="object"?qe.source:void 0,Ge=t,Rt,q,Ur;try{if(Fe?.bindingId&&Fe?.connectionId&&Fe?.commitSha){let at=Ke.getBinding(String(Fe.bindingId)),pt=Ke.getConnection(String(Fe.connectionId));if(!at||!pt||at.connectionId!==pt.id)throw Error("Queued source binding is no longer available");let Rr=(at.repositoryId?Ke.getRepository(at.repositoryId):Ke.listRepositories(pt.id).find((Is)=>Is.fullName.toLowerCase()===at.repositoryFullName.toLowerCase()))?.cloneUrl;if(!Rr&&pt.provider==="generic_ssh")Rr=`git@${new URL(pt.host).hostname}:${at.repositoryFullName}.git`;if(!Rr)Rr=new URL(`/${at.repositoryFullName}.git`,pt.host.endsWith("/")?pt.host:`${pt.host}/`).href;let Ce=at.deployKeyId?Ke.getDeployKey(at.deployKeyId):void 0,sr=Ce&&at.deployKeyId?{...Ce,privateKey:Ke.getDeployPrivateKey(at.deployKeyId)}:void 0;if(["github","gitlab","bitbucket","gitea"].includes(pt.provider)&&N.target.previewId){let Is=Ze(pt,Ke.getCredential(pt.id)),me=yr.previews.getInstance(N.target.previewId);Ur=async($n,xc)=>{try{await Is.setCommitStatus(at.repositoryFullName,String(Fe.commitSha),{state:$n,url:me?.url,description:xc})}catch(Es){ze.log(`Could not publish source status: ${Es instanceof Error?Es.message:String(Es)}`,{stream:"stderr"})}},await Ur("pending",`Preview deployment started for ${String(Fe.commitSha).slice(0,12)}`)}Rt=km(Ut(Wu(),"ts-cloud-queued-source-")),ze.log(`Checking out immutable source commit ${Fe.commitSha}.`,{stream:"system"}),Ge=(await Go({remote:Rr,binding:at,destination:Ut(Rt,"checkout"),ref:String(Fe.branch??at.defaultBranch),commitSha:String(Fe.commitSha)},{credential:Ke.getCredential(pt.id),deployKey:sr})).directory}if(ze.operation.kind!=="preview.destroy"){let at=N.target.previewId?yr.previews.getInstance(N.target.previewId):void 0,pt=at?yr.previews.getDefinition(at.definitionId):void 0,$r=ze.operation.resourceId?y.store.getResource(ze.operation.resourceId):void 0;if(q=await kn.resolve({projectId:y.project.id,environmentId:ze.operation.environmentId,resourceId:ze.operation.resourceId,functionId:$r?.kind==="function"?$r.id:void 0,previewId:at?.id,trustedPreview:!!at&&!at.fork,allowedPreviewSecrets:pt?.inheritedSecrets}),q.warnings.some((Rr)=>Rr.code==="missing_required"))throw Error(`Required deployment configuration is unavailable: ${q.warnings.filter((Rr)=>Rr.code==="missing_required").map((Rr)=>Rr.key).join(", ")}`);if(ze.operation.resourceId)for(let Rr of Object.values(q.entries))Ci.setDependency({entryId:Rr.id,resourceId:ze.operation.resourceId,injectionTarget:"environment",required:Rr.required,requiresRedeploy:!0});ze.log(`Resolved configuration ${q.configurationHash.slice(0,18)} for ${Object.keys(q.values).length} keys.`,{stream:"system"})}let vr=await wm(N,{cwd:Ge,cliEntry:l,signal:ze.signal,env:q?.values,onOutput:(at,pt)=>ze.log(pt,{stream:at,step:"execute",secrets:[...hw,...Object.entries(q?.entries??{}).filter(([,$r])=>$r.kind==="secret").map(([$r])=>q.values[$r]).filter(Boolean)]})});if(vr.ok&&ze.operation.resourceId&&q)for(let at of Object.values(q.entries))Ci.setDependency({entryId:at.id,resourceId:ze.operation.resourceId,injectionTarget:"environment",required:at.required,requiresRedeploy:!1,lastDeployedVersion:at.version});return await Ur?.(vr.ok?"success":"failure",vr.ok?`Preview is ready at ${String(Fe?.commitSha).slice(0,12)}`:`Preview deployment failed at ${String(Fe?.commitSha).slice(0,12)}`),vr}catch(vr){throw await Ur?.("error",`Preview deployment could not complete at ${String(Fe?.commitSha).slice(0,12)}`),vr}finally{if(Rt)bs(Rt,{recursive:!0,force:!0})}}}),...Ul({store:Pr,executor:yw}),...Hl({store:or,secrets:oi,resolveAdapter:Em}),...Vl(Ja,Zn.drivers),...zl(bo,[new Aa("aws","AWS regional execution requires an injected AwsRegionalTransport; topology and plans were preserved without provider mutation.")]),...Yl({store:ai,cleanup:Pm}),...Wc(Ju,Gu),...Au({store:br,queue:Vt,resolveSource:uw,resolveDestination:pw,validateHealth:async(N,ze)=>{if(!N.healthCheckId)return{healthy:!0,mode:"adapter"};let qe=st.getHealthCheck(N.healthCheckId);if(!qe||qe.projectId!==N.projectId)return{healthy:!1,error:"Configured restore health check was not found."};let Fe=await new je(st).runAndEvaluate(qe);return{healthy:Fe.result.status==="healthy",healthCheckId:qe.id,healthResultId:Fe.result.id,target:ze}}}),...yl({store:y.store,resolveDriver:e.releaseDriver??((N)=>({name:`${y.store.getResource(N.resourceId)?.provider??"provider"} release driver`,capability:()=>({strategy:N.strategy,supported:!1,explanation:"This dashboard process has no immutable activation driver configured for the target provider.",capacityMultiplier:1,costImpact:"none",rollback:"The previous release remains preserved; configure a release driver before retrying."}),activate:async()=>{throw Error("Immutable activation driver is not configured")},rollback:async()=>{throw Error("Immutable rollback driver is not configured")}})),resolveHealthGate:async(N,ze)=>{let qe=st.listHealthChecks(ze.projectId,ze.environmentId).find((Ge)=>Ge.enabled&&Ge.name===N&&(!Ge.resourceId||Ge.resourceId===ze.resourceId));if(!qe)return{healthy:!1,message:`Named health gate ${N} was not found for this release.`};let Fe=await new je(st).runAndEvaluate(qe);return{healthy:Fe.result.status==="healthy",evidence:{healthCheckId:qe.id,healthResultId:Fe.result.id,status:Fe.result.status,timings:Fe.result.timings},message:Fe.result.message}}})},{parallelism:e.queueParallelism??(Number(process.env.TS_CLOUD_QUEUE_PARALLELISM)||8),onError:(N)=>console.error("ts-cloud deployment queue worker failed:",N)}):void 0;if(kl(y),ji(ut,ne(y,String(T)),B),_t)Zi(y,_t.users),iS(Ne,y,_t.users);let lr=rS({cwd:t,enabled:xe,secret:mt,authentication:Ne,authorization:{store:y.store,organizationId:y.organization.id,projectId:y.project.id,defaultEnvironment:String(T)}}),Sr=new Xo,Bm=setInterval(()=>Sr.sweep(),60000);Bm.unref?.();let Cc=new Sc,Zu=new Sc(3,900000,900000),Pc=new Sc(8,900000,900000),Mm=setInterval(()=>Cc.prune(),300000),Lm=setInterval(()=>Zu.prune(),300000),Fm=setInterval(()=>Pc.prune(),300000);if(Mm.unref?.(),Lm.unref?.(),Fm.unref?.(),xe){if(_t?.generated)console.warn(`
|
|
676
|
+
[output truncated]`}async function rw(e,t,r){let a=e.getReader(),l=new TextDecoder,m="";while(!0){let{done:S,value:R}=await a.read();if(S)break;let y=l.decode(R,{stream:!0});if(m+=y,y)r?.(t,y)}let h=l.decode();if(h)m+=h,r?.(t,h);return m}async function wm(e,t){let r=Bun.spawn([process.execPath,t.cliEntry,...e.command],{cwd:t.cwd,stdout:"pipe",stderr:"pipe",env:{...process.env,...t.env}}),a=()=>{try{r.kill()}catch{}};if(t.signal?.aborted)a();else t.signal?.addEventListener("abort",a,{once:!0});try{let[l,m,h]=await Promise.all([rw(r.stdout,"stdout",t.onOutput),rw(r.stderr,"stderr",t.onOutput),r.exited]);return{action:e.id,command:["cloud",...e.command].join(" "),exitCode:h,ok:h===0,stdout:tw(l),stderr:tw(m)}}finally{t.signal?.removeEventListener("abort",a)}}function cT(){return Object.entries(process.env).filter(([e,t])=>!!t&&t.length>=8&&/(?:secret|token|password|passwd|private|credential|api.?key|access.?key)/i.test(e)).map(([,e])=>e)}var dT=new Set(["/server/sites","/server/deployments","/server/logs","/integrations","/applications/new","/applications/compose","/operations/queue","/operations/previews","/operations/releases","/operations/workloads","/operations/observability","/operations/alerts","/operations/jobs","/data/backups","/account/security","/security","/access-denied"]);function lT(e){let t=Ec(e);if(t&&t!==".html")return!1;let r=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(r==="/")return!1;return!dT.has(r)}var uT={"/":"runtime:read","/server/activity":"audit:read","/server/sites":"project:read","/server/deployments":"deployments:read","/server/logs":"runtime:logs","/server/metrics":"runtime:read","/server/services":"runtime:read","/data/backups":"backups:read","/data/volumes":"data:read","/server/fleet":"fleet:read","/server/capacity":"fleet:read","/server/actions":"runtime:restart","/server/database":"data:read","/server/firewall":"fleet:read","/infrastructure/topology":"fleet:read","/server/security":"security:read","/security":"security:read","/integrations":"sources:read","/applications/new":"applications:read","/applications/compose":"applications:read","/operations/queue":"deployments:read","/operations/previews":"deployments:read","/operations/releases":"deployments:read","/operations/regions":"deployments:read","/operations/maintenance":"deployments:read","/operations/workloads":"runtime:read","/operations/observability":"runtime:logs","/operations/alerts":"runtime:read","/operations/jobs":"automation:read","/operations/configuration":"config:read","/server/ssh-keys":"fleet:read","/server/terminal":"runtime:terminal","/server/team":"users:read","/account/security":"project:read","/account/automation":"users:read","/serverless":"project:read","/serverless/deployments":"deployments:read","/serverless/logs":"runtime:logs","/serverless/metrics":"runtime:read","/serverless/traces":"runtime:read","/serverless/functions":"config:read","/serverless/queues":"data:read","/serverless/data":"data:read","/serverless/assets":"project:read","/serverless/secrets":"secrets:read","/serverless/firewall":"fleet:read","/serverless/alarms":"runtime:read","/serverless/cost":"project:read"};function nw(e,t){if(t.role==="admin")return!0;let r=Ec(e);if(r&&r!==".html")return!0;if(t.organizationSource==="legacy")return!lT(e);let a=e.replace(/\.html$/,"").replace(/\/+$/,"")||"/";if(a==="/access-denied")return!0;let l=uT[a];return!!l&&!!t.capabilities?.includes(l)}function pT(e,t){let r=decodeURIComponent(t).replace(/^\/+/,""),l=N_(r===""?"index.html":r);if(l.startsWith("..")||l.includes("/../"))return null;let m=Ut(e,l);if(Ai(m)&&!aw(m).isDirectory())return m;if(!Ec(m)&&Ai(`${m}.html`))return`${m}.html`;if(!Ec(m)&&Ai(Ut(m,"index.html")))return Ut(m,"index.html");return null}async function iw(e,t){let r=pT(e,t);if(!r){let m=Ut(e,"404.html");if(Ai(m))return new Response(await ii(m),{status:404,headers:{"content-type":"text/html; charset=utf-8"}});return Hu("Not found",404)}if(aw(r).isDirectory())return Hu("Not found",404);let a=await ii(r),l=V_[Ec(r)]??"application/octet-stream";return new Response(a,{headers:{"content-type":l}})}var Vu=["observe","backup","restore","restart","resize","version","rotate","expose","delete","logs","slow_queries","users","databases"],ow=new WeakMap;async function sw(e){let t=ow.get(e);if(t)return t;let r=await import("./spend/index.js"),a=new r.SpendStore(e),l={store:a,service:new r.SpendService(a),gate:new r.SpendGate(e)};return ow.set(e,l),l}async function $a(e={}){q_();let t=e.cwd??process.cwd(),r=e.host??F_,a=e.port??z_,l=e.cliEntry??process.argv[1];if(e.box)process.env.TS_CLOUD_DASHBOARD_BOX="1";await Z_(t);let m=e.config??await sl(),h=process.env.TS_CLOUD_DASHBOARD_DB_PASSWORD,S=p(m);if(h&&S&&!S.password)S.password=h;let R=m.infrastructure?.compute?.managedServices?.vitess;if(h&&R&&typeof R==="object"&&!R.password)R.password=h;let y=ou(t,m);if(y.reconciliation.failed>0)console.warn(` ts-cloud dashboard: marked ${y.reconciliation.failed} orphaned operation(s) as failed after restart.`);let C=Object.keys(m.environments??{}),T=Q_(m,e.environment),j=X_(t),B=await vs(m,T),V=new Map([[T,B]]),W=new Map([[T,Date.now()]]),Y=new Map([[T,Date.now()]]),te=new Map,le=Math.min(300000,Math.max(5000,Number(process.env.TS_CLOUD_DASHBOARD_REFRESH_MS)||30000)),X=Math.min(1800000,Math.max(60000,Number(process.env.TS_CLOUD_DASHBOARD_SITE_REFRESH_MS)||300000)),ce=M(m)!=="serverless",Ee=(N)=>{let ze=V.get(N);if(ze&&!ZS(W.get(N),Date.now(),le))return Promise.resolve(ze);let qe=te.get(N);if(qe)return qe;let Fe=!ce||ZS(Y.get(N),Date.now(),X),Ge=vs(m,N,{includeSiteHealth:Fe}).then((Rt)=>{let q=V.get(N),Ur=Fe?Rt:oT(q,Rt);if(V.set(N,Ur),W.set(N,Date.now()),Fe)Y.set(N,Date.now());if(q?._serverReachable!==Ur._serverReachable||q?._metricsStatus!==Ur._metricsStatus||(q?.sitesDetail?.length??0)!==(Ur.sitesDetail?.length??0))ot();return Ur}).finally(()=>te.delete(N));return te.set(N,Ge),Ge},Re=Lt(t),de=process.env.TS_CLOUD_DASHBOARD_TELEMETRY?.trim();if(e.box&&de!=="0"&&(de==="1"||!m.cloud?.attachTo)){let N=!1,ze=Date.now()+300000,qe=async()=>{if(N)return;N=!0;try{let Ge=Date.now(),Rt=Ge>=ze;if(Rt)ze=Ge+300000;let q=y.environments.get(T);await bm({controlPlane:y.store,projectId:y.project.id,environmentId:q?.id,config:m,environment:T,force:!0,lightweight:!0,includeSiteHealth:Rt})}catch(Ge){if(e.verbose)console.warn(` ts-cloud dashboard: background telemetry collection failed: ${Ge instanceof Error?Ge.message:String(Ge)}`)}finally{N=!1}};qe(),setInterval(()=>void qe(),60000).unref?.()}let ae=new Map,Le=new Map,Je=new Set,gt=0;function Jt(N,ze){if(N.role==="admin"&&!y.store.getActorByExternalId("user",`dashboard:${N.username.toLowerCase()}`))return N;let qe=y.store.getActorByExternalId("user",`dashboard:${N.username.toLowerCase()}`),Fe=qe?y.store.getMembershipForActor(y.organization.id,qe.id):void 0;if(!Fe||Fe.status!=="active")return{...N,role:"member",sites:{},capabilities:[]};let Ge=y.store.listGrants(Fe.id),Rt=y.store.resolveAuthorizationTarget(y.organization.id,Fe.scope)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),q=Mt({membership:Fe,grants:Ge,target:Rt});if(Fe.roleTemplate==="owner"||Fe.roleTemplate==="admin")return{...N,role:"admin",sites:{},organizationRole:Fe.roleTemplate,organizationSource:Fe.source,capabilities:q};let Ur=y.environments.get(ze),vr={};for(let at of y.store.listResources(y.project.id,Ur?.id).filter((pt)=>pt.kind==="application")){let pt=y.store.resolveAuthorizationTarget(y.organization.id,{type:"resource",id:at.id});if(!pt||!D({membership:Fe,grants:Ge,capability:"project:read",target:pt}).allowed)continue;vr[at.slug]=D({membership:Fe,grants:Ge,capability:"config:write",target:pt}).allowed?"owner":"collaborator"}return{...N,role:"member",sites:vr,organizationRole:Fe.roleTemplate,organizationSource:Fe.source,capabilities:q}}function ot(){gt+=1,ae.clear();for(let N of Je)bs(N,{recursive:!0,force:!0});Je.clear()}let Pt=(N,ze)=>`${ze}:${N.role==="admin"?"admin":`member:${Object.entries(N.sites).sort(([qe],[Fe])=>qe.localeCompare(Fe)).map(([qe,Fe])=>`${qe}=${Fe}`).join(",")}`}:${[...N.capabilities??[]].sort().join(",")}`;async function Qt(N,ze){let qe=Jt(N,ze),Fe=Pt(qe,ze),Ge=ae.get(Fe);if(Ge)return Ge;let Rt=Le.get(Fe);if(Rt)return Rt;let q=gt,Ur=(async()=>{let vr=V.get(ze)??await vs(m,ze);V.set(ze,vr);let at={...lm(vr,{user:qe,slug:m.project.slug}),viewer:{role:qe.role,organizationRole:qe.organizationRole,organizationSource:qe.organizationSource,capabilities:qe.capabilities??[]}},pt=await aT(t,at);if(pt&&q!==gt)return bs(pt,{recursive:!0,force:!0}),Re?.uiRoot;if(pt)Je.add(pt);let $r=pt??Re?.uiRoot;if($r)ae.set(Fe,$r);return $r})();Le.set(Fe,Ur);try{return await Ur}finally{Le.delete(Fe)}}let lt=await Qt({username:"",passwordHash:"",role:"admin",sites:{}},T);if(!lt)throw Error("ts-cloud dashboard UI not found. Run `bun run build` in ts-cloud or reinstall the package.");let G=new WeakMap,ue=process.env.TS_CLOUD_DASHBOARD_TERMINAL!=="0",be=process.env.TS_CLOUD_DASHBOARD_AUTH==="0";if(be&&e.box)throw Error("TS_CLOUD_DASHBOARD_AUTH=0 is refused in box mode: the dashboard is internet-facing there, and disabling auth would expose a root shell.");let xe=!be,mt=Yb(t),_t=xe?tS(t,process.env.TS_CLOUD_UI_USERNAME?.trim()||"admin"):void 0,Ne=new Ui(y.store,{encryptionKey:Ye(t)}),yt=new Qi(y.store),ut=new en(y.store),Ke=new Qo(y.store,{encryptionKey:Ye(t)}),zr=new lp(y.store),Ss=new mp(y.store,{cwd:t}),Yn=new pp(y.store,{encryptionKey:Ye(t)}),Vt=new c(y.store,{workerId:`dashboard:${process.pid}`}),or=new ta(y.store),oi=new la(y.store,Ye(t)),Ci=new Ba(y.store),Rc=new Wi(or,Vt,oi),Pi=m.project?.region??"us-east-1",Im=Ye(t),kn=new La(Ci,{encryptionKey:Im,backends:[new gn(y.store,Im),new _a(new z(Pi),Pi),new Oa(new we(Pi),Pi),new xa]});await Eu(kn,y,m);let Ku=new K(Pi),dw={aws_rds:new ra(new aa(Ku)),aws_aurora:new na(new ca(Ku)),aws_elasticache:new ia(new da(new it(Pi))),server:new sa(new er),container:new oa(new er)},Em=(N)=>dw[N.provider],br=new va(y.store),vo=new rs(br,Vt),Rm=new Ta(oi),lw={managed_database:new wa(or,Ku),logical_database:new Da(or,oi),volume:new Pa,files:new Ra(t),control_plane:new Na(y.store,t),infrastructure:new ka(new ir(Pi))},uw=(N)=>lw[N.resourceKind],pw=(N)=>N.provider==="aws_backup"?void 0:Rm,Ju=new Ft(y.store),Gu=[new Or,new zs(d(t,"volumes"))],si=new js(Ju,Gu,Vt),Ja=new ua(y.store),Zn=new pa(Ja,[new on("aws"),new on("hetzner"),new on("ssh")],Vt),_i=new ga(y.store),Am=new ma(_i,Ja),bo=new ha(y.store),Cm=new fa(bo,Vt),ai=new ya(y.store),Qu=new Ia(ai,Vt),Pm=["releases","artifacts","operations","logs","previews","snapshots","orphaned_resources"].map((N)=>new Sa(N,y.store,y.project.id,y.organization.id)),Pr=new Yo(y.store),_m=new ea(Pr,{queue:Vt}),yr=new _r(y.store),xi=new xr(y.store),Dn=new It(y.store),st=new Ei(y.store,{encryptionKey:Ye(t)}),gw=()=>sw(y.store);for(let N of y.environments.values())Zo(Pr,m,{organization:y.organization,project:y.project,environment:N,resources:y.store.listResources(y.project.id,N.id)});let On=new bi(st,{emailImpl:async(N)=>{let{email:ze}=await import("./chunk-e3831mvy.js");return ze.send(N)}}),Tm=async(N)=>{let ze=oo(st,y.project.id,N),qe=[];for(let Fe of ze.filter((Ge)=>Ge.notify&&Ge.alert))qe.push(...await On.deliverAll(On.enqueue(y.organization.id,Fe.alert,Fe.transition)));return qe.push(...await On.deliverAll(On.enqueueRemindersAndEscalations(y.organization.id,st.listAlerts(y.project.id,{environmentId:N,states:["firing"]})))),qe.push(...await On.retryDue()),{evaluations:ze,deliveries:qe}},Yu=!1,mw=async()=>{if(Yu)return;Yu=!0;try{for(let N of y.environments.values())for(let ze of st.listHealthChecks(y.project.id,N.id).filter((qe)=>qe.enabled)){let qe=st.listHealthResults(ze.id,1)[0];if(qe&&Date.now()-new Date(qe.checkedAt).getTime()<ze.intervalSeconds*1000)continue;let Fe=await new je(st).runAndEvaluate(ze);for(let Ge of Fe.evaluations.filter((Rt)=>Rt.notify&&Rt.alert))await On.deliverAll(On.enqueue(y.organization.id,Ge.alert,Ge.transition))}}finally{Yu=!1}},xm=setInterval(()=>{for(let N of y.environments.values())Tm(N.id).catch((ze)=>console.error("ts-cloud alert evaluation failed:",ze))},60000);xm.unref?.();let Dm=setInterval(()=>{mw().catch((N)=>console.error("ts-cloud health check evaluation failed:",N))},30000);Dm.unref?.();let Om=setInterval(()=>{try{_m.tick()}catch(N){console.error("ts-cloud scheduled job evaluation failed:",N)}},30000);Om.unref?.();let $m=setInterval(()=>{try{vo.enqueueDue(),vo.enqueueRetention()}catch(N){console.error("ts-cloud backup policy evaluation failed:",N)}},30000);$m.unref?.(),yr.cleanup();let Nm=setInterval(()=>{try{yr.cleanup()}catch(N){console.error("ts-cloud preview cleanup failed:",N)}},3600000);Nm.unref?.();let fw=e.queueWorker??!0,hw=cT(),yw=async(N,ze)=>{let Fe=(N.environmentId?y.store.listEnvironments(N.projectId).find((Ge)=>Ge.id===N.environmentId):void 0)?.slug??String(T);if(ze.kind==="dashboard_operation"&&ze.operationId){let Ge=V.get(Fe)??B,Rt=dm(ze.operationId,m,Ge);if(!Rt||Rt.danger||!["scheduler","backup","worker"].includes(Rt.group))return{ok:!1,stderr:"The allowlisted dashboard operation is no longer available."};let q=await Bu(m,Fe,Rt);return{ok:q.ok,stdout:q.stdout,stderr:q.stderr??q.error,retryable:/temporar|unavailable|timeout|network/i.test(q.stderr??q.error??""),output:{command:q.command??null,operation:q.operation}}}if(ze.kind==="serverless_scheduler"){let Ge=await vm(m,Fe,"run");return{ok:Ge.ok,stdout:Ge.stdout,stderr:Ge.error,retryable:/temporar|unavailable|timeout|network/i.test(Ge.error??""),output:{command:Ge.command??null,operation:"serverless_scheduler"}}}return{ok:!1,stderr:`No safe executor is configured for ${ze.kind}.`}},Ac=fw?new qs(Vt,{...Kc({store:y.store,execute:async(N,ze)=>{let qe=ze.operation.input&&typeof ze.operation.input==="object"&&!Array.isArray(ze.operation.input)?ze.operation.input:{},Fe=qe.source&&typeof qe.source==="object"?qe.source:void 0,Ge=t,Rt,q,Ur;try{if(Fe?.bindingId&&Fe?.connectionId&&Fe?.commitSha){let at=Ke.getBinding(String(Fe.bindingId)),pt=Ke.getConnection(String(Fe.connectionId));if(!at||!pt||at.connectionId!==pt.id)throw Error("Queued source binding is no longer available");let Rr=(at.repositoryId?Ke.getRepository(at.repositoryId):Ke.listRepositories(pt.id).find((Is)=>Is.fullName.toLowerCase()===at.repositoryFullName.toLowerCase()))?.cloneUrl;if(!Rr&&pt.provider==="generic_ssh")Rr=`git@${new URL(pt.host).hostname}:${at.repositoryFullName}.git`;if(!Rr)Rr=new URL(`/${at.repositoryFullName}.git`,pt.host.endsWith("/")?pt.host:`${pt.host}/`).href;let Ce=at.deployKeyId?Ke.getDeployKey(at.deployKeyId):void 0,sr=Ce&&at.deployKeyId?{...Ce,privateKey:Ke.getDeployPrivateKey(at.deployKeyId)}:void 0;if(["github","gitlab","bitbucket","gitea"].includes(pt.provider)&&N.target.previewId){let Is=Ze(pt,Ke.getCredential(pt.id)),me=yr.previews.getInstance(N.target.previewId);Ur=async($n,xc)=>{try{await Is.setCommitStatus(at.repositoryFullName,String(Fe.commitSha),{state:$n,url:me?.url,description:xc})}catch(Es){ze.log(`Could not publish source status: ${Es instanceof Error?Es.message:String(Es)}`,{stream:"stderr"})}},await Ur("pending",`Preview deployment started for ${String(Fe.commitSha).slice(0,12)}`)}Rt=km(Ut(Wu(),"ts-cloud-queued-source-")),ze.log(`Checking out immutable source commit ${Fe.commitSha}.`,{stream:"system"}),Ge=(await Go({remote:Rr,binding:at,destination:Ut(Rt,"checkout"),ref:String(Fe.branch??at.defaultBranch),commitSha:String(Fe.commitSha)},{credential:Ke.getCredential(pt.id),deployKey:sr})).directory}if(ze.operation.kind!=="preview.destroy"){let at=N.target.previewId?yr.previews.getInstance(N.target.previewId):void 0,pt=at?yr.previews.getDefinition(at.definitionId):void 0,$r=ze.operation.resourceId?y.store.getResource(ze.operation.resourceId):void 0;if(q=await kn.resolve({projectId:y.project.id,environmentId:ze.operation.environmentId,resourceId:ze.operation.resourceId,functionId:$r?.kind==="function"?$r.id:void 0,previewId:at?.id,trustedPreview:!!at&&!at.fork,allowedPreviewSecrets:pt?.inheritedSecrets}),q.warnings.some((Rr)=>Rr.code==="missing_required"))throw Error(`Required deployment configuration is unavailable: ${q.warnings.filter((Rr)=>Rr.code==="missing_required").map((Rr)=>Rr.key).join(", ")}`);if(ze.operation.resourceId)for(let Rr of Object.values(q.entries))Ci.setDependency({entryId:Rr.id,resourceId:ze.operation.resourceId,injectionTarget:"environment",required:Rr.required,requiresRedeploy:!0});ze.log(`Resolved configuration ${q.configurationHash.slice(0,18)} for ${Object.keys(q.values).length} keys.`,{stream:"system"})}let vr=await wm(N,{cwd:Ge,cliEntry:l,signal:ze.signal,env:q?.values,onOutput:(at,pt)=>ze.log(pt,{stream:at,step:"execute",secrets:[...hw,...Object.entries(q?.entries??{}).filter(([,$r])=>$r.kind==="secret").map(([$r])=>q.values[$r]).filter(Boolean)]})});if(vr.ok&&ze.operation.resourceId&&q)for(let at of Object.values(q.entries))Ci.setDependency({entryId:at.id,resourceId:ze.operation.resourceId,injectionTarget:"environment",required:at.required,requiresRedeploy:!1,lastDeployedVersion:at.version});return await Ur?.(vr.ok?"success":"failure",vr.ok?`Preview is ready at ${String(Fe?.commitSha).slice(0,12)}`:`Preview deployment failed at ${String(Fe?.commitSha).slice(0,12)}`),vr}catch(vr){throw await Ur?.("error",`Preview deployment could not complete at ${String(Fe?.commitSha).slice(0,12)}`),vr}finally{if(Rt)bs(Rt,{recursive:!0,force:!0})}}}),...Ul({store:Pr,executor:yw}),...Hl({store:or,secrets:oi,resolveAdapter:Em}),...Vl(Ja,Zn.drivers),...zl(bo,[new Aa("aws","AWS regional execution requires an injected AwsRegionalTransport; topology and plans were preserved without provider mutation.")]),...Yl({store:ai,cleanup:Pm}),...Wc(Ju,Gu),...Au({store:br,queue:Vt,resolveSource:uw,resolveDestination:pw,validateHealth:async(N,ze)=>{if(!N.healthCheckId)return{healthy:!0,mode:"adapter"};let qe=st.getHealthCheck(N.healthCheckId);if(!qe||qe.projectId!==N.projectId)return{healthy:!1,error:"Configured restore health check was not found."};let Fe=await new je(st).runAndEvaluate(qe);return{healthy:Fe.result.status==="healthy",healthCheckId:qe.id,healthResultId:Fe.result.id,target:ze}}}),...yl({store:y.store,resolveDriver:e.releaseDriver??((N)=>({name:`${y.store.getResource(N.resourceId)?.provider??"provider"} release driver`,capability:()=>({strategy:N.strategy,supported:!1,explanation:"This dashboard process has no immutable activation driver configured for the target provider.",capacityMultiplier:1,costImpact:"none",rollback:"The previous release remains preserved; configure a release driver before retrying."}),activate:async()=>{throw Error("Immutable activation driver is not configured")},rollback:async()=>{throw Error("Immutable rollback driver is not configured")}})),resolveHealthGate:async(N,ze)=>{let qe=st.listHealthChecks(ze.projectId,ze.environmentId).find((Ge)=>Ge.enabled&&Ge.name===N&&(!Ge.resourceId||Ge.resourceId===ze.resourceId));if(!qe)return{healthy:!1,message:`Named health gate ${N} was not found for this release.`};let Fe=await new je(st).runAndEvaluate(qe);return{healthy:Fe.result.status==="healthy",evidence:{healthCheckId:qe.id,healthResultId:Fe.result.id,status:Fe.result.status,timings:Fe.result.timings},message:Fe.result.message}}})},{parallelism:e.queueParallelism??(Number(process.env.TS_CLOUD_QUEUE_PARALLELISM)||8),onError:(N)=>console.error("ts-cloud deployment queue worker failed:",N)}):void 0;if(kl(y),ji(ut,ne(y,String(T)),B),_t)Zi(y,_t.users),iS(Ne,y,_t.users);let lr=rS({cwd:t,enabled:xe,secret:mt,authentication:Ne,authorization:{store:y.store,organizationId:y.organization.id,projectId:y.project.id,defaultEnvironment:String(T)}}),Sr=new Xo,Bm=setInterval(()=>Sr.sweep(),60000);Bm.unref?.();let Cc=new Sc,Zu=new Sc(3,900000,900000),Pc=new Sc(8,900000,900000),Mm=setInterval(()=>Cc.prune(),300000),Lm=setInterval(()=>Zu.prune(),300000),Fm=setInterval(()=>Pc.prune(),300000);if(Mm.unref?.(),Lm.unref?.(),Fm.unref?.(),xe){if(_t?.generated)console.warn(`
|
|
677
677
|
ts-cloud dashboard: created the first admin.
|
|
678
678
|
username: ${_t.generated.username}
|
|
679
679
|
password: ${_t.generated.password}
|
|
680
680
|
Saved (hashed) to ${Xb()}. This password is shown once.
|
|
681
|
-
`)}else console.warn(" ts-cloud dashboard: authentication is DISABLED (TS_CLOUD_DASHBOARD_AUTH=0). Every request runs as an admin.");let Di=r!=="127.0.0.1"&&r!=="localhost",Xu=(N)=>
|
|
681
|
+
`)}else console.warn(" ts-cloud dashboard: authentication is DISABLED (TS_CLOUD_DASHBOARD_AUTH=0). Every request runs as an admin.");let Di=r!=="127.0.0.1"&&r!=="localhost",Xu=(N)=>O_("sha256").update(`${mt}:${N}`).digest("hex").slice(0,16),vw=jo({controlPlane:y.store,identities:yt,sources:Ke,applications:{drafts:zr,artifacts:Ss,registries:Yn}}),Um=(N)=>N.headers.get("user-agent")?.trim().slice(0,256)||void 0,_c=(N,ze,qe,Fe="local")=>Ne.createSession({identityId:N,authMethod:Fe,userAgent:Um(ze),networkHint:Xu(qe)}),We=(N)=>{let ze=y.store.getActorByExternalId("user",`dashboard:${N.username.toLowerCase()}`),qe=ze?y.store.getMembershipForActor(y.organization.id,ze.id):void 0;return{actor:ze,membership:qe,grants:qe?y.store.listGrants(qe.id):[]}},ws=(N,ze,qe)=>{if(N.role==="admin")return!0;let Fe=y.store.getOperation(ze),Ge=We(N);if(!Fe||!Ge.membership)return!1;let Rt=Fe.resourceId?{type:"resource",id:Fe.resourceId}:Fe.environmentId?{type:"environment",id:Fe.environmentId}:Fe.projectId?{type:"project",id:Fe.projectId}:{type:"organization"},q=y.store.resolveAuthorizationTarget(y.organization.id,Rt);return!!q&&D({membership:Ge.membership,grants:Ge.grants,capability:qe,target:q}).allowed},Dr=(N,ze,qe)=>{if(N.role==="admin")return!0;let Fe=We(N);if(!Fe.membership)return!1;let Ge=y.store.resolveAuthorizationTarget(y.organization.id,{type:"resource",id:ze});return!!Ge&&D({membership:Fe.membership,grants:Fe.grants,capability:qe,target:Ge}).allowed},Ga=(N,ze,qe)=>{if(N.role==="admin")return!0;let Fe=We(N);if(!Fe.membership)return!1;let Ge=y.store.resolveAuthorizationTarget(y.organization.id,{type:"environment",id:ze});return!!Ge&&D({membership:Fe.membership,grants:Fe.grants,capability:qe,target:Ge}).allowed},Tc=(N,ze)=>{if(N.role==="admin")return!0;let qe=We(N);if(!qe.membership)return!1;let Fe=y.store.resolveAuthorizationTarget(y.organization.id,{type:"organization"});return!!Fe&&D({membership:qe.membership,grants:qe.grants,capability:ze,target:Fe}).allowed},ks=Bun.serve({hostname:r,port:a,idleTimeout:30,websocket:{open(N){if(!ue){N.send(`The web terminal is disabled (TS_CLOUD_DASHBOARD_TERMINAL=0).\r
|
|
682
682
|
`),N.close();return}let ze=GS((qe)=>N.send(qe),{cwd:t,onExit:()=>{try{N.close()}catch{}}});G.set(N,ze),N.send(`Connected to ${r==="127.0.0.1"?"localhost":r} shell. This is a line-oriented shell (no full-screen apps).\r
|
|
683
|
-
`)},message(N,ze){G.get(N)?.write(typeof ze==="string"?ze:new TextDecoder().decode(ze))},close(N){G.get(N)?.close(),G.delete(N)}},async fetch(N,ze){let qe=Date.now(),Fe=N.clone(),Ge=N.headers.get("x-request-id")?.slice(0,128)||crypto.randomUUID(),Rt=!["GET","HEAD","OPTIONS"].includes(N.method.toUpperCase()),q=new URL(N.url),vr=await(async()=>{let at=ze??ks,pt=
|
|
683
|
+
`)},message(N,ze){G.get(N)?.write(typeof ze==="string"?ze:new TextDecoder().decode(ze))},close(N){G.get(N)?.close(),G.delete(N)}},async fetch(N,ze){let qe=Date.now(),Fe=N.clone(),Ge=N.headers.get("x-request-id")?.slice(0,128)||crypto.randomUUID(),Rt=!["GET","HEAD","OPTIONS"].includes(N.method.toUpperCase()),q=new URL(N.url),vr=await(async()=>{let at=ze??ks,pt=G_(r,at.port??a),$r=await vw(N,Xu(at.requestIP(N)?.address??"unknown"));if($r)return $r;let Rr=q.searchParams.get("env"),Ce=Y_(C,T,Rr),sr=V.get(Ce);if(!sr)sr=await Ee(Ce);try{if(!tT(N))return x({ok:!1,error:"Cross-site requests are not allowed."},403);let So=/^\/api\/source\/webhooks\/([A-Za-z0-9_-]{16,200})$/.exec(q.pathname);if(So&&N.method==="POST"){let A=await bl({sources:Ke,controlPlane:y.store,endpointToken:So[1],headers:N.headers,rawBody:new Uint8Array(await N.arrayBuffer())});return x({accepted:A.accepted,duplicate:A.duplicate,status:A.status,operationIds:A.operations.map((P)=>P.id),message:A.message},A.accepted?202:404)}let Is=/^\/auth\/oidc\/([a-z0-9-]+)\/(start|callback)$/.exec(q.pathname);if(Is&&N.method==="GET"){let[,A,P]=Is;if(!pt)return new Response(null,{status:302,headers:{location:"/login?sso_error=configuration"}});if(P==="start")try{let F=await $o(Ne,A,pt,q.searchParams.get("return")??void 0,e.oidcFetch);return new Response(null,{status:302,headers:{location:F.authorizationUrl,"cache-control":"no-store"}})}catch(F){return y.store.appendEvent({organizationId:y.organization.id,type:"auth.oidc.start_failed",level:"warning",payload:{provider:A,reason:F instanceof Error?F.message.slice(0,200):"unknown"}}),new Response(null,{status:302,headers:{location:"/login?sso_error=start","cache-control":"no-store"}})}try{if(q.searchParams.has("error")){let Q=Ne.getOidcProviderBySlug(A),J=q.searchParams.get("state");if(Q&&J)Ne.consumeOidcTransaction(Q.id,J);throw Error("OIDC provider returned an authorization error")}let F=await Mo(Ne,{providerSlug:A,state:q.searchParams.get("state")??"",code:q.searchParams.get("code")??"",origin:pt},e.oidcFetch),U=oS(Ne,y,t,F.identity);Ne.recordLogin(U.identity.id);let H=_c(U.identity.id,N,at.requestIP(N)?.address??"unknown","oidc");return ot(),y.store.appendEvent({organizationId:y.organization.id,actorId:U.identity.actorId,type:"auth.login.succeeded",payload:{method:"oidc",provider:A,provisioned:U.provisioned}}),new Response(null,{status:302,headers:{location:F.returnPath,"cache-control":"no-store","set-cookie":Ua(H.token,{secure:Di,maxAgeMs:Xe})}})}catch(F){return y.store.appendEvent({organizationId:y.organization.id,type:"auth.oidc.callback_failed",level:"warning",payload:{provider:A,reason:F instanceof Error?F.message.slice(0,200):"unknown"}}),new Response(null,{status:302,headers:{location:"/login?sso_error=callback","cache-control":"no-store"}})}}if(q.pathname==="/api/invitations/accept"&&N.method==="POST"){let A=await re(N),P=String(A.token??"").trim(),F=String(A.username??"").trim(),U=String(A.password??"");if(!P||!Ou(F)||U.length<12)return x({ok:!1,error:"Invitation token, valid username, and a password of at least 12 characters are required."},422);let H=y.store.inspectInvitationToken(P);if(!H||H.state!=="pending")return x({ok:!1,error:H?`Invitation is ${H.state}`:"Invitation is invalid"},H?409:404);let Q=Fn(wn(t),F),J=Ne.getIdentityByUsername(F);if(Q&&!Qn(U,J?.passwordHash??Q.passwordHash))return x({ok:!1,error:"That username already exists; enter its current password to continue."},401);let ee=Ne.getIdentityByEmail(H.email);if(ee&&ee.id!==J?.id)return x({ok:!1,error:"This invitation belongs to an existing account. Sign in with that account or ask an owner to resend it."},409);let Se=vc(t,{username:F,password:Q?void 0:U,name:typeof A.name==="string"?A.name:void 0,email:H.email,sites:Q?.sites??{}}),ve=E(y.store,Se.user);try{let nt=y.store.acceptInvitation(P,ve.id),Pe=J?Ne.setVerifiedEmail(J.id,nt.invitation.email):Ne.createIdentity({actorId:ve.id,username:Se.user.username,email:nt.invitation.email,emailVerified:!0,passwordHash:Se.user.passwordHash}),He=_c(Pe.id,N,at.requestIP(N)?.address??"unknown");return ot(),x({ok:!0,user:qa(Se.user),organization:y.organization,membership:nt.membership},200,{"set-cookie":Ua(He.token,{secure:Di,maxAgeMs:Xe})})}catch(nt){if(!Q)am(t,Se.user.username);let Pe=nt instanceof Error?nt.message:"Invitation could not be accepted.";return x({ok:!1,error:Pe},Pe.includes("expired")||Pe.includes("revoked")||Pe.includes("accepted")?409:404)}}if(q.pathname==="/api/auth/password-reset/request"&&N.method==="POST"){let A=await re(N),P=String(A.identifier??"").trim().toLowerCase(),F=at.requestIP(N)?.address??"unknown",U=Zu.check(P,F),H=P.includes("@")?Ne.getIdentityByEmail(P):Ne.getIdentityByUsername(P);if(U.allowed)Zu.recordFailure(P,F);if(U.allowed&&H?.email&&H.emailVerifiedAt&&!H.disabledAt){Ne.revokeActionTokens(H.id,"password_reset");let Q=Ne.createActionToken(H.id,"password_reset"),J=`${q.origin}/reset-password?token=${encodeURIComponent(Q.token)}`,ee=await Xr(m,{to:H.email,subject:"Reset your ts-cloud password",text:`Reset your ts-cloud password: ${J}
|
|
684
684
|
|
|
685
|
-
This link expires in one hour and can be used once.`});y.store.appendEvent({organizationId:y.organization.id,actorId:H.actorId,type:"auth.password_reset.requested",payload:{delivered:ee}})}return x({ok:!0,message:"If that account has a verified email, a reset link has been sent."},202)}if(q.pathname==="/api/auth/password-reset/complete"&&N.method==="POST"){let A=await re(N),P=String(A.token??"").trim(),F=String(A.password??"");if(!P||F.length<12)return x({ok:!1,error:"A valid reset token and password of at least 12 characters are required."},422);try{let U=Ne.consumeActionToken(P,"password_reset"),H=ho(F),Q=Ne.updatePassword(U.identityId,H);return Nu(t,Q.username,H),y.store.appendEvent({organizationId:y.organization.id,actorId:Q.actorId,type:"auth.password_reset.completed"}),x({ok:!0,message:"Password changed. Sign in again."},200,{"set-cookie":Du({secure:Di})})}catch(U){let H=U instanceof Error?U.message:"Password reset failed.";return x({ok:!1,error:H.replace("Action token","Reset link")},H.includes("consumed")||H.includes("expired")?409:404)}}if(q.pathname==="/api/login"&&N.method==="POST"){let A=await re(N),P=String(A.username??"").trim(),F=String(A.password??""),U=at.requestIP(N)?.address??"unknown",H=Cc.check(P,U);if(!H.allowed)return x({ok:!1,error:`Too many failed attempts. Try again in ${Math.ceil((H.retryAfterSeconds??0)/60)} minute(s).`},429,{"retry-after":String(H.retryAfterSeconds??60)});let Q=Fn(wn(t),P),J=Ne.getIdentityByUsername(P),ee=J?.passwordHash??Q?.passwordHash??K_;if(!(Qn(F,ee)&&!!Q&&!!J&&!J.disabledAt))return Cc.recordFailure(P,U),x({ok:!1,error:"Incorrect username or password."},401);if(sS(Ne,y,J))return x({ok:!1,error:"Single sign-on is required for this account."},403);Cc.recordSuccess(P,U);let ve=J,nt=ve.requiresPasswordUpgrade||bb(ve.passwordHash);if(nt){let He=ho(F);ve=Ne.rehashPassword(ve.id,He),Nu(t,ve.username,He)}if(Ne.recordLogin(ve.id),Ne.getMfaFactor(ve.id)?.state==="active"){let He=Ne.createMfaChallenge(ve.id,"login");return y.store.appendEvent({organizationId:y.organization.id,actorId:ve.actorId,type:"auth.mfa.challenge.created",payload:{purpose:"login"}}),x({ok:!0,mfaRequired:!0,challengeToken:He.token,passwordUpgraded:nt})}let Pe=_c(ve.id,N,U);return y.store.appendEvent({organizationId:y.organization.id,actorId:ve.actorId,type:"auth.login.succeeded",payload:{method:"local"}}),x({ok:!0,user:qa(Q),passwordUpgraded:nt},200,{"set-cookie":Ua(Pe.token,{secure:Di,maxAgeMs:Xe})})}if(q.pathname==="/api/auth/mfa/complete"&&N.method==="POST"){let A=await re(N),P=String(A.challengeToken??"").trim(),F=String(A.code??"").trim(),U=at.requestIP(N)?.address??"unknown",Q=Ne.inspectMfaChallengeToken(P,"login")?.identityId??"unknown-mfa",J=Pc.check(Q,U);if(!J.allowed)return x({ok:!1,error:"Too many MFA attempts. Try again later."},429,{"retry-after":String(J.retryAfterSeconds??60)});try{let ee=Ne.completeMfaChallenge(P,F,"login");Pc.recordSuccess(Q,U);let Se=new Date().toISOString(),ve=Ne.createSession({identityId:ee.identity.id,userAgent:Um(N),networkHint:Xu(U),mfaAt:Se,recentAuthAt:Se});return y.store.appendEvent({organizationId:y.organization.id,actorId:ee.identity.actorId,type:"auth.mfa.succeeded",payload:{purpose:"login",method:ee.method}}),x({ok:!0},200,{"set-cookie":Ua(ve.token,{secure:Di,maxAgeMs:Xe})})}catch{return Pc.recordFailure(Q,U),x({ok:!1,error:"Authenticator or recovery code is incorrect."},401)}}if(q.pathname==="/api/logout"&&N.method==="POST"){let A=lr.resolveSession(N);if(A)Ne.revokeSession(A.identityId,A.id);let P=Du({secure:Di});if(N.headers.get("accept")?.includes("text/html"))return new Response(null,{status:302,headers:{location:"/login","set-cookie":P}});return x({ok:!0},200,{"set-cookie":P})}if(q.pathname==="/login"){let A=Ne.listOidcProviders(y.organization.id).map((P)=>({slug:P.slug,name:P.name}));return new Response(aS(B?.mode==="serverless",A),{headers:{"content-type":"text/html; charset=utf-8"}})}if(q.pathname==="/forgot-password"||q.pathname==="/reset-password")return new Response(cS(q.pathname==="/reset-password"?"reset":"request"),{headers:{"content-type":"text/html; charset=utf-8"}});if(q.pathname==="/accept-invitation")return iw(lt,q.pathname);let me=lr.resolveUser(N);if(!me){if(!q.pathname.startsWith("/api/")&&N.headers.get("accept")?.includes("text/html"))return new Response(null,{status:302,headers:{location:"/login"}});return x({ok:!1,error:"Sign in to continue."},401)}let $n=Jt(me,Ce);if(q.pathname==="/api/me"){let A=y.store.getActorByExternalId("user",`dashboard:${me.username.toLowerCase()}`),P=A?y.store.getMembershipForActor(y.organization.id,A.id):void 0,F=y.store.resolveAuthorizationTarget(y.organization.id,P?.scope??{type:"project",id:y.project.id})??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id});return x({ok:!0,user:qa(me),authEnabled:xe,organization:y.organization,membership:P,capabilities:Mt({membership:P,grants:P?y.store.listGrants(P.id):[],target:F})})}if(q.pathname.startsWith("/api/")){let A=await nS(N,q.pathname),P=lr.check(N,q.pathname,me,A);if(!P.ok)return x({ok:!1,error:P.error},P.status??403);if(xe&&nT.has(`${N.method.toUpperCase()} ${q.pathname}`)){let F=lr.resolveSession(N);if(!F||!Ne.isRecentlyAuthenticated(F))return x({ok:!1,error:"Recent authentication is required for this change.",stepUpRequired:!0},401)}}if(q.pathname==="/api/auth/security"&&N.method==="GET"){let A=We(me),P=A.actor?Ne.getIdentityByActor(A.actor.id):void 0,F=lr.resolveSession(N);return x({identity:P?{username:P.username,email:P.email,emailVerifiedAt:P.emailVerifiedAt,requiresPasswordUpgrade:P.requiresPasswordUpgrade,lastLoginAt:P.lastLoginAt}:void 0,currentSessionId:F?.id,sessions:P?Ne.listSessions(P.id,{includeInactive:!0}):[],mfa:P?{factor:Ne.getMfaFactor(P.id),recoveryCodesRemaining:Ne.remainingRecoveryCodes(P.id)}:void 0})}if(q.pathname==="/api/auth/oidc/providers"&&N.method==="GET")return x({providers:Ne.listOidcProviders(y.organization.id,{includeDisabled:!0}),callbackOrigin:pt,callbackPattern:pt?`${pt}/auth/oidc/{slug}/callback`:void 0,localOwnerRecovery:!0});if(q.pathname==="/api/auth/oidc/providers"&&N.method==="POST"){let A=await re(N),P=We(me),F=P.actor?Ne.getIdentityByActor(P.actor.id):void 0,U=A.enforceSso===!0;if(U&&(!F?.emailVerifiedAt||Ne.remainingRecoveryCodes(F.id)<1))return x({ok:!1,error:"Verify the owner email and generate MFA recovery codes before enforcing SSO."},409);try{let H=qu(A.defaultRole),Q=Ne.upsertOidcProvider({id:typeof A.id==="string"?A.id:void 0,organizationId:y.organization.id,slug:String(A.slug??""),name:String(A.name??""),issuer:String(A.issuer??""),clientId:String(A.clientId??""),clientSecret:typeof A.clientSecret==="string"&&A.clientSecret?A.clientSecret:void 0,scopes:Array.isArray(A.scopes)?A.scopes.map(String):void 0,allowedDomains:Array.isArray(A.allowedDomains)?A.allowedDomains.map(String):[],defaultRole:H&&H!=="owner"?H:void 0,enabled:A.enabled!==!1,enforceSso:U});return y.store.appendEvent({organizationId:y.organization.id,actorId:P.actor?.id,type:"auth.oidc.provider.configured",payload:{providerId:Q.id,issuer:Q.issuer,enabled:Q.enabled,enforceSso:Q.enforceSso}}),x({ok:!0,provider:Q})}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"OIDC provider could not be saved."},422)}}if(q.pathname==="/api/auth/oidc/providers"&&N.method==="PATCH"){let A=await re(N),P=Ne.getOidcProvider(String(A.id??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"OIDC provider was not found."},404);let F=We(me),U=Ne.setOidcProviderEnabled(P.id,A.enabled===!0);return y.store.appendEvent({organizationId:y.organization.id,actorId:F.actor?.id,type:U.enabled?"auth.oidc.provider.enabled":"auth.oidc.provider.disabled",payload:{providerId:P.id}}),x({ok:!0,provider:U})}if(q.pathname==="/api/automation"&&N.method==="GET"){let A=yt.listServiceAccounts(y.organization.id,{includeDisabled:!0}).map((P)=>{let F=y.store.getMembershipForActor(y.organization.id,P.actorId),U=P.createdByActorId?y.store.getActor(P.createdByActorId):void 0,H=yt.listTokens(P.id,{includeInactive:!0}).map((Q)=>({...Q,createdBy:Q.createdByActorId?y.store.getActor(Q.createdByActorId):void 0}));return{account:P,createdBy:U,membership:F,tokens:H}});return x({accounts:A,apiBaseUrl:`${q.origin}/api/v1`,openApiUrl:`${q.origin}/api/v1/openapi.json`,tokenEnvironmentVariable:"TS_CLOUD_API_TOKEN"})}if(q.pathname==="/api/automation/service-accounts"&&N.method==="POST"){let A=await re(N),P=We(me),F=qu(A.roleTemplate),U=Ic(A);if(!P.actor||!F||F==="owner"||!U)return x({ok:!1,error:"A non-owner role and valid organization scope are required."},422);try{let H=yt.createServiceAccount({organizationId:y.organization.id,slug:String(A.slug??""),name:String(A.name??""),description:typeof A.description==="string"?A.description:void 0,roleTemplate:F,scope:U,createdByActorId:P.actor.id});return x({ok:!0,...H},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"Service account could not be created."},422)}}if(q.pathname==="/api/automation/service-accounts"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=yt.getServiceAccount(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Service account was not found."},404);return x({ok:!0,account:yt.disableServiceAccount(F.id,P.actor?.id)})}if(q.pathname==="/api/automation/tokens"&&N.method==="POST"){let A=await re(N),P=We(me),F=yt.getServiceAccount(String(A.serviceAccountId??"")),U=Ic(A);if(!P.actor||!F||F.organizationId!==y.organization.id||!U||!Array.isArray(A.capabilities))return x({ok:!1,error:"Service account, explicit capabilities, and valid scope are required."},422);try{let H=yt.createToken({serviceAccountId:F.id,name:String(A.name??"API token"),capabilities:A.capabilities.map(String),scope:U,expiresAt:typeof A.expiresAt==="string"?A.expiresAt:void 0,createdByActorId:P.actor.id});return x({ok:!0,token:H.token,secret:H.secret,revealOnce:!0},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"API token could not be created."},422)}}if(q.pathname==="/api/automation/tokens/rotate"&&N.method==="POST"){let A=await re(N),P=We(me),F=yt.getToken(String(A.id??"")),U=F?yt.getServiceAccount(F.serviceAccountId):void 0;if(!P.actor||!F||U?.organizationId!==y.organization.id)return x({ok:!1,error:"API token was not found."},404);try{let H=yt.rotateToken(F.id,P.actor.id);return x({ok:!0,token:H.token,secret:H.secret,revealOnce:!0,overlap:!0},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"API token could not be rotated."},409)}}if(q.pathname==="/api/automation/tokens"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=yt.getToken(String(A.id??"")),U=F?yt.getServiceAccount(F.serviceAccountId):void 0;if(!F||U?.organizationId!==y.organization.id)return x({ok:!1,error:"API token was not found."},404);return x({ok:!0,token:yt.revokeToken(F.id,P.actor?.id)})}if(q.pathname==="/api/onboarding"&&N.method==="GET"){let A=Ke.listConnections(y.organization.id);return x({drafts:zr.list(y.project.id),artifacts:Ss.list(y.project.id),registries:Yn.list(y.organization.id),sourceConnections:A,repositories:A.flatMap((P)=>Ke.listRepositories(P.id)),project:{id:y.project.id,slug:y.project.slug,name:y.project.name},environments:[...y.environments.values()].map((P)=>({id:P.id,slug:P.slug,name:P.name,kind:P.kind,region:P.region})),resources:y.store.listResources(y.project.id).filter((P)=>P.kind==="application").map((P)=>({id:P.id,slug:P.slug,name:P.name,environmentId:P.environmentId}))})}if(q.pathname==="/api/onboarding/detect"&&N.method==="POST"){let A=await re(N);try{if(A.source?.kind==="git"){let U=Ke.getConnection(String(A.source.connectionId??"")),H=Ke.getRepository(String(A.source.repositoryId??""));if(!U||U.organizationId!==y.organization.id||!H||H.connectionId!==U.id)throw Error("Authorized Git repository was not found");let Q=typeof A.source.deployKeyId==="string"?Ke.getDeployKey(A.source.deployKeyId):void 0;if(Q&&Q.connectionId!==U.id)throw Error("Deploy key does not belong to this connection");let J=km(Ut(Wu(),"ts-cloud-onboarding-git-"));try{let ee=await Go({remote:H.cloneUrl,destination:Ut(J,"checkout"),ref:String(A.source.ref??H.defaultBranch),sparsePaths:Array.isArray(A.source.sparsePaths)?A.source.sparsePaths.map(String):void 0,binding:{id:"detection",projectId:y.project.id,connectionId:U.id,repositoryId:H.id,repositoryFullName:H.fullName,defaultBranch:H.defaultBranch,monorepoRoot:String(A.source.monorepoRoot??"."),includePaths:[],excludePaths:[],submodules:A.source.submodules===!0,cloneDepth:1,deployKeyId:Q?.id,autoDeploy:!1,pullRequestPreviews:!1,status:"active",version:1,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}},{credential:Ke.getCredential(U.id),deployKey:Q?{...Q,privateKey:Ke.getDeployPrivateKey(Q.id)}:void 0,timeoutMs:120000});return x({ok:!0,commitSha:ee.commitSha,candidates:_s(ap(ee.directory))})}finally{bs(J,{recursive:!0,force:!0})}}if(Array.isArray(A.files)){if(A.files.length>1e4)throw Error("Detection file-count limit exceeded");let U=A.files.map((H)=>({path:String(H.path??""),size:Number(H.size??0),content:typeof H.content==="string"?H.content.slice(0,262144):void 0}));return x({ok:!0,candidates:_s(U)})}let P=j_(t,String(A.root??".")),F=N_(t,P);if(F===".."||F.startsWith(`..${B_}`))throw Error("Detection root must stay inside the project");return x({ok:!0,candidates:_s(ap(P))})}catch(P){return x({ok:!1,error:P instanceof Error?P.message:"Application detection failed."},422)}}if(q.pathname==="/api/onboarding/plan"&&N.method==="POST"){let A=await re(N);try{return x({ok:!0,plan:qn(A.draft,Array.isArray(A.suppliedSecretNames)?A.suppliedSecretNames.map(String):[])})}catch(P){return x({ok:!1,error:P instanceof Error?P.message:"Application plan could not be generated."},422)}}if(q.pathname==="/api/onboarding/drafts"&&N.method==="POST"){let A=await re(N),P=We(me);try{return x({ok:!0,draft:zr.create({organizationId:y.organization.id,projectId:y.project.id,name:String(A.name??A.draft?.name??"Application draft"),draft:{...A.draft,projectId:y.project.id},step:A.step,suppliedSecretNames:Array.isArray(A.suppliedSecretNames)?A.suppliedSecretNames.map(String):[],actorId:P.actor?.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Application draft could not be saved."},422)}}if(q.pathname==="/api/onboarding/drafts"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=zr.get(String(A.id??""));if(!F||F.projectId!==y.project.id)return x({ok:!1,error:"Application draft was not found."},404);try{return x({ok:!0,draft:zr.update(F.id,Number(A.version),{draft:{...A.draft,projectId:y.project.id},step:A.step,suppliedSecretNames:Array.isArray(A.suppliedSecretNames)?A.suppliedSecretNames.map(String):void 0,actorId:P.actor?.id})})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Application draft could not be updated."},409)}}if(q.pathname==="/api/onboarding/artifacts"&&N.method==="POST"){let A=We(me);if(Number(N.headers.get("content-length")??0)>104857600)return x({ok:!1,error:"Artifact exceeds the 100 MB upload limit."},413);try{let F=new Uint8Array(await N.arrayBuffer());return x({ok:!0,artifact:Ss.create({organizationId:y.organization.id,projectId:y.project.id,filename:N.headers.get("x-artifact-filename")??"application.zip",bytes:F,actorId:A.actor?.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Artifact could not be inspected."},422)}}if(q.pathname==="/api/onboarding/registries"&&N.method==="POST"){let A=await re(N),P=We(me);try{return x({ok:!0,registry:Yn.create({organizationId:y.organization.id,provider:A.provider,name:String(A.name??"Container registry"),host:String(A.host??""),credential:A.token||A.password?{username:typeof A.username==="string"?A.username:void 0,password:typeof A.password==="string"?A.password:void 0,token:typeof A.token==="string"?A.token:void 0}:void 0,credentialExpiresAt:typeof A.credentialExpiresAt==="string"?A.credentialExpiresAt:void 0,actorId:P.actor?.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Registry connection could not be created."},422)}}if(q.pathname==="/api/onboarding/registries"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=Yn.get(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Registry connection was not found."},404);try{if(A.action==="test")return x({ok:!0,registry:await Yn.test(F.id,{image:typeof A.image==="string"?A.image:void 0})});if(A.action==="rotate")return x({ok:!0,registry:Yn.rotate(F.id,{username:typeof A.username==="string"?A.username:void 0,password:typeof A.password==="string"?A.password:void 0,token:typeof A.token==="string"?A.token:void 0},{expiresAt:typeof A.expiresAt==="string"?A.expiresAt:void 0,actorId:P.actor?.id})});return x({ok:!1,error:"Registry action must be test or rotate."},422)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Registry connection could not be updated."},422)}}if(q.pathname==="/api/onboarding/registries"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=Yn.get(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Registry connection was not found."},404);let U=zr.list(y.project.id).filter((H)=>H.input.source.kind==="image"&&H.input.source.registryConnectionId===F.id||H.input.build.kind==="prebuilt_image"&&H.input.build.registryConnectionId===F.id);if(A.preview===!0)return x({ok:!0,preview:!0,affectedDrafts:U});return x({ok:!0,registry:Yn.disconnect(F.id,P.actor?.id),affectedDrafts:U})}if(q.pathname==="/api/onboarding/apply"&&N.method==="POST"){let A=await re(N),P=We(me);try{let F=Bc({controlPlane:y.store,drafts:zr,draftId:String(A.id??""),expectedVersion:Number(A.version),confirmEnvironment:String(A.confirmEnvironment??""),actorId:P.actor?.id});return x({ok:!0,resource:F.resource,operation:F.operation,plan:F.plan},202)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Application plan could not be applied."},422)}}if(q.pathname==="/api/sources"&&N.method==="GET"){let A=Ke.listConnections(y.organization.id);return x({connections:A,bindings:Ke.listBindings({projectId:y.project.id}),repositories:A.flatMap((P)=>Ke.listRepositories(P.id)),deployKeys:A.flatMap((P)=>Ke.listDeployKeys(P.id)),webhooks:A.flatMap((P)=>Ke.listWebhooks(P.id)).map((P)=>({...P,deliveries:Ke.listDeliveries(P.id,20)})),project:{id:y.project.id,slug:y.project.slug},environment:ne(y,String(Ce)),resources:y.store.listResources(y.project.id,ne(y,String(Ce)).environmentId).filter((P)=>P.kind==="application").map((P)=>({id:P.id,slug:P.slug,name:P.name}))})}if(q.pathname==="/api/sources/connections"&&N.method==="POST"){let A=await re(N),P=We(me),F=String(A.provider??"");if(!["github","gitlab","bitbucket","gitea","generic_https","generic_ssh"].includes(F))return x({ok:!1,error:"A supported Git provider is required."},422);try{let U=F==="github"&&(A.privateKey||A.appId)?{appId:typeof A.appId==="string"?A.appId:void 0,installationId:typeof A.installationId==="string"?A.installationId:void 0,privateKey:typeof A.privateKey==="string"?A.privateKey:void 0}:F!=="generic_ssh"&&A.token?{token:typeof A.token==="string"?A.token:void 0,username:typeof A.username==="string"?A.username:void 0}:void 0,H={github:"https://github.com",gitlab:"https://gitlab.com",bitbucket:"https://bitbucket.org",gitea:"https://gitea.com"},Q,J,ee;if(y.store.database.transaction(()=>{if(Q=Ke.createConnection({organizationId:y.organization.id,provider:F,name:String(A.name??F),host:String(A.host??H[F]??""),owner:typeof A.owner==="string"?A.owner:void 0,authKind:A.authKind,credential:U,grantedScopes:Array.isArray(A.grantedScopes)?A.grantedScopes.map(String):[],credentialExpiresAt:typeof A.credentialExpiresAt==="string"?A.credentialExpiresAt:void 0,createdByActorId:P.actor?.id}),typeof A.repositoryUrl==="string"&&typeof A.repositoryFullName==="string")J=Ke.upsertRepository({connectionId:Q.id,providerRepositoryId:`manual:${A.repositoryFullName}`,fullName:A.repositoryFullName,cloneUrl:A.repositoryUrl,defaultBranch:String(A.defaultBranch??"main"),visibility:"unknown",archived:!1,metadata:{source:"manual"}});if(F==="generic_ssh")ee=Ke.createDeployKey({connectionId:Q.id,name:String(A.deployKeyName??"Repository deploy key"),publicKey:String(A.publicKey??""),privateKey:String(A.deployPrivateKey??""),host:String(A.sshHost??""),hostKey:String(A.hostKey??""),actorId:P.actor?.id})})(),A.test===!0)Q=await qo(Ke,Q.id,J?.id);return x({ok:!0,connection:Q,repository:J,deployKey:ee},201)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source connection could not be created."},422)}}if(q.pathname==="/api/sources/connections"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=Ke.getConnection(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{if(A.action==="test")return x({ok:!0,connection:await qo(Ke,F.id,typeof A.repositoryId==="string"?A.repositoryId:void 0)});if(A.action==="rotate")return x({ok:!0,connection:Ke.rotateCredential(F.id,{token:typeof A.token==="string"?A.token:void 0,username:typeof A.username==="string"?A.username:void 0,appId:typeof A.appId==="string"?A.appId:void 0,installationId:typeof A.installationId==="string"?A.installationId:void 0,privateKey:typeof A.privateKey==="string"?A.privateKey:void 0},{expiresAt:typeof A.expiresAt==="string"?A.expiresAt:void 0,actorId:P.actor?.id})});return x({ok:!1,error:"Connection action must be test or rotate."},422)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source connection could not be updated."},422)}}if(q.pathname==="/api/sources/connections"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=Ke.getConnection(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);let U=Ke.listBindings({connectionId:F.id,status:"active"});if(A.preview===!0)return x({ok:!0,preview:!0,affectedBindings:U});return x({ok:!0,...Ke.disconnectConnection(F.id,P.actor?.id)})}if(q.pathname==="/api/sources/deploy-keys"&&N.method==="POST"){let A=await re(N),P=We(me),F=Ke.getConnection(String(A.connectionId??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x({ok:!0,deployKey:Ke.createDeployKey({connectionId:F.id,name:String(A.name??"Repository deploy key"),publicKey:String(A.publicKey??""),privateKey:String(A.privateKey??""),host:String(A.host??""),hostKey:String(A.hostKey??""),actorId:P.actor?.id})},201)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Deploy key could not be stored."},422)}}if(q.pathname==="/api/sources/deploy-keys"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=Ke.getDeployKey(String(A.id??"")),U=F?Ke.getConnection(F.connectionId):void 0;if(!F||!U||U.organizationId!==y.organization.id)return x({ok:!1,error:"Deploy key was not found."},404);let H=Ke.listBindings({connectionId:U.id}).filter((Q)=>Q.deployKeyId===F.id);if(A.preview===!0)return x({ok:!0,preview:!0,affectedBindings:H});return x({ok:!0,...Ke.revokeDeployKey(F.id,P.actor?.id)})}if(q.pathname==="/api/sources/repositories/sync"&&N.method==="POST"){let A=await re(N),P=Ke.getConnection(String(A.connectionId??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x({ok:!0,repositories:await Gi(Ke,String(A.connectionId??""),{search:typeof A.search==="string"?A.search:void 0})})}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Repositories could not be synchronized."},422)}}if(q.pathname==="/api/sources/references"&&N.method==="GET"){let A=Ke.getConnection(String(q.searchParams.get("connectionId")??""));if(!A||A.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x(await qi(Ke,{connectionId:String(q.searchParams.get("connectionId")??""),repository:String(q.searchParams.get("repository")??""),repositoryId:q.searchParams.get("repositoryId")??void 0,deployKeyId:q.searchParams.get("deployKeyId")??void 0,type:q.searchParams.get("type")==="tags"?"tags":"branches",cursor:q.searchParams.get("cursor")??void 0}))}catch(P){return x({ok:!1,error:P instanceof Error?P.message:"References could not be listed."},422)}}if(q.pathname==="/api/sources/bindings"&&N.method==="POST"){let A=await re(N),P=We(me),F=ne(y,String(Ce)),U=Ke.getConnection(String(A.connectionId??""));if(!U||U.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x({ok:!0,binding:Ke.createBinding({projectId:y.project.id,environmentId:F.environmentId,resourceId:typeof A.resourceId==="string"?A.resourceId:void 0,connectionId:String(A.connectionId??""),repositoryId:typeof A.repositoryId==="string"?A.repositoryId:void 0,repositoryFullName:String(A.repositoryFullName??""),defaultBranch:String(A.defaultBranch??"main"),branchRule:typeof A.branchRule==="string"?A.branchRule:void 0,tagRule:typeof A.tagRule==="string"?A.tagRule:void 0,monorepoRoot:String(A.monorepoRoot??"."),includePaths:Array.isArray(A.includePaths)?A.includePaths.map(String):[],excludePaths:Array.isArray(A.excludePaths)?A.excludePaths.map(String):[],submodules:A.submodules===!0,cloneDepth:A.cloneDepth?Number(A.cloneDepth):void 0,deployKeyId:typeof A.deployKeyId==="string"&&A.deployKeyId?A.deployKeyId:void 0,autoDeploy:A.autoDeploy!==!1,pullRequestPreviews:A.pullRequestPreviews!==!1,actorId:P.actor?.id})},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"Source binding could not be created."},422)}}if(q.pathname==="/api/sources/bindings"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=Ke.getBinding(String(A.id??""));if(!F||F.projectId!==y.project.id)return x({ok:!1,error:"Source binding was not found."},404);try{return x({ok:!0,binding:Ke.updateBinding(F.id,Number(A.version),{defaultBranch:A.defaultBranch,branchRule:A.branchRule,tagRule:A.tagRule,monorepoRoot:A.monorepoRoot,includePaths:A.includePaths,excludePaths:A.excludePaths,submodules:A.submodules,cloneDepth:A.cloneDepth,deployKeyId:A.deployKeyId,autoDeploy:A.autoDeploy,pullRequestPreviews:A.pullRequestPreviews,status:A.status,disabledReason:A.disabledReason,actorId:P.actor?.id})})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source binding could not be updated."},409)}}if(q.pathname==="/api/sources/webhooks"&&N.method==="POST"){let A=await re(N),P=Ke.getConnection(String(A.connectionId??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{let F=Ke.createWebhook({connectionId:String(A.connectionId??""),repositoryId:typeof A.repositoryId==="string"?A.repositoryId:void 0,repositoryFullName:String(A.repositoryFullName??""),events:Array.isArray(A.events)?A.events.map(String):void 0,secret:typeof A.secret==="string"?A.secret:void 0}),U=process.env.TS_CLOUD_WEBHOOK_BASE_URL?.trim()||pt,H=U?Zt(U,F.webhook):void 0,Q=A.reconcile!==!1&&U?await Zr(Ke,F.webhook.id,U):F.webhook;return x({ok:!0,webhook:Q,endpoint:H,endpointRevealOnce:!0},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Source webhook could not be created."},422)}}if(q.pathname==="/api/sources/webhooks"&&N.method==="PATCH"){let A=await re(N),P=process.env.TS_CLOUD_WEBHOOK_BASE_URL?.trim()||pt,F=Ke.getWebhook(String(A.id??"")),U=F?Ke.getConnection(F.connectionId):void 0;if(!F||!U||U.organizationId!==y.organization.id)return x({ok:!1,error:"Source webhook was not found."},404);if(!P)return x({ok:!1,error:"Set TS_CLOUD_WEBHOOK_BASE_URL to reconcile provider webhooks."},422);try{return x({ok:!0,webhook:await Zr(Ke,String(A.id??""),P)})}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"Source webhook could not be reconciled."},422)}}if(q.pathname==="/api/sources/webhooks"&&N.method==="DELETE"){let A=await re(N),P=Ke.getWebhook(String(A.id??"")),F=P?Ke.getConnection(P.connectionId):void 0;if(!P||!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source webhook was not found."},404);try{return x({ok:!0,webhook:await vl(Ke,String(A.id??""))})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source webhook could not be removed."},422)}}if(q.pathname==="/api/security/posture"&&N.method==="GET"){let A=ne(y,String(Ce)),P=ut.listFindings({...A,limit:500});return x({scope:A,summary:ut.summary(A.organizationId,A.projectId,A.environmentId),findings:P,scans:ut.listScanRuns({...A,limit:100}),policies:ut.listPolicies(A.organizationId).filter((F)=>!F.environmentId||F.environmentId===A.environmentId),waivers:P.flatMap((F)=>ut.listWaivers(F.id)),decisions:ut.listDecisions(A.environmentId,50),actors:y.store.listMemberships(y.organization.id).map((F)=>y.store.getActor(F.actorId)).filter(Boolean)})}if(q.pathname==="/api/security/export"&&N.method==="GET")return x(ut.exportPosture(y.organization.id));if(q.pathname==="/api/security/scan"&&N.method==="POST"){let A=ne(y,String(Ce)),P=await new St(ut).run(new rn,{...A,artifactRoot:t}),F=ji(ut,A,sr??{});return x({ok:!0,source:P,host:F,summary:ut.summary(A.organizationId,A.projectId,A.environmentId)})}if(q.pathname==="/api/security/review"&&N.method==="POST")try{let A=ne(y,String(Ce));return x({ok:!0,...zi(ut,{scope:A,desiredConfigHash:y.project.desiredConfigHash})})}catch(A){return x({ok:!1,error:A instanceof Error?A.message:"Security change review failed."},409)}if(q.pathname==="/api/security/policies"&&N.method==="POST"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{let F=ut.createPolicy({organizationId:y.organization.id,environmentId:A.environmentId===null?void 0:String(A.environmentId??ne(y,String(Ce)).environmentId),name:String(A.name??""),scannerFailMode:A.scannerFailMode==="open"?"open":"closed",requiredScanners:Array.isArray(A.requiredScanners)?A.requiredScanners.map(String):[],rules:Array.isArray(A.rules)?A.rules.map((U)=>({minimumSeverity:String(U.minimumSeverity),action:String(U.action),scannerId:U.scannerId?String(U.scannerId):void 0})):[],actorId:P.actor.id});return x({ok:!0,policy:F},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Security policy could not be created."},422)}}if(q.pathname==="/api/security/policies"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=ut.getPolicy(String(A.id??""));if(!P.actor||!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Security policy was not found."},404);try{return x({ok:!0,policy:ut.updatePolicy(F.id,Number(A.version),{name:typeof A.name==="string"?A.name:void 0,scannerFailMode:A.scannerFailMode==="open"||A.scannerFailMode==="closed"?A.scannerFailMode:void 0,requiredScanners:Array.isArray(A.requiredScanners)?A.requiredScanners.map(String):void 0,rules:Array.isArray(A.rules)?A.rules.map((U)=>({minimumSeverity:String(U.minimumSeverity),action:String(U.action),scannerId:U.scannerId?String(U.scannerId):void 0})):void 0,enabled:typeof A.enabled==="boolean"?A.enabled:void 0,actorId:P.actor.id})})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Security policy could not be updated."},409)}}if(q.pathname==="/api/security/waivers"&&N.method==="POST"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{return x({ok:!0,waiver:ut.createWaiver({findingId:String(A.findingId??""),policyId:typeof A.policyId==="string"?A.policyId:void 0,reason:String(A.reason??""),referenceUrl:typeof A.referenceUrl==="string"?A.referenceUrl:void 0,expiresAt:String(A.expiresAt??""),actorId:P.actor.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Security waiver could not be created."},422)}}if(q.pathname==="/api/security/waivers"&&N.method==="DELETE"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{return x({ok:!0,waiver:ut.revokeWaiver(String(A.id??""),P.actor.id)})}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Security waiver could not be revoked."},404)}}if(q.pathname==="/api/security/findings"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=ut.getFinding(String(A.id??""));if(!P.actor||!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Security finding was not found."},404);try{let U=A.action==="acknowledge"?ut.acknowledgeFinding(F.id,P.actor.id):ut.assignFinding(F.id,typeof A.ownerActorId==="string"&&A.ownerActorId?A.ownerActorId:void 0,P.actor.id);return x({ok:!0,finding:U})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Security finding could not be updated."},422)}}if(q.pathname==="/api/security/comments"&&N.method==="POST"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{return x({ok:!0,comment:ut.addComment({findingId:String(A.findingId??""),actorId:P.actor.id,body:String(A.body??""),referenceUrl:typeof A.referenceUrl==="string"?A.referenceUrl:void 0})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Comment could not be saved."},422)}}if(q.pathname==="/api/auth/sessions"&&N.method==="GET"){let A=lr.resolveSession(N);return x({currentSessionId:A?.id,sessions:A?Ne.listSessions(A.identityId,{includeInactive:!0}):[]})}if(q.pathname==="/api/auth/sessions"&&N.method==="DELETE"){let A=await re(N),P=lr.resolveSession(N);if(!P)return x({ok:!1,error:"Sign in again to manage sessions."},401);let F=String(A.id??""),U=Ne.revokeSession(P.identityId,F),H=F===P.id&&U?{"set-cookie":Du({secure:Di})}:void 0;return x({ok:U,signedOut:F===P.id&&U},U?200:404,H)}if(q.pathname==="/api/auth/sessions/revoke-others"&&N.method==="POST"){let A=lr.resolveSession(N);if(!A)return x({ok:!1,error:"Sign in again to manage sessions."},401);return x({ok:!0,revoked:Ne.revokeOtherSessions(A.identityId,A.id)})}if(q.pathname==="/api/auth/password/change"&&N.method==="POST"){let A=await re(N),P=String(A.currentPassword??""),F=String(A.password??""),U=We(me),H=U.actor?Ne.getIdentityByActor(U.actor.id):void 0;if(!H||!Qn(P,H.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);if(F.length<12)return x({ok:!1,error:"New password must be at least 12 characters."},422);if(Qn(F,H.passwordHash))return x({ok:!1,error:"Choose a different password."},409);let Q=ho(F),J=Ne.updatePassword(H.id,Q);Nu(t,J.username,Q);let ee=_c(J.id,N,at.requestIP(N)?.address??"unknown");return y.store.appendEvent({organizationId:y.organization.id,actorId:J.actorId,type:"auth.password.changed"}),x({ok:!0,message:"Password changed and other sessions were signed out."},200,{"set-cookie":Ua(ee.token,{secure:Di,maxAgeMs:Xe})})}if(q.pathname==="/api/auth/mfa/enroll"&&N.method==="POST"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U)return x({ok:!1,error:"Sign in again before enabling MFA."},401);if(!Qn(String(A.password??""),U.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);try{let H=Ne.beginTotpEnrollment(U.id,{issuer:y.organization.name});return y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.mfa.enrollment.started"}),x({factor:H.factor,secret:H.secret,uri:H.uri})}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"MFA enrollment failed."},409)}}if(q.pathname==="/api/auth/mfa/verify"&&N.method==="POST"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U)return x({ok:!1,error:"Sign in again before enabling MFA."},401);try{let H=Ne.verifyTotpEnrollment(U.id,String(A.code??""));return Ne.markSessionStepUp(P.id,!0),y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.mfa.enabled",payload:{recoveryCodeCount:H.recoveryCodes.length}}),x(H)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"MFA enrollment failed."},422)}}if(q.pathname==="/api/auth/mfa"&&N.method==="DELETE"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U||!Qn(String(A.password??""),U.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);let H=Ne.verifyMfaCode(U.id,String(A.code??""));if(!H.valid||!H.method)return x({ok:!1,error:"Authenticator or recovery code is incorrect."},401);return Ne.disableMfa(U.id),Ne.revokeOtherSessions(U.id,P.id),Ne.markSessionStepUp(P.id),y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.mfa.disabled",payload:{method:H.method}}),x({ok:!0})}if(q.pathname==="/api/auth/step-up"&&N.method==="POST"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U||!Qn(String(A.password??""),U.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);let H=Ne.getMfaFactor(U.id);if(H?.state==="active"){if(!Ne.verifyMfaCode(U.id,String(A.code??"")).valid)return x({ok:!1,error:"Authenticator or recovery code is incorrect."},401)}let Q=Ne.markSessionStepUp(P.id,H?.state==="active");return y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.step_up.succeeded",payload:{mfa:H?.state==="active"}}),x({ok:!0,recentAuthAt:Q.recentAuthAt})}if(q.pathname==="/api/terminal"){if(!ue)return x({ok:!1,error:"The web terminal is disabled."},403);if(at.upgrade(N))return;return Hu("WebSocket upgrade failed",400)}if(q.pathname==="/api/health"){let A=y.store.health();return x({ok:!0,cwd:t,environment:Ce,environments:C,uiRoot:await Qt(me,Ce),liveData:ae.size>0,terminal:ue,localPackage:import.meta.url.includes("/Code/Libraries/ts-cloud/"),controlPlane:{schemaVersion:A.schemaVersion,supportedSchemaVersion:A.supportedSchemaVersion,integrity:A.integrity,pendingRetryableOperations:A.pendingRetryableOperations}})}if(q.pathname==="/api/control-plane/operations"){let A=q.searchParams.get("state"),P=A&&["queued","running","succeeded","failed","cancelled","timed_out"].includes(A)?A:void 0;return x({operations:y.store.listOperations({projectId:y.project.id,state:P,kind:q.searchParams.get("kind")??void 0,limit:Number(q.searchParams.get("limit"))||100})})}if(q.pathname==="/api/queue"&&N.method==="GET"){let A=q.searchParams.get("state"),P=A&&["queued","running","succeeded","failed","cancelled","timed_out"].includes(A)?A:void 0,F=Vt.list({projectId:y.project.id,state:P,limit:Number(q.searchParams.get("limit"))||250}).filter((U)=>ws(me,U.operation.id,"deployments:read")).map((U)=>{let H=U.operation.resourceId?y.store.getResource(U.operation.resourceId):void 0,Q=U.operation.environmentId?y.store.listEnvironments(y.project.id).find((Se)=>Se.id===U.operation.environmentId):void 0,J=U.operation.actorId?y.store.getActor(U.operation.actorId):void 0,ee=U.operation.input;return{...U,target:H?{id:H.id,name:H.name,slug:H.slug,kind:H.kind}:Q?{id:Q.id,name:Q.name,slug:Q.slug,kind:"environment"}:{id:y.project.id,name:y.project.name,slug:y.project.slug,kind:"project"},actor:J?{id:J.id,name:J.displayName,kind:J.kind}:void 0,commit:ee.revision??ee.source?.commitSha??null}});return x({operations:F,concurrency:Vt.limits})}if(q.pathname==="/api/queue/logs"&&N.method==="GET"){let A=String(q.searchParams.get("id")??"");if(!ws(me,A,"deployments:read"))return x({ok:!1,error:"Operation was not found in this scope."},404);let P=Vt.logs(A,{after:Number(q.searchParams.get("after"))||0,limit:Number(q.searchParams.get("limit"))||500});return x({entries:P,cursor:P.at(-1)?.sequence??(Number(q.searchParams.get("after"))||0),operation:y.store.getOperation(A)})}if(q.pathname==="/api/queue/stream"&&N.method==="GET"){let A=String(q.searchParams.get("id")??"");if(!ws(me,A,"deployments:read"))return x({ok:!1,error:"Operation was not found in this scope."},404);let P=N.headers.get("last-event-id")?.trim(),F=Number(P||q.searchParams.get("after")||0),U=new TextEncoder,H,Q=!1,J=new ReadableStream({start(ee){let Se=()=>{if(Q)return;let ve=lr.resolveUser(N);if(!ve||!ws(ve,A,"deployments:read")){if(Q=!0,H)clearInterval(H);ee.close();return}let nt=Vt.logs(A,{after:F,limit:500});for(let He of nt)F=He.sequence,ee.enqueue(U.encode(`id: ${He.sequence}
|
|
685
|
+
This link expires in one hour and can be used once.`});y.store.appendEvent({organizationId:y.organization.id,actorId:H.actorId,type:"auth.password_reset.requested",payload:{delivered:ee}})}return x({ok:!0,message:"If that account has a verified email, a reset link has been sent."},202)}if(q.pathname==="/api/auth/password-reset/complete"&&N.method==="POST"){let A=await re(N),P=String(A.token??"").trim(),F=String(A.password??"");if(!P||F.length<12)return x({ok:!1,error:"A valid reset token and password of at least 12 characters are required."},422);try{let U=Ne.consumeActionToken(P,"password_reset"),H=ho(F),Q=Ne.updatePassword(U.identityId,H);return Nu(t,Q.username,H),y.store.appendEvent({organizationId:y.organization.id,actorId:Q.actorId,type:"auth.password_reset.completed"}),x({ok:!0,message:"Password changed. Sign in again."},200,{"set-cookie":Du({secure:Di})})}catch(U){let H=U instanceof Error?U.message:"Password reset failed.";return x({ok:!1,error:H.replace("Action token","Reset link")},H.includes("consumed")||H.includes("expired")?409:404)}}if(q.pathname==="/api/login"&&N.method==="POST"){let A=await re(N),P=String(A.username??"").trim(),F=String(A.password??""),U=at.requestIP(N)?.address??"unknown",H=Cc.check(P,U);if(!H.allowed)return x({ok:!1,error:`Too many failed attempts. Try again in ${Math.ceil((H.retryAfterSeconds??0)/60)} minute(s).`},429,{"retry-after":String(H.retryAfterSeconds??60)});let Q=Fn(wn(t),P),J=Ne.getIdentityByUsername(P),ee=J?.passwordHash??Q?.passwordHash??J_;if(!(Qn(F,ee)&&!!Q&&!!J&&!J.disabledAt))return Cc.recordFailure(P,U),x({ok:!1,error:"Incorrect username or password."},401);if(sS(Ne,y,J))return x({ok:!1,error:"Single sign-on is required for this account."},403);Cc.recordSuccess(P,U);let ve=J,nt=ve.requiresPasswordUpgrade||bb(ve.passwordHash);if(nt){let He=ho(F);ve=Ne.rehashPassword(ve.id,He),Nu(t,ve.username,He)}if(Ne.recordLogin(ve.id),Ne.getMfaFactor(ve.id)?.state==="active"){let He=Ne.createMfaChallenge(ve.id,"login");return y.store.appendEvent({organizationId:y.organization.id,actorId:ve.actorId,type:"auth.mfa.challenge.created",payload:{purpose:"login"}}),x({ok:!0,mfaRequired:!0,challengeToken:He.token,passwordUpgraded:nt})}let Pe=_c(ve.id,N,U);return y.store.appendEvent({organizationId:y.organization.id,actorId:ve.actorId,type:"auth.login.succeeded",payload:{method:"local"}}),x({ok:!0,user:qa(Q),passwordUpgraded:nt},200,{"set-cookie":Ua(Pe.token,{secure:Di,maxAgeMs:Xe})})}if(q.pathname==="/api/auth/mfa/complete"&&N.method==="POST"){let A=await re(N),P=String(A.challengeToken??"").trim(),F=String(A.code??"").trim(),U=at.requestIP(N)?.address??"unknown",Q=Ne.inspectMfaChallengeToken(P,"login")?.identityId??"unknown-mfa",J=Pc.check(Q,U);if(!J.allowed)return x({ok:!1,error:"Too many MFA attempts. Try again later."},429,{"retry-after":String(J.retryAfterSeconds??60)});try{let ee=Ne.completeMfaChallenge(P,F,"login");Pc.recordSuccess(Q,U);let Se=new Date().toISOString(),ve=Ne.createSession({identityId:ee.identity.id,userAgent:Um(N),networkHint:Xu(U),mfaAt:Se,recentAuthAt:Se});return y.store.appendEvent({organizationId:y.organization.id,actorId:ee.identity.actorId,type:"auth.mfa.succeeded",payload:{purpose:"login",method:ee.method}}),x({ok:!0},200,{"set-cookie":Ua(ve.token,{secure:Di,maxAgeMs:Xe})})}catch{return Pc.recordFailure(Q,U),x({ok:!1,error:"Authenticator or recovery code is incorrect."},401)}}if(q.pathname==="/api/logout"&&N.method==="POST"){let A=lr.resolveSession(N);if(A)Ne.revokeSession(A.identityId,A.id);let P=Du({secure:Di});if(N.headers.get("accept")?.includes("text/html"))return new Response(null,{status:302,headers:{location:"/login","set-cookie":P}});return x({ok:!0},200,{"set-cookie":P})}if(q.pathname==="/login"){let A=Ne.listOidcProviders(y.organization.id).map((P)=>({slug:P.slug,name:P.name}));return new Response(aS(B?.mode==="serverless",A),{headers:{"content-type":"text/html; charset=utf-8"}})}if(q.pathname==="/forgot-password"||q.pathname==="/reset-password")return new Response(cS(q.pathname==="/reset-password"?"reset":"request"),{headers:{"content-type":"text/html; charset=utf-8"}});if(q.pathname==="/accept-invitation")return iw(lt,q.pathname);let me=lr.resolveUser(N);if(!me){if(!q.pathname.startsWith("/api/")&&N.headers.get("accept")?.includes("text/html"))return new Response(null,{status:302,headers:{location:"/login"}});return x({ok:!1,error:"Sign in to continue."},401)}let $n=Jt(me,Ce);if(q.pathname==="/api/me"){let A=y.store.getActorByExternalId("user",`dashboard:${me.username.toLowerCase()}`),P=A?y.store.getMembershipForActor(y.organization.id,A.id):void 0,F=y.store.resolveAuthorizationTarget(y.organization.id,P?.scope??{type:"project",id:y.project.id})??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id});return x({ok:!0,user:qa(me),authEnabled:xe,organization:y.organization,membership:P,capabilities:Mt({membership:P,grants:P?y.store.listGrants(P.id):[],target:F})})}if(q.pathname.startsWith("/api/")){let A=await nS(N,q.pathname),P=lr.check(N,q.pathname,me,A);if(!P.ok)return x({ok:!1,error:P.error},P.status??403);if(xe&&iT.has(`${N.method.toUpperCase()} ${q.pathname}`)){let F=lr.resolveSession(N);if(!F||!Ne.isRecentlyAuthenticated(F))return x({ok:!1,error:"Recent authentication is required for this change.",stepUpRequired:!0},401)}}if(q.pathname==="/api/auth/security"&&N.method==="GET"){let A=We(me),P=A.actor?Ne.getIdentityByActor(A.actor.id):void 0,F=lr.resolveSession(N);return x({identity:P?{username:P.username,email:P.email,emailVerifiedAt:P.emailVerifiedAt,requiresPasswordUpgrade:P.requiresPasswordUpgrade,lastLoginAt:P.lastLoginAt}:void 0,currentSessionId:F?.id,sessions:P?Ne.listSessions(P.id,{includeInactive:!0}):[],mfa:P?{factor:Ne.getMfaFactor(P.id),recoveryCodesRemaining:Ne.remainingRecoveryCodes(P.id)}:void 0})}if(q.pathname==="/api/auth/oidc/providers"&&N.method==="GET")return x({providers:Ne.listOidcProviders(y.organization.id,{includeDisabled:!0}),callbackOrigin:pt,callbackPattern:pt?`${pt}/auth/oidc/{slug}/callback`:void 0,localOwnerRecovery:!0});if(q.pathname==="/api/auth/oidc/providers"&&N.method==="POST"){let A=await re(N),P=We(me),F=P.actor?Ne.getIdentityByActor(P.actor.id):void 0,U=A.enforceSso===!0;if(U&&(!F?.emailVerifiedAt||Ne.remainingRecoveryCodes(F.id)<1))return x({ok:!1,error:"Verify the owner email and generate MFA recovery codes before enforcing SSO."},409);try{let H=qu(A.defaultRole),Q=Ne.upsertOidcProvider({id:typeof A.id==="string"?A.id:void 0,organizationId:y.organization.id,slug:String(A.slug??""),name:String(A.name??""),issuer:String(A.issuer??""),clientId:String(A.clientId??""),clientSecret:typeof A.clientSecret==="string"&&A.clientSecret?A.clientSecret:void 0,scopes:Array.isArray(A.scopes)?A.scopes.map(String):void 0,allowedDomains:Array.isArray(A.allowedDomains)?A.allowedDomains.map(String):[],defaultRole:H&&H!=="owner"?H:void 0,enabled:A.enabled!==!1,enforceSso:U});return y.store.appendEvent({organizationId:y.organization.id,actorId:P.actor?.id,type:"auth.oidc.provider.configured",payload:{providerId:Q.id,issuer:Q.issuer,enabled:Q.enabled,enforceSso:Q.enforceSso}}),x({ok:!0,provider:Q})}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"OIDC provider could not be saved."},422)}}if(q.pathname==="/api/auth/oidc/providers"&&N.method==="PATCH"){let A=await re(N),P=Ne.getOidcProvider(String(A.id??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"OIDC provider was not found."},404);let F=We(me),U=Ne.setOidcProviderEnabled(P.id,A.enabled===!0);return y.store.appendEvent({organizationId:y.organization.id,actorId:F.actor?.id,type:U.enabled?"auth.oidc.provider.enabled":"auth.oidc.provider.disabled",payload:{providerId:P.id}}),x({ok:!0,provider:U})}if(q.pathname==="/api/automation"&&N.method==="GET"){let A=yt.listServiceAccounts(y.organization.id,{includeDisabled:!0}).map((P)=>{let F=y.store.getMembershipForActor(y.organization.id,P.actorId),U=P.createdByActorId?y.store.getActor(P.createdByActorId):void 0,H=yt.listTokens(P.id,{includeInactive:!0}).map((Q)=>({...Q,createdBy:Q.createdByActorId?y.store.getActor(Q.createdByActorId):void 0}));return{account:P,createdBy:U,membership:F,tokens:H}});return x({accounts:A,apiBaseUrl:`${q.origin}/api/v1`,openApiUrl:`${q.origin}/api/v1/openapi.json`,tokenEnvironmentVariable:"TS_CLOUD_API_TOKEN"})}if(q.pathname==="/api/automation/service-accounts"&&N.method==="POST"){let A=await re(N),P=We(me),F=qu(A.roleTemplate),U=Ic(A);if(!P.actor||!F||F==="owner"||!U)return x({ok:!1,error:"A non-owner role and valid organization scope are required."},422);try{let H=yt.createServiceAccount({organizationId:y.organization.id,slug:String(A.slug??""),name:String(A.name??""),description:typeof A.description==="string"?A.description:void 0,roleTemplate:F,scope:U,createdByActorId:P.actor.id});return x({ok:!0,...H},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"Service account could not be created."},422)}}if(q.pathname==="/api/automation/service-accounts"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=yt.getServiceAccount(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Service account was not found."},404);return x({ok:!0,account:yt.disableServiceAccount(F.id,P.actor?.id)})}if(q.pathname==="/api/automation/tokens"&&N.method==="POST"){let A=await re(N),P=We(me),F=yt.getServiceAccount(String(A.serviceAccountId??"")),U=Ic(A);if(!P.actor||!F||F.organizationId!==y.organization.id||!U||!Array.isArray(A.capabilities))return x({ok:!1,error:"Service account, explicit capabilities, and valid scope are required."},422);try{let H=yt.createToken({serviceAccountId:F.id,name:String(A.name??"API token"),capabilities:A.capabilities.map(String),scope:U,expiresAt:typeof A.expiresAt==="string"?A.expiresAt:void 0,createdByActorId:P.actor.id});return x({ok:!0,token:H.token,secret:H.secret,revealOnce:!0},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"API token could not be created."},422)}}if(q.pathname==="/api/automation/tokens/rotate"&&N.method==="POST"){let A=await re(N),P=We(me),F=yt.getToken(String(A.id??"")),U=F?yt.getServiceAccount(F.serviceAccountId):void 0;if(!P.actor||!F||U?.organizationId!==y.organization.id)return x({ok:!1,error:"API token was not found."},404);try{let H=yt.rotateToken(F.id,P.actor.id);return x({ok:!0,token:H.token,secret:H.secret,revealOnce:!0,overlap:!0},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"API token could not be rotated."},409)}}if(q.pathname==="/api/automation/tokens"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=yt.getToken(String(A.id??"")),U=F?yt.getServiceAccount(F.serviceAccountId):void 0;if(!F||U?.organizationId!==y.organization.id)return x({ok:!1,error:"API token was not found."},404);return x({ok:!0,token:yt.revokeToken(F.id,P.actor?.id)})}if(q.pathname==="/api/onboarding"&&N.method==="GET"){let A=Ke.listConnections(y.organization.id);return x({drafts:zr.list(y.project.id),artifacts:Ss.list(y.project.id),registries:Yn.list(y.organization.id),sourceConnections:A,repositories:A.flatMap((P)=>Ke.listRepositories(P.id)),project:{id:y.project.id,slug:y.project.slug,name:y.project.name},environments:[...y.environments.values()].map((P)=>({id:P.id,slug:P.slug,name:P.name,kind:P.kind,region:P.region})),resources:y.store.listResources(y.project.id).filter((P)=>P.kind==="application").map((P)=>({id:P.id,slug:P.slug,name:P.name,environmentId:P.environmentId}))})}if(q.pathname==="/api/onboarding/detect"&&N.method==="POST"){let A=await re(N);try{if(A.source?.kind==="git"){let U=Ke.getConnection(String(A.source.connectionId??"")),H=Ke.getRepository(String(A.source.repositoryId??""));if(!U||U.organizationId!==y.organization.id||!H||H.connectionId!==U.id)throw Error("Authorized Git repository was not found");let Q=typeof A.source.deployKeyId==="string"?Ke.getDeployKey(A.source.deployKeyId):void 0;if(Q&&Q.connectionId!==U.id)throw Error("Deploy key does not belong to this connection");let J=km(Ut(Wu(),"ts-cloud-onboarding-git-"));try{let ee=await Go({remote:H.cloneUrl,destination:Ut(J,"checkout"),ref:String(A.source.ref??H.defaultBranch),sparsePaths:Array.isArray(A.source.sparsePaths)?A.source.sparsePaths.map(String):void 0,binding:{id:"detection",projectId:y.project.id,connectionId:U.id,repositoryId:H.id,repositoryFullName:H.fullName,defaultBranch:H.defaultBranch,monorepoRoot:String(A.source.monorepoRoot??"."),includePaths:[],excludePaths:[],submodules:A.source.submodules===!0,cloneDepth:1,deployKeyId:Q?.id,autoDeploy:!1,pullRequestPreviews:!1,status:"active",version:1,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}},{credential:Ke.getCredential(U.id),deployKey:Q?{...Q,privateKey:Ke.getDeployPrivateKey(Q.id)}:void 0,timeoutMs:120000});return x({ok:!0,commitSha:ee.commitSha,candidates:_s(ap(ee.directory))})}finally{bs(J,{recursive:!0,force:!0})}}if(Array.isArray(A.files)){if(A.files.length>1e4)throw Error("Detection file-count limit exceeded");let U=A.files.map((H)=>({path:String(H.path??""),size:Number(H.size??0),content:typeof H.content==="string"?H.content.slice(0,262144):void 0}));return x({ok:!0,candidates:_s(U)})}let P=B_(t,String(A.root??".")),F=j_(t,P);if(F===".."||F.startsWith(`..${M_}`))throw Error("Detection root must stay inside the project");return x({ok:!0,candidates:_s(ap(P))})}catch(P){return x({ok:!1,error:P instanceof Error?P.message:"Application detection failed."},422)}}if(q.pathname==="/api/onboarding/plan"&&N.method==="POST"){let A=await re(N);try{return x({ok:!0,plan:qn(A.draft,Array.isArray(A.suppliedSecretNames)?A.suppliedSecretNames.map(String):[])})}catch(P){return x({ok:!1,error:P instanceof Error?P.message:"Application plan could not be generated."},422)}}if(q.pathname==="/api/onboarding/drafts"&&N.method==="POST"){let A=await re(N),P=We(me);try{return x({ok:!0,draft:zr.create({organizationId:y.organization.id,projectId:y.project.id,name:String(A.name??A.draft?.name??"Application draft"),draft:{...A.draft,projectId:y.project.id},step:A.step,suppliedSecretNames:Array.isArray(A.suppliedSecretNames)?A.suppliedSecretNames.map(String):[],actorId:P.actor?.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Application draft could not be saved."},422)}}if(q.pathname==="/api/onboarding/drafts"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=zr.get(String(A.id??""));if(!F||F.projectId!==y.project.id)return x({ok:!1,error:"Application draft was not found."},404);try{return x({ok:!0,draft:zr.update(F.id,Number(A.version),{draft:{...A.draft,projectId:y.project.id},step:A.step,suppliedSecretNames:Array.isArray(A.suppliedSecretNames)?A.suppliedSecretNames.map(String):void 0,actorId:P.actor?.id})})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Application draft could not be updated."},409)}}if(q.pathname==="/api/onboarding/artifacts"&&N.method==="POST"){let A=We(me);if(Number(N.headers.get("content-length")??0)>104857600)return x({ok:!1,error:"Artifact exceeds the 100 MB upload limit."},413);try{let F=new Uint8Array(await N.arrayBuffer());return x({ok:!0,artifact:Ss.create({organizationId:y.organization.id,projectId:y.project.id,filename:N.headers.get("x-artifact-filename")??"application.zip",bytes:F,actorId:A.actor?.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Artifact could not be inspected."},422)}}if(q.pathname==="/api/onboarding/registries"&&N.method==="POST"){let A=await re(N),P=We(me);try{return x({ok:!0,registry:Yn.create({organizationId:y.organization.id,provider:A.provider,name:String(A.name??"Container registry"),host:String(A.host??""),credential:A.token||A.password?{username:typeof A.username==="string"?A.username:void 0,password:typeof A.password==="string"?A.password:void 0,token:typeof A.token==="string"?A.token:void 0}:void 0,credentialExpiresAt:typeof A.credentialExpiresAt==="string"?A.credentialExpiresAt:void 0,actorId:P.actor?.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Registry connection could not be created."},422)}}if(q.pathname==="/api/onboarding/registries"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=Yn.get(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Registry connection was not found."},404);try{if(A.action==="test")return x({ok:!0,registry:await Yn.test(F.id,{image:typeof A.image==="string"?A.image:void 0})});if(A.action==="rotate")return x({ok:!0,registry:Yn.rotate(F.id,{username:typeof A.username==="string"?A.username:void 0,password:typeof A.password==="string"?A.password:void 0,token:typeof A.token==="string"?A.token:void 0},{expiresAt:typeof A.expiresAt==="string"?A.expiresAt:void 0,actorId:P.actor?.id})});return x({ok:!1,error:"Registry action must be test or rotate."},422)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Registry connection could not be updated."},422)}}if(q.pathname==="/api/onboarding/registries"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=Yn.get(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Registry connection was not found."},404);let U=zr.list(y.project.id).filter((H)=>H.input.source.kind==="image"&&H.input.source.registryConnectionId===F.id||H.input.build.kind==="prebuilt_image"&&H.input.build.registryConnectionId===F.id);if(A.preview===!0)return x({ok:!0,preview:!0,affectedDrafts:U});return x({ok:!0,registry:Yn.disconnect(F.id,P.actor?.id),affectedDrafts:U})}if(q.pathname==="/api/onboarding/apply"&&N.method==="POST"){let A=await re(N),P=We(me);try{let F=Bc({controlPlane:y.store,drafts:zr,draftId:String(A.id??""),expectedVersion:Number(A.version),confirmEnvironment:String(A.confirmEnvironment??""),actorId:P.actor?.id});return x({ok:!0,resource:F.resource,operation:F.operation,plan:F.plan},202)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Application plan could not be applied."},422)}}if(q.pathname==="/api/sources"&&N.method==="GET"){let A=Ke.listConnections(y.organization.id);return x({connections:A,bindings:Ke.listBindings({projectId:y.project.id}),repositories:A.flatMap((P)=>Ke.listRepositories(P.id)),deployKeys:A.flatMap((P)=>Ke.listDeployKeys(P.id)),webhooks:A.flatMap((P)=>Ke.listWebhooks(P.id)).map((P)=>({...P,deliveries:Ke.listDeliveries(P.id,20)})),project:{id:y.project.id,slug:y.project.slug},environment:ne(y,String(Ce)),resources:y.store.listResources(y.project.id,ne(y,String(Ce)).environmentId).filter((P)=>P.kind==="application").map((P)=>({id:P.id,slug:P.slug,name:P.name}))})}if(q.pathname==="/api/sources/connections"&&N.method==="POST"){let A=await re(N),P=We(me),F=String(A.provider??"");if(!["github","gitlab","bitbucket","gitea","generic_https","generic_ssh"].includes(F))return x({ok:!1,error:"A supported Git provider is required."},422);try{let U=F==="github"&&(A.privateKey||A.appId)?{appId:typeof A.appId==="string"?A.appId:void 0,installationId:typeof A.installationId==="string"?A.installationId:void 0,privateKey:typeof A.privateKey==="string"?A.privateKey:void 0}:F!=="generic_ssh"&&A.token?{token:typeof A.token==="string"?A.token:void 0,username:typeof A.username==="string"?A.username:void 0}:void 0,H={github:"https://github.com",gitlab:"https://gitlab.com",bitbucket:"https://bitbucket.org",gitea:"https://gitea.com"},Q,J,ee;if(y.store.database.transaction(()=>{if(Q=Ke.createConnection({organizationId:y.organization.id,provider:F,name:String(A.name??F),host:String(A.host??H[F]??""),owner:typeof A.owner==="string"?A.owner:void 0,authKind:A.authKind,credential:U,grantedScopes:Array.isArray(A.grantedScopes)?A.grantedScopes.map(String):[],credentialExpiresAt:typeof A.credentialExpiresAt==="string"?A.credentialExpiresAt:void 0,createdByActorId:P.actor?.id}),typeof A.repositoryUrl==="string"&&typeof A.repositoryFullName==="string")J=Ke.upsertRepository({connectionId:Q.id,providerRepositoryId:`manual:${A.repositoryFullName}`,fullName:A.repositoryFullName,cloneUrl:A.repositoryUrl,defaultBranch:String(A.defaultBranch??"main"),visibility:"unknown",archived:!1,metadata:{source:"manual"}});if(F==="generic_ssh")ee=Ke.createDeployKey({connectionId:Q.id,name:String(A.deployKeyName??"Repository deploy key"),publicKey:String(A.publicKey??""),privateKey:String(A.deployPrivateKey??""),host:String(A.sshHost??""),hostKey:String(A.hostKey??""),actorId:P.actor?.id})})(),A.test===!0)Q=await qo(Ke,Q.id,J?.id);return x({ok:!0,connection:Q,repository:J,deployKey:ee},201)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source connection could not be created."},422)}}if(q.pathname==="/api/sources/connections"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=Ke.getConnection(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{if(A.action==="test")return x({ok:!0,connection:await qo(Ke,F.id,typeof A.repositoryId==="string"?A.repositoryId:void 0)});if(A.action==="rotate")return x({ok:!0,connection:Ke.rotateCredential(F.id,{token:typeof A.token==="string"?A.token:void 0,username:typeof A.username==="string"?A.username:void 0,appId:typeof A.appId==="string"?A.appId:void 0,installationId:typeof A.installationId==="string"?A.installationId:void 0,privateKey:typeof A.privateKey==="string"?A.privateKey:void 0},{expiresAt:typeof A.expiresAt==="string"?A.expiresAt:void 0,actorId:P.actor?.id})});return x({ok:!1,error:"Connection action must be test or rotate."},422)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source connection could not be updated."},422)}}if(q.pathname==="/api/sources/connections"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=Ke.getConnection(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);let U=Ke.listBindings({connectionId:F.id,status:"active"});if(A.preview===!0)return x({ok:!0,preview:!0,affectedBindings:U});return x({ok:!0,...Ke.disconnectConnection(F.id,P.actor?.id)})}if(q.pathname==="/api/sources/deploy-keys"&&N.method==="POST"){let A=await re(N),P=We(me),F=Ke.getConnection(String(A.connectionId??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x({ok:!0,deployKey:Ke.createDeployKey({connectionId:F.id,name:String(A.name??"Repository deploy key"),publicKey:String(A.publicKey??""),privateKey:String(A.privateKey??""),host:String(A.host??""),hostKey:String(A.hostKey??""),actorId:P.actor?.id})},201)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Deploy key could not be stored."},422)}}if(q.pathname==="/api/sources/deploy-keys"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=Ke.getDeployKey(String(A.id??"")),U=F?Ke.getConnection(F.connectionId):void 0;if(!F||!U||U.organizationId!==y.organization.id)return x({ok:!1,error:"Deploy key was not found."},404);let H=Ke.listBindings({connectionId:U.id}).filter((Q)=>Q.deployKeyId===F.id);if(A.preview===!0)return x({ok:!0,preview:!0,affectedBindings:H});return x({ok:!0,...Ke.revokeDeployKey(F.id,P.actor?.id)})}if(q.pathname==="/api/sources/repositories/sync"&&N.method==="POST"){let A=await re(N),P=Ke.getConnection(String(A.connectionId??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x({ok:!0,repositories:await Gi(Ke,String(A.connectionId??""),{search:typeof A.search==="string"?A.search:void 0})})}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Repositories could not be synchronized."},422)}}if(q.pathname==="/api/sources/references"&&N.method==="GET"){let A=Ke.getConnection(String(q.searchParams.get("connectionId")??""));if(!A||A.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x(await qi(Ke,{connectionId:String(q.searchParams.get("connectionId")??""),repository:String(q.searchParams.get("repository")??""),repositoryId:q.searchParams.get("repositoryId")??void 0,deployKeyId:q.searchParams.get("deployKeyId")??void 0,type:q.searchParams.get("type")==="tags"?"tags":"branches",cursor:q.searchParams.get("cursor")??void 0}))}catch(P){return x({ok:!1,error:P instanceof Error?P.message:"References could not be listed."},422)}}if(q.pathname==="/api/sources/bindings"&&N.method==="POST"){let A=await re(N),P=We(me),F=ne(y,String(Ce)),U=Ke.getConnection(String(A.connectionId??""));if(!U||U.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{return x({ok:!0,binding:Ke.createBinding({projectId:y.project.id,environmentId:F.environmentId,resourceId:typeof A.resourceId==="string"?A.resourceId:void 0,connectionId:String(A.connectionId??""),repositoryId:typeof A.repositoryId==="string"?A.repositoryId:void 0,repositoryFullName:String(A.repositoryFullName??""),defaultBranch:String(A.defaultBranch??"main"),branchRule:typeof A.branchRule==="string"?A.branchRule:void 0,tagRule:typeof A.tagRule==="string"?A.tagRule:void 0,monorepoRoot:String(A.monorepoRoot??"."),includePaths:Array.isArray(A.includePaths)?A.includePaths.map(String):[],excludePaths:Array.isArray(A.excludePaths)?A.excludePaths.map(String):[],submodules:A.submodules===!0,cloneDepth:A.cloneDepth?Number(A.cloneDepth):void 0,deployKeyId:typeof A.deployKeyId==="string"&&A.deployKeyId?A.deployKeyId:void 0,autoDeploy:A.autoDeploy!==!1,pullRequestPreviews:A.pullRequestPreviews!==!1,actorId:P.actor?.id})},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"Source binding could not be created."},422)}}if(q.pathname==="/api/sources/bindings"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=Ke.getBinding(String(A.id??""));if(!F||F.projectId!==y.project.id)return x({ok:!1,error:"Source binding was not found."},404);try{return x({ok:!0,binding:Ke.updateBinding(F.id,Number(A.version),{defaultBranch:A.defaultBranch,branchRule:A.branchRule,tagRule:A.tagRule,monorepoRoot:A.monorepoRoot,includePaths:A.includePaths,excludePaths:A.excludePaths,submodules:A.submodules,cloneDepth:A.cloneDepth,deployKeyId:A.deployKeyId,autoDeploy:A.autoDeploy,pullRequestPreviews:A.pullRequestPreviews,status:A.status,disabledReason:A.disabledReason,actorId:P.actor?.id})})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source binding could not be updated."},409)}}if(q.pathname==="/api/sources/webhooks"&&N.method==="POST"){let A=await re(N),P=Ke.getConnection(String(A.connectionId??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Source connection was not found."},404);try{let F=Ke.createWebhook({connectionId:String(A.connectionId??""),repositoryId:typeof A.repositoryId==="string"?A.repositoryId:void 0,repositoryFullName:String(A.repositoryFullName??""),events:Array.isArray(A.events)?A.events.map(String):void 0,secret:typeof A.secret==="string"?A.secret:void 0}),U=process.env.TS_CLOUD_WEBHOOK_BASE_URL?.trim()||pt,H=U?Zt(U,F.webhook):void 0,Q=A.reconcile!==!1&&U?await Zr(Ke,F.webhook.id,U):F.webhook;return x({ok:!0,webhook:Q,endpoint:H,endpointRevealOnce:!0},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Source webhook could not be created."},422)}}if(q.pathname==="/api/sources/webhooks"&&N.method==="PATCH"){let A=await re(N),P=process.env.TS_CLOUD_WEBHOOK_BASE_URL?.trim()||pt,F=Ke.getWebhook(String(A.id??"")),U=F?Ke.getConnection(F.connectionId):void 0;if(!F||!U||U.organizationId!==y.organization.id)return x({ok:!1,error:"Source webhook was not found."},404);if(!P)return x({ok:!1,error:"Set TS_CLOUD_WEBHOOK_BASE_URL to reconcile provider webhooks."},422);try{return x({ok:!0,webhook:await Zr(Ke,String(A.id??""),P)})}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"Source webhook could not be reconciled."},422)}}if(q.pathname==="/api/sources/webhooks"&&N.method==="DELETE"){let A=await re(N),P=Ke.getWebhook(String(A.id??"")),F=P?Ke.getConnection(P.connectionId):void 0;if(!P||!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Source webhook was not found."},404);try{return x({ok:!0,webhook:await vl(Ke,String(A.id??""))})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Source webhook could not be removed."},422)}}if(q.pathname==="/api/security/posture"&&N.method==="GET"){let A=ne(y,String(Ce)),P=ut.listFindings({...A,limit:500});return x({scope:A,summary:ut.summary(A.organizationId,A.projectId,A.environmentId),findings:P,scans:ut.listScanRuns({...A,limit:100}),policies:ut.listPolicies(A.organizationId).filter((F)=>!F.environmentId||F.environmentId===A.environmentId),waivers:P.flatMap((F)=>ut.listWaivers(F.id)),decisions:ut.listDecisions(A.environmentId,50),actors:y.store.listMemberships(y.organization.id).map((F)=>y.store.getActor(F.actorId)).filter(Boolean)})}if(q.pathname==="/api/security/export"&&N.method==="GET")return x(ut.exportPosture(y.organization.id));if(q.pathname==="/api/security/scan"&&N.method==="POST"){let A=ne(y,String(Ce)),P=await new St(ut).run(new rn,{...A,artifactRoot:t}),F=ji(ut,A,sr??{});return x({ok:!0,source:P,host:F,summary:ut.summary(A.organizationId,A.projectId,A.environmentId)})}if(q.pathname==="/api/security/review"&&N.method==="POST")try{let A=ne(y,String(Ce));return x({ok:!0,...zi(ut,{scope:A,desiredConfigHash:y.project.desiredConfigHash})})}catch(A){return x({ok:!1,error:A instanceof Error?A.message:"Security change review failed."},409)}if(q.pathname==="/api/security/policies"&&N.method==="POST"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{let F=ut.createPolicy({organizationId:y.organization.id,environmentId:A.environmentId===null?void 0:String(A.environmentId??ne(y,String(Ce)).environmentId),name:String(A.name??""),scannerFailMode:A.scannerFailMode==="open"?"open":"closed",requiredScanners:Array.isArray(A.requiredScanners)?A.requiredScanners.map(String):[],rules:Array.isArray(A.rules)?A.rules.map((U)=>({minimumSeverity:String(U.minimumSeverity),action:String(U.action),scannerId:U.scannerId?String(U.scannerId):void 0})):[],actorId:P.actor.id});return x({ok:!0,policy:F},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Security policy could not be created."},422)}}if(q.pathname==="/api/security/policies"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=ut.getPolicy(String(A.id??""));if(!P.actor||!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Security policy was not found."},404);try{return x({ok:!0,policy:ut.updatePolicy(F.id,Number(A.version),{name:typeof A.name==="string"?A.name:void 0,scannerFailMode:A.scannerFailMode==="open"||A.scannerFailMode==="closed"?A.scannerFailMode:void 0,requiredScanners:Array.isArray(A.requiredScanners)?A.requiredScanners.map(String):void 0,rules:Array.isArray(A.rules)?A.rules.map((U)=>({minimumSeverity:String(U.minimumSeverity),action:String(U.action),scannerId:U.scannerId?String(U.scannerId):void 0})):void 0,enabled:typeof A.enabled==="boolean"?A.enabled:void 0,actorId:P.actor.id})})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Security policy could not be updated."},409)}}if(q.pathname==="/api/security/waivers"&&N.method==="POST"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{return x({ok:!0,waiver:ut.createWaiver({findingId:String(A.findingId??""),policyId:typeof A.policyId==="string"?A.policyId:void 0,reason:String(A.reason??""),referenceUrl:typeof A.referenceUrl==="string"?A.referenceUrl:void 0,expiresAt:String(A.expiresAt??""),actorId:P.actor.id})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Security waiver could not be created."},422)}}if(q.pathname==="/api/security/waivers"&&N.method==="DELETE"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{return x({ok:!0,waiver:ut.revokeWaiver(String(A.id??""),P.actor.id)})}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Security waiver could not be revoked."},404)}}if(q.pathname==="/api/security/findings"&&N.method==="PATCH"){let A=await re(N),P=We(me),F=ut.getFinding(String(A.id??""));if(!P.actor||!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Security finding was not found."},404);try{let U=A.action==="acknowledge"?ut.acknowledgeFinding(F.id,P.actor.id):ut.assignFinding(F.id,typeof A.ownerActorId==="string"&&A.ownerActorId?A.ownerActorId:void 0,P.actor.id);return x({ok:!0,finding:U})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Security finding could not be updated."},422)}}if(q.pathname==="/api/security/comments"&&N.method==="POST"){let A=await re(N),P=We(me);if(!P.actor)return x({ok:!1,error:"An organization actor is required."},403);try{return x({ok:!0,comment:ut.addComment({findingId:String(A.findingId??""),actorId:P.actor.id,body:String(A.body??""),referenceUrl:typeof A.referenceUrl==="string"?A.referenceUrl:void 0})},201)}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Comment could not be saved."},422)}}if(q.pathname==="/api/auth/sessions"&&N.method==="GET"){let A=lr.resolveSession(N);return x({currentSessionId:A?.id,sessions:A?Ne.listSessions(A.identityId,{includeInactive:!0}):[]})}if(q.pathname==="/api/auth/sessions"&&N.method==="DELETE"){let A=await re(N),P=lr.resolveSession(N);if(!P)return x({ok:!1,error:"Sign in again to manage sessions."},401);let F=String(A.id??""),U=Ne.revokeSession(P.identityId,F),H=F===P.id&&U?{"set-cookie":Du({secure:Di})}:void 0;return x({ok:U,signedOut:F===P.id&&U},U?200:404,H)}if(q.pathname==="/api/auth/sessions/revoke-others"&&N.method==="POST"){let A=lr.resolveSession(N);if(!A)return x({ok:!1,error:"Sign in again to manage sessions."},401);return x({ok:!0,revoked:Ne.revokeOtherSessions(A.identityId,A.id)})}if(q.pathname==="/api/auth/password/change"&&N.method==="POST"){let A=await re(N),P=String(A.currentPassword??""),F=String(A.password??""),U=We(me),H=U.actor?Ne.getIdentityByActor(U.actor.id):void 0;if(!H||!Qn(P,H.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);if(F.length<12)return x({ok:!1,error:"New password must be at least 12 characters."},422);if(Qn(F,H.passwordHash))return x({ok:!1,error:"Choose a different password."},409);let Q=ho(F),J=Ne.updatePassword(H.id,Q);Nu(t,J.username,Q);let ee=_c(J.id,N,at.requestIP(N)?.address??"unknown");return y.store.appendEvent({organizationId:y.organization.id,actorId:J.actorId,type:"auth.password.changed"}),x({ok:!0,message:"Password changed and other sessions were signed out."},200,{"set-cookie":Ua(ee.token,{secure:Di,maxAgeMs:Xe})})}if(q.pathname==="/api/auth/mfa/enroll"&&N.method==="POST"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U)return x({ok:!1,error:"Sign in again before enabling MFA."},401);if(!Qn(String(A.password??""),U.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);try{let H=Ne.beginTotpEnrollment(U.id,{issuer:y.organization.name});return y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.mfa.enrollment.started"}),x({factor:H.factor,secret:H.secret,uri:H.uri})}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"MFA enrollment failed."},409)}}if(q.pathname==="/api/auth/mfa/verify"&&N.method==="POST"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U)return x({ok:!1,error:"Sign in again before enabling MFA."},401);try{let H=Ne.verifyTotpEnrollment(U.id,String(A.code??""));return Ne.markSessionStepUp(P.id,!0),y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.mfa.enabled",payload:{recoveryCodeCount:H.recoveryCodes.length}}),x(H)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"MFA enrollment failed."},422)}}if(q.pathname==="/api/auth/mfa"&&N.method==="DELETE"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U||!Qn(String(A.password??""),U.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);let H=Ne.verifyMfaCode(U.id,String(A.code??""));if(!H.valid||!H.method)return x({ok:!1,error:"Authenticator or recovery code is incorrect."},401);return Ne.disableMfa(U.id),Ne.revokeOtherSessions(U.id,P.id),Ne.markSessionStepUp(P.id),y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.mfa.disabled",payload:{method:H.method}}),x({ok:!0})}if(q.pathname==="/api/auth/step-up"&&N.method==="POST"){let A=await re(N),P=lr.resolveSession(N),F=We(me),U=F.actor?Ne.getIdentityByActor(F.actor.id):void 0;if(!P||!U||!Qn(String(A.password??""),U.passwordHash))return x({ok:!1,error:"Current password is incorrect."},401);let H=Ne.getMfaFactor(U.id);if(H?.state==="active"){if(!Ne.verifyMfaCode(U.id,String(A.code??"")).valid)return x({ok:!1,error:"Authenticator or recovery code is incorrect."},401)}let Q=Ne.markSessionStepUp(P.id,H?.state==="active");return y.store.appendEvent({organizationId:y.organization.id,actorId:U.actorId,type:"auth.step_up.succeeded",payload:{mfa:H?.state==="active"}}),x({ok:!0,recentAuthAt:Q.recentAuthAt})}if(q.pathname==="/api/terminal"){if(!ue)return x({ok:!1,error:"The web terminal is disabled."},403);if(at.upgrade(N))return;return Hu("WebSocket upgrade failed",400)}if(q.pathname==="/api/health"){let A=y.store.health();return x({ok:!0,cwd:t,environment:Ce,environments:C,uiRoot:await Qt(me,Ce),liveData:ae.size>0,terminal:ue,localPackage:import.meta.url.includes("/Code/Libraries/ts-cloud/"),controlPlane:{schemaVersion:A.schemaVersion,supportedSchemaVersion:A.supportedSchemaVersion,integrity:A.integrity,pendingRetryableOperations:A.pendingRetryableOperations}})}if(q.pathname==="/api/control-plane/operations"){let A=q.searchParams.get("state"),P=A&&["queued","running","succeeded","failed","cancelled","timed_out"].includes(A)?A:void 0;return x({operations:y.store.listOperations({projectId:y.project.id,state:P,kind:q.searchParams.get("kind")??void 0,limit:Number(q.searchParams.get("limit"))||100})})}if(q.pathname==="/api/queue"&&N.method==="GET"){let A=q.searchParams.get("state"),P=A&&["queued","running","succeeded","failed","cancelled","timed_out"].includes(A)?A:void 0,F=Vt.list({projectId:y.project.id,state:P,limit:Number(q.searchParams.get("limit"))||250}).filter((U)=>ws(me,U.operation.id,"deployments:read")).map((U)=>{let H=U.operation.resourceId?y.store.getResource(U.operation.resourceId):void 0,Q=U.operation.environmentId?y.store.listEnvironments(y.project.id).find((Se)=>Se.id===U.operation.environmentId):void 0,J=U.operation.actorId?y.store.getActor(U.operation.actorId):void 0,ee=U.operation.input;return{...U,target:H?{id:H.id,name:H.name,slug:H.slug,kind:H.kind}:Q?{id:Q.id,name:Q.name,slug:Q.slug,kind:"environment"}:{id:y.project.id,name:y.project.name,slug:y.project.slug,kind:"project"},actor:J?{id:J.id,name:J.displayName,kind:J.kind}:void 0,commit:ee.revision??ee.source?.commitSha??null}});return x({operations:F,concurrency:Vt.limits})}if(q.pathname==="/api/queue/logs"&&N.method==="GET"){let A=String(q.searchParams.get("id")??"");if(!ws(me,A,"deployments:read"))return x({ok:!1,error:"Operation was not found in this scope."},404);let P=Vt.logs(A,{after:Number(q.searchParams.get("after"))||0,limit:Number(q.searchParams.get("limit"))||500});return x({entries:P,cursor:P.at(-1)?.sequence??(Number(q.searchParams.get("after"))||0),operation:y.store.getOperation(A)})}if(q.pathname==="/api/queue/stream"&&N.method==="GET"){let A=String(q.searchParams.get("id")??"");if(!ws(me,A,"deployments:read"))return x({ok:!1,error:"Operation was not found in this scope."},404);let P=N.headers.get("last-event-id")?.trim(),F=Number(P||q.searchParams.get("after")||0),U=new TextEncoder,H,Q=!1,J=new ReadableStream({start(ee){let Se=()=>{if(Q)return;let ve=lr.resolveUser(N);if(!ve||!ws(ve,A,"deployments:read")){if(Q=!0,H)clearInterval(H);ee.close();return}let nt=Vt.logs(A,{after:F,limit:500});for(let He of nt)F=He.sequence,ee.enqueue(U.encode(`id: ${He.sequence}
|
|
686
686
|
event: log
|
|
687
687
|
data: ${JSON.stringify(He)}
|
|
688
688
|
|
|
@@ -693,8 +693,8 @@ data: ${JSON.stringify({state:Pe.state,cursor:F})}
|
|
|
693
693
|
|
|
694
694
|
This link expires ${H.invitation.expiresAt} and can be used once.`});return x({invitation:H.invitation,token:H.token,acceptUrl:Q,delivered:J},201)}catch(H){return x({ok:!1,error:H instanceof Error?H.message:"Invitation could not be created."},422)}}if(q.pathname==="/api/organization/invitations"&&N.method==="DELETE"){let A=await re(N),P=We(me);try{return x({invitation:y.store.revokeInvitation(String(A.id??""),P.actor?.id)})}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Invitation could not be revoked."},409)}}if(q.pathname==="/api/organization/invitations/resend"&&N.method==="POST"){let A=await re(N),P=We(me);try{let F=y.store.reissueInvitation(String(A.id??""),P.actor?.id),U=`${q.origin}/accept-invitation?token=${encodeURIComponent(F.token)}`,H=await Xr(m,{to:F.invitation.email,subject:"Your ts-cloud organization invitation",text:`Accept your ts-cloud invitation: ${U}
|
|
695
695
|
|
|
696
|
-
This replacement link expires ${F.invitation.expiresAt} and can be used once.`});return x({invitation:F.invitation,token:F.token,acceptUrl:U,delivered:H})}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Invitation could not be resent."},409)}}if(q.pathname==="/api/organization/memberships"&&N.method==="PATCH"){let A=await re(N),P=y.store.getMembership(String(A.id??"")),F=qu(A.roleTemplate),U=Ic(A);if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Membership was not found."},404);if(!F||!U)return x({ok:!1,error:"Choose a valid role template and resource scope."},422);let H=We(me);if((P.roleTemplate==="owner"||F==="owner")&&(!Qn(String(A.password??""),me.passwordHash)||H.membership?.roleTemplate!=="owner"))return x({ok:!1,error:"Ownership changes require an owner to re-enter their password."},401);let J=y.store.resolveAuthorizationTarget(y.organization.id,U)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),ee=y.store.listGrants(P.id),Se=Mt({membership:P,grants:ee,target:J}),ve={...P,roleTemplate:F,scope:U},nt=Mt({membership:ve,grants:ee,target:J}),Pe={gained:nt.filter((He)=>!Se.includes(He)),lost:Se.filter((He)=>!nt.includes(He))};if(A.preview===!0)return x({membership:P,proposed:{roleTemplate:F,scope:U},accessDiff:Pe});if(String(A.confirm??"")!==P.id)return x({ok:!1,error:`Confirm this change with membership ID ${P.id}.`,accessDiff:Pe},409);try{return x({membership:y.store.updateMembership({id:P.id,roleTemplate:F,scope:U,actorId:H.actor?.id}),accessDiff:Pe})}catch(He){return x({ok:!1,error:He instanceof Error?He.message:"Membership could not be updated."},409)}}if(q.pathname==="/api/organization/memberships"&&N.method==="DELETE"){let A=await re(N),P=y.store.getMembership(String(A.id??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Membership was not found."},404);if(String(A.confirm??"")!==P.id)return x({ok:!1,error:`Confirm removal with membership ID ${P.id}.`},409);let F=We(me);if(P.roleTemplate==="owner"&&(F.membership?.roleTemplate!=="owner"||!Qn(String(A.password??""),me.passwordHash)))return x({ok:!1,error:"Removing an owner requires an owner to re-enter their current password."},401);try{return x({membership:y.store.revokeMembership(P.id,F.actor?.id)})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Membership could not be removed."},409)}}if(q.pathname==="/api/organization/grants"&&N.method==="POST"){let A=await re(N),P=String(A.capability??""),F=A.effect==="deny"?"deny":A.effect==="allow"?"allow":void 0,U=Ic(A),H=We(me);if(!F||!U||!pe.includes(P))return x({ok:!1,error:"Choose a valid capability, effect, and resource scope."},422);try{return x({grant:y.store.upsertGrant({organizationId:y.organization.id,membershipId:String(A.membershipId??""),effect:F,capability:P,scope:U,actorId:H.actor?.id})},201)}catch(Q){return x({ok:!1,error:Q instanceof Error?Q.message:"Grant could not be created."},422)}}if(q.pathname==="/api/organization/grants"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=y.store.getGrant(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Grant was not found."},404);return x({ok:y.store.removeGrant(F.id,P.actor?.id)})}if(q.pathname==="/api/tags"&&N.method==="GET")return x({tags:y.store.listTags(y.project.id),assignments:y.store.listResourceTags(y.project.id)});if(q.pathname==="/api/tags"&&N.method==="POST"){let A=await re(N),P=y.store.upsertTag(y.project.id,String(A.name??""),String(A.color??"#5a8be0"));if(A.resourceId)y.store.assignTag(String(A.resourceId),P.id);return x({tag:P},201)}if(q.pathname==="/api/tags"&&N.method==="DELETE"){let A=await re(N);return y.store.removeTag(String(A.resourceId??""),String(A.tagId??"")),x({ok:!0})}if(q.pathname==="/"&&!nw(q.pathname,$n))return new Response(null,{status:302,headers:{location:`/server/sites?env=${encodeURIComponent(Ce)}`}});if(q.pathname==="/"&&sr?.mode==="serverless")return new Response(null,{status:302,headers:{location:`/serverless?env=${encodeURIComponent(Ce)}`}});let xc=cu(q.pathname);if(xc)return new Response(null,{status:308,headers:{location:`${xc}?env=${encodeURIComponent(Ce)}`}});if(q.pathname==="/api/env"&&N.method==="POST"){let A=await re(N),P=String(A.env??"");if(!C.includes(P))return x({ok:!1,error:`Unknown environment '${P}'.`,environments:C},404);return x({ok:!0,environment:P,environments:C,href:`?env=${encodeURIComponent(P)}`})}if(q.pathname==="/api/config"){let A={...ns(m),environment:Ce,environments:C};return x(yS(A,$n))}if(q.pathname==="/api/ssh-keys"&&N.method==="GET")return x({configPath:j,keys:yo(Ka(m))});if(q.pathname==="/api/ssh-keys"&&N.method==="POST"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=await ii(j,"utf8"),F=Ka(m),U=wb({configText:P,name:String(A.name??""),publicKey:String(A.publicKey??""),existingKeys:F});return await ys(j,U),XS(m,[...F,{name:String(A.name??"").trim(),publicKey:String(A.publicKey??"").trim().replace(/\s+/g," ")}]),x({ok:!0,configPath:j,keys:yo(Ka(m))})}if(q.pathname==="/api/ssh-keys"&&N.method==="DELETE"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??q.searchParams.get("name")??""),F=await ii(j,"utf8"),U=Ka(m),H=kb({configText:F,name:P,existingKeys:U});return await ys(j,H),XS(m,U.filter((Q)=>Q.name!==P.trim())),x({ok:!0,configPath:j,keys:yo(Ka(m))})}if(q.pathname==="/api/firewall"&&N.method==="GET")return x({configPath:j,alwaysOpen:[22,80,443],ports:Sm(m)});if(q.pathname==="/api/firewall"&&N.method==="POST"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=Number(A.port);if(!wc(P))return x({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let F=Sm(m),U=await ii(j,"utf8");try{await ys(j,RS(U,P,F))}catch(J){return x({ok:!1,error:J?.message??String(J)},422)}let H=hs([...F,P]);ew(m,H);let Q=A.apply===!1?null:await bc(m,Ce,`ufw allow ${P}/tcp`).catch((J)=>({ok:!1,error:String(J?.message??J)}));return x({ok:!0,configPath:j,ports:H,apply:Q})}if(q.pathname==="/api/firewall"&&N.method==="DELETE"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=Number(A.port??q.searchParams.get("port"));if(!wc(P))return x({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let F=Sm(m),U=await ii(j,"utf8");await ys(j,AS(U,P,F));let H=hs(F.filter((J)=>J!==P));ew(m,H);let Q=A.apply===!1?null:await bc(m,Ce,`ufw delete allow ${P}/tcp`).catch((J)=>({ok:!1,error:String(J?.message??J)}));return x({ok:!0,configPath:j,ports:H,apply:Q})}if(q.pathname==="/api/sites"&&N.method==="POST"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??"").trim(),F=String(A.root??"").trim();if(!P||!F)return x({ok:!1,error:"Site name and root are required."},422);let U={deploy:A.deploy==="bucket"?"bucket":"server",root:F,path:String(A.path??"").trim()||void 0,domain:String(A.domain??"").trim()||void 0,build:String(A.build??"").trim()||void 0,start:String(A.start??"").trim()||void 0,port:A.port?Number(A.port):void 0,type:String(A.type??"").trim()||void 0};if(U.port!==void 0&&(!Number.isInteger(U.port)||U.port<1||U.port>65535))return x({ok:!1,error:"Port must be a number between 1 and 65535."},422);let H=await ii(j,"utf8"),Q=cn({configText:H,name:P,root:U.root,domain:U.domain,path:U.path,deploy:U.deploy,build:U.build,start:U.start,port:U.port,type:U.type});return await ys(j,Q),X_(m,P,Object.fromEntries(Object.entries(U).filter(([,J])=>J!==void 0))),sr=await vs(m,Ce),V.set(Ce,sr),x({ok:!0,configPath:j,site:P,data:sr})}if(q.pathname==="/api/sites"&&N.method==="DELETE"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??q.searchParams.get("name")??"").trim();if(!P||!m.sites?.[P])return x({ok:!1,error:`Site '${P}' was not found.`},404);let F=await ii(j,"utf8");return await ys(j,dn({configText:F,name:P})),delete m.sites[P],sr=await vs(m,Ce),V.set(Ce,sr),x({ok:!0,configPath:j,site:P,data:sr})}if(q.pathname==="/api/sites"&&N.method==="PATCH"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??"").trim(),F=m.sites?.[P];if(!P||!F)return x({ok:!1,error:`Site '${P}' was not found.`},404);if($n.role==="member"){let Q=wS(A);if(!Q.ok)return x({ok:!1,error:Q.error},403);let J=kS({siteName:P,body:A,sites:m.sites??{},ownSites:Object.keys($n.sites)});if(!J.ok)return x({ok:!1,error:J.error},409)}if(A.port!==void 0&&A.port!==null&&A.port!==""&&(!Number.isInteger(Number(A.port))||Number(A.port)<1||Number(A.port)>65535))return x({ok:!1,error:"Port must be a number between 1 and 65535."},422);if(typeof A.domain==="string"&&A.domain.trim()&&!Ca(A.domain.trim()))return x({ok:!1,error:`Domain '${A.domain.trim()}' is not a valid hostname.`},422);let U=await ii(j,"utf8"),H=(Q,J)=>{U=Yi({configText:U,siteName:P,key:Q,valueText:J})};if(A.ssl!==void 0)H("ssl",eu(A.ssl)),F.ssl=A.ssl;if(A.env!==void 0&&A.env&&typeof A.env==="object")H("env",ru(A.env)),F.env=A.env;if(A.aliases!==void 0&&Array.isArray(A.aliases)){let Q=A.aliases.map((J)=>String(J));H("aliases",nu(Q)),F.aliases=Q.map((J)=>J.trim().toLowerCase()).filter(Boolean)}if(A.redirects!==void 0&&A.redirects&&typeof A.redirects==="object")H("redirects",iu(A.redirects)),F.redirects=A.redirects;for(let Q of["domain","path","build","start","type","root","php"])if(typeof A[Q]==="string"&&A[Q].trim())H(Q,tu(String(A[Q]).trim())),F[Q]=String(A[Q]).trim();if(A.port!==void 0&&A.port!==null&&A.port!=="")H("port",String(Number(A.port))),F.port=Number(A.port);return await ys(j,U),sr=await vs(m,Ce),V.set(Ce,sr),x({ok:!0,configPath:j,site:P,data:sr})}if(q.pathname==="/api/sites/deploy"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim();if(!P||!m.sites?.[P])return x({ok:!1,error:`Site '${P}' was not found.`},404);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to deploy this site.`},409);let F=ne(y,String(Ce));await new St(ut).run(new rn,{...F,artifactRoot:t}),ji(ut,F,sr??{});let U=zi(ut,{scope:F,desiredConfigHash:y.project.desiredConfigHash});if(U.decision.outcome==="block")return x({ok:!1,error:`Deployment blocked by security policy: ${U.decision.explanation}`,securityReview:U},409);let H={id:`deploy:${P}`,label:`Deploy ${P}`,description:`Deploy the ${P} site for ${Ce}.`,command:["deploy","--env",Ce,"--site",P,"--yes"],mutates:!0},Q=await _e({controlPlane:y,environment:Ce,actor:me,kind:"dashboard.site.deploy",resourceSlug:P,input:{site:P},execute:()=>wm(H,{cwd:t,cliEntry:l})});return x({...Q.result,controlPlaneOperation:Q.operation,securityReview:U})}if(q.pathname==="/api/actions")return x(mn(Ce));if(q.pathname==="/api/server/operations")return x(ju(m,sr));if(q.pathname==="/api/runtime/workloads"&&N.method==="GET"){let A=await ie(m,Ce);return x(A)}if(q.pathname==="/api/runtime/logs"&&N.method==="GET"){let A=String(q.searchParams.get("workload")??"");if(!A)return x({ok:!1,error:"A workload query parameter is required."},422);let P=Math.min(1000,Math.max(1,Number(q.searchParams.get("limit"))||200));try{return x(await new fe(m,Ce).logs(A,{limit:P}))}catch(F){return x({ok:!1,error:String(F?.message??F)},404)}}if(q.pathname==="/api/runtime/log-sessions"&&N.method==="POST"){let A=await re(N),P=String(A.workloadId??"");if(!P)return x({ok:!1,error:"A workloadId is required."},422);let F=await ie(m,Ce),U=F.workloads.find((J)=>J.id===P);if(!U)return x({ok:!1,error:"Workload was not found in the current project and environment."},404);if(!U.capabilities.logs.supported)return x({ok:!1,error:U.capabilities.logs.reason??"Logs are unsupported for this workload."},409);let H=new fe(m,Ce,{inventory:async()=>F}),Q=Sr.create("logs",P);return(async()=>{let J=new Date(Date.now()-Math.min(3600000,Math.max(1000,Number(A.sinceMs)||60000)));try{for(let ee=0;ee<200&&!Sr.signal(Q.id)?.aborted;ee++){let Se=await H.logs(P,{limit:Math.min(500,Math.max(1,Number(A.limit)||200)),since:J});for(let ve of Se.lines)if(Sr.append(Q.id,`${ve.timestamp?`${ve.timestamp} `:""}${ve.message}
|
|
697
|
-
`),ve.timestamp)J=new Date(Math.max(J.getTime(),new Date(ve.timestamp).getTime()+1));await Bun.sleep(3000)}if(!Sr.signal(Q.id)?.aborted)Sr.close(Q.id,"complete")}catch(ee){Sr.append(Q.id,ee instanceof Error?ee.message:String(ee),"stderr"),Sr.close(Q.id,"failed",ee instanceof Error?ee.message:String(ee))}})(),x({ok:!0,session:Q,streamUrl:`/api/runtime/log-stream?id=${encodeURIComponent(Q.id)}&workload=${encodeURIComponent(P)}`},201)}if((q.pathname==="/api/runtime/log-stream"||q.pathname==="/api/runtime/exec-stream")&&N.method==="GET"){let A=String(q.searchParams.get("id")??""),P=String(q.searchParams.get("workload")??""),F=Number(N.headers.get("last-event-id")??q.searchParams.get("after")??0)||0,U=Sr.read(A,P,F),H=q.pathname.includes("exec")?"exec":"logs";if(!U||U.kind!==H)return x({ok:!1,error:"Runtime stream was not found in this workload scope."},404);return
|
|
696
|
+
This replacement link expires ${F.invitation.expiresAt} and can be used once.`});return x({invitation:F.invitation,token:F.token,acceptUrl:U,delivered:H})}catch(F){return x({ok:!1,error:F instanceof Error?F.message:"Invitation could not be resent."},409)}}if(q.pathname==="/api/organization/memberships"&&N.method==="PATCH"){let A=await re(N),P=y.store.getMembership(String(A.id??"")),F=qu(A.roleTemplate),U=Ic(A);if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Membership was not found."},404);if(!F||!U)return x({ok:!1,error:"Choose a valid role template and resource scope."},422);let H=We(me);if((P.roleTemplate==="owner"||F==="owner")&&(!Qn(String(A.password??""),me.passwordHash)||H.membership?.roleTemplate!=="owner"))return x({ok:!1,error:"Ownership changes require an owner to re-enter their password."},401);let J=y.store.resolveAuthorizationTarget(y.organization.id,U)??y.store.resolveAuthorizationTarget(y.organization.id,{type:"project",id:y.project.id}),ee=y.store.listGrants(P.id),Se=Mt({membership:P,grants:ee,target:J}),ve={...P,roleTemplate:F,scope:U},nt=Mt({membership:ve,grants:ee,target:J}),Pe={gained:nt.filter((He)=>!Se.includes(He)),lost:Se.filter((He)=>!nt.includes(He))};if(A.preview===!0)return x({membership:P,proposed:{roleTemplate:F,scope:U},accessDiff:Pe});if(String(A.confirm??"")!==P.id)return x({ok:!1,error:`Confirm this change with membership ID ${P.id}.`,accessDiff:Pe},409);try{return x({membership:y.store.updateMembership({id:P.id,roleTemplate:F,scope:U,actorId:H.actor?.id}),accessDiff:Pe})}catch(He){return x({ok:!1,error:He instanceof Error?He.message:"Membership could not be updated."},409)}}if(q.pathname==="/api/organization/memberships"&&N.method==="DELETE"){let A=await re(N),P=y.store.getMembership(String(A.id??""));if(!P||P.organizationId!==y.organization.id)return x({ok:!1,error:"Membership was not found."},404);if(String(A.confirm??"")!==P.id)return x({ok:!1,error:`Confirm removal with membership ID ${P.id}.`},409);let F=We(me);if(P.roleTemplate==="owner"&&(F.membership?.roleTemplate!=="owner"||!Qn(String(A.password??""),me.passwordHash)))return x({ok:!1,error:"Removing an owner requires an owner to re-enter their current password."},401);try{return x({membership:y.store.revokeMembership(P.id,F.actor?.id)})}catch(U){return x({ok:!1,error:U instanceof Error?U.message:"Membership could not be removed."},409)}}if(q.pathname==="/api/organization/grants"&&N.method==="POST"){let A=await re(N),P=String(A.capability??""),F=A.effect==="deny"?"deny":A.effect==="allow"?"allow":void 0,U=Ic(A),H=We(me);if(!F||!U||!pe.includes(P))return x({ok:!1,error:"Choose a valid capability, effect, and resource scope."},422);try{return x({grant:y.store.upsertGrant({organizationId:y.organization.id,membershipId:String(A.membershipId??""),effect:F,capability:P,scope:U,actorId:H.actor?.id})},201)}catch(Q){return x({ok:!1,error:Q instanceof Error?Q.message:"Grant could not be created."},422)}}if(q.pathname==="/api/organization/grants"&&N.method==="DELETE"){let A=await re(N),P=We(me),F=y.store.getGrant(String(A.id??""));if(!F||F.organizationId!==y.organization.id)return x({ok:!1,error:"Grant was not found."},404);return x({ok:y.store.removeGrant(F.id,P.actor?.id)})}if(q.pathname==="/api/tags"&&N.method==="GET")return x({tags:y.store.listTags(y.project.id),assignments:y.store.listResourceTags(y.project.id)});if(q.pathname==="/api/tags"&&N.method==="POST"){let A=await re(N),P=y.store.upsertTag(y.project.id,String(A.name??""),String(A.color??"#5a8be0"));if(A.resourceId)y.store.assignTag(String(A.resourceId),P.id);return x({tag:P},201)}if(q.pathname==="/api/tags"&&N.method==="DELETE"){let A=await re(N);return y.store.removeTag(String(A.resourceId??""),String(A.tagId??"")),x({ok:!0})}if(q.pathname==="/"&&!nw(q.pathname,$n))return new Response(null,{status:302,headers:{location:`/server/sites?env=${encodeURIComponent(Ce)}`}});if(q.pathname==="/"&&sr?.mode==="serverless")return new Response(null,{status:302,headers:{location:`/serverless?env=${encodeURIComponent(Ce)}`}});let xc=cu(q.pathname);if(xc)return new Response(null,{status:308,headers:{location:`${xc}?env=${encodeURIComponent(Ce)}`}});if(q.pathname==="/api/env"&&N.method==="POST"){let A=await re(N),P=String(A.env??"");if(!C.includes(P))return x({ok:!1,error:`Unknown environment '${P}'.`,environments:C},404);return x({ok:!0,environment:P,environments:C,href:`?env=${encodeURIComponent(P)}`})}if(q.pathname==="/api/config"){let A={...ns(m),environment:Ce,environments:C};return x(yS(A,$n))}if(q.pathname==="/api/ssh-keys"&&N.method==="GET")return x({configPath:j,keys:yo(Ka(m))});if(q.pathname==="/api/ssh-keys"&&N.method==="POST"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=await ii(j,"utf8"),F=Ka(m),U=wb({configText:P,name:String(A.name??""),publicKey:String(A.publicKey??""),existingKeys:F});return await ys(j,U),XS(m,[...F,{name:String(A.name??"").trim(),publicKey:String(A.publicKey??"").trim().replace(/\s+/g," ")}]),x({ok:!0,configPath:j,keys:yo(Ka(m))})}if(q.pathname==="/api/ssh-keys"&&N.method==="DELETE"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??q.searchParams.get("name")??""),F=await ii(j,"utf8"),U=Ka(m),H=kb({configText:F,name:P,existingKeys:U});return await ys(j,H),XS(m,U.filter((Q)=>Q.name!==P.trim())),x({ok:!0,configPath:j,keys:yo(Ka(m))})}if(q.pathname==="/api/firewall"&&N.method==="GET")return x({configPath:j,alwaysOpen:[22,80,443],ports:Sm(m)});if(q.pathname==="/api/firewall"&&N.method==="POST"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=Number(A.port);if(!wc(P))return x({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let F=Sm(m),U=await ii(j,"utf8");try{await ys(j,RS(U,P,F))}catch(J){return x({ok:!1,error:J?.message??String(J)},422)}let H=hs([...F,P]);ew(m,H);let Q=A.apply===!1?null:await bc(m,Ce,`ufw allow ${P}/tcp`).catch((J)=>({ok:!1,error:String(J?.message??J)}));return x({ok:!0,configPath:j,ports:H,apply:Q})}if(q.pathname==="/api/firewall"&&N.method==="DELETE"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=Number(A.port??q.searchParams.get("port"));if(!wc(P))return x({ok:!1,error:"Port must be an integer between 1 and 65535."},422);let F=Sm(m),U=await ii(j,"utf8");await ys(j,AS(U,P,F));let H=hs(F.filter((J)=>J!==P));ew(m,H);let Q=A.apply===!1?null:await bc(m,Ce,`ufw delete allow ${P}/tcp`).catch((J)=>({ok:!1,error:String(J?.message??J)}));return x({ok:!0,configPath:j,ports:H,apply:Q})}if(q.pathname==="/api/sites"&&N.method==="POST"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??"").trim(),F=String(A.root??"").trim();if(!P||!F)return x({ok:!1,error:"Site name and root are required."},422);let U={deploy:A.deploy==="bucket"?"bucket":"server",root:F,path:String(A.path??"").trim()||void 0,domain:String(A.domain??"").trim()||void 0,build:String(A.build??"").trim()||void 0,start:String(A.start??"").trim()||void 0,port:A.port?Number(A.port):void 0,type:String(A.type??"").trim()||void 0};if(U.port!==void 0&&(!Number.isInteger(U.port)||U.port<1||U.port>65535))return x({ok:!1,error:"Port must be a number between 1 and 65535."},422);let H=await ii(j,"utf8"),Q=cn({configText:H,name:P,root:U.root,domain:U.domain,path:U.path,deploy:U.deploy,build:U.build,start:U.start,port:U.port,type:U.type});return await ys(j,Q),eT(m,P,Object.fromEntries(Object.entries(U).filter(([,J])=>J!==void 0))),sr=await vs(m,Ce),V.set(Ce,sr),x({ok:!0,configPath:j,site:P,data:sr})}if(q.pathname==="/api/sites"&&N.method==="DELETE"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??q.searchParams.get("name")??"").trim();if(!P||!m.sites?.[P])return x({ok:!1,error:`Site '${P}' was not found.`},404);let F=await ii(j,"utf8");return await ys(j,dn({configText:F,name:P})),delete m.sites[P],sr=await vs(m,Ce),V.set(Ce,sr),x({ok:!0,configPath:j,site:P,data:sr})}if(q.pathname==="/api/sites"&&N.method==="PATCH"){if(!j)return x({ok:!1,error:"No cloud config file was found in this checkout."},404);let A=await re(N),P=String(A.name??"").trim(),F=m.sites?.[P];if(!P||!F)return x({ok:!1,error:`Site '${P}' was not found.`},404);if($n.role==="member"){let Q=wS(A);if(!Q.ok)return x({ok:!1,error:Q.error},403);let J=kS({siteName:P,body:A,sites:m.sites??{},ownSites:Object.keys($n.sites)});if(!J.ok)return x({ok:!1,error:J.error},409)}if(A.port!==void 0&&A.port!==null&&A.port!==""&&(!Number.isInteger(Number(A.port))||Number(A.port)<1||Number(A.port)>65535))return x({ok:!1,error:"Port must be a number between 1 and 65535."},422);if(typeof A.domain==="string"&&A.domain.trim()&&!Ca(A.domain.trim()))return x({ok:!1,error:`Domain '${A.domain.trim()}' is not a valid hostname.`},422);let U=await ii(j,"utf8"),H=(Q,J)=>{U=Yi({configText:U,siteName:P,key:Q,valueText:J})};if(A.ssl!==void 0)H("ssl",eu(A.ssl)),F.ssl=A.ssl;if(A.env!==void 0&&A.env&&typeof A.env==="object")H("env",ru(A.env)),F.env=A.env;if(A.aliases!==void 0&&Array.isArray(A.aliases)){let Q=A.aliases.map((J)=>String(J));H("aliases",nu(Q)),F.aliases=Q.map((J)=>J.trim().toLowerCase()).filter(Boolean)}if(A.redirects!==void 0&&A.redirects&&typeof A.redirects==="object")H("redirects",iu(A.redirects)),F.redirects=A.redirects;for(let Q of["domain","path","build","start","type","root","php"])if(typeof A[Q]==="string"&&A[Q].trim())H(Q,tu(String(A[Q]).trim())),F[Q]=String(A[Q]).trim();if(A.port!==void 0&&A.port!==null&&A.port!=="")H("port",String(Number(A.port))),F.port=Number(A.port);return await ys(j,U),sr=await vs(m,Ce),V.set(Ce,sr),x({ok:!0,configPath:j,site:P,data:sr})}if(q.pathname==="/api/sites/deploy"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim();if(!P||!m.sites?.[P])return x({ok:!1,error:`Site '${P}' was not found.`},404);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to deploy this site.`},409);let F=ne(y,String(Ce));await new St(ut).run(new rn,{...F,artifactRoot:t}),ji(ut,F,sr??{});let U=zi(ut,{scope:F,desiredConfigHash:y.project.desiredConfigHash});if(U.decision.outcome==="block")return x({ok:!1,error:`Deployment blocked by security policy: ${U.decision.explanation}`,securityReview:U},409);let H={id:`deploy:${P}`,label:`Deploy ${P}`,description:`Deploy the ${P} site for ${Ce}.`,command:["deploy","--env",Ce,"--site",P,"--yes"],mutates:!0},Q=await _e({controlPlane:y,environment:Ce,actor:me,kind:"dashboard.site.deploy",resourceSlug:P,input:{site:P},execute:()=>wm(H,{cwd:t,cliEntry:l})});return x({...Q.result,controlPlaneOperation:Q.operation,securityReview:U})}if(q.pathname==="/api/actions")return x(mn(Ce));if(q.pathname==="/api/server/operations")return x(ju(m,sr));if(q.pathname==="/api/runtime/workloads"&&N.method==="GET"){let A=await ie(m,Ce);return x(A)}if(q.pathname==="/api/runtime/logs"&&N.method==="GET"){let A=String(q.searchParams.get("workload")??"");if(!A)return x({ok:!1,error:"A workload query parameter is required."},422);let P=Math.min(1000,Math.max(1,Number(q.searchParams.get("limit"))||200));try{return x(await new fe(m,Ce).logs(A,{limit:P}))}catch(F){return x({ok:!1,error:String(F?.message??F)},404)}}if(q.pathname==="/api/runtime/log-sessions"&&N.method==="POST"){let A=await re(N),P=String(A.workloadId??"");if(!P)return x({ok:!1,error:"A workloadId is required."},422);let F=await ie(m,Ce),U=F.workloads.find((J)=>J.id===P);if(!U)return x({ok:!1,error:"Workload was not found in the current project and environment."},404);if(!U.capabilities.logs.supported)return x({ok:!1,error:U.capabilities.logs.reason??"Logs are unsupported for this workload."},409);let H=new fe(m,Ce,{inventory:async()=>F}),Q=Sr.create("logs",P);return(async()=>{let J=new Date(Date.now()-Math.min(3600000,Math.max(1000,Number(A.sinceMs)||60000)));try{for(let ee=0;ee<200&&!Sr.signal(Q.id)?.aborted;ee++){let Se=await H.logs(P,{limit:Math.min(500,Math.max(1,Number(A.limit)||200)),since:J});for(let ve of Se.lines)if(Sr.append(Q.id,`${ve.timestamp?`${ve.timestamp} `:""}${ve.message}
|
|
697
|
+
`),ve.timestamp)J=new Date(Math.max(J.getTime(),new Date(ve.timestamp).getTime()+1));await Bun.sleep(3000)}if(!Sr.signal(Q.id)?.aborted)Sr.close(Q.id,"complete")}catch(ee){Sr.append(Q.id,ee instanceof Error?ee.message:String(ee),"stderr"),Sr.close(Q.id,"failed",ee instanceof Error?ee.message:String(ee))}})(),x({ok:!0,session:Q,streamUrl:`/api/runtime/log-stream?id=${encodeURIComponent(Q.id)}&workload=${encodeURIComponent(P)}`},201)}if((q.pathname==="/api/runtime/log-stream"||q.pathname==="/api/runtime/exec-stream")&&N.method==="GET"){let A=String(q.searchParams.get("id")??""),P=String(q.searchParams.get("workload")??""),F=Number(N.headers.get("last-event-id")??q.searchParams.get("after")??0)||0,U=Sr.read(A,P,F),H=q.pathname.includes("exec")?"exec":"logs";if(!U||U.kind!==H)return x({ok:!1,error:"Runtime stream was not found in this workload scope."},404);return W_(Sr,U,F,N.signal)}if((q.pathname==="/api/runtime/log-sessions"||q.pathname==="/api/runtime/exec-sessions")&&N.method==="DELETE"){let A=await re(N),P=Sr.cancel(String(A.id??""),String(A.workloadId??""));if(!P)return x({ok:!1,error:"Runtime stream was not found in this workload scope."},404);return x({ok:!0,session:P})}if(q.pathname==="/api/runtime/exec-sessions"&&N.method==="POST"){let A=await re(N),P=String(A.workloadId??""),F=await ie(m,Ce),U=F.workloads.find((ee)=>ee.id===P);if(!U)return x({ok:!1,error:"Workload was not found in the current project and environment."},404);let H=lr.resolveSession(N),Q=new fe(m,Ce,{inventory:async()=>F}),J=Sr.create("exec",P);return _e({controlPlane:y,environment:Ce,actor:me,kind:"runtime.exec",resourceSlug:U.links.service,input:{workloadId:P,provider:U.provider,preset:A.preset?String(A.preset):null,freeForm:!!String(A.command??"").trim()},execute:()=>Q.exec({workloadId:P,preset:["process","sockets","filesystem"].includes(String(A.preset))?String(A.preset):void 0,command:typeof A.command==="string"?A.command:void 0,confirm:String(A.confirm??""),recentAuth:!xe||!!H&&Ne.isRecentlyAuthenticated(H)})}).then(({result:ee,operation:Se})=>{if(Sr.append(J.id,`operation ${Se.id}
|
|
698
698
|
`,"system"),ee.stdout)Sr.append(J.id,ee.stdout,"stdout");if(ee.stderr)Sr.append(J.id,ee.stderr,"stderr");Sr.close(J.id,ee.ok?"complete":"failed",ee.error)}).catch((ee)=>{let Se=ee instanceof Error?ee.message:String(ee);Sr.append(J.id,Se,"stderr"),Sr.close(J.id,"failed",Se)}),x({ok:!0,session:J,streamUrl:`/api/runtime/exec-stream?id=${encodeURIComponent(J.id)}&workload=${encodeURIComponent(P)}`},202)}if(q.pathname==="/api/runtime/files/read"&&N.method==="POST"){let A=await re(N),P=await ie(m,Ce),F=lr.resolveSession(N),U=await new fe(m,Ce,{inventory:async()=>P}).readFile({workloadId:String(A.workloadId??""),path:String(A.path??""),confirm:String(A.confirm??""),recentAuth:!xe||!!F&&Ne.isRecentlyAuthenticated(F)});return x(U,U.ok?200:409)}if(q.pathname==="/api/runtime/files/write"&&N.method==="POST"){let A=await re(N),P=await ie(m,Ce),F=String(A.workloadId??""),U=P.workloads.find((ee)=>ee.id===F);if(!U)return x({ok:!1,error:"Workload was not found in the current project and environment."},404);let H=lr.resolveSession(N),Q=new fe(m,Ce,{inventory:async()=>P}),J=await _e({controlPlane:y,environment:Ce,actor:me,kind:"runtime.file.write",resourceSlug:U.links.service,input:{workloadId:F,provider:U.provider,path:String(A.path??""),bytes:Buffer.from(String(A.contentBase64??""),"base64").byteLength},execute:()=>Q.writeFile({workloadId:F,path:String(A.path??""),contentBase64:String(A.contentBase64??""),confirm:String(A.confirm??""),recentAuth:!xe||!!H&&Ne.isRecentlyAuthenticated(H)})});return x({...J.result,controlPlaneOperation:J.operation},J.result.ok?200:409)}if(q.pathname==="/api/runtime/operations"&&N.method==="POST"){let A=await re(N),P=String(A.workloadId??""),F=String(A.action??"");if(!P||!["start","stop","restart","redeploy","scale","inspect"].includes(F))return x({ok:!1,error:"A valid workloadId and lifecycle action are required."},422);let U=await ie(m,Ce),H=U.workloads.find((Se)=>Se.id===P);if(!H)return x({ok:!1,error:"Workload was not found in the current project and environment."},404);let Q=lr.resolveSession(N),J=new fe(m,Ce,{inventory:async()=>U}),ee=await _e({controlPlane:y,environment:Ce,actor:me,kind:`runtime.${F}`,resourceSlug:H.links.service,input:{workloadId:P,provider:H.provider,action:F,replicas:A.replicas==null?null:Number(A.replicas)},execute:()=>J.run({workloadId:P,action:F,replicas:A.replicas==null?void 0:Number(A.replicas),confirm:String(A.confirm??""),recentAuth:!xe||!!Q&&Ne.isRecentlyAuthenticated(Q)})});return x({...ee.result,controlPlaneOperation:ee.operation},ee.result.ok?200:409)}if(q.pathname.startsWith("/api/protection")){let A=me.role==="admin"||Tc(me,"security:read"),P=me.role==="admin"||Tc(me,"security:manage");if(!A)return x({ok:!1,error:"Protection controls require security:read."},403);let{ProtectionControlStore:F,describePosture:U}=await import("./protection/index.js"),H=new F(y.store),Q=()=>{if(!P)throw Error("Changing protection controls requires security:manage.")};if(q.pathname==="/api/protection"&&N.method==="GET"){let J=H.current();return x({ok:!0,posture:U(J),controls:J,raw:H.raw()})}if(q.pathname==="/api/protection/attack-mode"&&N.method==="POST"){Q();let J=await re(N);if(J.enabled===!1)return x({ok:!0,disabled:H.disableAttackMode()});return x({ok:!0,control:H.enableAttackMode({hours:J.hours==null?void 0:Number(J.hours),reason:String(J.reason??"Enabled from the dashboard."),actorId:We(me).actor?.id})})}if(q.pathname==="/api/protection/pause"&&N.method==="POST"){Q();let J=await re(N);if(J.enabled===!1)return x({ok:!0,resumed:H.resumeMitigations()});return x({ok:!0,control:H.pauseMitigations({hours:J.hours==null?void 0:Number(J.hours),reason:String(J.reason??""),actorId:We(me).actor?.id})})}if(q.pathname==="/api/protection/ip-rules"&&N.method==="GET")return x({ok:!0,ipRules:H.current().ipRules});if(q.pathname==="/api/protection/ip-rules"&&(N.method==="POST"||N.method==="DELETE")){Q();let J=await re(N),ee=J.list==="allow"?"allow":"block",Se=N.method==="POST"?H.addIpRule(ee,String(J.cidr??"")):H.removeIpRule(ee,String(J.cidr??""));return x({ok:!0,ipRules:Se})}return x({ok:!1,error:"Protection endpoint was not found."},404)}if(q.pathname.startsWith("/api/spend/")||q.pathname==="/api/usage"){let A=await gw(),{store:P,service:F,gate:U}=A,H=me.role==="admin"||Tc(me,"billing:read"),Q=me.role==="admin"||Tc(me,"billing:manage");if(!H)return x({ok:!1,error:"Spend data requires the billing:read capability."},403);let J=y.environments.get(Ce),ee={organizationId:y.organization.id,projectId:y.project.id,environmentId:J?.id},Se=()=>{if(!Q)throw Error("Changing a budget requires the billing:manage capability.")};if(q.pathname==="/api/usage"&&N.method==="GET")return x({ok:!0,...F.usageReport({organizationId:ee.organizationId,projectId:ee.projectId,period:q.searchParams.get("period")??"monthly",timezone:q.searchParams.get("timezone")??void 0})});if(q.pathname==="/api/spend/budgets"&&N.method==="GET")return x({ok:!0,budgets:P.listBudgets({organizationId:ee.organizationId,projectId:ee.projectId}).map((ve)=>({...ve,status:F.status(ve)}))});if(q.pathname==="/api/spend/budgets"&&N.method==="POST"){Se();let ve=await re(N),nt=String(ve.scope??"project"),Pe=P.createBudget({organizationId:ee.organizationId,projectId:nt==="organization"?void 0:ee.projectId,environmentId:nt==="environment"?ee.environmentId:void 0,name:String(ve.name??"").trim(),period:ve.period??"monthly",timezone:ve.timezone?String(ve.timezone):void 0,softLimitCents:ve.softLimitCents==null?void 0:Math.round(Number(ve.softLimitCents)),hardLimitCents:ve.hardLimitCents==null?void 0:Math.round(Number(ve.hardLimitCents)),graceSeconds:ve.graceSeconds==null?void 0:Number(ve.graceSeconds),dryRun:ve.dryRun!==!1});return x({ok:!0,budget:Pe})}if(q.pathname==="/api/spend/budgets"&&N.method==="PATCH"){Se();let ve=await re(N),nt=String(ve.id??""),Pe=P.getBudget(nt);if(!Pe||Pe.organizationId!==ee.organizationId)return x({ok:!1,error:"Budget was not found."},404);return x({ok:!0,budget:P.updateBudget(nt,{softLimitCents:ve.softLimitCents==null?Pe.softLimitCents:Math.round(Number(ve.softLimitCents)),hardLimitCents:ve.hardLimitCents==null?Pe.hardLimitCents:Math.round(Number(ve.hardLimitCents)),enabled:ve.enabled==null?Pe.enabled:ve.enabled===!0,dryRun:ve.dryRun==null?Pe.dryRun:ve.dryRun===!0},ve.expectedVersion==null?void 0:Number(ve.expectedVersion))})}if(q.pathname==="/api/spend/budgets"&&N.method==="DELETE"){Se();let ve=await re(N),nt=String(ve.id??""),Pe=P.getBudget(nt);if(!Pe||Pe.organizationId!==ee.organizationId)return x({ok:!1,error:"Budget was not found."},404);let He=U.closeBudget(nt);return P.deleteBudget(nt),x({ok:!0,deleted:!0,lifted:He})}if(q.pathname==="/api/spend/check"&&N.method==="POST"){Se();let ve=await re(N),{SpendRunner:nt}=await import("./spend/index.js"),Pe=new nt({controlPlane:y.store,store:P,alerts:st});if(ve.apply!==!0){let Te=P.budgetsForScope(ee.organizationId,ee.projectId,ee.environmentId);return x({ok:!0,applied:!1,preview:Te.map((Ue)=>F.status(Ue))})}let He=await Pe.run({...ee,environmentKind:J?.kind});return x({ok:!0,applied:!0,result:He})}if(q.pathname==="/api/spend/enforcement"&&N.method==="GET")return x({ok:!0,enforcement:U.listUnder({organizationId:ee.organizationId})});if(q.pathname==="/api/spend/release"&&N.method==="POST"){Se();let ve=await re(N),nt=U.close(String(ve.budgetId??""),ve.action);return x({ok:nt,released:nt,note:nt?"The next spend cycle re-applies this if spend is still over the threshold.":"That action was not in force."})}if(q.pathname==="/api/spend/anomalies"&&N.method==="GET")return x({ok:!0,anomalies:P.listAnomalies({organizationId:ee.organizationId,projectId:ee.projectId,unacknowledgedOnly:q.searchParams.get("unacknowledged")==="true"})});if(q.pathname==="/api/spend/anomalies/acknowledge"&&N.method==="POST"){Se();let ve=await re(N);return x({ok:!0,acknowledged:P.acknowledgeAnomaly(String(ve.id??""))})}return x({ok:!1,error:"Spend endpoint was not found."},404)}if(q.pathname.startsWith("/api/health/")||q.pathname.startsWith("/api/alerts")||q.pathname.startsWith("/api/notifications/")){let A=y.environments.get(Ce),P=y.store.listResources(y.project.id,A?.id),F=me.role==="admin"||!!A&&Ga(me,A.id,"runtime:read")?P:P.filter((J)=>Dr(me,J.id,"runtime:read")),U=(J)=>!J||F.some((ee)=>ee.id===J),H=(J)=>{if(!J)return;let ee=P.find((Se)=>Se.id===J||Se.slug===J);if(!ee)throw Error("Alert resource was not found.");if(!U(ee.id))throw Error("Alert resource is outside your authorized scope.");return ee.id},Q=We(me).actor;if(q.pathname==="/api/health/checks"&&N.method==="GET")return x({ok:!0,checks:st.listHealthChecks(y.project.id,A?.id).filter((J)=>U(J.resourceId)).map((J)=>({...J,results:st.listHealthResults(J.id,20)}))});if(q.pathname==="/api/health/checks"&&N.method==="POST"){let J=await re(N),ee=String(J.kind??"http");if(ee==="command"&&me.role!=="admin")return x({ok:!1,error:"Command health checks require an administrator."},403);let Se={method:String(J.config?.method??"GET").toUpperCase().slice(0,10),path:J.config?.path?String(J.config.path).slice(0,500):void 0,port:J.config?.port==null?void 0:Number(J.config.port),command:Array.isArray(J.config?.command)?J.config.command.map(String).slice(0,20):void 0,expectedStatuses:Array.isArray(J.config?.expectedStatuses)?J.config.expectedStatuses.map(Number).filter(Number.isInteger).slice(0,20):void 0,expectedBody:J.config?.expectedBody?String(J.config.expectedBody).slice(0,500):void 0};return x({ok:!0,check:st.createHealthCheck({projectId:y.project.id,environmentId:A?.id,resourceId:H(J.resourceId??J.resource),name:String(J.name??""),kind:ee,target:String(J.target??""),config:Se,intervalSeconds:Number(J.intervalSeconds)||60,timeoutSeconds:Number(J.timeoutSeconds)||10,failureThreshold:Number(J.failureThreshold)||3,recoveryThreshold:Number(J.recoveryThreshold)||2,regions:Array.isArray(J.regions)?J.regions.map(String):["local"],enabled:J.enabled!==!1})},201)}if(q.pathname==="/api/health/checks"&&N.method==="PATCH"){let J=await re(N),ee=st.getHealthCheck(String(J.id??""));if(!ee||!U(ee.resourceId))return x({ok:!1,error:"Health check was not found."},404);return x({ok:!0,check:st.setHealthCheckEnabled(ee.id,J.enabled!==!1)})}if(q.pathname==="/api/health/checks/test"&&N.method==="POST"){let J=await re(N),ee=st.getHealthCheck(String(J.id??""));if(!ee||!U(ee.resourceId))return x({ok:!1,error:"Health check was not found."},404);return x({ok:!0,productionIncidentCreated:!1,result:await new je(st).probe(ee)})}if(q.pathname==="/api/health/checks/run"&&N.method==="POST"){let J=await re(N),ee=st.getHealthCheck(String(J.id??""));if(!ee||!U(ee.resourceId))return x({ok:!1,error:"Health check was not found."},404);let Se=await new je(st).runAndEvaluate(ee),ve=[];for(let nt of Se.evaluations.filter((Pe)=>Pe.notify&&Pe.alert)){let Pe=On.enqueue(y.organization.id,nt.alert,nt.transition);ve.push(...await On.deliverAll(Pe))}return x({ok:!0,...Se,deliveries:ve})}if(q.pathname==="/api/alerts/rules"&&N.method==="GET")return x({ok:!0,rules:st.listRules(y.project.id,A?.id).filter((J)=>U(J.resourceId))});if(q.pathname==="/api/alerts/rules"&&N.method==="POST"){let J=await re(N),ee=J.healthCheckId?st.getHealthCheck(String(J.healthCheckId)):void 0;if(J.healthCheckId&&(!ee||!U(ee.resourceId)))return x({ok:!1,error:"Health check was not found."},404);return x({ok:!0,rule:st.createRule({projectId:y.project.id,environmentId:A?.id,resourceId:H(J.resourceId??J.resource)??ee?.resourceId,healthCheckId:ee?.id,name:String(J.name??""),signal:String(J.signal??(ee?"health":"")),operator:String(J.operator??(ee?"unhealthy":"gt")),threshold:J.threshold==null?void 0:Number(J.threshold),recoveryThreshold:J.recoveryThreshold==null?void 0:Number(J.recoveryThreshold),windowMs:Number(J.windowMs)||300000,consecutive:Number(J.consecutive)||ee?.failureThreshold||3,recoveryConsecutive:Number(J.recoveryConsecutive)||ee?.recoveryThreshold||2,noDataPolicy:["ignore","pending","firing"].includes(String(J.noDataPolicy))?J.noDataPolicy:"pending",severity:["info","warning","critical"].includes(String(J.severity))?J.severity:"warning",groupBy:Array.isArray(J.groupBy)?J.groupBy.map(String):[],labels:J.labels&&typeof J.labels==="object"?J.labels:{},enabled:J.enabled!==!1})},201)}if(q.pathname==="/api/alerts/rules"&&N.method==="PATCH"){let J=await re(N),ee=st.getRule(String(J.id??""));if(!ee||!U(ee.resourceId))return x({ok:!1,error:"Alert rule was not found."},404);return x({ok:!0,rule:st.setRuleEnabled(ee.id,J.enabled!==!1)})}if(q.pathname==="/api/alerts/evaluate"&&N.method==="POST")return x({ok:!0,...await Tm(A?.id)});if(q.pathname==="/api/alerts"&&N.method==="GET")return x({ok:!0,alerts:st.listAlerts(y.project.id,{environmentId:A?.id,states:q.searchParams.getAll("state").length?q.searchParams.getAll("state"):void 0,limit:Number(q.searchParams.get("limit"))||200}).filter((J)=>U(J.resourceId)).map((J)=>({...J,deliveries:st.listDeliveries({alertId:J.id,limit:50})}))});if(q.pathname==="/api/alerts/action"&&N.method==="POST"){let J=await re(N),ee=st.getAlert(String(J.id??""));if(!ee||!U(ee.resourceId))return x({ok:!1,error:"Alert was not found."},404);let Se=String(J.action??"");if(Se==="acknowledge")return x({ok:!0,alert:st.acknowledge(ee.id,Q?.id??"")});if(Se==="assign")return x({ok:!0,alert:st.assign(ee.id,J.ownerActorId==="me"?Q?.id:J.ownerActorId?String(J.ownerActorId):void 0,Q?.id)});if(Se==="silence"){if(me.role!=="admin")return x({ok:!1,error:"Silencing production alerts requires an administrator."},403);let ve=lr.resolveSession(N);if(xe&&(!ve||!Ne.isRecentlyAuthenticated(ve)))return x({ok:!1,error:"Recent authentication is required to silence alerts.",stepUpRequired:!0},401);return x({ok:!0,alert:st.silenceAlert(ee.id,String(J.until??""),Q?.id)})}return x({ok:!1,error:"Action must be acknowledge, assign, or silence."},422)}if(q.pathname==="/api/alerts/silences"&&N.method==="POST"){let J=await re(N);return x({ok:!0,id:st.createSilence({projectId:y.project.id,environmentId:A?.id,resourceId:H(J.resourceId??J.resource),matcher:J.matcher,reason:String(J.reason??""),startsAt:String(J.startsAt??new Date().toISOString()),endsAt:String(J.endsAt??""),timezone:String(J.timezone??"UTC"),actorId:Q?.id})},201)}if(q.pathname==="/api/notifications/channels"&&N.method==="GET")return x({ok:!0,channels:st.listChannels(y.organization.id)});if(q.pathname==="/api/notifications/channels"&&N.method==="POST"){let J=await re(N),ee=String(J.kind??""),Se=ee==="email"?{to:J.config?.to,from:J.config?.from}:ee==="telegram"?{chatId:String(J.config?.chatId??"")}:{};return x({ok:!0,channel:st.createChannel({organizationId:y.organization.id,name:String(J.name??""),kind:ee,config:Se,credential:J.credential?String(J.credential):void 0,actorId:Q?.id})},201)}if(q.pathname==="/api/notifications/channels"&&N.method==="PATCH"){let J=await re(N),ee=String(J.id??"");if(J.credential)return x({ok:!0,channel:st.rotateChannel(ee,String(J.credential))});let Se=String(J.status??"paused");if(!["active","paused","disabled"].includes(Se))return x({ok:!1,error:"Channel status must be active, paused, or disabled."},422);return x({ok:!0,channel:st.setChannelStatus(ee,Se)})}if(q.pathname==="/api/notifications/channels/test"&&N.method==="POST"){let J=await re(N);return x({ok:!0,productionIncidentCreated:!1,result:await On.testChannel(String(J.id??""))})}if(q.pathname==="/api/notifications/routes"&&N.method==="GET")return x({ok:!0,routes:st.listRoutes(y.organization.id)});if(q.pathname==="/api/notifications/routes"&&N.method==="POST"){let J=await re(N),ee=Array.isArray(J.channelIds)?J.channelIds.map(String):[];if(ee.some((Se)=>st.getChannel(Se)?.organizationId!==y.organization.id))return x({ok:!1,error:"Route contains an unavailable channel."},422);return x({ok:!0,route:st.createRoute({organizationId:y.organization.id,name:String(J.name??""),priority:Number(J.priority)||0,matcher:J.matcher&&typeof J.matcher==="object"?J.matcher:{},channelIds:ee,quietHours:J.quietHours,groupWaitSeconds:Number(J.groupWaitSeconds)||30,reminderSeconds:J.reminderSeconds==null?void 0:Number(J.reminderSeconds),escalation:Array.isArray(J.escalation)?J.escalation:[],template:J.template?String(J.template):void 0,rateLimitPerMinute:Number(J.rateLimitPerMinute)||60,enabled:J.enabled!==!1})},201)}if(q.pathname==="/api/notifications/routes"&&N.method==="PATCH"){let J=await re(N),ee=st.getRoute(String(J.id??""));if(!ee||ee.organizationId!==y.organization.id)return x({ok:!1,error:"Notification route was not found."},404);return x({ok:!0,route:st.setRouteEnabled(ee.id,J.enabled!==!1)})}if(q.pathname==="/api/notifications/routes/preview"&&N.method==="POST"){let J=await re(N),Se=(J.alertId?st.getAlert(String(J.alertId)):void 0)??{id:"preview",ruleId:"preview",projectId:y.project.id,environmentId:A?.id,resourceId:H(J.resourceId??J.resource),dedupKey:"preview",groupKey:String(J.groupKey??"default"),state:"firing",severity:["info","warning","critical"].includes(String(J.severity))?J.severity:"warning",title:String(J.title??"Rule preview"),evidence:{},failureCount:1,recoveryCount:0,occurrenceCount:1,firstSeenAt:new Date().toISOString(),lastSeenAt:new Date().toISOString(),firingAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return x({ok:!0,productionIncidentCreated:!1,matches:On.preview(y.organization.id,Se,String(J.eventType??"firing")).map((ve)=>({route:ve.route,channels:ve.channels,quiet:ve.quiet}))})}if(q.pathname==="/api/notifications/deliveries"&&N.method==="GET")return x({ok:!0,deliveries:st.listDeliveries({alertId:q.searchParams.get("alertId")??void 0,states:q.searchParams.getAll("state"),limit:Number(q.searchParams.get("limit"))||200})});if(q.pathname==="/api/notifications/deliveries/retry"&&N.method==="POST"){let J=await re(N),ee=st.getDelivery(String(J.id??""));if(!ee)return x({ok:!1,error:"Delivery was not found."},404);return st.updateDelivery(ee.id,{state:"retrying",attempt:Math.max(0,ee.attempt-1),nextAttemptAt:new Date().toISOString()}),x({ok:!0,delivery:await On.deliver(ee.id)})}}if(q.pathname.startsWith("/api/jobs")||q.pathname.startsWith("/api/workers")){let A=y.environments.get(Ce),P=y.store.listResources(y.project.id,A?.id),U=me.role==="admin"||!!A&&Ga(me,A.id,"automation:read")?P:P.filter((Te)=>Dr(me,Te.id,"automation:read")),H=(Te)=>!Te||U.some((Ue)=>Ue.id===Te),Q=We(me).actor,J=V.get(Ce)??B,ee=ju(m,J),Se=ee.filter((Te)=>!Te.danger&&["scheduler","backup","worker"].includes(Te.group)),ve=M(m),nt=()=>{let Te=lr.resolveSession(N);return!xe||!!Te&&Ne.isRecentlyAuthenticated(Te)},Pe=(Te)=>{if(!Te||typeof Te!=="object"||Array.isArray(Te))return{};let Ue=Object.entries(Te).slice(0,50);if(Ue.some(([,ct])=>typeof ct!=="string"||!/^(?:secret|ssm|arn|env):\/\//.test(ct)))throw Error("Job payload values must be secret or environment references, never inline values.");return Object.fromEntries(Ue)},He=(Te,Ue,ct)=>y.store.appendEvent({organizationId:y.organization.id,projectId:y.project.id,resourceId:ct,actorId:Q?.id,type:`job.${Te}`,payload:Ue});if(q.pathname==="/api/jobs/preview"&&N.method==="POST"){let Te=await re(N);try{return x({ok:!0,productionExecutionCreated:!1,preview:vt(String(Te.expression??""),String(Te.timezone??"UTC"),new Date(Te.from?String(Te.from):Date.now()),Number(Te.count)||5)})}catch(Ue){return x({ok:!1,error:Ue instanceof Error?Ue.message:"Schedule preview could not be generated.",productionExecutionCreated:!1},422)}}if(q.pathname==="/api/jobs"&&N.method==="GET")return x({ok:!0,jobs:Pr.list(y.project.id,{environmentId:A?.id}).filter((Te)=>H(Te.resourceId)).map((Te)=>({...Te,preview:vt(Te.normalizedExpression,Te.timezone,new Date,5),capability:nn(Te),lastExecution:Pr.listExecutions(Te.id,1)[0]}))});if(q.pathname==="/api/jobs"&&N.method==="POST"){let Te=await re(N),Ue=String(Te.provider??(ve==="serverless"?"eventbridge":"server")),ct=ve==="serverless"?"eventbridge":"server";if(Ue!==ct)return x({ok:!1,error:`${ve} environments accept ${ct} schedules through this adapter.`},422);let ht=Te.operationId?String(Te.operationId):void 0;if(Ue==="server"&&(!ht||!Se.some((wr)=>wr.id===ht)))return x({ok:!1,error:"Server jobs require an allowlisted operation target."},422);let Nt=nn({provider:Ue,expression:String(Te.expression??""),flexibleMinutes:Number(Te.flexibleMinutes)||0,missedRunPolicy:Te.missedRunPolicy==="catch_up"?"catch_up":"skip",overlapPolicy:["allow","forbid","replace"].includes(String(Te.overlapPolicy))?Te.overlapPolicy:"forbid"});if(!Nt.supported)return x({ok:!1,error:Nt.notes.join(" ")},422);let Pn=Te.resourceId?P.find((wr)=>wr.id===Te.resourceId||wr.slug===Te.resourceId):void 0;if(Te.resourceId&&(!Pn||!H(Pn.id)))return x({ok:!1,error:"Job resource was not found."},404);try{let wr=Ue==="server"?{kind:"dashboard_operation",operationId:ht}:{kind:"serverless_scheduler",action:"run"},Oi=Pr.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:A?.id,resourceId:Pn?.id,name:String(Te.name??""),provider:Ue,expression:String(Te.expression??""),timezone:String(Te.timezone??"UTC"),startsAt:Te.startsAt?String(Te.startsAt):void 0,endsAt:Te.endsAt?String(Te.endsAt):void 0,flexibleMinutes:Number(Te.flexibleMinutes)||0,target:wr,payloadRefs:Pe(Te.payloadRefs),missedRunPolicy:Te.missedRunPolicy==="catch_up"?"catch_up":"skip",overlapPolicy:["allow","forbid","replace"].includes(String(Te.overlapPolicy))?Te.overlapPolicy:"forbid",retryPolicy:{maxAttempts:Number(Te.maxAttempts)||3,backoffSeconds:Number(Te.backoffSeconds)||30,deadLetterRef:Te.deadLetterRef?String(Te.deadLetterRef):void 0},timeoutSeconds:Number(Te.timeoutSeconds)||900,enabled:Te.enabled!==!1,origin:"managed",ownerActorId:Q?.id,observedState:{},reconciliationStatus:"pending"});return He("created",{jobId:Oi.id,provider:Oi.provider,expression:Oi.normalizedExpression},Oi.resourceId),x({ok:!0,job:Oi,capability:Nt},201)}catch(wr){return x({ok:!1,error:wr instanceof Error?wr.message:"Scheduled job could not be created."},422)}}if(q.pathname==="/api/jobs"&&N.method==="PATCH"){let Te=await re(N),Ue=Pr.get(String(Te.id??""));if(!Ue||!H(Ue.resourceId))return x({ok:!1,error:"Scheduled job was not found."},404);if(Ue.origin==="config")return x({ok:!1,error:"Config-defined schedules must be edited in cloud.config.ts and reconciled."},409);let ct=Te.missedRunPolicy==null?void 0:String(Te.missedRunPolicy),ht=Te.overlapPolicy==null?void 0:String(Te.overlapPolicy);if(ct&&!["skip","catch_up"].includes(ct))return x({ok:!1,error:"Missed-run policy must be skip or catch_up."},422);if(ht&&!["allow","forbid","replace"].includes(ht))return x({ok:!1,error:"Overlap policy must be allow, forbid, or replace."},422);try{let Nt=Pr.updateSchedule(Ue.id,{expression:Te.expression?String(Te.expression):void 0,timezone:Te.timezone?String(Te.timezone):void 0,missedRunPolicy:ct,overlapPolicy:ht,timeoutSeconds:Te.timeoutSeconds==null?void 0:Number(Te.timeoutSeconds)});return He("updated",{jobId:Nt.id,expression:Nt.normalizedExpression,version:Nt.version},Nt.resourceId),x({ok:!0,job:Nt})}catch(Nt){return x({ok:!1,error:Nt instanceof Error?Nt.message:"Scheduled job could not be updated."},422)}}if(q.pathname==="/api/jobs/action"&&N.method==="POST"){let Te=await re(N),Ue=Pr.get(String(Te.id??""));if(!Ue||!H(Ue.resourceId))return x({ok:!1,error:"Scheduled job was not found."},404);let ct=String(Te.action??"");if(ct==="run"){let ht=_m.enqueue(Ue,{trigger:"manual",actorId:Q?.id});return He("run_queued",{jobId:Ue.id,executionId:ht.id},Ue.resourceId),x({ok:!0,execution:ht},202)}if(["disable","delete"].includes(ct)&&A?.kind==="production"){if(String(Te.confirm??"")!==ct)return x({ok:!1,error:`Type "${ct}" to confirm this production change.`},409);if(!nt())return x({ok:!1,error:"Recent authentication is required for this production change.",stepUpRequired:!0},401)}if(ct==="enable"||ct==="disable"){let ht=Pr.setEnabled(Ue.id,ct==="enable");return He(ct==="enable"?"enabled":"disabled",{jobId:Ue.id},Ue.resourceId),x({ok:!0,job:ht})}if(ct==="delete")try{return Pr.remove(Ue.id),He("deleted",{jobId:Ue.id,name:Ue.name},Ue.resourceId),x({ok:!0,deleted:Ue.id})}catch(ht){return x({ok:!1,error:ht instanceof Error?ht.message:"Scheduled job could not be deleted."},409)}return x({ok:!1,error:"Action must be run, enable, disable, or delete."},422)}if(q.pathname==="/api/jobs/history"&&N.method==="GET"){let Te=Pr.get(String(q.searchParams.get("jobId")??""));if(!Te||!H(Te.resourceId))return x({ok:!1,error:"Scheduled job was not found."},404);return x({ok:!0,executions:Pr.listExecutions(Te.id,Number(q.searchParams.get("limit"))||100).map((Ue)=>({...Ue,logs:Ue.operationId?Vt.logs(Ue.operationId,{limit:500}):[]}))})}if(q.pathname==="/api/jobs/reconcile"&&N.method==="POST"){if(!A)return x({ok:!1,error:"Environment was not found."},404);let Te=Zo(Pr,m,{organization:y.organization,project:y.project,environment:A,resources:P});return He("reconciled",Te),x({ok:!0,reconciliation:Te})}if(q.pathname==="/api/workers"&&N.method==="GET"){let Te=Array.isArray(J.workersDetail??J.workers)?J.workersDetail??J.workers:[];return x({ok:!0,workers:Pr.listWorkers(y.project.id,A?.id).filter((Ue)=>H(Ue.resourceId)).map((Ue)=>{let ct=Te.find((ht)=>ht.name===Ue.name||ht.site===Ue.target.site);return ct?{...Ue,observedState:{...Ue.observedState,status:ct.status??"configured",currentJob:ct.currentJob??null,failures:Number(ct.failed??ct.failures)||0,processed:Number(ct.processed)||0}}:Ue})})}if(q.pathname==="/api/workers/action"&&N.method==="POST"){let Te=await re(N),Ue=Pr.getWorker(String(Te.id??""));if(!Ue||!H(Ue.resourceId))return x({ok:!1,error:"Worker was not found."},404);let ct=String(Te.action??"");if(ct==="restart"){if(String(Te.confirm??"")!==Ue.name)return x({ok:!1,error:`Type "${Ue.name}" to restart this worker.`},409);let ht=ee.find((wr)=>wr.id===Ue.target.operationId);if(!ht)return x({ok:!1,error:"The allowlisted worker restart operation is unavailable."},409);let Nt=await Bu(m,Ce,ht),Pn=Pr.reconcileWorker(Ue.id,Nt.ok?"in_sync":"unavailable",{...Ue.observedState,lastRestartAt:new Date().toISOString(),command:Nt.command??null,error:Nt.error??Nt.stderr??null});return He("worker_restarted",{workerId:Ue.id,ok:Nt.ok},Ue.resourceId),x({...Nt,worker:Pn},Nt.ok?200:409)}if(ct==="scale")return x({ok:!1,error:Ue.provider==="systemd"?"Systemd worker scale is config-managed; edit the worker definition and reconcile.":"This provider does not expose safe worker scaling through the current adapter."},422);return x({ok:!1,error:"Action must be restart or scale."},422)}}if(q.pathname.startsWith("/api/telemetry/")){let A=y.environments.get(Ce),P=new ft(y.store),F=y.store.listResources(y.project.id,A?.id),U=["/api/telemetry/query","/api/telemetry/tail","/api/telemetry/export","/api/telemetry/saved-queries","/api/telemetry/refresh"].includes(q.pathname)?"runtime:logs":"runtime:read",H=me.role==="admin"||!!A&&Ga(me,A.id,U),Q=H?F:F.filter((Pe)=>Dr(me,Pe.id,U)),J=(Pe)=>US(Q,H,Pe),ee=(Pe)=>{let He=new Date,Te={"1h":3600000,"6h":21600000,"24h":86400000,"7d":604800000,"30d":2592000000},Ue=String(Pe.to??He.toISOString()),ct=String(Pe.from??new Date(new Date(Ue).getTime()-(Te[String(Pe.range??"1h")]??Te["1h"])).toISOString()),ht=(Pn)=>{let wr=(Array.isArray(Pn)?Pn:String(Pn??"").split(",")).map(String).filter(Boolean);return wr.length?wr:void 0},Nt=ht(Pe.kinds)?.filter((Pn)=>["metric","log","trace","request","event"].includes(Pn));return{projectId:y.project.id,environmentId:A?.id,resourceIds:J(Pe.resources),kinds:Nt,names:ht(Pe.names),sources:ht(Pe.sources),levels:ht(Pe.levels),from:ct,to:Ue,text:String(Pe.text??"")||void 0,traceId:String(Pe.traceId??"")||void 0,requestId:String(Pe.requestId??"")||void 0,deploymentId:String(Pe.deploymentId??"")||void 0,releaseId:String(Pe.releaseId??"")||void 0,workloadId:String(Pe.workloadId??"")||void 0,cursor:String(Pe.cursor??"")||void 0,limit:Number(Pe.limit)||void 0}},Se=Object.fromEntries(q.searchParams.entries()),ve=(Pe=!1)=>bm({controlPlane:y.store,projectId:y.project.id,environmentId:A?.id,config:m,environment:Ce,force:Pe,lightweight:!Pe}),nt=()=>{let Pe=y.store.getSetting(`telemetry.collection:${y.project.id}:${A?.id??"all"}`)??{};return{generatedAt:String(Pe.generatedAt??new Date().toISOString()),cached:!0,statuses:Array.isArray(Pe.statuses)?Pe.statuses:[],errors:Array.isArray(Pe.errors)?Pe.errors:[],policy:Pe.policy??Gt(y.store,y.project.id)}};if(q.pathname==="/api/telemetry/status"&&N.method==="GET"){ve(!1);let Pe=nt(),He=H?Pe.statuses:P.status(y.project.id,A?.id,Pe.policy.rawDays,Pe.policy.samplingRate,Q.map((Ue)=>Ue.id)),Te=He.reduce((Ue,ct)=>Ue+ct.estimatedDailyBytes*30,0);return x({ok:!0,generatedAt:Pe.generatedAt,cached:Pe.cached,sources:He,errors:H?Pe.errors:[],policy:Pe.policy,retention:{rawDays:Pe.policy.rawDays,downsampleAfterDays:Pe.policy.downsampleAfterDays,downsampleBucketMs:Pe.policy.downsampleBucketMs,maxRecords:Pe.policy.maxRecords},estimatedMonthlyBytes:Te,estimatedMonthlyCostUsd:Ad(Te,Pe.policy),costEstimateConfigured:Pe.policy.estimatedStorageUsdPerGbMonth>0})}if(q.pathname==="/api/telemetry/settings"&&N.method==="GET")return x({ok:!0,policy:Gt(y.store,y.project.id)});if(q.pathname==="/api/telemetry/settings"&&N.method==="PATCH"){let Pe=fd(y.store,y.project.id,await re(N));return JS(y.project.id),x({ok:!0,policy:Pe})}if(q.pathname==="/api/telemetry/query"&&N.method==="GET"){ve(!1);let Pe=nt();return x({ok:!0,collection:{generatedAt:Pe.generatedAt,cached:Pe.cached},...P.query(ee(Se))})}if(q.pathname==="/api/telemetry/tail"&&N.method==="GET"){ve(!1);let Pe=new TextEncoder,He=new Date,Te=ee({...Se,kinds:Se.kinds||"log,request,event,trace",from:Se.from||new Date(He.getTime()-120000).toISOString(),to:He.toISOString(),limit:Math.min(1000,Number(Se.limit)||200),cursor:void 0}),Ue=N.headers.get("last-event-id")||String(Se.cursor??"")||void 0,ct,ht=!1,Nt=!1,Pn=new ReadableStream({start(wr){let Oi=()=>{if(ht)return;if(ht=!0,ct)clearInterval(ct);N.signal.removeEventListener("abort",Oi);try{wr.close()}catch{}},Hm=async()=>{if(ht||Nt)return;Nt=!0;try{let wo=P.tail({...Te,to:new Date(Date.now()+1000).toISOString()},Ue);for(let Gm of wo.records)Ue=wi(Gm)??Ue,wr.enqueue(Pe.encode(`id: ${Ue??""}
|
|
699
699
|
event: record
|
|
700
700
|
data: ${JSON.stringify(Gm)}
|
|
@@ -706,4 +706,4 @@ data: ${JSON.stringify({message:wo instanceof Error?wo.message:String(wo)})}
|
|
|
706
706
|
data: ${JSON.stringify({cursor:Ue,at:new Date().toISOString()})}
|
|
707
707
|
|
|
708
708
|
`))},5000),ct.unref?.(),N.signal.addEventListener("abort",Oi,{once:!0})},cancel(){if(ht=!0,ct)clearInterval(ct)}});return new Response(Pn,{headers:{"cache-control":"no-cache, no-transform",connection:"keep-alive","content-type":"text/event-stream; charset=utf-8","x-accel-buffering":"no"}})}if(q.pathname==="/api/telemetry/series"&&N.method==="GET"){ve(!1);let Pe=nt(),He=["sum","avg","min","max","count","p50","p90","p95","p99"].includes(String(Se.aggregation))?Se.aggregation:"avg",Te=ee({...Se,kinds:"metric",limit:5000}),Ue=P.series({...Te,bucketMs:Number(Se.bucketMs)||60000,aggregation:He,timezone:String(Se.timezone??"UTC"),compareFrom:Se.compareFrom,compareTo:Se.compareTo});return x({ok:!0,collection:{generatedAt:Pe.generatedAt,cached:Pe.cached},query:{aggregation:He,bucketMs:Number(Se.bucketMs)||60000,timezone:String(Se.timezone??"UTC")},series:Ue})}if(q.pathname==="/api/telemetry/refresh"&&N.method==="POST")return x({ok:!0,...await ve(!0)});if(q.pathname==="/api/telemetry/export"&&N.method==="POST"){let Pe=await re(N);await ve(!1);let He=P.query({...ee(Pe),limit:Math.min(5000,Number(Pe.limit)||5000),cursor:void 0});if((Pe.format==="csv"?"csv":"json")==="json")return new Response(JSON.stringify({exportedAt:new Date().toISOString(),query:ee(Pe),...He},null,2),{headers:{"content-disposition":'attachment; filename="ts-cloud-telemetry.json"',"content-type":"application/json; charset=utf-8"}});let Ue=["timestamp","kind","source","name","level","value","unit","message","traceId","requestId","deploymentId","releaseId","workloadId"],ct=[Ue.join(","),...He.records.map((ht)=>Ue.map((Nt)=>`"${String(ht[Nt]??"").replaceAll('"','""')}"`).join(","))].join(`
|
|
709
|
-
`);return new Response(ct,{headers:{"content-disposition":'attachment; filename="ts-cloud-telemetry.csv"',"content-type":"text/csv; charset=utf-8"}})}if(q.pathname==="/api/telemetry/saved-queries"&&N.method==="GET"){let Pe=We(me);return x({ok:!0,queries:P.listSavedQueries(y.project.id,Pe.actor?.id)})}if(q.pathname==="/api/telemetry/saved-queries"&&N.method==="POST"){let Pe=await re(N),He=We(me);return x({ok:!0,query:P.saveQuery(y.project.id,He.actor?.id,String(Pe.name??""),ee(Pe.query??Pe))},201)}if(q.pathname==="/api/telemetry/saved-queries"&&N.method==="DELETE"){let Pe=await re(N),He=We(me),Te=P.deleteSavedQuery(y.project.id,He.actor?.id,String(Pe.id??""));return x({ok:Te},Te?200:404)}}if(q.pathname.startsWith("/api/configuration")){let A=y.environments.get(Ce),P=me.role==="admin"||!!$n.capabilities?.includes("secrets:read"),F=me.role==="admin"||!!$n.capabilities?.includes("secrets:write"),U={projectId:y.project.id,environmentId:A?.id},H={"cache-control":"no-store"};if(q.pathname==="/api/configuration"&&N.method==="GET"){let Q=Object.fromEntries(q.searchParams),J=Q.scopeType||Q.scopeId?Wa(Q,U):void 0,ee=["variable","secret"].includes(String(Q.kind))?Q.kind:void 0,Se=J?.type==="preview"?yr.previews.getInstance(J.id):void 0,ve=Se?yr.previews.getDefinition(Se.definitionId):void 0,nt=J?await kn.resolve({projectId:y.project.id,environmentId:J.environmentId,resourceId:J.resourceId,functionId:J.type==="function"?J.id:void 0,previewId:J.previewId,trustedPreview:!!Se&&!Se.fork,allowedPreviewSecrets:ve?.inheritedSecrets,nativeReferences:!0,canReadSecretMetadata:P}):void 0,Pe=y.store.listResources(y.project.id);return x({ok:!0,entries:kn.list({projectId:y.project.id,scope:J,kind:ee,search:Q.search,canReadSecretMetadata:P}),effectiveEntries:nt?Object.values(nt.entries).filter((He)=>!ee||He.kind===ee).filter((He)=>!Q.search||He.key.toLowerCase().includes(String(Q.search).toLowerCase())):[],configurationHash:nt?.configurationHash,warnings:nt?.warnings??[],scopes:{project:y.project,environments:y.store.listEnvironments(y.project.id),resources:Pe.filter((He)=>He.kind!=="function"),functions:Pe.filter((He)=>He.kind==="function"),previews:yr.previews.listInstances({projectId:y.project.id}).filter((He)=>He.status!=="destroyed").map((He)=>({id:He.id,name:He.name,environmentId:He.baseEnvironmentId,resourceId:He.resourceId,fork:He.fork,status:He.status}))}},200,H)}if(q.pathname==="/api/configuration/export"&&N.method==="GET"){let Q=Wa(Object.fromEntries(q.searchParams),U);return new Response(kn.exportVariables({projectId:y.project.id,scope:Q}),{headers:{...H,"content-disposition":'attachment; filename="ts-cloud.env"',"content-type":"text/plain; charset=utf-8"}})}if(q.pathname==="/api/configuration/plan"&&N.method==="POST"){let Q=await re(N),J=Wa(Q,U),ee=Q.values&&typeof Q.values==="object"&&!Array.isArray(Q.values)?Object.fromEntries(Object.entries(Q.values).map(([Se,ve])=>[Se,String(ve)])):{};return x({ok:!0,plan:kn.plan({projectId:y.project.id,scope:J,values:ee,removeMissing:Q.removeMissing===!0})},200,H)}if(q.pathname==="/api/configuration"&&N.method==="POST"){let Q=await re(N),J=Wa(Q,U),ee=Q.kind==="secret"?"secret":"variable",Se=String(Q.key??"");if(ee==="secret"&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);try{let ve=await kn.set({organizationId:y.organization.id,projectId:y.project.id,scope:J,key:Se,kind:ee,value:Q.value==null?void 0:String(Q.value),reference:Q.reference==null?void 0:String(Q.reference),backend:Q.backend,required:Q.required===!0,expectedVersion:Q.expectedVersion==null?void 0:Number(Q.expectedVersion),confirmed:String(Q.confirm??"")===Se,idempotencyKey:N.headers.get("idempotency-key")??Q.idempotencyKey,actorId:We(me).actor?.id});return x({ok:!0,entry:kn.list({projectId:y.project.id,scope:J,canReadSecretMetadata:P}).find((nt)=>nt.id===ve.entry.id),mutation:ve.mutation,warnings:ve.warnings},ve.mutation.added.length?201:200,H)}catch(ve){return x({ok:!1,error:ve instanceof Error?ve.message:String(ve)},409,H)}}if(q.pathname==="/api/configuration/import"&&N.method==="POST"){let Q=await re(N),J=Wa(Q,U),ee=Array.isArray(Q.secretKeys)?Q.secretKeys.map(String):[];if(ee.length&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);try{let Se=await kn.importDotenv({organizationId:y.organization.id,projectId:y.project.id,scope:J,source:String(Q.source??""),secretKeys:ee,backend:Q.backend,confirmed:Q.confirm==="import",idempotencyKey:N.headers.get("idempotency-key")??Q.idempotencyKey,actorId:We(me).actor?.id});return x({ok:Se.document.valid,diagnostics:Se.document.diagnostics,mutation:Se.mutation,warnings:Se.warnings},Se.document.valid?200:422,H)}catch(Se){return x({ok:!1,error:Se instanceof Error?Se.message:String(Se)},409,H)}}if(q.pathname==="/api/configuration/dependencies"&&N.method==="POST"){let Q=await re(N),J=Ci.get(String(Q.entryId??"")),ee=y.store.getResource(String(Q.resourceId??""));if(!J||J.projectId!==y.project.id||!ee||ee.projectId!==y.project.id)return x({ok:!1,error:"Configuration entry or dependent resource was not found."},404,H);return x({ok:!0,dependency:Ci.setDependency({entryId:J.id,resourceId:ee.id,injectionTarget:["native_reference","file"].includes(String(Q.injectionTarget))?Q.injectionTarget:"environment",required:Q.required!==!1,requiresRedeploy:Q.requiresRedeploy!==!1,lastDeployedVersion:Q.lastDeployedVersion==null?void 0:Number(Q.lastDeployedVersion)})},200,H)}if(q.pathname==="/api/configuration/transfer"&&N.method==="POST"){let Q=await re(N),J=Ci.get(String(Q.id??"")),ee=Wa({...Q,scopeType:Q.targetScopeType,scopeId:Q.targetScopeId},U);if(!J||J.projectId!==y.project.id)return x({ok:!1,error:"Configuration entry was not found."},404,H);if(J.kind==="secret"&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);try{let Se=await kn.transfer({entryId:J.id,targetScope:ee,mode:Q.mode==="move"?"move":"copy",confirmed:Q.confirm===J.key,actorId:We(me).actor?.id,idempotencyKey:N.headers.get("idempotency-key")??Q.idempotencyKey});return x({ok:!0,entry:kn.list({projectId:y.project.id,scope:ee,canReadSecretMetadata:P}).find((ve)=>ve.id===Se.entry.id),mutation:Se.mutation},200,H)}catch(Se){return x({ok:!1,error:Se instanceof Error?Se.message:String(Se)},409,H)}}if(q.pathname==="/api/configuration/bulk"&&N.method==="POST"){let Q=await re(N),J=Array.isArray(Q.ids)?Q.ids.map(String).slice(0,500):[],ee=J.map((ve)=>Ci.get(ve)).filter((ve)=>!!ve&&ve.projectId===y.project.id);if(ee.length!==J.length)return x({ok:!1,error:"One or more configuration entries were not found."},404,H);if(ee.some((ve)=>ve.kind==="secret")&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);if(Q.action!=="delete"||Q.confirm!=="bulk")return x({ok:!1,error:"Bulk deletion requires action delete and confirm bulk."},409,H);let Se=[];try{for(let ve of ee)Se.push(await kn.remove({entryId:ve.id,expectedVersion:ve.version,confirmed:!0,actorId:We(me).actor?.id}));return x({ok:!0,removed:Se.flatMap((ve)=>ve.removed),affectedResourceIds:[...new Set(Se.flatMap((ve)=>ve.affectedResourceIds))].sort()},200,H)}catch(ve){return x({ok:!1,error:ve instanceof Error?ve.message:String(ve),partial:Se.flatMap((nt)=>nt.removed)},409,H)}}if(q.pathname==="/api/configuration/reveal"&&N.method==="POST"){let Q=await re(N),J=lr.resolveSession(N);try{return x({ok:!0,value:await kn.reveal({entryId:String(Q.id??""),canRevealSecrets:P,recentlyAuthenticated:!xe||!!J&&Ne.isRecentlyAuthenticated(J),actorId:We(me).actor?.id})},200,H)}catch(ee){return x({ok:!1,error:ee instanceof Error?ee.message:String(ee)},403,H)}}if(q.pathname==="/api/configuration"&&N.method==="DELETE"){let Q=await re(N),J=Ci.get(String(Q.id??""));if(J?.kind==="secret"&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);if(!J||J.projectId!==y.project.id)return x({ok:!1,error:"Configuration entry was not found."},404,H);try{return x({ok:!0,mutation:await kn.remove({entryId:J.id,expectedVersion:Number(Q.expectedVersion),confirmed:String(Q.confirm??"")===J.key,actorId:We(me).actor?.id})},200,H)}catch(ee){return x({ok:!1,error:ee instanceof Error?ee.message:String(ee)},409,H)}}}if(q.pathname.startsWith("/api/fleet")){let A=We(me).actor?.id,P=(F,U=409)=>x({ok:!1,error:F instanceof Error?F.message:String(F)},U,{"cache-control":"no-store"});if(q.pathname==="/api/fleet"&&N.method==="GET")return x({ok:!0,servers:Ja.list(y.project.id),resources:y.store.listResources(y.project.id),operations:Vt.list({projectId:y.project.id,limit:200}).filter((F)=>F.operation.kind.startsWith("fleet."))},200,{"cache-control":"no-store"});if(q.pathname==="/api/fleet"&&N.method==="POST"){let F=await re(N);try{return x({ok:!0,server:Zn.enroll({organizationId:y.organization.id,projectId:y.project.id,name:String(F.name??""),provider:["aws","hetzner"].includes(String(F.provider))?F.provider:"ssh",providerId:F.providerId?String(F.providerId):void 0,region:F.region?String(F.region):void 0,zone:F.zone?String(F.zone):void 0,endpoint:String(F.endpoint??""),sshUser:String(F.sshUser??"deploy"),sshPort:F.sshPort?Number(F.sshPort):22,credentialRef:String(F.credentialRef??""),roles:Array.isArray(F.roles)?F.roles:[],labels:F.labels&&typeof F.labels==="object"?F.labels:{}})},201)}catch(U){return P(U,422)}}if(q.pathname==="/api/fleet/action"&&N.method==="POST"){let F=await re(N),U=String(F.id??""),H=String(F.action??"");try{if(H==="test")return x({ok:!0,server:await Zn.test(U)});if(H==="validate")return x({ok:!0,server:await Zn.validate(U)});if(H==="review_host_key")return x({ok:!0,server:Zn.reviewHostKey(U,String(F.fingerprint??""))});if(H==="bootstrap")return x({ok:!0,...Zn.bootstrap(U,F.confirmed===!0)},F.confirmed===!0?202:200);if(H==="heartbeat")return x({ok:!0,server:Zn.heartbeat(U,{usage:F.usage&&typeof F.usage==="object"?F.usage:{}})});if(H==="drain")return x({ok:!0,server:Zn.drain(U,F.completed===!0)});if(H==="uncordon")return x({ok:!0,server:Zn.uncordon(U)});if(H==="archive")return x({ok:!0,server:Zn.archive(U,String(F.confirmation??""))});return P("Unsupported fleet action.",422)}catch(Q){return P(Q)}}}if(q.pathname.startsWith("/api/capacity")){let A=(P,F=409)=>x({ok:!1,error:P instanceof Error?P.message:String(P)},F,{"cache-control":"no-store"});if(q.pathname==="/api/capacity"&&N.method==="GET")return x({ok:!0,pools:_i.listPools(y.project.id),placements:_i.listPlacements(y.project.id),servers:Ja.list(y.project.id)},200,{"cache-control":"no-store"});if(q.pathname==="/api/capacity"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,pool:_i.createPool({organizationId:y.organization.id,projectId:y.project.id,name:String(P.name??""),purpose:String(P.purpose??"application"),backend:String(P.backend??"server"),region:P.region?String(P.region):void 0,architecture:P.architecture?String(P.architecture):void 0,labels:P.labels&&typeof P.labels==="object"?P.labels:{},requiredServerLabels:P.requiredServerLabels&&typeof P.requiredServerLabels==="object"?P.requiredServerLabels:{},toleratedTaints:Array.isArray(P.toleratedTaints)?P.toleratedTaints.map(String):[],capacity:P.capacity&&typeof P.capacity==="object"?P.capacity:{},maxWorkloads:Number(P.maxWorkloads??10),costWeight:Number(P.costWeight??1),spreadKey:P.spreadKey?String(P.spreadKey):void 0,concurrency:Number(P.concurrency??1),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"})},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/capacity/member"&&N.method==="POST"){let P=await re(N);try{return _i.addMember(String(P.poolId??""),String(P.serverId??"")),x({ok:!0,pool:_i.getPool(String(P.poolId??""))})}catch(F){return A(F,422)}}if(q.pathname==="/api/capacity/explain"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,decisions:Am.explain(y.project.id,{purpose:String(P.purpose??"application"),resources:P.resources&&typeof P.resources==="object"?P.resources:{},region:P.region?String(P.region):void 0,architecture:P.architecture?String(P.architecture):void 0,labels:P.labels&&typeof P.labels==="object"?P.labels:{}})})}catch(F){return A(F,422)}}if(q.pathname==="/api/capacity/action"&&N.method==="POST"){let P=await re(N);try{if(P.action==="drain")return x({ok:!0,...Am.drainPool(String(P.poolId??""))});if(P.action==="enable")return x({ok:!0,pool:_i.updatePool(String(P.poolId??""),{status:"active"})});if(P.action==="disable")return x({ok:!0,pool:_i.updatePool(String(P.poolId??""),{status:"disabled"})});return A("Unsupported capacity action.",422)}catch(F){return A(F,422)}}}if(q.pathname.startsWith("/api/regions")){let A=(P,F=409)=>x({ok:!1,error:P instanceof Error?P.message:String(P)},F,{"cache-control":"no-store"});if(q.pathname==="/api/regions"&&N.method==="GET")return x({ok:!0,topologies:bo.list(y.project.id).map((P)=>({topology:P,targets:bo.targets(P.id),channels:bo.channels(P.id),route:bo.route(P.id),executions:bo.executions(P.id)}))},200,{"cache-control":"no-store"});if(q.pathname==="/api/regions"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,topology:Cm.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:y.environments.get(Ce)?.id,name:String(P.name??""),hostname:String(P.hostname??""),regions:Array.isArray(P.regions)?P.regions:[],trafficPolicy:P.trafficPolicy==="weighted"||P.trafficPolicy==="latency"?P.trafficPolicy:"active_passive",dataPolicy:{replicate:Array.isArray(P.replicate)?P.replicate:["s3","dynamodb","secrets"],maxLagSeconds:Number(P.maxLagSeconds??30),retainOnDestroy:P.retainOnDestroy!==!1},dnsProvider:"route53",cdnEnabled:P.cdnEnabled===!0,wafEnabled:P.wafEnabled===!0})},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/regions/action"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,...Cm.enqueue({topologyId:String(P.topologyId??""),kind:String(P.action??""),targetRegion:P.targetRegion?String(P.targetRegion):void 0,revision:P.revision?String(P.revision):void 0,manifest:P.manifest&&typeof P.manifest==="object"?P.manifest:{},confirmation:P.confirmation?String(P.confirmation):void 0,deleteData:P.deleteData===!0})},202)}catch(F){return A(F,422)}}}if(q.pathname.startsWith("/api/maintenance")){let A=(P,F=409)=>x({ok:!1,error:P instanceof Error?P.message:String(P)},F,{"cache-control":"no-store"});if(q.pathname==="/api/maintenance"&&N.method==="GET")return x({ok:!0,manifests:ai.manifests(y.organization.id),windows:ai.windows(y.project.id),campaigns:ai.campaigns(y.project.id).map((P)=>({campaign:P,targets:ai.targets(P.id)})),cleanups:ai.cleanups(y.project.id),drills:ai.drills(y.project.id)},200,{"cache-control":"no-store"});if(q.pathname==="/api/maintenance/cleanup-preview"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,plan:await Qu.previewCleanup({projectId:y.project.id,kind:String(P.kind??"operations"),criteria:{olderThanDays:Number(P.olderThanDays??30)}},Pm)},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/maintenance/cleanup-apply"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,...Qu.enqueueCleanup(String(P.planId??""),String(P.confirmation??""))},202)}catch(F){return A(F,422)}}if(q.pathname==="/api/maintenance/drill"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,drill:ai.createDrill({projectId:y.project.id,scenario:String(P.scenario??"control_plane"),isolatedTarget:String(P.isolatedTarget??""),expectedRpoMinutes:Number(P.expectedRpoMinutes??60),expectedRtoMinutes:Number(P.expectedRtoMinutes??30),recoveryPointId:P.recoveryPointId?String(P.recoveryPointId):void 0,topologyId:P.topologyId?String(P.topologyId):void 0})},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/maintenance/drill-run"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,...Qu.enqueueDrill(String(P.drillId??""))},202)}catch(F){return A(F,422)}}}if(q.pathname.startsWith("/api/volumes")){let A=y.environments.get(Ce),P=We(me).actor?.id,F=(U,H=409)=>x({ok:!1,error:U instanceof Error?U.message:String(U)},H,{"cache-control":"no-store"});if(q.pathname==="/api/volumes"&&N.method==="GET"){let U=Ju.inventory(y.project.id,A?.id),H=y.store.listResources(y.project.id,A?.id).map((Q)=>({id:Q.id,name:Q.name,slug:Q.slug,kind:Q.kind,provider:Q.provider,providerId:Q.providerId}));return x({ok:!0,volumes:U,resources:H,operations:Vt.list({projectId:y.project.id,limit:100}).filter((Q)=>Q.operation.kind.startsWith("volume.")),recoveryPoints:br.listRecoveryPoints(y.project.id).filter((Q)=>Q.kind==="volume"),providers:Gu.map((Q)=>({provider:Q.provider,type:Q.type,capabilities:Q.capabilities()}))},200,{"cache-control":"no-store"})}if(q.pathname==="/api/volumes"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:A?.id,resourceId:U.resourceId?String(U.resourceId):void 0,name:String(U.name??""),provider:String(U.provider??"docker"),type:U.type==="docker"?"docker":U.type,capacityBytes:U.capacityBytes==null?void 0:Number(U.capacityBytes),filesystem:U.filesystem?String(U.filesystem):void 0,encrypted:U.encrypted===!0,desiredState:U.desiredState&&typeof U.desiredState==="object"?U.desiredState:{},actorId:P})},202,{"cache-control":"no-store"})}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/attach"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.attach(String(U.volumeId??""),{resourceId:String(U.resourceId??""),targetPath:String(U.targetPath??""),readOnly:U.readOnly===!0,uid:U.uid==null?void 0:Number(U.uid),gid:U.gid==null?void 0:Number(U.gid),mode:U.mode?String(U.mode):void 0,propagation:U.propagation,driverOptions:U.driverOptions&&typeof U.driverOptions==="object"?U.driverOptions:{},actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/detach"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.detach(String(U.volumeId??""),String(U.attachmentId??""),{force:U.force===!0,drained:U.drained===!0,unmounted:U.unmounted===!0,confirmation:U.confirmation?String(U.confirmation):void 0,actorId:P})},202)}catch(H){return F(H)}}if(q.pathname==="/api/volumes/resize"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.resize(String(U.volumeId??""),Number(U.capacityBytes),{drained:U.drained===!0,actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/snapshot"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.snapshot(String(U.volumeId??""),{name:U.name?String(U.name):void 0,actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/restore"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.restore(String(U.snapshotId??""),{name:String(U.name??""),actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/discover"&&N.method==="POST")try{return x({ok:!0,volumes:await si.discover({organizationId:y.organization.id,projectId:y.project.id,environmentId:A?.id,actorId:P})})}catch(U){return F(U,502)}if(q.pathname==="/api/volumes/adopt"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,volume:si.adopt(String(U.volumeId??""),{name:String(U.name??""),actorId:P})})}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes"&&N.method==="DELETE"){let U=await re(N),H=lr.resolveSession(N);try{return x({ok:!0,...si.delete(String(U.volumeId??""),{recentAuthAt:!xe||H&&Ne.isRecentlyAuthenticated(H)?new Date().toISOString():void 0,confirmation:U.confirmation?String(U.confirmation):void 0,backupOverride:U.backupOverride===!0,backupOverrideConfirmation:U.backupOverrideConfirmation?String(U.backupOverrideConfirmation):void 0,actorId:P})},202)}catch(Q){return F(Q)}}}if(q.pathname==="/api/backups"&&N.method==="GET"){let A=y.environments.get(Ce),P=br.listPolicies(y.project.id,A?.id),F=new Set(P.map((ee)=>ee.id)),U=br.listRecoveryPoints(y.project.id).filter((ee)=>!ee.policyId||F.has(ee.policyId)),H=br.listJobs(y.project.id).filter((ee)=>!ee.policyId||F.has(ee.policyId)),Q=(ee)=>({...ee,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!ee.credentialRef,clientEncryptionConfigured:!!ee.encryptionKeyRef}),J=await Promise.all(br.listDestinations(y.project.id).map(async(ee)=>({...Q(ee),credentialStatus:await fu(ee,oi)})));return x({ok:!0,destinations:J,policies:P,recoveryPoints:U,jobs:H,coverage:br.coverage(y.project.id).filter((ee)=>F.has(ee.policy.id)),resources:A?y.store.listResources(y.project.id,A.id).map((ee)=>({id:ee.id,name:ee.name,slug:ee.slug,kind:ee.kind})):[]})}if(q.pathname==="/api/backups/destinations"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim(),F=String(A.provider??""),U=String(A.encryption??"provider"),H=`secret://data-services/backups/${y.project.id}/${P}`,Q=[];if(!["aws_s3","s3_compatible","aws_backup"].includes(F))return x({ok:!1,error:"A supported backup destination provider is required."},422);if(!["provider","client_side","both"].includes(U))return x({ok:!1,error:"Encryption must be provider, client_side, or both."},422);try{let J,ee;if(A.credentials&&typeof A.credentials==="object"&&!Array.isArray(A.credentials))J=`${H}/credentials`,await oi.put(J,JSON.stringify(A.credentials)),Q.push(J);if(U!=="provider"){let ve=String(A.encryptionKey??"");if(ve.length<32)throw Error("Client-side encryption keys must contain at least 32 characters.");ee=`${H}/encryption-key`,await oi.put(ee,ve),Q.push(ee)}let Se=br.createDestination({organizationId:y.organization.id,projectId:y.project.id,name:P,provider:F,endpoint:A.endpoint?String(A.endpoint):void 0,endpointPolicy:A.endpointPolicy==="allow_private"?"allow_private":"public_https",bucket:A.bucket?String(A.bucket):void 0,prefix:String(A.prefix??""),region:A.region?String(A.region):Pi,forcePathStyle:A.forcePathStyle===!0,credentialRef:J,encryption:U,encryptionKeyRef:ee,immutability:A.immutability&&typeof A.immutability==="object"&&!Array.isArray(A.immutability)?A.immutability:{},status:"untested"});return x({ok:!0,destination:{...Se,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!J,clientEncryptionConfigured:!!ee}},201)}catch(J){for(let ee of Q)await oi.remove(ee).catch(()=>{});return x({ok:!1,error:J instanceof Error?J.message:String(J)},422)}}if(q.pathname==="/api/backups/destinations/test"&&N.method==="POST"){let A=await re(N),P=br.getDestination(String(A.id??""));if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Backup destination was not found."},404);if(P.provider==="aws_backup")return x({ok:!1,error:"AWS Backup destinations are verified by creating a provider recovery point."},422);try{return await Rm.test(P),x({ok:!0,destination:br.recordDestinationTest(P.id,{ok:!0})})}catch(F){let U=F instanceof Error?F.message:String(F);return br.recordDestinationTest(P.id,{ok:!1,error:U}),x({ok:!1,error:U},502)}}if(q.pathname==="/api/backups/policies"&&N.method==="POST"){let A=await re(N),P=y.environments.get(Ce),F=br.getDestination(String(A.destinationId??"")),U=String(A.resourceKind??""),H=A.dataServiceId?String(A.dataServiceId):void 0,Q=H?or.get(H):void 0,J=A.resourceId?String(A.resourceId):void 0,ee=J?y.store.getResource(J):void 0;if(!P)return x({ok:!1,error:"Environment was not found."},404);if(!F||F.projectId!==y.project.id)return x({ok:!1,error:"Backup destination was not found."},404);if(!["managed_database","logical_database","volume","files","control_plane","infrastructure"].includes(U))return x({ok:!1,error:"A supported backup resource kind is required."},422);if(H&&(!Q||Q.projectId!==y.project.id||Q.environmentId!==P.id))return x({ok:!1,error:"Data service was not found in this environment."},404);if(J&&(!ee||ee.projectId!==y.project.id||ee.environmentId!==P.id))return x({ok:!1,error:"Resource was not found in this environment."},404);if(U==="managed_database"&&!Q)return x({ok:!1,error:"Managed database policies require a data service."},422);if(U==="logical_database"&&(!Q||!["container","server"].includes(Q.provider)))return x({ok:!1,error:"Logical database policies require an on-box data service."},422);if(U==="volume"&&(!ee||!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(String(A.volumeName??""))))return x({ok:!1,error:"Volume policies require a scoped resource and valid volumeName."},422);let Se=Array.isArray(A.includePatterns)?A.includePatterns.map(String).filter(Boolean):[];if(U==="files"&&(!ee||!Se.length))return x({ok:!1,error:"File policies require a scoped resource and at least one project-relative include path."},422);if(U==="control_plane"&&F.encryption==="provider")return x({ok:!1,error:"Control-plane policies require a destination with client-side encryption."},422);if(U==="infrastructure"&&(F.provider!=="aws_backup"||!Se.some((ve)=>ve.startsWith("resource:arn:"))||!Se.some((ve)=>ve.startsWith("role:arn:"))))return x({ok:!1,error:"Infrastructure policies require an AWS Backup destination plus resource:<arn> and role:<arn> include values."},422);try{let ve=br.createPolicy({organizationId:y.organization.id,projectId:y.project.id,environmentId:P.id,resourceId:J,dataServiceId:H,destinationId:F.id,name:String(A.name??"").trim(),resourceKind:U,schedule:String(A.schedule??"daily"),timezone:String(A.timezone??"UTC"),retention:A.retention&&typeof A.retention==="object"&&!Array.isArray(A.retention)?A.retention:{keepLast:7,expireAfterDays:30},compression:["none","gzip","zstd"].includes(String(A.compression))?A.compression:"gzip",encryption:["destination","client_side","both"].includes(String(A.encryption))?A.encryption:"destination",includePatterns:U==="volume"?[String(A.volumeName),...Se]:Se,excludePatterns:Array.isArray(A.excludePatterns)?A.excludePatterns.map(String):[],expectedRpoMinutes:Math.max(1,Number(A.expectedRpoMinutes)||1440),expectedRtoMinutes:Math.max(1,Number(A.expectedRtoMinutes)||120),healthCheckId:A.healthCheckId?String(A.healthCheckId):void 0,enabled:A.enabled!==!1});return x({ok:!0,policy:ve},201)}catch(ve){return x({ok:!1,error:ve instanceof Error?ve.message:String(ve)},422)}}if(q.pathname==="/api/backups/run"&&N.method==="POST"){let A=await re(N),P=br.getPolicy(String(A.policyId??"")),F=y.environments.get(Ce);if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Backup policy was not found in this environment."},404);try{let U=vo.enqueueBackup(P,new Date().toISOString(),We(me).actor?.id);return x({ok:!0,job:U},202)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:String(U)},409)}}if(q.pathname==="/api/backups/verify"&&N.method==="POST"){let A=await re(N),P=br.getRecoveryPoint(String(A.recoveryPointId??""));if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Recovery point was not found."},404);return x({ok:!0,job:vo.enqueueVerification(P)},202)}if(q.pathname==="/api/backups/restore"&&N.method==="POST"){let A=await re(N),P=br.getRecoveryPoint(String(A.recoveryPointId??"")),F=A.mode==="in_place"?"in_place":"isolated",U=A.target&&typeof A.target==="object"&&!Array.isArray(A.target)?{...A.target,inPlace:F==="in_place"}:{inPlace:F==="in_place"},H=lr.resolveSession(N),Q={mode:F,target:U,targetName:String(A.targetName??""),confirm:A.confirm?String(A.confirm):void 0,recentAuth:!xe||!!H&&Ne.isRecentlyAuthenticated(H),downtimeAcknowledged:A.downtimeAcknowledged===!0,safetyBackupId:A.safetyBackupId?String(A.safetyBackupId):void 0};if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Recovery point was not found."},404);if(A.drill===!0&&F!=="isolated")return x({ok:!1,error:"Recovery drills must use an isolated target."},422);try{let J=vo.planRestore(P,Q);if(A.execute!==!0)return x({ok:!0,plan:J,executionCreated:!1});let ee=vo.enqueueRestore(P,{...Q,drill:A.drill===!0,actorId:We(me).actor?.id});return x({ok:!0,plan:J,job:ee},202)}catch(J){return x({ok:!1,error:J instanceof Error?J.message:String(J)},409)}}if(q.pathname==="/api/backups/recovery-points"&&N.method==="POST"){let A=await re(N),P=br.getRecoveryPoint(String(A.id??""));if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Recovery point was not found."},404);if(A.held==null&&A.pinned==null)return x({ok:!1,error:"held or pinned must be provided."},422);return x({ok:!0,recoveryPoint:br.updateRecoveryPoint(P.id,{held:A.held==null?P.held:A.held===!0,pinned:A.pinned==null?P.pinned:A.pinned===!0})})}if(q.pathname==="/api/backups/retention"&&N.method==="POST")return x({ok:!0,jobs:vo.enqueueRetention()},202);if(q.pathname==="/api/data-services/capabilities"&&N.method==="GET"){let A=String(q.searchParams.get("engine")??""),P=String(q.searchParams.get("provider")??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(A)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(P))return x({ok:!1,error:"A supported engine and provider are required."},422);return x({ok:!0,engine:A,provider:P,capabilities:sn(A,P)})}if(q.pathname==="/api/data-services"&&N.method==="GET"){let A=y.environments.get(Ce),P=or.list(y.project.id,A?.id).map((F)=>{let U=or.credential(F.id);return{...F,credentialRef:void 0,credential:U?{configured:!0,username:U.username,version:U.version,rotatedAt:U.rotatedAt}:void 0,dependencies:or.dependencies(F.id).map((H)=>({resourceId:H.resourceId,requiresRedeploy:H.requiresRedeploy}))}});return x({ok:!0,services:P})}if(q.pathname==="/api/data-services/preview"&&N.method==="POST"){let A=await re(N);if(A.id){let U=or.get(String(A.id)),H=y.environments.get(Ce),Q=String(A.action??"");if(!U||U.projectId!==y.project.id||U.environmentId!==H?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!Vu.includes(Q))return x({ok:!1,error:`Action must be one of: ${Vu.join(", ")}.`},422);try{return x({ok:!0,plan:Rc.plan(U,Q,A.changes??{})})}catch(J){return x({ok:!1,error:J instanceof Error?J.message:String(J)},422)}}let P=String(A.engine??""),F=String(A.provider??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(P)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(F))return x({ok:!1,error:"A supported engine and provider are required."},422);return x({ok:!0,capabilities:sn(P,F),defaults:{publicExposure:!1,backupRetentionDays:7,deletionProtection:!0},productionExecutionCreated:!1})}if(q.pathname==="/api/data-services"&&N.method==="POST"){let A=await re(N),P=String(A.engine??""),F=String(A.provider??""),U=y.environments.get(Ce),H=We(me);if(!U)return x({ok:!1,error:"Environment was not found."},404);if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(P)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(F))return x({ok:!1,error:"A supported engine and provider are required."},422);let Q={organizationId:y.organization.id,projectId:y.project.id,environmentId:U.id,resourceId:A.resourceId?String(A.resourceId):void 0,name:String(A.name??"").trim(),engine:P,provider:F,placement:String(A.placement??A.name??"").trim(),engineVersion:A.engineVersion?String(A.engineVersion):void 0,plan:String(A.plan??(F==="aws_elasticache"?"cache.t4g.micro":F==="aws_aurora"?"db.serverless":"db.t4g.micro")),storageGb:A.storageGb==null?void 0:Number(A.storageGb),highAvailability:A.highAvailability===!0,publicExposure:A.publicExposure===!0,allowedCidrs:Array.isArray(A.allowedCidrs)?A.allowedCidrs.map(String):[],desiredState:A.desiredState&&typeof A.desiredState==="object"&&!Array.isArray(A.desiredState)?A.desiredState:{},observedState:{},origin:A.adopt===!0?"adopted":"managed",managementEnabled:A.adopt!==!0,ownerActorId:H.actor?.id,username:A.username?String(A.username):void 0};try{if(A.adopt===!0){let ee=or.create({...Q,status:"adopted",credentialRef:void 0});return x({ok:!0,service:ee,readOnly:!0},201)}if(!Em({provider:F,engine:P}))return x({ok:!1,error:`No ${F}/${P} provisioning adapter is configured; adopt it read-only or choose a supported provider.`},422);let J=await Rc.create(Q);return x({ok:!0,service:J.service,operationId:J.operationId,oneTimeCredential:J.credential},201)}catch(J){return x({ok:!1,error:J instanceof Error?J.message:String(J)},422)}}if(q.pathname==="/api/data-services/connections"&&N.method==="GET"){let A=or.get(String(q.searchParams.get("id")??"")),P=y.environments.get(Ce);if(!A||A.projectId!==y.project.id||A.environmentId!==P?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);let F=typeof A.observedState.endpoint==="string"?A.observedState.endpoint:void 0,U=typeof A.observedState.readerEndpoint==="string"?A.observedState.readerEndpoint:void 0,H=Number(A.observedState.port)||(A.engine==="postgres"?5432:A.engine==="redis"?6379:A.engine==="mongodb"?27017:A.engine==="libsql"?8080:3306),Q=typeof A.observedState.database==="string"?A.observedState.database:void 0,J=typeof A.observedState.tls==="boolean"?A.observedState.tls:A.provider.startsWith("aws_"),ee=[...F?[{type:A.publicExposure?"external":"internal",host:F,port:H,database:Q,tls:J}]:[],...U?[{type:"internal",host:U,port:H,database:Q,tls:J}]:[],{type:"tunnel",host:F??A.placement,port:H,database:Q,tls:J}];return x({ok:!0,serviceId:A.id,guidance:Ql(A,ee)})}if(q.pathname==="/api/data-services/action"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce),U=String(A.action??"");if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!Vu.includes(U))return x({ok:!1,error:`Action must be one of: ${Vu.join(", ")}.`},422);let H=A.changes&&typeof A.changes==="object"&&!Array.isArray(A.changes)?A.changes:{};try{let Q=Rc.plan(P,U,H);if(A.execute!==!0)return x({ok:!0,plan:Q,productionExecutionCreated:!1});let J=Rc.enqueue(P,U,H,We(me).actor?.id);return x({ok:!0,plan:Q,operationId:J},202)}catch(Q){return x({ok:!1,error:Q instanceof Error?Q.message:String(Q)},409)}}if(q.pathname==="/api/data-services/dependencies"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce),U=y.store.getResource(String(A.resourceId??""));if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!U||U.projectId!==y.project.id||U.environmentId!==F?.id)return x({ok:!1,error:"Dependent resource was not found in this environment."},404);if(A.remove===!0)return x({ok:or.removeDependency(P.id,U.id)});return or.addDependency({serviceId:P.id,resourceId:U.id,secretRef:P.credentialRef??`secret://data-services/${P.projectId}/${P.name}`,requiresRedeploy:A.requiresRedeploy!==!1}),x({ok:!0,dependencies:or.dependencies(P.id).map((H)=>({resourceId:H.resourceId,requiresRedeploy:H.requiresRedeploy}))})}if(q.pathname==="/api/data-services/management"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce);if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(P.origin!=="adopted"||A.reviewed!==!0||A.confirm!==P.name)return x({ok:!1,error:`Enabling management requires reviewed=true and typing ${P.name}.`},409);return x({ok:!0,service:or.update(P.id,P.version,{managementEnabled:!0})})}if(q.pathname==="/api/data-services/reveal"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce),U=P?or.credential(P.id):void 0;if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!U)return x({ok:!1,error:"No managed credential is configured."},404);return x({ok:!0,credential:{username:U.username,password:await oi.resolve(U.secretRef),version:U.version}},200,{"cache-control":"no-store"})}if(q.pathname==="/api/databases"&&N.method==="GET")return x(await $b(m,Ce));if(q.pathname==="/api/databases"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim();if(!Ii(P))return x({ok:!1,error:"Database name must be a valid identifier (letters, numbers, underscore; not starting with a digit)."},422);return x({...await Nb(m,Ce,P),name:P})}if(q.pathname==="/api/databases/vitess"&&N.method==="GET"){let A=await Lb(m,Ce);return x({...A,unhealthy:Fb(A.tablets),missingPrimary:zb(A)})}if(q.pathname==="/api/databases/vitess/provision"&&N.method==="POST"){let A=await re(N);try{return x(await Qb(m,Ce,{keyspace:String(A.keyspace??""),username:String(A.username??""),password:String(A.password??""),sharded:A.sharded===!0,confirm:String(A.confirm??"")}))}catch(P){return x({ok:!1,error:P instanceof Error?P.message:String(P)},422)}}if(q.pathname==="/api/databases/vitess/migrations"&&N.method==="GET"){let A=q.searchParams.get("keyspace")??void 0;return x(await Jb(m,Ce,A))}if(q.pathname==="/api/databases/vitess/migrations/action"&&N.method==="POST"){let A=await re(N),P=String(A.uuid??"").trim(),F=String(A.action??"");if(!["retry","cancel","cleanup","complete"].includes(F))return x({ok:!1,error:"Unknown migration action."},422);return x(await Gb(m,Ce,P,F))}if(q.pathname==="/api/databases/vitess/keyspaces"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim(),F=A.sharded===!0;return x(await Wb(m,Ce,P,{sharded:F}))}if(q.pathname==="/api/databases/vitess/vschema"&&N.method==="POST"){let A=await re(N),P=String(A.keyspace??"").trim(),F=typeof A.vschema==="string"?A.vschema:JSON.stringify(A.vschema??null);return x(await Hb(m,Ce,P,F))}if(q.pathname==="/api/databases/vitess/schema"&&N.method==="POST"){let A=await re(N),P=String(A.sql??"");return x(await Kb(m,Ce,P))}if(q.pathname==="/api/databases/vitess/install-client"&&N.method==="POST")return x(await Vb(m,Ce));if(q.pathname==="/api/databases/backups"&&N.method==="GET")return x(await Mb(m,Ce));if(q.pathname==="/api/databases/backup"&&N.method==="POST"){let A=await re(N),P=String(A.database??"").trim();if(!Ii(P))return x({ok:!1,error:"Database name must be a valid identifier."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to back up this database.`},409);return x(await Bb(m,Ce,P))}if(q.pathname==="/api/databases/users"&&N.method==="POST"){let A=await re(N),P=String(A.username??"").trim(),F=String(A.password??""),U=String(A.database??"").trim()||void 0,H=A.access==="readonly"?"readonly":"all";if(!Ii(P))return x({ok:!1,error:"Username must be a valid identifier."},422);if(!F)return x({ok:!1,error:"Password is required."},422);if(U&&!Ii(U))return x({ok:!1,error:"Database must be a valid identifier."},422);return x({...await jb(m,Ce,{username:P,password:F,database:U,access:H}),username:P})}if(q.pathname==="/api/dashboard-data")return sr=V.get(Ce)??await Ee(Ce),Ee(Ce),x(lm(sr,{user:$n,slug:m.project.slug}));if(q.pathname==="/api/users"&&N.method==="GET")return x({ok:!0,users:wn(t).map(qa)});if(q.pathname==="/api/users"&&N.method==="POST"){let A=await re(N),P=String(A.username??"").trim();if(!Ou(P))return x({ok:!1,error:"Username must be 2-32 characters: letters, numbers, dot, dash or underscore."},422);let F=A.sites&&typeof A.sites==="object"?A.sites:{},U=new Set(Object.keys(m.sites??{})),H={};for(let[ee,Se]of Object.entries(F)){if(!U.has(ee))return x({ok:!1,error:`Site '${ee}' was not found.`},404);if(Se!=="owner"&&Se!=="collaborator")return x({ok:!1,error:`Unknown site role '${Se}'. Use 'owner' or 'collaborator'.`},422);H[ee]=Se}let Q=typeof A.password==="string"&&A.password.trim()?A.password.trim():void 0;if(Q&&Q.length<12)return x({ok:!1,error:"Password must be at least 12 characters."},422);let J=vc(t,{username:P,password:Q,name:typeof A.name==="string"?A.name:void 0,sites:H});return Zi(y,wn(t)),ot(),x({ok:!0,user:qa(J.user),password:J.password})}if(q.pathname==="/api/users"&&N.method==="DELETE"){let A=await re(N),P=String(A.username??"").trim();if(P.toLowerCase()===me.username.toLowerCase())return x({ok:!1,error:"You cannot remove your own account."},409);let F=Fn(wn(t),P),U=F?y.store.getActorByExternalId("user",`dashboard:${F.username.toLowerCase()}`):void 0,H=U?y.store.getMembershipForActor(y.organization.id,U.id):void 0;if(H&&H.source!=="legacy")return x({ok:!1,error:"Organization members must be removed from Organization access."},409);let Q=am(t,P);if(!Q.ok)return x(Q,409);return Zi(y,wn(t)),ae.clear(),x({ok:!0,username:P})}if(q.pathname==="/api/actions/run"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=A.action?is(A.action,Ce):void 0;if(!P)return x({ok:!1,error:"Unknown dashboard action."},404);if(P.mutates&&A.confirm!==P.confirm)return x({ok:!1,error:`Type "${P.confirm}" to run this action.`},409);let F=await _e({controlPlane:y,environment:Ce,actor:me,kind:`dashboard.action.${P.id}`,input:{action:P.id},execute:()=>wm(P,{cwd:t,cliEntry:l})});return x({...F.result,controlPlaneOperation:F.operation})}if(q.pathname==="/api/server/operations/run"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=A.operation?dm(A.operation,m,sr):void 0;if(!P)return x({ok:!1,error:"Unknown or unavailable server operation."},404);if(P.mutates&&A.confirm!==P.confirm)return x({ok:!1,error:`Type "${P.confirm}" to run this operation.`},409);let F=ne(y,String(Ce));await new St(ut).run(new rn,{...F,artifactRoot:t});let U=zi(ut,{scope:F,desiredConfigHash:y.project.desiredConfigHash});if(U.decision.outcome==="block")return x({ok:!1,error:`Operation blocked by security policy: ${U.decision.explanation}`,securityReview:U},409);let H=await _e({controlPlane:y,environment:Ce,actor:me,kind:`dashboard.server.${P.id}`,resourceSlug:P.target,input:{operation:P.id,target:P.target,to:A.to??null},execute:()=>Bu(m,Ce,P,{to:A.to})});return x({...H.result,controlPlaneOperation:H.operation,securityReview:U})}if(q.pathname==="/api/server/command"&&N.method==="POST"){let A=await N.json().catch(()=>({}));if(A.confirm!=="run")return x({ok:!1,error:'Type "run" to execute this command on the server.'},409);let P=await _e({controlPlane:y,environment:Ce,actor:me,kind:"dashboard.server.command",input:{source:"interactive-command"},execute:()=>bc(m,Ce,String(A.command??""))});return x({...P.result,controlPlaneOperation:P.operation})}if(q.pathname==="/api/serverless/operations")return x(fm(m,Ce,sr));if(q.pathname==="/api/serverless/operations/run"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=A.operation?_S(A.operation,m,Ce,sr):void 0;if(!P)return x({ok:!1,error:"Unknown or unavailable serverless operation."},404);if(P.mutates&&A.confirm!==P.confirm)return x({ok:!1,error:`Type "${P.confirm}" to run this operation.`},409);let F=await _e({controlPlane:y,environment:Ce,actor:me,kind:`dashboard.serverless.${P.id}`,input:{operation:P.id,min:A.min??null,max:A.max??null},execute:()=>TS(m,Ce,P,{min:A.min,max:A.max})});return sr=await vs(m,Ce),V.set(Ce,sr),x({...F.result,controlPlaneOperation:F.operation})}if(q.pathname==="/api/serverless/command"&&N.method==="POST"){let A=await N.json().catch(()=>({}));if(A.confirm!=="run")return x({ok:!1,error:'Type "run" to execute this command.'},409);return x(await xS(m,Ce,String(A.command??"")))}if(q.pathname==="/api/serverless/dlq"&&N.method==="GET"){let A=Number(q.searchParams.get("max"))||10;return x(await DS(m,Ce,A))}if(q.pathname==="/api/serverless/dlq/redrive"&&N.method==="POST"){let A=await N.json().catch(()=>({}));if(A.confirm!=="redrive")return x({ok:!1,error:'Type "redrive" to move messages back onto a source queue.'},409);return x(await OS(m,Ce,{max:A.max,targetQueue:A.targetQueue}))}if(q.pathname==="/api/serverless/dlq/purge"&&N.method==="POST"){if((await N.json().catch(()=>({}))).confirm!=="purge")return x({ok:!1,error:'Type "purge" to permanently discard every DLQ message.'},409);return x(await $S(m,Ce))}if(q.pathname==="/api/serverless/secrets"&&N.method==="GET")return x({secrets:NS(m,Ce)});if(q.pathname==="/api/serverless/secrets"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.secretId??"").trim();if(!P)return x({ok:!1,error:"A secret id is required."},422);if(typeof A.value!=="string"||A.value==="")return x({ok:!1,error:"A non-empty value is required."},422);return x(await jS(m,Ce,P,A.value))}if(q.pathname==="/api/serverless/secrets"&&N.method==="DELETE"){let A=await N.json().catch(()=>({})),P=String(A.secretId??"").trim();if(!P)return x({ok:!1,error:"A secret id is required."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to delete this secret.`},409);return x(await BS(m,Ce,P))}if(q.pathname==="/api/serverless/functions/config"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.mode??"").trim();if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to update this function.`},409);return x(await MS(m,Ce,P,{memory:A.memory,timeout:A.timeout}))}if(q.pathname==="/api/serverless/alarms"&&N.method==="GET")return x(await LS(m,Ce));if(q.pathname==="/api/serverless/alarms"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.preset??"").trim(),F=Number(A.threshold);if(!P)return x({ok:!1,error:"An alarm metric is required."},422);if(!Number.isFinite(F))return x({ok:!1,error:"A numeric threshold is required."},422);return x(await FS(m,Ce,P,F))}if(q.pathname==="/api/serverless/alarms"&&N.method==="DELETE"){let A=await N.json().catch(()=>({})),P=String(A.name??"").trim();if(!P)return x({ok:!1,error:"An alarm name is required."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to delete this alarm.`},409);return x(await zS(m,Ce,P))}if(q.pathname==="/api/serverless/traces"&&N.method==="GET"){let A=Number(q.searchParams.get("minutes"))||30;return x(await Uu(m,Ce,A))}if(q.pathname==="/api/serverless/scheduler"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.action??"").trim();if(P!=="enable"&&P!=="disable"&&P!=="run")return x({ok:!1,error:"Unknown scheduler action."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to ${P} the scheduler.`},409);return x(await vm(m,Ce,P))}if(!nw(q.pathname,$n))return new Response(null,{status:302,headers:{location:`/access-denied?env=${encodeURIComponent(Ce)}`}});let Es=await Qt(me,Ce);if(!Es)return Hu("ts-cloud dashboard UI is unavailable.",503);return iw(Es,q.pathname)}catch(So){if(e.verbose)console.error(So);return x({ok:!1,error:So?.message??String(So)},500)}})();if(!vr)return vr;if(Rt&&(q.pathname.startsWith("/api/")||q.pathname.startsWith("/auth/"))){let at;if((Fe.headers.get("content-type")||"").includes("application/json"))at=await Fe.json().catch(()=>{return});let $r=lr.resolveUser(N),Rr=$r?We($r).actor:void 0;y.store.appendEvent({organizationId:y.organization.id,projectId:y.project.id,actorId:Rr?.id,correlationId:Ge,type:vr.status<400?"dashboard.mutation.succeeded":"dashboard.mutation.failed",level:vr.status<400?"info":"warning",payload:H_(N.method,q.pathname,at,vr.status,Date.now()-qe)})}return vr.headers.set("x-request-id",Ge),vr}});Ac?.start();let bw=e.spendLoop??!0,qm;if(bw)(async()=>{let{SpendRunner:N,SpendLoopLease:ze,startSpendLoop:qe}=await import("./spend/index.js"),{store:Fe}=await sw(y.store),Ge=new N({controlPlane:y.store,store:Fe,alerts:st});qm=qe(Ge,{lease:new ze(y.store,{owner:`dashboard:${process.pid}`}),onError:(Rt)=>console.error(`[ts-cloud] spend cycle failed: ${Rt instanceof Error?Rt.message:String(Rt)}`)})})();let Sw=ks.stop.bind(ks);return ks.stop=(N)=>{clearInterval(Mm),clearInterval(Lm),clearInterval(Fm),clearInterval(Bm),clearInterval(Nm),clearInterval(xm),clearInterval(Dm),clearInterval(Om),clearInterval($m),ot(),Sr.clear(),Ac?.stop(),qm?.();let ze=Sw(N);if(Ac)Ac.settled().finally(()=>y.store.close());else y.store.close();return ze},{server:ks,url:`http://${r}:${ks.port}/`}}export{_o,Vm,sl,fy,Fi,ol,Oo,jm,zm,Jr,xo,al,Xe,cl,dl,ll,Ui,Xr,Km,Ye,ul,Lo,$o,Mo,pl,gl,ml,Qi,Fo,hl,Yr,Hi,Uo,It,Wm,fl,Al,Jm,yl,Qo,Yt,Il,Sl,Cl,El,Ze,Xm,bl,Zt,Ho,Go,qo,Gi,qi,Zr,vl,Vi,Vo,jo,en,Tl,tn,Ym,Zm,St,rn,zo,eh,wl,Rl,Ko,Dl,Pl,Nl,Ay,ne,kl,yy,Iy,ji,zi,Sy,he,th,Ct,ke,Be,Et,Bl,_l,Ol,xl,rh,nh,Wo,ih,sh,Jo,Ll,$l,oh,ie,ah,Ml,fe,Xo,et,bt,vt,nn,Ki,Fl,Cy,Yo,ch,dh,lh,uh,Zo,ea,Ul,sn,ta,Ql,Wi,Hl,ra,na,ia,sa,oa,aa,ca,da,Gl,er,la,ql,on,Vl,ua,pa,jl,tr,ga,ma,ph,Ey,Ji,by,vy,Ty,ha,fa,zl,gh,Aa,an,Kl,Xi,Wl,Jl,Xl,ya,mh,Ia,Yl,hh,Sa,fh,cn,dn,Zl,Yi,eu,tu,ru,Ca,nu,iu,Ah,su,E,ou,Zi,_e,au,cu,wy,du,lu,uu,pu,gu,yh,Ry,Dy,Py,Ih,Sh,Ny,ky,Ch,Eh,By,es,rr,Ea,ln,un,nr,tt,Tt,ts,bh,pn,mu,hu,ba,vh,va,Th,wh,fu,Ta,rs,Au,wa,wt,Oe,yu,Ra,Da,Iu,Pa,Na,ka,Ba,Su,Cu,gn,_a,Oa,xa,La,Eu,ns,mn,is,$a};
|
|
709
|
+
`);return new Response(ct,{headers:{"content-disposition":'attachment; filename="ts-cloud-telemetry.csv"',"content-type":"text/csv; charset=utf-8"}})}if(q.pathname==="/api/telemetry/saved-queries"&&N.method==="GET"){let Pe=We(me);return x({ok:!0,queries:P.listSavedQueries(y.project.id,Pe.actor?.id)})}if(q.pathname==="/api/telemetry/saved-queries"&&N.method==="POST"){let Pe=await re(N),He=We(me);return x({ok:!0,query:P.saveQuery(y.project.id,He.actor?.id,String(Pe.name??""),ee(Pe.query??Pe))},201)}if(q.pathname==="/api/telemetry/saved-queries"&&N.method==="DELETE"){let Pe=await re(N),He=We(me),Te=P.deleteSavedQuery(y.project.id,He.actor?.id,String(Pe.id??""));return x({ok:Te},Te?200:404)}}if(q.pathname.startsWith("/api/configuration")){let A=y.environments.get(Ce),P=me.role==="admin"||!!$n.capabilities?.includes("secrets:read"),F=me.role==="admin"||!!$n.capabilities?.includes("secrets:write"),U={projectId:y.project.id,environmentId:A?.id},H={"cache-control":"no-store"};if(q.pathname==="/api/configuration"&&N.method==="GET"){let Q=Object.fromEntries(q.searchParams),J=Q.scopeType||Q.scopeId?Wa(Q,U):void 0,ee=["variable","secret"].includes(String(Q.kind))?Q.kind:void 0,Se=J?.type==="preview"?yr.previews.getInstance(J.id):void 0,ve=Se?yr.previews.getDefinition(Se.definitionId):void 0,nt=J?await kn.resolve({projectId:y.project.id,environmentId:J.environmentId,resourceId:J.resourceId,functionId:J.type==="function"?J.id:void 0,previewId:J.previewId,trustedPreview:!!Se&&!Se.fork,allowedPreviewSecrets:ve?.inheritedSecrets,nativeReferences:!0,canReadSecretMetadata:P}):void 0,Pe=y.store.listResources(y.project.id);return x({ok:!0,entries:kn.list({projectId:y.project.id,scope:J,kind:ee,search:Q.search,canReadSecretMetadata:P}),effectiveEntries:nt?Object.values(nt.entries).filter((He)=>!ee||He.kind===ee).filter((He)=>!Q.search||He.key.toLowerCase().includes(String(Q.search).toLowerCase())):[],configurationHash:nt?.configurationHash,warnings:nt?.warnings??[],scopes:{project:y.project,environments:y.store.listEnvironments(y.project.id),resources:Pe.filter((He)=>He.kind!=="function"),functions:Pe.filter((He)=>He.kind==="function"),previews:yr.previews.listInstances({projectId:y.project.id}).filter((He)=>He.status!=="destroyed").map((He)=>({id:He.id,name:He.name,environmentId:He.baseEnvironmentId,resourceId:He.resourceId,fork:He.fork,status:He.status}))}},200,H)}if(q.pathname==="/api/configuration/export"&&N.method==="GET"){let Q=Wa(Object.fromEntries(q.searchParams),U);return new Response(kn.exportVariables({projectId:y.project.id,scope:Q}),{headers:{...H,"content-disposition":'attachment; filename="ts-cloud.env"',"content-type":"text/plain; charset=utf-8"}})}if(q.pathname==="/api/configuration/plan"&&N.method==="POST"){let Q=await re(N),J=Wa(Q,U),ee=Q.values&&typeof Q.values==="object"&&!Array.isArray(Q.values)?Object.fromEntries(Object.entries(Q.values).map(([Se,ve])=>[Se,String(ve)])):{};return x({ok:!0,plan:kn.plan({projectId:y.project.id,scope:J,values:ee,removeMissing:Q.removeMissing===!0})},200,H)}if(q.pathname==="/api/configuration"&&N.method==="POST"){let Q=await re(N),J=Wa(Q,U),ee=Q.kind==="secret"?"secret":"variable",Se=String(Q.key??"");if(ee==="secret"&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);try{let ve=await kn.set({organizationId:y.organization.id,projectId:y.project.id,scope:J,key:Se,kind:ee,value:Q.value==null?void 0:String(Q.value),reference:Q.reference==null?void 0:String(Q.reference),backend:Q.backend,required:Q.required===!0,expectedVersion:Q.expectedVersion==null?void 0:Number(Q.expectedVersion),confirmed:String(Q.confirm??"")===Se,idempotencyKey:N.headers.get("idempotency-key")??Q.idempotencyKey,actorId:We(me).actor?.id});return x({ok:!0,entry:kn.list({projectId:y.project.id,scope:J,canReadSecretMetadata:P}).find((nt)=>nt.id===ve.entry.id),mutation:ve.mutation,warnings:ve.warnings},ve.mutation.added.length?201:200,H)}catch(ve){return x({ok:!1,error:ve instanceof Error?ve.message:String(ve)},409,H)}}if(q.pathname==="/api/configuration/import"&&N.method==="POST"){let Q=await re(N),J=Wa(Q,U),ee=Array.isArray(Q.secretKeys)?Q.secretKeys.map(String):[];if(ee.length&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);try{let Se=await kn.importDotenv({organizationId:y.organization.id,projectId:y.project.id,scope:J,source:String(Q.source??""),secretKeys:ee,backend:Q.backend,confirmed:Q.confirm==="import",idempotencyKey:N.headers.get("idempotency-key")??Q.idempotencyKey,actorId:We(me).actor?.id});return x({ok:Se.document.valid,diagnostics:Se.document.diagnostics,mutation:Se.mutation,warnings:Se.warnings},Se.document.valid?200:422,H)}catch(Se){return x({ok:!1,error:Se instanceof Error?Se.message:String(Se)},409,H)}}if(q.pathname==="/api/configuration/dependencies"&&N.method==="POST"){let Q=await re(N),J=Ci.get(String(Q.entryId??"")),ee=y.store.getResource(String(Q.resourceId??""));if(!J||J.projectId!==y.project.id||!ee||ee.projectId!==y.project.id)return x({ok:!1,error:"Configuration entry or dependent resource was not found."},404,H);return x({ok:!0,dependency:Ci.setDependency({entryId:J.id,resourceId:ee.id,injectionTarget:["native_reference","file"].includes(String(Q.injectionTarget))?Q.injectionTarget:"environment",required:Q.required!==!1,requiresRedeploy:Q.requiresRedeploy!==!1,lastDeployedVersion:Q.lastDeployedVersion==null?void 0:Number(Q.lastDeployedVersion)})},200,H)}if(q.pathname==="/api/configuration/transfer"&&N.method==="POST"){let Q=await re(N),J=Ci.get(String(Q.id??"")),ee=Wa({...Q,scopeType:Q.targetScopeType,scopeId:Q.targetScopeId},U);if(!J||J.projectId!==y.project.id)return x({ok:!1,error:"Configuration entry was not found."},404,H);if(J.kind==="secret"&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);try{let Se=await kn.transfer({entryId:J.id,targetScope:ee,mode:Q.mode==="move"?"move":"copy",confirmed:Q.confirm===J.key,actorId:We(me).actor?.id,idempotencyKey:N.headers.get("idempotency-key")??Q.idempotencyKey});return x({ok:!0,entry:kn.list({projectId:y.project.id,scope:ee,canReadSecretMetadata:P}).find((ve)=>ve.id===Se.entry.id),mutation:Se.mutation},200,H)}catch(Se){return x({ok:!1,error:Se instanceof Error?Se.message:String(Se)},409,H)}}if(q.pathname==="/api/configuration/bulk"&&N.method==="POST"){let Q=await re(N),J=Array.isArray(Q.ids)?Q.ids.map(String).slice(0,500):[],ee=J.map((ve)=>Ci.get(ve)).filter((ve)=>!!ve&&ve.projectId===y.project.id);if(ee.length!==J.length)return x({ok:!1,error:"One or more configuration entries were not found."},404,H);if(ee.some((ve)=>ve.kind==="secret")&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);if(Q.action!=="delete"||Q.confirm!=="bulk")return x({ok:!1,error:"Bulk deletion requires action delete and confirm bulk."},409,H);let Se=[];try{for(let ve of ee)Se.push(await kn.remove({entryId:ve.id,expectedVersion:ve.version,confirmed:!0,actorId:We(me).actor?.id}));return x({ok:!0,removed:Se.flatMap((ve)=>ve.removed),affectedResourceIds:[...new Set(Se.flatMap((ve)=>ve.affectedResourceIds))].sort()},200,H)}catch(ve){return x({ok:!1,error:ve instanceof Error?ve.message:String(ve),partial:Se.flatMap((nt)=>nt.removed)},409,H)}}if(q.pathname==="/api/configuration/reveal"&&N.method==="POST"){let Q=await re(N),J=lr.resolveSession(N);try{return x({ok:!0,value:await kn.reveal({entryId:String(Q.id??""),canRevealSecrets:P,recentlyAuthenticated:!xe||!!J&&Ne.isRecentlyAuthenticated(J),actorId:We(me).actor?.id})},200,H)}catch(ee){return x({ok:!1,error:ee instanceof Error?ee.message:String(ee)},403,H)}}if(q.pathname==="/api/configuration"&&N.method==="DELETE"){let Q=await re(N),J=Ci.get(String(Q.id??""));if(J?.kind==="secret"&&!F)return x({ok:!1,error:"Secret write permission is required."},403,H);if(!J||J.projectId!==y.project.id)return x({ok:!1,error:"Configuration entry was not found."},404,H);try{return x({ok:!0,mutation:await kn.remove({entryId:J.id,expectedVersion:Number(Q.expectedVersion),confirmed:String(Q.confirm??"")===J.key,actorId:We(me).actor?.id})},200,H)}catch(ee){return x({ok:!1,error:ee instanceof Error?ee.message:String(ee)},409,H)}}}if(q.pathname.startsWith("/api/fleet")){let A=We(me).actor?.id,P=(F,U=409)=>x({ok:!1,error:F instanceof Error?F.message:String(F)},U,{"cache-control":"no-store"});if(q.pathname==="/api/fleet"&&N.method==="GET")return x({ok:!0,servers:Ja.list(y.project.id),resources:y.store.listResources(y.project.id),operations:Vt.list({projectId:y.project.id,limit:200}).filter((F)=>F.operation.kind.startsWith("fleet."))},200,{"cache-control":"no-store"});if(q.pathname==="/api/fleet"&&N.method==="POST"){let F=await re(N);try{return x({ok:!0,server:Zn.enroll({organizationId:y.organization.id,projectId:y.project.id,name:String(F.name??""),provider:["aws","hetzner"].includes(String(F.provider))?F.provider:"ssh",providerId:F.providerId?String(F.providerId):void 0,region:F.region?String(F.region):void 0,zone:F.zone?String(F.zone):void 0,endpoint:String(F.endpoint??""),sshUser:String(F.sshUser??"deploy"),sshPort:F.sshPort?Number(F.sshPort):22,credentialRef:String(F.credentialRef??""),roles:Array.isArray(F.roles)?F.roles:[],labels:F.labels&&typeof F.labels==="object"?F.labels:{}})},201)}catch(U){return P(U,422)}}if(q.pathname==="/api/fleet/action"&&N.method==="POST"){let F=await re(N),U=String(F.id??""),H=String(F.action??"");try{if(H==="test")return x({ok:!0,server:await Zn.test(U)});if(H==="validate")return x({ok:!0,server:await Zn.validate(U)});if(H==="review_host_key")return x({ok:!0,server:Zn.reviewHostKey(U,String(F.fingerprint??""))});if(H==="bootstrap")return x({ok:!0,...Zn.bootstrap(U,F.confirmed===!0)},F.confirmed===!0?202:200);if(H==="heartbeat")return x({ok:!0,server:Zn.heartbeat(U,{usage:F.usage&&typeof F.usage==="object"?F.usage:{}})});if(H==="drain")return x({ok:!0,server:Zn.drain(U,F.completed===!0)});if(H==="uncordon")return x({ok:!0,server:Zn.uncordon(U)});if(H==="archive")return x({ok:!0,server:Zn.archive(U,String(F.confirmation??""))});return P("Unsupported fleet action.",422)}catch(Q){return P(Q)}}}if(q.pathname.startsWith("/api/capacity")){let A=(P,F=409)=>x({ok:!1,error:P instanceof Error?P.message:String(P)},F,{"cache-control":"no-store"});if(q.pathname==="/api/capacity"&&N.method==="GET")return x({ok:!0,pools:_i.listPools(y.project.id),placements:_i.listPlacements(y.project.id),servers:Ja.list(y.project.id)},200,{"cache-control":"no-store"});if(q.pathname==="/api/capacity"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,pool:_i.createPool({organizationId:y.organization.id,projectId:y.project.id,name:String(P.name??""),purpose:String(P.purpose??"application"),backend:String(P.backend??"server"),region:P.region?String(P.region):void 0,architecture:P.architecture?String(P.architecture):void 0,labels:P.labels&&typeof P.labels==="object"?P.labels:{},requiredServerLabels:P.requiredServerLabels&&typeof P.requiredServerLabels==="object"?P.requiredServerLabels:{},toleratedTaints:Array.isArray(P.toleratedTaints)?P.toleratedTaints.map(String):[],capacity:P.capacity&&typeof P.capacity==="object"?P.capacity:{},maxWorkloads:Number(P.maxWorkloads??10),costWeight:Number(P.costWeight??1),spreadKey:P.spreadKey?String(P.spreadKey):void 0,concurrency:Number(P.concurrency??1),ephemeralWorkspaces:!0,allowProductionSecrets:!1,status:"active"})},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/capacity/member"&&N.method==="POST"){let P=await re(N);try{return _i.addMember(String(P.poolId??""),String(P.serverId??"")),x({ok:!0,pool:_i.getPool(String(P.poolId??""))})}catch(F){return A(F,422)}}if(q.pathname==="/api/capacity/explain"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,decisions:Am.explain(y.project.id,{purpose:String(P.purpose??"application"),resources:P.resources&&typeof P.resources==="object"?P.resources:{},region:P.region?String(P.region):void 0,architecture:P.architecture?String(P.architecture):void 0,labels:P.labels&&typeof P.labels==="object"?P.labels:{}})})}catch(F){return A(F,422)}}if(q.pathname==="/api/capacity/action"&&N.method==="POST"){let P=await re(N);try{if(P.action==="drain")return x({ok:!0,...Am.drainPool(String(P.poolId??""))});if(P.action==="enable")return x({ok:!0,pool:_i.updatePool(String(P.poolId??""),{status:"active"})});if(P.action==="disable")return x({ok:!0,pool:_i.updatePool(String(P.poolId??""),{status:"disabled"})});return A("Unsupported capacity action.",422)}catch(F){return A(F,422)}}}if(q.pathname.startsWith("/api/regions")){let A=(P,F=409)=>x({ok:!1,error:P instanceof Error?P.message:String(P)},F,{"cache-control":"no-store"});if(q.pathname==="/api/regions"&&N.method==="GET")return x({ok:!0,topologies:bo.list(y.project.id).map((P)=>({topology:P,targets:bo.targets(P.id),channels:bo.channels(P.id),route:bo.route(P.id),executions:bo.executions(P.id)}))},200,{"cache-control":"no-store"});if(q.pathname==="/api/regions"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,topology:Cm.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:y.environments.get(Ce)?.id,name:String(P.name??""),hostname:String(P.hostname??""),regions:Array.isArray(P.regions)?P.regions:[],trafficPolicy:P.trafficPolicy==="weighted"||P.trafficPolicy==="latency"?P.trafficPolicy:"active_passive",dataPolicy:{replicate:Array.isArray(P.replicate)?P.replicate:["s3","dynamodb","secrets"],maxLagSeconds:Number(P.maxLagSeconds??30),retainOnDestroy:P.retainOnDestroy!==!1},dnsProvider:"route53",cdnEnabled:P.cdnEnabled===!0,wafEnabled:P.wafEnabled===!0})},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/regions/action"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,...Cm.enqueue({topologyId:String(P.topologyId??""),kind:String(P.action??""),targetRegion:P.targetRegion?String(P.targetRegion):void 0,revision:P.revision?String(P.revision):void 0,manifest:P.manifest&&typeof P.manifest==="object"?P.manifest:{},confirmation:P.confirmation?String(P.confirmation):void 0,deleteData:P.deleteData===!0})},202)}catch(F){return A(F,422)}}}if(q.pathname.startsWith("/api/maintenance")){let A=(P,F=409)=>x({ok:!1,error:P instanceof Error?P.message:String(P)},F,{"cache-control":"no-store"});if(q.pathname==="/api/maintenance"&&N.method==="GET")return x({ok:!0,manifests:ai.manifests(y.organization.id),windows:ai.windows(y.project.id),campaigns:ai.campaigns(y.project.id).map((P)=>({campaign:P,targets:ai.targets(P.id)})),cleanups:ai.cleanups(y.project.id),drills:ai.drills(y.project.id)},200,{"cache-control":"no-store"});if(q.pathname==="/api/maintenance/cleanup-preview"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,plan:await Qu.previewCleanup({projectId:y.project.id,kind:String(P.kind??"operations"),criteria:{olderThanDays:Number(P.olderThanDays??30)}},Pm)},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/maintenance/cleanup-apply"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,...Qu.enqueueCleanup(String(P.planId??""),String(P.confirmation??""))},202)}catch(F){return A(F,422)}}if(q.pathname==="/api/maintenance/drill"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,drill:ai.createDrill({projectId:y.project.id,scenario:String(P.scenario??"control_plane"),isolatedTarget:String(P.isolatedTarget??""),expectedRpoMinutes:Number(P.expectedRpoMinutes??60),expectedRtoMinutes:Number(P.expectedRtoMinutes??30),recoveryPointId:P.recoveryPointId?String(P.recoveryPointId):void 0,topologyId:P.topologyId?String(P.topologyId):void 0})},201)}catch(F){return A(F,422)}}if(q.pathname==="/api/maintenance/drill-run"&&N.method==="POST"){let P=await re(N);try{return x({ok:!0,...Qu.enqueueDrill(String(P.drillId??""))},202)}catch(F){return A(F,422)}}}if(q.pathname.startsWith("/api/volumes")){let A=y.environments.get(Ce),P=We(me).actor?.id,F=(U,H=409)=>x({ok:!1,error:U instanceof Error?U.message:String(U)},H,{"cache-control":"no-store"});if(q.pathname==="/api/volumes"&&N.method==="GET"){let U=Ju.inventory(y.project.id,A?.id),H=y.store.listResources(y.project.id,A?.id).map((Q)=>({id:Q.id,name:Q.name,slug:Q.slug,kind:Q.kind,provider:Q.provider,providerId:Q.providerId}));return x({ok:!0,volumes:U,resources:H,operations:Vt.list({projectId:y.project.id,limit:100}).filter((Q)=>Q.operation.kind.startsWith("volume.")),recoveryPoints:br.listRecoveryPoints(y.project.id).filter((Q)=>Q.kind==="volume"),providers:Gu.map((Q)=>({provider:Q.provider,type:Q.type,capabilities:Q.capabilities()}))},200,{"cache-control":"no-store"})}if(q.pathname==="/api/volumes"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.create({organizationId:y.organization.id,projectId:y.project.id,environmentId:A?.id,resourceId:U.resourceId?String(U.resourceId):void 0,name:String(U.name??""),provider:String(U.provider??"docker"),type:U.type==="docker"?"docker":U.type,capacityBytes:U.capacityBytes==null?void 0:Number(U.capacityBytes),filesystem:U.filesystem?String(U.filesystem):void 0,encrypted:U.encrypted===!0,desiredState:U.desiredState&&typeof U.desiredState==="object"?U.desiredState:{},actorId:P})},202,{"cache-control":"no-store"})}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/attach"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.attach(String(U.volumeId??""),{resourceId:String(U.resourceId??""),targetPath:String(U.targetPath??""),readOnly:U.readOnly===!0,uid:U.uid==null?void 0:Number(U.uid),gid:U.gid==null?void 0:Number(U.gid),mode:U.mode?String(U.mode):void 0,propagation:U.propagation,driverOptions:U.driverOptions&&typeof U.driverOptions==="object"?U.driverOptions:{},actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/detach"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.detach(String(U.volumeId??""),String(U.attachmentId??""),{force:U.force===!0,drained:U.drained===!0,unmounted:U.unmounted===!0,confirmation:U.confirmation?String(U.confirmation):void 0,actorId:P})},202)}catch(H){return F(H)}}if(q.pathname==="/api/volumes/resize"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.resize(String(U.volumeId??""),Number(U.capacityBytes),{drained:U.drained===!0,actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/snapshot"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.snapshot(String(U.volumeId??""),{name:U.name?String(U.name):void 0,actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/restore"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,...si.restore(String(U.snapshotId??""),{name:String(U.name??""),actorId:P})},202)}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes/discover"&&N.method==="POST")try{return x({ok:!0,volumes:await si.discover({organizationId:y.organization.id,projectId:y.project.id,environmentId:A?.id,actorId:P})})}catch(U){return F(U,502)}if(q.pathname==="/api/volumes/adopt"&&N.method==="POST"){let U=await re(N);try{return x({ok:!0,volume:si.adopt(String(U.volumeId??""),{name:String(U.name??""),actorId:P})})}catch(H){return F(H,422)}}if(q.pathname==="/api/volumes"&&N.method==="DELETE"){let U=await re(N),H=lr.resolveSession(N);try{return x({ok:!0,...si.delete(String(U.volumeId??""),{recentAuthAt:!xe||H&&Ne.isRecentlyAuthenticated(H)?new Date().toISOString():void 0,confirmation:U.confirmation?String(U.confirmation):void 0,backupOverride:U.backupOverride===!0,backupOverrideConfirmation:U.backupOverrideConfirmation?String(U.backupOverrideConfirmation):void 0,actorId:P})},202)}catch(Q){return F(Q)}}}if(q.pathname==="/api/backups"&&N.method==="GET"){let A=y.environments.get(Ce),P=br.listPolicies(y.project.id,A?.id),F=new Set(P.map((ee)=>ee.id)),U=br.listRecoveryPoints(y.project.id).filter((ee)=>!ee.policyId||F.has(ee.policyId)),H=br.listJobs(y.project.id).filter((ee)=>!ee.policyId||F.has(ee.policyId)),Q=(ee)=>({...ee,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!ee.credentialRef,clientEncryptionConfigured:!!ee.encryptionKeyRef}),J=await Promise.all(br.listDestinations(y.project.id).map(async(ee)=>({...Q(ee),credentialStatus:await fu(ee,oi)})));return x({ok:!0,destinations:J,policies:P,recoveryPoints:U,jobs:H,coverage:br.coverage(y.project.id).filter((ee)=>F.has(ee.policy.id)),resources:A?y.store.listResources(y.project.id,A.id).map((ee)=>({id:ee.id,name:ee.name,slug:ee.slug,kind:ee.kind})):[]})}if(q.pathname==="/api/backups/destinations"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim(),F=String(A.provider??""),U=String(A.encryption??"provider"),H=`secret://data-services/backups/${y.project.id}/${P}`,Q=[];if(!["aws_s3","s3_compatible","aws_backup"].includes(F))return x({ok:!1,error:"A supported backup destination provider is required."},422);if(!["provider","client_side","both"].includes(U))return x({ok:!1,error:"Encryption must be provider, client_side, or both."},422);try{let J,ee;if(A.credentials&&typeof A.credentials==="object"&&!Array.isArray(A.credentials))J=`${H}/credentials`,await oi.put(J,JSON.stringify(A.credentials)),Q.push(J);if(U!=="provider"){let ve=String(A.encryptionKey??"");if(ve.length<32)throw Error("Client-side encryption keys must contain at least 32 characters.");ee=`${H}/encryption-key`,await oi.put(ee,ve),Q.push(ee)}let Se=br.createDestination({organizationId:y.organization.id,projectId:y.project.id,name:P,provider:F,endpoint:A.endpoint?String(A.endpoint):void 0,endpointPolicy:A.endpointPolicy==="allow_private"?"allow_private":"public_https",bucket:A.bucket?String(A.bucket):void 0,prefix:String(A.prefix??""),region:A.region?String(A.region):Pi,forcePathStyle:A.forcePathStyle===!0,credentialRef:J,encryption:U,encryptionKeyRef:ee,immutability:A.immutability&&typeof A.immutability==="object"&&!Array.isArray(A.immutability)?A.immutability:{},status:"untested"});return x({ok:!0,destination:{...Se,credentialRef:void 0,encryptionKeyRef:void 0,credentialsConfigured:!!J,clientEncryptionConfigured:!!ee}},201)}catch(J){for(let ee of Q)await oi.remove(ee).catch(()=>{});return x({ok:!1,error:J instanceof Error?J.message:String(J)},422)}}if(q.pathname==="/api/backups/destinations/test"&&N.method==="POST"){let A=await re(N),P=br.getDestination(String(A.id??""));if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Backup destination was not found."},404);if(P.provider==="aws_backup")return x({ok:!1,error:"AWS Backup destinations are verified by creating a provider recovery point."},422);try{return await Rm.test(P),x({ok:!0,destination:br.recordDestinationTest(P.id,{ok:!0})})}catch(F){let U=F instanceof Error?F.message:String(F);return br.recordDestinationTest(P.id,{ok:!1,error:U}),x({ok:!1,error:U},502)}}if(q.pathname==="/api/backups/policies"&&N.method==="POST"){let A=await re(N),P=y.environments.get(Ce),F=br.getDestination(String(A.destinationId??"")),U=String(A.resourceKind??""),H=A.dataServiceId?String(A.dataServiceId):void 0,Q=H?or.get(H):void 0,J=A.resourceId?String(A.resourceId):void 0,ee=J?y.store.getResource(J):void 0;if(!P)return x({ok:!1,error:"Environment was not found."},404);if(!F||F.projectId!==y.project.id)return x({ok:!1,error:"Backup destination was not found."},404);if(!["managed_database","logical_database","volume","files","control_plane","infrastructure"].includes(U))return x({ok:!1,error:"A supported backup resource kind is required."},422);if(H&&(!Q||Q.projectId!==y.project.id||Q.environmentId!==P.id))return x({ok:!1,error:"Data service was not found in this environment."},404);if(J&&(!ee||ee.projectId!==y.project.id||ee.environmentId!==P.id))return x({ok:!1,error:"Resource was not found in this environment."},404);if(U==="managed_database"&&!Q)return x({ok:!1,error:"Managed database policies require a data service."},422);if(U==="logical_database"&&(!Q||!["container","server"].includes(Q.provider)))return x({ok:!1,error:"Logical database policies require an on-box data service."},422);if(U==="volume"&&(!ee||!/^[A-Za-z0-9][A-Za-z0-9_.-]{1,127}$/.test(String(A.volumeName??""))))return x({ok:!1,error:"Volume policies require a scoped resource and valid volumeName."},422);let Se=Array.isArray(A.includePatterns)?A.includePatterns.map(String).filter(Boolean):[];if(U==="files"&&(!ee||!Se.length))return x({ok:!1,error:"File policies require a scoped resource and at least one project-relative include path."},422);if(U==="control_plane"&&F.encryption==="provider")return x({ok:!1,error:"Control-plane policies require a destination with client-side encryption."},422);if(U==="infrastructure"&&(F.provider!=="aws_backup"||!Se.some((ve)=>ve.startsWith("resource:arn:"))||!Se.some((ve)=>ve.startsWith("role:arn:"))))return x({ok:!1,error:"Infrastructure policies require an AWS Backup destination plus resource:<arn> and role:<arn> include values."},422);try{let ve=br.createPolicy({organizationId:y.organization.id,projectId:y.project.id,environmentId:P.id,resourceId:J,dataServiceId:H,destinationId:F.id,name:String(A.name??"").trim(),resourceKind:U,schedule:String(A.schedule??"daily"),timezone:String(A.timezone??"UTC"),retention:A.retention&&typeof A.retention==="object"&&!Array.isArray(A.retention)?A.retention:{keepLast:7,expireAfterDays:30},compression:["none","gzip","zstd"].includes(String(A.compression))?A.compression:"gzip",encryption:["destination","client_side","both"].includes(String(A.encryption))?A.encryption:"destination",includePatterns:U==="volume"?[String(A.volumeName),...Se]:Se,excludePatterns:Array.isArray(A.excludePatterns)?A.excludePatterns.map(String):[],expectedRpoMinutes:Math.max(1,Number(A.expectedRpoMinutes)||1440),expectedRtoMinutes:Math.max(1,Number(A.expectedRtoMinutes)||120),healthCheckId:A.healthCheckId?String(A.healthCheckId):void 0,enabled:A.enabled!==!1});return x({ok:!0,policy:ve},201)}catch(ve){return x({ok:!1,error:ve instanceof Error?ve.message:String(ve)},422)}}if(q.pathname==="/api/backups/run"&&N.method==="POST"){let A=await re(N),P=br.getPolicy(String(A.policyId??"")),F=y.environments.get(Ce);if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Backup policy was not found in this environment."},404);try{let U=vo.enqueueBackup(P,new Date().toISOString(),We(me).actor?.id);return x({ok:!0,job:U},202)}catch(U){return x({ok:!1,error:U instanceof Error?U.message:String(U)},409)}}if(q.pathname==="/api/backups/verify"&&N.method==="POST"){let A=await re(N),P=br.getRecoveryPoint(String(A.recoveryPointId??""));if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Recovery point was not found."},404);return x({ok:!0,job:vo.enqueueVerification(P)},202)}if(q.pathname==="/api/backups/restore"&&N.method==="POST"){let A=await re(N),P=br.getRecoveryPoint(String(A.recoveryPointId??"")),F=A.mode==="in_place"?"in_place":"isolated",U=A.target&&typeof A.target==="object"&&!Array.isArray(A.target)?{...A.target,inPlace:F==="in_place"}:{inPlace:F==="in_place"},H=lr.resolveSession(N),Q={mode:F,target:U,targetName:String(A.targetName??""),confirm:A.confirm?String(A.confirm):void 0,recentAuth:!xe||!!H&&Ne.isRecentlyAuthenticated(H),downtimeAcknowledged:A.downtimeAcknowledged===!0,safetyBackupId:A.safetyBackupId?String(A.safetyBackupId):void 0};if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Recovery point was not found."},404);if(A.drill===!0&&F!=="isolated")return x({ok:!1,error:"Recovery drills must use an isolated target."},422);try{let J=vo.planRestore(P,Q);if(A.execute!==!0)return x({ok:!0,plan:J,executionCreated:!1});let ee=vo.enqueueRestore(P,{...Q,drill:A.drill===!0,actorId:We(me).actor?.id});return x({ok:!0,plan:J,job:ee},202)}catch(J){return x({ok:!1,error:J instanceof Error?J.message:String(J)},409)}}if(q.pathname==="/api/backups/recovery-points"&&N.method==="POST"){let A=await re(N),P=br.getRecoveryPoint(String(A.id??""));if(!P||P.projectId!==y.project.id)return x({ok:!1,error:"Recovery point was not found."},404);if(A.held==null&&A.pinned==null)return x({ok:!1,error:"held or pinned must be provided."},422);return x({ok:!0,recoveryPoint:br.updateRecoveryPoint(P.id,{held:A.held==null?P.held:A.held===!0,pinned:A.pinned==null?P.pinned:A.pinned===!0})})}if(q.pathname==="/api/backups/retention"&&N.method==="POST")return x({ok:!0,jobs:vo.enqueueRetention()},202);if(q.pathname==="/api/data-services/capabilities"&&N.method==="GET"){let A=String(q.searchParams.get("engine")??""),P=String(q.searchParams.get("provider")??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(A)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(P))return x({ok:!1,error:"A supported engine and provider are required."},422);return x({ok:!0,engine:A,provider:P,capabilities:sn(A,P)})}if(q.pathname==="/api/data-services"&&N.method==="GET"){let A=y.environments.get(Ce),P=or.list(y.project.id,A?.id).map((F)=>{let U=or.credential(F.id);return{...F,credentialRef:void 0,credential:U?{configured:!0,username:U.username,version:U.version,rotatedAt:U.rotatedAt}:void 0,dependencies:or.dependencies(F.id).map((H)=>({resourceId:H.resourceId,requiresRedeploy:H.requiresRedeploy}))}});return x({ok:!0,services:P})}if(q.pathname==="/api/data-services/preview"&&N.method==="POST"){let A=await re(N);if(A.id){let U=or.get(String(A.id)),H=y.environments.get(Ce),Q=String(A.action??"");if(!U||U.projectId!==y.project.id||U.environmentId!==H?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!Vu.includes(Q))return x({ok:!1,error:`Action must be one of: ${Vu.join(", ")}.`},422);try{return x({ok:!0,plan:Rc.plan(U,Q,A.changes??{})})}catch(J){return x({ok:!1,error:J instanceof Error?J.message:String(J)},422)}}let P=String(A.engine??""),F=String(A.provider??"");if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(P)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(F))return x({ok:!1,error:"A supported engine and provider are required."},422);return x({ok:!0,capabilities:sn(P,F),defaults:{publicExposure:!1,backupRetentionDays:7,deletionProtection:!0},productionExecutionCreated:!1})}if(q.pathname==="/api/data-services"&&N.method==="POST"){let A=await re(N),P=String(A.engine??""),F=String(A.provider??""),U=y.environments.get(Ce),H=We(me);if(!U)return x({ok:!1,error:"Environment was not found."},404);if(!["postgres","mysql","mariadb","redis","mongodb","libsql"].includes(P)||!["aws_rds","aws_aurora","aws_elasticache","server","container","external"].includes(F))return x({ok:!1,error:"A supported engine and provider are required."},422);let Q={organizationId:y.organization.id,projectId:y.project.id,environmentId:U.id,resourceId:A.resourceId?String(A.resourceId):void 0,name:String(A.name??"").trim(),engine:P,provider:F,placement:String(A.placement??A.name??"").trim(),engineVersion:A.engineVersion?String(A.engineVersion):void 0,plan:String(A.plan??(F==="aws_elasticache"?"cache.t4g.micro":F==="aws_aurora"?"db.serverless":"db.t4g.micro")),storageGb:A.storageGb==null?void 0:Number(A.storageGb),highAvailability:A.highAvailability===!0,publicExposure:A.publicExposure===!0,allowedCidrs:Array.isArray(A.allowedCidrs)?A.allowedCidrs.map(String):[],desiredState:A.desiredState&&typeof A.desiredState==="object"&&!Array.isArray(A.desiredState)?A.desiredState:{},observedState:{},origin:A.adopt===!0?"adopted":"managed",managementEnabled:A.adopt!==!0,ownerActorId:H.actor?.id,username:A.username?String(A.username):void 0};try{if(A.adopt===!0){let ee=or.create({...Q,status:"adopted",credentialRef:void 0});return x({ok:!0,service:ee,readOnly:!0},201)}if(!Em({provider:F,engine:P}))return x({ok:!1,error:`No ${F}/${P} provisioning adapter is configured; adopt it read-only or choose a supported provider.`},422);let J=await Rc.create(Q);return x({ok:!0,service:J.service,operationId:J.operationId,oneTimeCredential:J.credential},201)}catch(J){return x({ok:!1,error:J instanceof Error?J.message:String(J)},422)}}if(q.pathname==="/api/data-services/connections"&&N.method==="GET"){let A=or.get(String(q.searchParams.get("id")??"")),P=y.environments.get(Ce);if(!A||A.projectId!==y.project.id||A.environmentId!==P?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);let F=typeof A.observedState.endpoint==="string"?A.observedState.endpoint:void 0,U=typeof A.observedState.readerEndpoint==="string"?A.observedState.readerEndpoint:void 0,H=Number(A.observedState.port)||(A.engine==="postgres"?5432:A.engine==="redis"?6379:A.engine==="mongodb"?27017:A.engine==="libsql"?8080:3306),Q=typeof A.observedState.database==="string"?A.observedState.database:void 0,J=typeof A.observedState.tls==="boolean"?A.observedState.tls:A.provider.startsWith("aws_"),ee=[...F?[{type:A.publicExposure?"external":"internal",host:F,port:H,database:Q,tls:J}]:[],...U?[{type:"internal",host:U,port:H,database:Q,tls:J}]:[],{type:"tunnel",host:F??A.placement,port:H,database:Q,tls:J}];return x({ok:!0,serviceId:A.id,guidance:Ql(A,ee)})}if(q.pathname==="/api/data-services/action"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce),U=String(A.action??"");if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!Vu.includes(U))return x({ok:!1,error:`Action must be one of: ${Vu.join(", ")}.`},422);let H=A.changes&&typeof A.changes==="object"&&!Array.isArray(A.changes)?A.changes:{};try{let Q=Rc.plan(P,U,H);if(A.execute!==!0)return x({ok:!0,plan:Q,productionExecutionCreated:!1});let J=Rc.enqueue(P,U,H,We(me).actor?.id);return x({ok:!0,plan:Q,operationId:J},202)}catch(Q){return x({ok:!1,error:Q instanceof Error?Q.message:String(Q)},409)}}if(q.pathname==="/api/data-services/dependencies"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce),U=y.store.getResource(String(A.resourceId??""));if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!U||U.projectId!==y.project.id||U.environmentId!==F?.id)return x({ok:!1,error:"Dependent resource was not found in this environment."},404);if(A.remove===!0)return x({ok:or.removeDependency(P.id,U.id)});return or.addDependency({serviceId:P.id,resourceId:U.id,secretRef:P.credentialRef??`secret://data-services/${P.projectId}/${P.name}`,requiresRedeploy:A.requiresRedeploy!==!1}),x({ok:!0,dependencies:or.dependencies(P.id).map((H)=>({resourceId:H.resourceId,requiresRedeploy:H.requiresRedeploy}))})}if(q.pathname==="/api/data-services/management"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce);if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(P.origin!=="adopted"||A.reviewed!==!0||A.confirm!==P.name)return x({ok:!1,error:`Enabling management requires reviewed=true and typing ${P.name}.`},409);return x({ok:!0,service:or.update(P.id,P.version,{managementEnabled:!0})})}if(q.pathname==="/api/data-services/reveal"&&N.method==="POST"){let A=await re(N),P=or.get(String(A.id??"")),F=y.environments.get(Ce),U=P?or.credential(P.id):void 0;if(!P||P.projectId!==y.project.id||P.environmentId!==F?.id)return x({ok:!1,error:"Data service was not found in this environment."},404);if(!U)return x({ok:!1,error:"No managed credential is configured."},404);return x({ok:!0,credential:{username:U.username,password:await oi.resolve(U.secretRef),version:U.version}},200,{"cache-control":"no-store"})}if(q.pathname==="/api/databases"&&N.method==="GET")return x(await $b(m,Ce));if(q.pathname==="/api/databases"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim();if(!Ii(P))return x({ok:!1,error:"Database name must be a valid identifier (letters, numbers, underscore; not starting with a digit)."},422);return x({...await Nb(m,Ce,P),name:P})}if(q.pathname==="/api/databases/vitess"&&N.method==="GET"){let A=await Lb(m,Ce);return x({...A,unhealthy:Fb(A.tablets),missingPrimary:zb(A)})}if(q.pathname==="/api/databases/vitess/provision"&&N.method==="POST"){let A=await re(N);try{return x(await Qb(m,Ce,{keyspace:String(A.keyspace??""),username:String(A.username??""),password:String(A.password??""),sharded:A.sharded===!0,confirm:String(A.confirm??"")}))}catch(P){return x({ok:!1,error:P instanceof Error?P.message:String(P)},422)}}if(q.pathname==="/api/databases/vitess/migrations"&&N.method==="GET"){let A=q.searchParams.get("keyspace")??void 0;return x(await Jb(m,Ce,A))}if(q.pathname==="/api/databases/vitess/migrations/action"&&N.method==="POST"){let A=await re(N),P=String(A.uuid??"").trim(),F=String(A.action??"");if(!["retry","cancel","cleanup","complete"].includes(F))return x({ok:!1,error:"Unknown migration action."},422);return x(await Gb(m,Ce,P,F))}if(q.pathname==="/api/databases/vitess/keyspaces"&&N.method==="POST"){let A=await re(N),P=String(A.name??"").trim(),F=A.sharded===!0;return x(await Wb(m,Ce,P,{sharded:F}))}if(q.pathname==="/api/databases/vitess/vschema"&&N.method==="POST"){let A=await re(N),P=String(A.keyspace??"").trim(),F=typeof A.vschema==="string"?A.vschema:JSON.stringify(A.vschema??null);return x(await Hb(m,Ce,P,F))}if(q.pathname==="/api/databases/vitess/schema"&&N.method==="POST"){let A=await re(N),P=String(A.sql??"");return x(await Kb(m,Ce,P))}if(q.pathname==="/api/databases/vitess/install-client"&&N.method==="POST")return x(await Vb(m,Ce));if(q.pathname==="/api/databases/backups"&&N.method==="GET")return x(await Mb(m,Ce));if(q.pathname==="/api/databases/backup"&&N.method==="POST"){let A=await re(N),P=String(A.database??"").trim();if(!Ii(P))return x({ok:!1,error:"Database name must be a valid identifier."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to back up this database.`},409);return x(await Bb(m,Ce,P))}if(q.pathname==="/api/databases/users"&&N.method==="POST"){let A=await re(N),P=String(A.username??"").trim(),F=String(A.password??""),U=String(A.database??"").trim()||void 0,H=A.access==="readonly"?"readonly":"all";if(!Ii(P))return x({ok:!1,error:"Username must be a valid identifier."},422);if(!F)return x({ok:!1,error:"Password is required."},422);if(U&&!Ii(U))return x({ok:!1,error:"Database must be a valid identifier."},422);return x({...await jb(m,Ce,{username:P,password:F,database:U,access:H}),username:P})}if(q.pathname==="/api/dashboard-data")return sr=V.get(Ce)??await Ee(Ce),Ee(Ce),x(lm(sr,{user:$n,slug:m.project.slug}));if(q.pathname==="/api/users"&&N.method==="GET")return x({ok:!0,users:wn(t).map(qa)});if(q.pathname==="/api/users"&&N.method==="POST"){let A=await re(N),P=String(A.username??"").trim();if(!Ou(P))return x({ok:!1,error:"Username must be 2-32 characters: letters, numbers, dot, dash or underscore."},422);let F=A.sites&&typeof A.sites==="object"?A.sites:{},U=new Set(Object.keys(m.sites??{})),H={};for(let[ee,Se]of Object.entries(F)){if(!U.has(ee))return x({ok:!1,error:`Site '${ee}' was not found.`},404);if(Se!=="owner"&&Se!=="collaborator")return x({ok:!1,error:`Unknown site role '${Se}'. Use 'owner' or 'collaborator'.`},422);H[ee]=Se}let Q=typeof A.password==="string"&&A.password.trim()?A.password.trim():void 0;if(Q&&Q.length<12)return x({ok:!1,error:"Password must be at least 12 characters."},422);let J=vc(t,{username:P,password:Q,name:typeof A.name==="string"?A.name:void 0,sites:H});return Zi(y,wn(t)),ot(),x({ok:!0,user:qa(J.user),password:J.password})}if(q.pathname==="/api/users"&&N.method==="DELETE"){let A=await re(N),P=String(A.username??"").trim();if(P.toLowerCase()===me.username.toLowerCase())return x({ok:!1,error:"You cannot remove your own account."},409);let F=Fn(wn(t),P),U=F?y.store.getActorByExternalId("user",`dashboard:${F.username.toLowerCase()}`):void 0,H=U?y.store.getMembershipForActor(y.organization.id,U.id):void 0;if(H&&H.source!=="legacy")return x({ok:!1,error:"Organization members must be removed from Organization access."},409);let Q=am(t,P);if(!Q.ok)return x(Q,409);return Zi(y,wn(t)),ae.clear(),x({ok:!0,username:P})}if(q.pathname==="/api/actions/run"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=A.action?is(A.action,Ce):void 0;if(!P)return x({ok:!1,error:"Unknown dashboard action."},404);if(P.mutates&&A.confirm!==P.confirm)return x({ok:!1,error:`Type "${P.confirm}" to run this action.`},409);let F=await _e({controlPlane:y,environment:Ce,actor:me,kind:`dashboard.action.${P.id}`,input:{action:P.id},execute:()=>wm(P,{cwd:t,cliEntry:l})});return x({...F.result,controlPlaneOperation:F.operation})}if(q.pathname==="/api/server/operations/run"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=A.operation?dm(A.operation,m,sr):void 0;if(!P)return x({ok:!1,error:"Unknown or unavailable server operation."},404);if(P.mutates&&A.confirm!==P.confirm)return x({ok:!1,error:`Type "${P.confirm}" to run this operation.`},409);let F=ne(y,String(Ce));await new St(ut).run(new rn,{...F,artifactRoot:t});let U=zi(ut,{scope:F,desiredConfigHash:y.project.desiredConfigHash});if(U.decision.outcome==="block")return x({ok:!1,error:`Operation blocked by security policy: ${U.decision.explanation}`,securityReview:U},409);let H=await _e({controlPlane:y,environment:Ce,actor:me,kind:`dashboard.server.${P.id}`,resourceSlug:P.target,input:{operation:P.id,target:P.target,to:A.to??null},execute:()=>Bu(m,Ce,P,{to:A.to})});return x({...H.result,controlPlaneOperation:H.operation,securityReview:U})}if(q.pathname==="/api/server/command"&&N.method==="POST"){let A=await N.json().catch(()=>({}));if(A.confirm!=="run")return x({ok:!1,error:'Type "run" to execute this command on the server.'},409);let P=await _e({controlPlane:y,environment:Ce,actor:me,kind:"dashboard.server.command",input:{source:"interactive-command"},execute:()=>bc(m,Ce,String(A.command??""))});return x({...P.result,controlPlaneOperation:P.operation})}if(q.pathname==="/api/serverless/operations")return x(fm(m,Ce,sr));if(q.pathname==="/api/serverless/operations/run"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=A.operation?_S(A.operation,m,Ce,sr):void 0;if(!P)return x({ok:!1,error:"Unknown or unavailable serverless operation."},404);if(P.mutates&&A.confirm!==P.confirm)return x({ok:!1,error:`Type "${P.confirm}" to run this operation.`},409);let F=await _e({controlPlane:y,environment:Ce,actor:me,kind:`dashboard.serverless.${P.id}`,input:{operation:P.id,min:A.min??null,max:A.max??null},execute:()=>TS(m,Ce,P,{min:A.min,max:A.max})});return sr=await vs(m,Ce),V.set(Ce,sr),x({...F.result,controlPlaneOperation:F.operation})}if(q.pathname==="/api/serverless/command"&&N.method==="POST"){let A=await N.json().catch(()=>({}));if(A.confirm!=="run")return x({ok:!1,error:'Type "run" to execute this command.'},409);return x(await xS(m,Ce,String(A.command??"")))}if(q.pathname==="/api/serverless/dlq"&&N.method==="GET"){let A=Number(q.searchParams.get("max"))||10;return x(await DS(m,Ce,A))}if(q.pathname==="/api/serverless/dlq/redrive"&&N.method==="POST"){let A=await N.json().catch(()=>({}));if(A.confirm!=="redrive")return x({ok:!1,error:'Type "redrive" to move messages back onto a source queue.'},409);return x(await OS(m,Ce,{max:A.max,targetQueue:A.targetQueue}))}if(q.pathname==="/api/serverless/dlq/purge"&&N.method==="POST"){if((await N.json().catch(()=>({}))).confirm!=="purge")return x({ok:!1,error:'Type "purge" to permanently discard every DLQ message.'},409);return x(await $S(m,Ce))}if(q.pathname==="/api/serverless/secrets"&&N.method==="GET")return x({secrets:NS(m,Ce)});if(q.pathname==="/api/serverless/secrets"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.secretId??"").trim();if(!P)return x({ok:!1,error:"A secret id is required."},422);if(typeof A.value!=="string"||A.value==="")return x({ok:!1,error:"A non-empty value is required."},422);return x(await jS(m,Ce,P,A.value))}if(q.pathname==="/api/serverless/secrets"&&N.method==="DELETE"){let A=await N.json().catch(()=>({})),P=String(A.secretId??"").trim();if(!P)return x({ok:!1,error:"A secret id is required."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to delete this secret.`},409);return x(await BS(m,Ce,P))}if(q.pathname==="/api/serverless/functions/config"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.mode??"").trim();if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to update this function.`},409);return x(await MS(m,Ce,P,{memory:A.memory,timeout:A.timeout}))}if(q.pathname==="/api/serverless/alarms"&&N.method==="GET")return x(await LS(m,Ce));if(q.pathname==="/api/serverless/alarms"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.preset??"").trim(),F=Number(A.threshold);if(!P)return x({ok:!1,error:"An alarm metric is required."},422);if(!Number.isFinite(F))return x({ok:!1,error:"A numeric threshold is required."},422);return x(await FS(m,Ce,P,F))}if(q.pathname==="/api/serverless/alarms"&&N.method==="DELETE"){let A=await N.json().catch(()=>({})),P=String(A.name??"").trim();if(!P)return x({ok:!1,error:"An alarm name is required."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to delete this alarm.`},409);return x(await zS(m,Ce,P))}if(q.pathname==="/api/serverless/traces"&&N.method==="GET"){let A=Number(q.searchParams.get("minutes"))||30;return x(await Uu(m,Ce,A))}if(q.pathname==="/api/serverless/scheduler"&&N.method==="POST"){let A=await N.json().catch(()=>({})),P=String(A.action??"").trim();if(P!=="enable"&&P!=="disable"&&P!=="run")return x({ok:!1,error:"Unknown scheduler action."},422);if(A.confirm!==P)return x({ok:!1,error:`Type "${P}" to ${P} the scheduler.`},409);return x(await vm(m,Ce,P))}if(!nw(q.pathname,$n))return new Response(null,{status:302,headers:{location:`/access-denied?env=${encodeURIComponent(Ce)}`}});let Es=await Qt(me,Ce);if(!Es)return Hu("ts-cloud dashboard UI is unavailable.",503);return iw(Es,q.pathname)}catch(So){if(e.verbose)console.error(So);return x({ok:!1,error:So?.message??String(So)},500)}})();if(!vr)return vr;if(Rt&&(q.pathname.startsWith("/api/")||q.pathname.startsWith("/auth/"))){let at;if((Fe.headers.get("content-type")||"").includes("application/json"))at=await Fe.json().catch(()=>{return});let $r=lr.resolveUser(N),Rr=$r?We($r).actor:void 0;y.store.appendEvent({organizationId:y.organization.id,projectId:y.project.id,actorId:Rr?.id,correlationId:Ge,type:vr.status<400?"dashboard.mutation.succeeded":"dashboard.mutation.failed",level:vr.status<400?"info":"warning",payload:K_(N.method,q.pathname,at,vr.status,Date.now()-qe)})}return vr.headers.set("x-request-id",Ge),vr}});Ac?.start();let bw=e.spendLoop??!0,qm;if(bw)(async()=>{let{SpendRunner:N,SpendLoopLease:ze,startSpendLoop:qe}=await import("./spend/index.js"),{store:Fe}=await sw(y.store),Ge=new N({controlPlane:y.store,store:Fe,alerts:st});qm=qe(Ge,{lease:new ze(y.store,{owner:`dashboard:${process.pid}`}),onError:(Rt)=>console.error(`[ts-cloud] spend cycle failed: ${Rt instanceof Error?Rt.message:String(Rt)}`)})})();let Sw=ks.stop.bind(ks);return ks.stop=(N)=>{clearInterval(Mm),clearInterval(Lm),clearInterval(Fm),clearInterval(Bm),clearInterval(Nm),clearInterval(xm),clearInterval(Dm),clearInterval(Om),clearInterval($m),ot(),Sr.clear(),Ac?.stop(),qm?.();let ze=Sw(N);if(Ac)Ac.settled().finally(()=>y.store.close());else y.store.close();return ze},{server:ks,url:`http://${r}:${ks.port}/`}}export{_o,Vm,sl,fy,Fi,ol,Oo,jm,zm,Jr,xo,al,Xe,cl,dl,ll,Ui,Xr,Km,Ye,ul,Lo,$o,Mo,pl,gl,ml,Qi,Fo,hl,Yr,Hi,Uo,It,Wm,fl,Al,Jm,yl,Qo,Yt,Il,Sl,Cl,El,Ze,Xm,bl,Zt,Ho,Go,qo,Gi,qi,Zr,vl,Vi,Vo,jo,en,Tl,tn,Ym,Zm,St,rn,zo,eh,wl,Rl,Ko,Dl,Pl,Nl,Ay,ne,kl,yy,Iy,ji,zi,Sy,he,th,Ct,ke,Be,Et,Bl,_l,Ol,xl,rh,nh,Wo,ih,sh,Jo,Ll,$l,oh,ie,ah,Ml,fe,Xo,et,bt,vt,nn,Ki,Fl,Cy,Yo,ch,dh,lh,uh,Zo,ea,Ul,sn,ta,Ql,Wi,Hl,ra,na,ia,sa,oa,aa,ca,da,Gl,er,la,ql,on,Vl,ua,pa,jl,tr,ga,ma,ph,Ey,Ji,by,vy,Ty,ha,fa,zl,gh,Aa,an,Kl,Xi,Wl,Jl,Xl,ya,mh,Ia,Yl,hh,Sa,fh,cn,dn,Zl,Yi,eu,tu,ru,Ca,nu,iu,Ah,su,E,ou,Zi,_e,au,cu,wy,du,lu,uu,pu,gu,yh,Ry,Dy,Py,Ih,Sh,Ny,ky,Ch,Eh,By,es,rr,Ea,ln,un,nr,tt,Tt,ts,bh,pn,mu,hu,ba,vh,va,Th,wh,fu,Ta,rs,Au,wa,wt,Oe,yu,Ra,Da,Iu,Pa,Na,ka,Ba,Su,Cu,gn,_a,Oa,xa,La,Eu,ns,mn,is,$a};
|