@stacksjs/ts-cloud 0.7.30 → 0.7.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/bin/cli.js +774 -767
  2. package/dist/{chunk-xdd6qvre.js → chunk-0c69nbaa.js} +252 -101
  3. package/dist/{chunk-rr3j38qr.js → chunk-crcjdm09.js} +8 -7
  4. package/dist/{chunk-4ew46pj6.js → chunk-ebx9gjnn.js} +2 -2
  5. package/dist/{chunk-k56wpkhg.js → chunk-stt1z5cx.js} +4 -1
  6. package/dist/{chunk-3mcfbrw8.js → chunk-tskj9fay.js} +1 -1
  7. package/dist/deploy/index.js +4 -4
  8. package/dist/drivers/hetzner/client.d.ts +8 -0
  9. package/dist/drivers/hetzner/driver.d.ts +16 -0
  10. package/dist/drivers/index.d.ts +3 -3
  11. package/dist/drivers/index.js +6 -2
  12. package/dist/drivers/local-box/driver.d.ts +1 -1
  13. package/dist/drivers/shared/compute-deploy.d.ts +9 -3
  14. package/dist/drivers/shared/deploy-script.d.ts +12 -2
  15. package/dist/drivers/shared/fleet.d.ts +12 -1
  16. package/dist/drivers/shared/rpx-gateway.d.ts +26 -0
  17. package/dist/drivers/shared/ssh-keys.d.ts +3 -2
  18. package/dist/index.js +6 -4
  19. package/dist/ui/index.html +3 -3
  20. package/dist/ui/server/actions.html +3 -3
  21. package/dist/ui/server/backups.html +3 -3
  22. package/dist/ui/server/database.html +3 -3
  23. package/dist/ui/server/deployments.html +3 -3
  24. package/dist/ui/server/firewall.html +3 -3
  25. package/dist/ui/server/logs.html +3 -3
  26. package/dist/ui/server/services.html +3 -3
  27. package/dist/ui/server/sites.html +3 -3
  28. package/dist/ui/server/ssh-keys.html +3 -3
  29. package/dist/ui/server/team.html +3 -3
  30. package/dist/ui/server/terminal.html +3 -3
  31. package/dist/ui/server/workers.html +3 -3
  32. package/dist/ui/serverless/alarms.html +3 -3
  33. package/dist/ui/serverless/assets.html +3 -3
  34. package/dist/ui/serverless/data.html +3 -3
  35. package/dist/ui/serverless/deployments.html +3 -3
  36. package/dist/ui/serverless/functions.html +3 -3
  37. package/dist/ui/serverless/logs.html +3 -3
  38. package/dist/ui/serverless/queues.html +3 -3
  39. package/dist/ui/serverless/scheduler.html +3 -3
  40. package/dist/ui/serverless/secrets.html +3 -3
  41. package/dist/ui/serverless/traces.html +3 -3
  42. package/dist/ui/serverless.html +3 -3
  43. package/package.json +3 -3
@@ -6,7 +6,7 @@ import {
6
6
  step,
7
7
  success,
8
8
  warn
9
- } from "./chunk-3mcfbrw8.js";
9
+ } from "./chunk-tskj9fay.js";
10
10
  import {
11
11
  CloudWatchLogsClient,
12
12
  CostExplorerClient,
@@ -28,13 +28,14 @@ import {
28
28
  resolveSiteKind,
29
29
  resolveUiSource,
30
30
  siteInstallBase
31
- } from "./chunk-xdd6qvre.js";
31
+ } from "./chunk-0c69nbaa.js";
32
32
  import {
33
33
  artifactKey,
34
34
  composeServerlessAppTemplate,
35
35
  laravelServerlessEnvDefaults,
36
36
  packagePhpApp,
37
37
  packageServerlessApp,
38
+ resolveAppDatabase,
38
39
  resolveDeploymentMode,
39
40
  resolveQueueNames,
40
41
  resolveQueues,
@@ -42,7 +43,7 @@ import {
42
43
  resolveServerlessArtifactBucketName,
43
44
  resolveServerlessAssetBucketName,
44
45
  resolveServerlessRuntime
45
- } from "./chunk-k56wpkhg.js";
46
+ } from "./chunk-stt1z5cx.js";
46
47
  import {
47
48
  deployStaticSiteWithExternalDnsFull
48
49
  } from "./chunk-d7p84vz5.js";
@@ -347,7 +348,7 @@ async function deployServerlessApp(config, environment, opts = {}) {
347
348
  }
348
349
  if (imageMode) {
349
350
  step("Building + pushing container image");
350
- const { buildAndPushServerlessImage } = await import("./chunk-4ew46pj6.js");
351
+ const { buildAndPushServerlessImage } = await import("./chunk-ebx9gjnn.js");
351
352
  const built = await buildAndPushServerlessImage({
352
353
  app,
353
354
  projectRoot,
@@ -10894,7 +10895,7 @@ function normalizeEngine(engine) {
10894
10895
  }
10895
10896
  function resolveDbEngine(config6) {
10896
10897
  const compute = config6.infrastructure?.compute;
10897
- const declared = config6.infrastructure?.appDatabase?.engine;
10898
+ const declared = resolveAppDatabase(config6)?.engine;
10898
10899
  if (declared)
10899
10900
  return normalizeEngine(declared);
10900
10901
  const managed = compute?.managedServices ?? {};
@@ -11626,7 +11627,7 @@ function buildDashboardOperations(config6, data) {
11626
11627
  const backups = config6.infrastructure?.compute?.backups;
11627
11628
  if (backups?.enabled) {
11628
11629
  ops.push({ id: "backup:run", label: "Run backup now", group: "backup", target: "backup", mutates: true, confirm: "backup" });
11629
- if (config6.infrastructure?.appDatabase)
11630
+ if (resolveAppDatabase(config6))
11630
11631
  ops.push({ id: "backup:restore", label: "Restore latest DB backup", group: "backup", target: "database", mutates: true, confirm: "restore", danger: true });
11631
11632
  }
11632
11633
  return ops;
@@ -11702,7 +11703,7 @@ async function runDashboardOperation(config6, environment, operation, options =
11702
11703
  return fromComputeOps(operation.id, `rollback ${operation.target}${to ? ` → ${to}` : ""}`, r);
11703
11704
  }
11704
11705
  if (operation.id === "backup:restore") {
11705
- const r = await restoreDatabaseBackup(ctx, { database: config6.infrastructure?.appDatabase });
11706
+ const r = await restoreDatabaseBackup(ctx, { database: resolveAppDatabase(config6) });
11706
11707
  return fromComputeOps(operation.id, "db restore", r);
11707
11708
  }
11708
11709
  const targets = await driver.findComputeTargets({ slug, environment, role: "app" });
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildAndPushServerlessImage
3
- } from "./chunk-3mcfbrw8.js";
3
+ } from "./chunk-tskj9fay.js";
4
4
  import"./chunk-hsk6fe6x.js";
5
- import"./chunk-k56wpkhg.js";
5
+ import"./chunk-stt1z5cx.js";
6
6
  import"./chunk-arsh1g5h.js";
7
7
  import"./chunk-v0bahtg2.js";
8
8
  export {
@@ -1140,6 +1140,9 @@ function deploymentCoexistenceError(config) {
1140
1140
  }
1141
1141
  return null;
1142
1142
  }
1143
+ function resolveAppDatabase(config) {
1144
+ return config.infrastructure?.appDatabase ?? config.infrastructure?.compute?.database;
1145
+ }
1143
1146
  function resolveCloudProvider(config) {
1144
1147
  if (config.cloud?.provider)
1145
1148
  return config.cloud.provider;
@@ -46181,4 +46184,4 @@ class ResourceManagementManager {
46181
46184
  }
46182
46185
  var resourceManagementManager = new ResourceManagementManager;
46183
46186
 
46184
- export { detectServiceRegion, signRequest, signRequestAsync, createPresignedUrl, createPresignedUrlAsync, makeAWSRequest, makeAWSRequestOnce, makeAWSRequestAsync, parseXMLResponse, parseJSONResponse, clearSigningKeyCache, getSigningKeyCacheSize, isNodeCryptoAvailable, isWebCryptoAvailable, QueuePresets, RealtimePresets, detectDeploymentTargets, resolveDeploymentMode, deploymentCoexistenceError, resolveCloudProvider, TemplateBuilder, Pseudo, generateResourceName, generateLogicalId, getTimestamp, sanitizeName, resolveProjectStackName, resolveSiteStackName, resolveSiteResourceName, resolveSiteBucketName, resolveStorageBucketName, resolveDeployBucketName, resolveServerlessAppStackName, resolveServerlessArtifactBucketName, resolveServerlessAssetBucketName, DependencyGraph, analyzeStackDiff, formatDiff, Storage, Registry, CDN, DNS, Security, Compute, Network, FileSystem, Email, exports_incoming_call, Phone, Queue, JobLoader, StacksIntegration, exports_send, SMS, AI, Database, Cache, Permissions, ApiGateway, Messaging, Workflow, Monitoring, Auth, Deployment, AssetHasher, Secrets, ParameterStore, Search, Redirects, Communication, Fn2, Arn, AWS_PSEUDO_PARAMETERS, CloudFormationBuilder, buildCloudFormationTemplate, createStaticSitePreset, createNodeJsServerPreset, createNodeJsServerlessPreset, createServerlessNodePreset, createFullStackAppPreset, createApiBackendPreset, createWordPressPreset, createJamstackPreset, createMicroservicesPreset, createRealtimeAppPreset, createDataPipelinePreset, createMLApiPreset, createTraditionalWebAppPreset, createLaravelPreset, createServerlessLaravelPreset, createDashboardSite, DASHBOARD_STATE_DIR, DASHBOARD_ENTRY, DASHBOARD_PORT_BASE, DASHBOARD_PORT_SPAN, deriveManagementDashboardPort, resolveDashboardDomain, resolveDashboardDomains, hasManagementDashboardSite, MANAGEMENT_DASHBOARD_SITE_PREFIX, managementDashboardSiteName, isManagementDashboardSiteName, resolveManagementDashboardSites, resolveManagementDashboardSite, extendPreset, composePresets, createPreset, mergeInfrastructure, withMonitoring, withSecurity, withDatabase, withCache, withCDN, withQueue, fromEnvironment, fromSharedCredentials, fromEC2Metadata, fromECSMetadata, fromWebIdentity, getCredentials, createCredentialProvider, resolveCredentials, resolveRegion, getAccountId, S3Error, createS3Client, CloudError, ConfigurationError, CredentialError, DeploymentError, ValidationError, AWSAPIError, ErrorCodes, getErrorDetails, createError, DebugLogger, validateConfiguration, detectMisconfigurations, validateCredentials, checkIAMPermissions, getRequiredPermissions, suggestIAMPolicy, DEFAULT_SERVICE_LIMITS, checkServiceQuotas, getQuotaUsageSummary, suggestQuotaIncrease, FileCache, TemplateCache, templateCache, hashFile, hashString, hashBuffer, hashDirectory, hashManifest, quickHash, findChangedFiles, HashCache, parallel, batch, parallelMap, parallelWithRetry, sequence, withTimeout, RateLimiter, chunk, processInChunks, diffTemplates, getDiffSummary, requiresReplacement, categorizeChanges, getDeploymentStrategy, getDiffStats, cloud_config_schema_default, validateAgainstSchema, defaultLocalConfig, getLocalConfig, isLocalDevelopment, getLocalEndpoint, getLocalCredentials, getLocalEnvVars, MockCloudFormation, MockS3, MockDynamoDB, createMockAWS, PreviewEnvironmentManager, previewManager, generatePreviewWorkflow, generateCleanupWorkflow, generateCostReportWorkflow, PreviewNotificationService, previewNotifications, formatTable, formatTree, formatProgressBar, formatBytes, formatDuration, formatList, formatKeyValue, ProgressBar, MultiStepProgress, Spinner, TaskList, suggestCommand, formatSuggestion, isLikelyTypo, getContextualHelp, searchCommands, autocomplete, suggestFlags, formatFlagSuggestions, getCommandUsage, validateCommand, REPL, REPLContext, REPLCommandBuilder, CommandHistory, formatHistory, formatHistoryStats, MultiRegionManager, multiRegionManager, CrossRegionReferenceManager, GlobalResourceManager, RegionPairManager, StackDependencyManager, crossRegionReferenceManager, globalResourceManager, regionPairManager, stackDependencyManager, AWS_REGIONS, getRegion, getAllRegions, getRegionsByLocation, getRegionsByCompliance, getRegionsByPricingTier, isValidRegion, getClosestRegion, suggestRegions, suggestRegionPairs, formatRegion, formatRegionList, getRegionStats, MultiAccountManager, OrganizationManager, multiAccountManager, organizationManager, RECOMMENDED_ACCOUNT_STRUCTURES, RECOMMENDED_SCPS, COMMON_CROSS_ACCOUNT_ROLES, getRecommendedStructure, generateCrossAccountRoleCF, validateAccountStructure, formatAccountStructure, generateDeploymentWorkflow, generateMultiEnvWorkflow, generatePRPreviewWorkflow, generateScheduledWorkflow, generateMatrixWorkflow, generateDeploymentPipeline, generateMultiEnvPipeline, generatePreviewPipeline, generateScheduledPipeline, generateManualPipeline, generateDeploymentConfig, generateMultiEnvConfig, generateScheduledConfig, generateApprovalConfig, generateParallelConfig, BackupManager, backupManager, DisasterRecoveryManager, drManager, AWSConfigManager, awsConfigManager, CloudTrailManager, cloudTrailManager, GuardDutyManager, guardDutyManager, SecurityHubManager, securityHubManager, BlueGreenManager, blueGreenManager, CanaryManager, canaryManager, ABTestManager, abTestManager, ProgressiveDeploymentManager, progressiveDeploymentManager, XRayManager, xrayManager, MetricsManager, metricsManager, LogsManager, logsManager, SyntheticsManager, syntheticsManager, MigrationManager, migrationManager, ReplicaManager, replicaManager, PerformanceManager, performanceManager, DatabaseUserManager, databaseUserManager, SecretsRotationManager, secretsRotationManager, SecretsManager, secretsManager, CertificateManager, certificateManager, SecurityScanningManager, securityScanningManager, ImageScanningManager, imageScanningManager, BuildOptimizationManager, buildOptimizationManager, ContainerRegistryManager, containerRegistryManager, ServiceMeshManager, serviceMeshManager, LambdaLayersManager, lambdaLayersManager, LambdaVersionsManager, lambdaVersionsManager, LambdaConcurrencyManager, lambdaConcurrencyManager, LambdaDestinationsManager, lambdaDestinationsManager, LambdaVPCManager, lambdaVPCManager, LambdaDLQManager, lambdaDLQManager, Route53RoutingManager, route53RoutingManager, DNSSECManager, dnssecManager, Route53ResolverManager, route53ResolverManager, BounceComplaintHandler, bounceComplaintHandler, EmailAnalyticsManager, emailAnalyticsManager, SenderReputationManager, senderReputationManager, EmailTemplateManager, emailTemplateManager, exports_advanced, exports_inbound, exports_advanced2, exports_advanced3, FIFOQueueManager, fifoQueueManager, DLQMonitoringManager, dlqMonitoringManager, BatchProcessingManager, batchProcessingManager, QueueManagementManager, queueManagementManager, createZip, generateBootstrap, runBuildHooks, sha256, artifactKey, packageServerlessApp, MANAGED_NODE_VERSIONS, resolveServerlessRuntime, resolveQueues, resolveQueueNames, composeServerlessAppTemplate, PHP_LAYER_EXTENSIONS, phpLayerPackages, phpLayerBuildStage, generatePhpLayerDockerfile, generateAppImageDockerfile, sharedRuntimeLoop, buildNodeRuntimeLayerZip, buildBunRuntimeLayerZip, resolveApp, eventToRequest, responseToResult, createHttpHandler, createQueueHandler, createCliHandler, createHandlers, generatePhpFpmConfig, phpRuntimeLayerAssets, laravelServerlessEnvDefaults, LARAVEL_SERVERLESS_BUILD_STEPS, buildPhpRuntimeLayerZip, PHP_DEFAULT_EXCLUDES, runPhpBuildHooks, collectPhpAppEntries, packagePhpApp, StaticSiteManager, staticSiteManager, StorageAdvancedManager, storageAdvancedManager, HealthCheckManager, healthCheckManager, NetworkSecurityManager, networkSecurityManager, ResourceManagementManager, resourceManagementManager };
46187
+ export { detectServiceRegion, signRequest, signRequestAsync, createPresignedUrl, createPresignedUrlAsync, makeAWSRequest, makeAWSRequestOnce, makeAWSRequestAsync, parseXMLResponse, parseJSONResponse, clearSigningKeyCache, getSigningKeyCacheSize, isNodeCryptoAvailable, isWebCryptoAvailable, QueuePresets, RealtimePresets, detectDeploymentTargets, resolveDeploymentMode, deploymentCoexistenceError, resolveAppDatabase, resolveCloudProvider, TemplateBuilder, Pseudo, generateResourceName, generateLogicalId, getTimestamp, sanitizeName, resolveProjectStackName, resolveSiteStackName, resolveSiteResourceName, resolveSiteBucketName, resolveStorageBucketName, resolveDeployBucketName, resolveServerlessAppStackName, resolveServerlessArtifactBucketName, resolveServerlessAssetBucketName, DependencyGraph, analyzeStackDiff, formatDiff, Storage, Registry, CDN, DNS, Security, Compute, Network, FileSystem, Email, exports_incoming_call, Phone, Queue, JobLoader, StacksIntegration, exports_send, SMS, AI, Database, Cache, Permissions, ApiGateway, Messaging, Workflow, Monitoring, Auth, Deployment, AssetHasher, Secrets, ParameterStore, Search, Redirects, Communication, Fn2, Arn, AWS_PSEUDO_PARAMETERS, CloudFormationBuilder, buildCloudFormationTemplate, createStaticSitePreset, createNodeJsServerPreset, createNodeJsServerlessPreset, createServerlessNodePreset, createFullStackAppPreset, createApiBackendPreset, createWordPressPreset, createJamstackPreset, createMicroservicesPreset, createRealtimeAppPreset, createDataPipelinePreset, createMLApiPreset, createTraditionalWebAppPreset, createLaravelPreset, createServerlessLaravelPreset, createDashboardSite, DASHBOARD_STATE_DIR, DASHBOARD_ENTRY, DASHBOARD_PORT_BASE, DASHBOARD_PORT_SPAN, deriveManagementDashboardPort, resolveDashboardDomain, resolveDashboardDomains, hasManagementDashboardSite, MANAGEMENT_DASHBOARD_SITE_PREFIX, managementDashboardSiteName, isManagementDashboardSiteName, resolveManagementDashboardSites, resolveManagementDashboardSite, extendPreset, composePresets, createPreset, mergeInfrastructure, withMonitoring, withSecurity, withDatabase, withCache, withCDN, withQueue, fromEnvironment, fromSharedCredentials, fromEC2Metadata, fromECSMetadata, fromWebIdentity, getCredentials, createCredentialProvider, resolveCredentials, resolveRegion, getAccountId, S3Error, createS3Client, CloudError, ConfigurationError, CredentialError, DeploymentError, ValidationError, AWSAPIError, ErrorCodes, getErrorDetails, createError, DebugLogger, validateConfiguration, detectMisconfigurations, validateCredentials, checkIAMPermissions, getRequiredPermissions, suggestIAMPolicy, DEFAULT_SERVICE_LIMITS, checkServiceQuotas, getQuotaUsageSummary, suggestQuotaIncrease, FileCache, TemplateCache, templateCache, hashFile, hashString, hashBuffer, hashDirectory, hashManifest, quickHash, findChangedFiles, HashCache, parallel, batch, parallelMap, parallelWithRetry, sequence, withTimeout, RateLimiter, chunk, processInChunks, diffTemplates, getDiffSummary, requiresReplacement, categorizeChanges, getDeploymentStrategy, getDiffStats, cloud_config_schema_default, validateAgainstSchema, defaultLocalConfig, getLocalConfig, isLocalDevelopment, getLocalEndpoint, getLocalCredentials, getLocalEnvVars, MockCloudFormation, MockS3, MockDynamoDB, createMockAWS, PreviewEnvironmentManager, previewManager, generatePreviewWorkflow, generateCleanupWorkflow, generateCostReportWorkflow, PreviewNotificationService, previewNotifications, formatTable, formatTree, formatProgressBar, formatBytes, formatDuration, formatList, formatKeyValue, ProgressBar, MultiStepProgress, Spinner, TaskList, suggestCommand, formatSuggestion, isLikelyTypo, getContextualHelp, searchCommands, autocomplete, suggestFlags, formatFlagSuggestions, getCommandUsage, validateCommand, REPL, REPLContext, REPLCommandBuilder, CommandHistory, formatHistory, formatHistoryStats, MultiRegionManager, multiRegionManager, CrossRegionReferenceManager, GlobalResourceManager, RegionPairManager, StackDependencyManager, crossRegionReferenceManager, globalResourceManager, regionPairManager, stackDependencyManager, AWS_REGIONS, getRegion, getAllRegions, getRegionsByLocation, getRegionsByCompliance, getRegionsByPricingTier, isValidRegion, getClosestRegion, suggestRegions, suggestRegionPairs, formatRegion, formatRegionList, getRegionStats, MultiAccountManager, OrganizationManager, multiAccountManager, organizationManager, RECOMMENDED_ACCOUNT_STRUCTURES, RECOMMENDED_SCPS, COMMON_CROSS_ACCOUNT_ROLES, getRecommendedStructure, generateCrossAccountRoleCF, validateAccountStructure, formatAccountStructure, generateDeploymentWorkflow, generateMultiEnvWorkflow, generatePRPreviewWorkflow, generateScheduledWorkflow, generateMatrixWorkflow, generateDeploymentPipeline, generateMultiEnvPipeline, generatePreviewPipeline, generateScheduledPipeline, generateManualPipeline, generateDeploymentConfig, generateMultiEnvConfig, generateScheduledConfig, generateApprovalConfig, generateParallelConfig, BackupManager, backupManager, DisasterRecoveryManager, drManager, AWSConfigManager, awsConfigManager, CloudTrailManager, cloudTrailManager, GuardDutyManager, guardDutyManager, SecurityHubManager, securityHubManager, BlueGreenManager, blueGreenManager, CanaryManager, canaryManager, ABTestManager, abTestManager, ProgressiveDeploymentManager, progressiveDeploymentManager, XRayManager, xrayManager, MetricsManager, metricsManager, LogsManager, logsManager, SyntheticsManager, syntheticsManager, MigrationManager, migrationManager, ReplicaManager, replicaManager, PerformanceManager, performanceManager, DatabaseUserManager, databaseUserManager, SecretsRotationManager, secretsRotationManager, SecretsManager, secretsManager, CertificateManager, certificateManager, SecurityScanningManager, securityScanningManager, ImageScanningManager, imageScanningManager, BuildOptimizationManager, buildOptimizationManager, ContainerRegistryManager, containerRegistryManager, ServiceMeshManager, serviceMeshManager, LambdaLayersManager, lambdaLayersManager, LambdaVersionsManager, lambdaVersionsManager, LambdaConcurrencyManager, lambdaConcurrencyManager, LambdaDestinationsManager, lambdaDestinationsManager, LambdaVPCManager, lambdaVPCManager, LambdaDLQManager, lambdaDLQManager, Route53RoutingManager, route53RoutingManager, DNSSECManager, dnssecManager, Route53ResolverManager, route53ResolverManager, BounceComplaintHandler, bounceComplaintHandler, EmailAnalyticsManager, emailAnalyticsManager, SenderReputationManager, senderReputationManager, EmailTemplateManager, emailTemplateManager, exports_advanced, exports_inbound, exports_advanced2, exports_advanced3, FIFOQueueManager, fifoQueueManager, DLQMonitoringManager, dlqMonitoringManager, BatchProcessingManager, batchProcessingManager, QueueManagementManager, queueManagementManager, createZip, generateBootstrap, runBuildHooks, sha256, artifactKey, packageServerlessApp, MANAGED_NODE_VERSIONS, resolveServerlessRuntime, resolveQueues, resolveQueueNames, composeServerlessAppTemplate, PHP_LAYER_EXTENSIONS, phpLayerPackages, phpLayerBuildStage, generatePhpLayerDockerfile, generateAppImageDockerfile, sharedRuntimeLoop, buildNodeRuntimeLayerZip, buildBunRuntimeLayerZip, resolveApp, eventToRequest, responseToResult, createHttpHandler, createQueueHandler, createCliHandler, createHandlers, generatePhpFpmConfig, phpRuntimeLayerAssets, laravelServerlessEnvDefaults, LARAVEL_SERVERLESS_BUILD_STEPS, buildPhpRuntimeLayerZip, PHP_DEFAULT_EXCLUDES, runPhpBuildHooks, collectPhpAppEntries, packagePhpApp, StaticSiteManager, staticSiteManager, StorageAdvancedManager, storageAdvancedManager, HealthCheckManager, healthCheckManager, NetworkSecurityManager, networkSecurityManager, ResourceManagementManager, resourceManagementManager };
@@ -8,7 +8,7 @@ import {
8
8
  phpRuntimeLayerAssets,
9
9
  runPhpBuildHooks,
10
10
  sha256
11
- } from "./chunk-k56wpkhg.js";
11
+ } from "./chunk-stt1z5cx.js";
12
12
 
13
13
  // src/deploy/serverless-image.ts
14
14
  import { execFileSync } from "node:child_process";
@@ -12,10 +12,10 @@ import {
12
12
  sanitizeCloudConfig,
13
13
  setMaintenance,
14
14
  startLocalDashboardServer
15
- } from "../chunk-rr3j38qr.js";
15
+ } from "../chunk-crcjdm09.js";
16
16
  import {
17
17
  buildAndPushServerlessImage
18
- } from "../chunk-3mcfbrw8.js";
18
+ } from "../chunk-tskj9fay.js";
19
19
  import"../chunk-b82pbxyp.js";
20
20
  import"../chunk-hsk6fe6x.js";
21
21
  import {
@@ -30,8 +30,8 @@ import {
30
30
  resolveUiSource,
31
31
  siteInstallBase,
32
32
  validateDeploymentConfig
33
- } from "../chunk-xdd6qvre.js";
34
- import"../chunk-k56wpkhg.js";
33
+ } from "../chunk-0c69nbaa.js";
34
+ import"../chunk-stt1z5cx.js";
35
35
  import"../chunk-93hjhs78.js";
36
36
  import {
37
37
  deleteStaticSite,
@@ -144,6 +144,14 @@ export declare class HetznerClient {
144
144
  private fetchImpl;
145
145
  constructor(options: HetznerClientOptions);
146
146
  private request;
147
+ /**
148
+ * Fetch every page of a list endpoint. Hetzner paginates lists at 25 items by
149
+ * default (max 50/page) and follows `meta.pagination.next_page`; without this,
150
+ * an account with more than one page of resources silently truncates — target
151
+ * lookups miss the project's own servers, and find-or-create attempts a
152
+ * duplicate create (409) for firewalls/keys that already exist.
153
+ */
154
+ private requestAll;
147
155
  listServers(): Promise<HetznerServer[]>;
148
156
  getServer(id: number): Promise<HetznerServer>;
149
157
  createServer(options: CreateServerOptions): Promise<{
@@ -93,6 +93,22 @@ export declare class HetznerDriver implements CloudDriver {
93
93
  private ensureSshKey;
94
94
  /** getServer that returns null instead of throwing when the server is gone. */
95
95
  private tryGetServer;
96
+ /**
97
+ * Rewrite a bun-fleet LB box's rpx route fragment (`sites.d/<slug>.json`)
98
+ * from the CURRENT sites model and the CURRENT app-box upstreams, then
99
+ * restart the gateway so the assembler re-merges. The LB box long outlives
100
+ * any single provision — without this refresh, the routes frozen at its
101
+ * first boot never learn about sites added/removed later or a changed
102
+ * app-fleet upstream set.
103
+ *
104
+ * App boxes without a routable address are dropped from the upstream list;
105
+ * when NO app box is routable the refresh is skipped entirely — rewriting
106
+ * the fragment with zero real upstreams would turn every route into a
107
+ * guaranteed 502, strictly worse than leaving the stale fragment in place.
108
+ * An SSH failure propagates: a deploy that cannot reach its LB to update
109
+ * routes must fail loudly, not silently serve stale ones.
110
+ */
111
+ private refreshLbRoutes;
96
112
  /**
97
113
  * Look up an existing ts-cloud server for this project/environment by labels
98
114
  * (falling back to name match). Used for idempotency when local state is
@@ -10,9 +10,9 @@ export { buildSshArgs, scpUpload, sshExec, sshExecOrThrow, waitForCloudInit, wai
10
10
  export type { RemoteExecOptions, RemoteExecResult, WaitOptions } from './shared/remote-exec';
11
11
  export { AwsBoxProvisioner, buildBoxUserData, createBoxProvisioner, HetznerBoxProvisioner, UBUNTU_2404_AMI_PARAM, } from './shared/box-provision';
12
12
  export type { AwsBoxProvisionerOptions, BoxPort, BoxProviderName, BoxProvisioner, BoxSpec, CreateBoxProvisionerOptions, ProvisionedBox, } from './shared/box-provision';
13
- export { buildAwsArtifactFetch, buildLocalArtifactFetch, buildSiteDeployScript, buildStaticSiteDeployScript, resolveExecStart, } from './shared/deploy-script';
13
+ export { buildAwsArtifactFetch, buildLocalArtifactFetch, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, resolveExecStart, } from './shared/deploy-script';
14
14
  export { deployAllComputeSites, deploySiteRelease, reloadRpxGateway } from './shared/compute-deploy';
15
- export { buildRpxConfig, buildRpxLbConfig, buildRpxProvisionScript, deriveRouteId, normalizeRoutePath, renderRpxLauncher, DEFAULT_RPX_CERTS_DIR, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, } from './shared/rpx-gateway';
16
- export type { BuildRpxConfigOptions, BuildRpxProvisionOptions, RpxGatewayConfig, RpxLbAppBox, RpxRoute, } from './shared/rpx-gateway';
15
+ export { buildRpxConfig, buildRpxFragmentRefreshScript, buildRpxLbConfig, buildRpxProvisionScript, deriveRouteId, normalizeRoutePath, renderRpxLauncher, DEFAULT_RPX_CERTS_DIR, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, } from './shared/rpx-gateway';
16
+ export type { BuildRpxConfigOptions, BuildRpxFragmentRefreshOptions, BuildRpxProvisionOptions, RpxGatewayConfig, RpxLbAppBox, RpxRoute, } from './shared/rpx-gateway';
17
17
  export { buildCloudFrontOriginConfig, MANAGED_CACHE_POLICY_DISABLED, MANAGED_CACHE_POLICY_OPTIMIZED, MANAGED_ORIGIN_REQUEST_POLICY_ALL_VIEWER, } from './shared/cloudfront-origin';
18
18
  export type { BuildCloudFrontOriginOptions, OriginFrontedBehavior, } from './shared/cloudfront-origin';
@@ -19,6 +19,7 @@ import {
19
19
  buildCloudFrontOriginConfig,
20
20
  buildLocalArtifactFetch,
21
21
  buildRpxConfig,
22
+ buildRpxFragmentRefreshScript,
22
23
  buildRpxLbConfig,
23
24
  buildRpxProvisionScript,
24
25
  buildSiteDeployScript,
@@ -37,6 +38,7 @@ import {
37
38
  isBoxMode,
38
39
  normalizeRoutePath,
39
40
  normalizeSshPublicKey,
41
+ releaseTarballTmpPath,
40
42
  reloadRpxGateway,
41
43
  renderRpxLauncher,
42
44
  resolveExecStart,
@@ -48,8 +50,8 @@ import {
48
50
  waitForCloudInit,
49
51
  waitForSsh,
50
52
  wrapCloudInitUserData
51
- } from "../chunk-xdd6qvre.js";
52
- import"../chunk-k56wpkhg.js";
53
+ } from "../chunk-0c69nbaa.js";
54
+ import"../chunk-stt1z5cx.js";
53
55
  import"../chunk-93hjhs78.js";
54
56
  import"../chunk-qpj3edwz.js";
55
57
  import"../chunk-vd87cpvn.js";
@@ -67,6 +69,7 @@ export {
67
69
  resolveExecStart,
68
70
  renderRpxLauncher,
69
71
  reloadRpxGateway,
72
+ releaseTarballTmpPath,
70
73
  normalizeSshPublicKey,
71
74
  normalizeRoutePath,
72
75
  isBoxMode,
@@ -85,6 +88,7 @@ export {
85
88
  buildSiteDeployScript,
86
89
  buildRpxProvisionScript,
87
90
  buildRpxLbConfig,
91
+ buildRpxFragmentRefreshScript,
88
92
  buildRpxConfig,
89
93
  buildLocalArtifactFetch,
90
94
  buildCloudFrontOriginConfig,
@@ -13,7 +13,7 @@ export declare class LocalBoxDriver implements CloudDriver {
13
13
  readonly usesCloudFormation = false;
14
14
  getComputeOutputs(): Promise<ComputeStackOutputs>;
15
15
  uploadRelease(options: UploadReleaseOptions): Promise<UploadReleaseResult>;
16
- findComputeTargets(_options: FindComputeTargetsOptions): Promise<ComputeTarget[]>;
16
+ findComputeTargets(options: FindComputeTargetsOptions): Promise<ComputeTarget[]>;
17
17
  runRemoteDeploy(options: RunRemoteDeployOptions): Promise<RemoteDeployResult>;
18
18
  }
19
19
  /** Truthy-env check shared by the box-mode gate. */
@@ -36,8 +36,14 @@ export interface DeployAllSitesOptions {
36
36
  export declare function deployAllComputeSites(options: DeployAllSitesOptions): Promise<boolean>;
37
37
  /**
38
38
  * Regenerate the rpx gateway config from the sites model and (re)start the
39
- * gateway on the compute targets. No-op (returns `true`) unless
40
- * `compute.proxy.engine === 'rpx'`. Re-runnable: the provision script writes the
41
- * launcher + unit and `systemctl restart`s, which reloads the new routes.
39
+ * gateway. No-op (returns `true`) unless `compute.proxy.engine === 'rpx'`.
40
+ *
41
+ * Two shapes, resolved by probing for a dedicated load-balancer target:
42
+ * - **Fleet** (bun-style: one rpx LB box fronts N gateway-less app boxes) —
43
+ * rewrite ONLY the LB's route fragment with the multi-upstream LB config
44
+ * ({@link buildRpxLbConfig} + {@link buildRpxFragmentRefreshScript}).
45
+ * - **Single box** — the gateway is co-located with the app, so the full
46
+ * provision script runs on the app targets. Re-runnable: it rewrites the
47
+ * launcher + unit and `systemctl restart`s, reloading the new routes.
42
48
  */
43
49
  export declare function reloadRpxGateway(options: DeployAllSitesOptions): Promise<boolean>;
@@ -77,6 +77,8 @@ export interface BuildSiteDeployScriptOptions {
77
77
  export declare function buildSiteDeployScript(options: BuildSiteDeployScriptOptions): string[];
78
78
  export interface BuildStaticSiteDeployScriptOptions {
79
79
  siteName: string;
80
+ /** Project slug — namespaces the staged tarball on shared boxes. */
81
+ slug?: string;
80
82
  /** How the remote host obtains the release tarball */
81
83
  artifactFetch: string[];
82
84
  /** Site base dir holding `releases/`, `current`. Default `/var/www/<site>`. */
@@ -101,5 +103,13 @@ export interface BuildStaticSiteDeployScriptOptions {
101
103
  * tlsx), which ts-cloud points at the symlink. Old releases are pruned.
102
104
  */
103
105
  export declare function buildStaticSiteDeployScript(options: BuildStaticSiteDeployScriptOptions): string[];
104
- export declare function buildAwsArtifactFetch(bucket: string, key: string, region: string, siteName: string): string[];
105
- export declare function buildLocalArtifactFetch(localPath: string, siteName: string): string[];
106
+ /**
107
+ * Box-local staging path for the uploaded release tarball. Namespaced by
108
+ * project slug + site + release id so two projects sharing a box (or two
109
+ * overlapping deploys of one site) never clobber each other's tarball between
110
+ * the fetch and the extract — the flat `/tmp/<site>-release.tar.gz` layout
111
+ * cross-contaminated releases on shared boxes.
112
+ */
113
+ export declare function releaseTarballTmpPath(slug: string | undefined, siteName: string, releaseId: string): string;
114
+ export declare function buildAwsArtifactFetch(bucket: string, key: string, region: string, destPath: string): string[];
115
+ export declare function buildLocalArtifactFetch(localPath: string, destPath: string): string[];
@@ -12,7 +12,7 @@
12
12
  * private network, and (required) a dedicated services box so every app server
13
13
  * shares one database/cache.
14
14
  */
15
- import type { ComputeConfig, DatabaseConfig } from '@ts-cloud/core';
15
+ import type { CloudConfig, ComputeConfig, DatabaseConfig } from '@ts-cloud/core';
16
16
  export type FleetRole = 'app' | 'services' | 'lb';
17
17
  export interface FleetTopology {
18
18
  /** Number of application servers. */
@@ -32,3 +32,14 @@ export declare function resolveFleetTopology(compute?: ComputeConfig): FleetTopo
32
32
  * under `site.env` (explicit values win).
33
33
  */
34
34
  export declare function buildFleetServicesEnv(servicesPrivateIp: string, database?: DatabaseConfig): Record<string, string>;
35
+ /**
36
+ * Build the provision commands for a fleet's dedicated services box (DB /
37
+ * cache / search only — no app runtime, no gateway). Shared by the PHP fleet
38
+ * and the bun/node/deno fleet so the two paths can never drift: engine
39
+ * installs bound to the private network, the app database + user, box
40
+ * maintenance, the on-box notifier (so the monitoring cron can report — a
41
+ * no-op unless notifications are configured), and — when `compute.backups`
42
+ * is enabled — the nightly DB backup, which MUST run here (where the
43
+ * database lives), never on an app box.
44
+ */
45
+ export declare function buildFleetServicesBoxProvision(config: CloudConfig): string[];
@@ -297,3 +297,29 @@ export declare function buildCertManagementCommands(options: BuildRpxProvisionOp
297
297
  * server-app/server-static sites appear in the gateway automatically.
298
298
  */
299
299
  export declare function buildRpxProvisionScript(options: BuildRpxProvisionOptions): string[];
300
+ export interface BuildRpxFragmentRefreshOptions {
301
+ /** The gateway config this deploy resolved (single-box or LB multi-upstream). */
302
+ config: RpxGatewayConfig;
303
+ /**
304
+ * This project's slug — the registry fragment is rewritten at
305
+ * `<sites.d>/<slug>.json`, exactly as in {@link buildRpxProvisionScript}.
306
+ * Defaults to `'app'`.
307
+ */
308
+ slug?: string;
309
+ }
310
+ /**
311
+ * Build the shell commands that rewrite ONLY this app's rpx route fragment
312
+ * (`<sites.d>/<slug>.json`) and restart the gateway, so the running assembler
313
+ * re-merges every fragment and the new routes go live.
314
+ *
315
+ * Unlike {@link buildRpxProvisionScript} this does NOT reinstall rpx/tlsx,
316
+ * rewrite the assembler launcher, or touch the systemd unit — it is the cheap
317
+ * reload for a box whose gateway is already provisioned. That is exactly the
318
+ * bun-fleet load-balancer situation: the LB box is created once (cloud-init
319
+ * writes the fragment at first boot) but long outlives any single deploy, so
320
+ * its routes must be refreshed from the CURRENT sites model + CURRENT app-box
321
+ * upstreams on every provision/deploy — otherwise sites added later 404 and
322
+ * app-fleet scale changes never reach the gateway. The `systemctl restart`
323
+ * re-runs the stable assembler, which re-reads all of {@link RPX_SITES_DIR}.
324
+ */
325
+ export declare function buildRpxFragmentRefreshScript(options: BuildRpxFragmentRefreshOptions): string[];
@@ -15,7 +15,8 @@ export interface AuthorizedKeysOptions {
15
15
  }
16
16
  /**
17
17
  * Build the commands that reconcile the managed key block in authorized_keys.
18
- * Strips any previous ts-cloud block, then appends the current set. Returns `[]`
19
- * when there are no keys to manage.
18
+ * Strips any previous ts-cloud block, then appends the current set. An empty
19
+ * key set still strips the block — removing your last key from the config must
20
+ * remove it from the box (e.g. revoking a compromised key).
20
21
  */
21
22
  export declare function buildAuthorizedKeysScript(keys?: SshKeyConfig[], options?: AuthorizedKeysOptions): string[];
package/dist/index.js CHANGED
@@ -55,10 +55,10 @@ import {
55
55
  sanitizeCloudConfig,
56
56
  setMaintenance,
57
57
  startLocalDashboardServer
58
- } from "./chunk-rr3j38qr.js";
58
+ } from "./chunk-crcjdm09.js";
59
59
  import {
60
60
  buildAndPushServerlessImage
61
- } from "./chunk-3mcfbrw8.js";
61
+ } from "./chunk-tskj9fay.js";
62
62
  import {
63
63
  CloudWatchLogsClient,
64
64
  EFSClient,
@@ -105,7 +105,7 @@ import {
105
105
  waitForCloudInit,
106
106
  waitForSsh,
107
107
  wrapCloudInitUserData
108
- } from "./chunk-xdd6qvre.js";
108
+ } from "./chunk-0c69nbaa.js";
109
109
  import {
110
110
  ABTestManager,
111
111
  AI,
@@ -446,6 +446,7 @@ import {
446
446
  replicaManager,
447
447
  requiresReplacement,
448
448
  resolveApp,
449
+ resolveAppDatabase,
449
450
  resolveCloudProvider,
450
451
  resolveCredentials,
451
452
  resolveDashboardDomain,
@@ -509,7 +510,7 @@ import {
509
510
  withSecurity,
510
511
  withTimeout,
511
512
  xrayManager
512
- } from "./chunk-k56wpkhg.js";
513
+ } from "./chunk-stt1z5cx.js";
513
514
  import {
514
515
  EC2Client,
515
516
  SSMClient
@@ -4729,6 +4730,7 @@ export {
4729
4730
  resolveDashboardAction,
4730
4731
  resolveCredentials,
4731
4732
  resolveCloudProvider,
4733
+ resolveAppDatabase,
4732
4734
  resolveApp,
4733
4735
  requiresReplacement,
4734
4736
  replicaManager,