@stacksjs/ts-cloud 0.7.84 → 0.7.86

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 (62) hide show
  1. package/dist/aws/ec2.d.ts +13 -0
  2. package/dist/aws/index.js +1 -1
  3. package/dist/bin/cli.js +512 -512
  4. package/dist/{chunk-8m38yfba.js → chunk-4erbrg3e.js} +6 -45
  5. package/dist/{chunk-703nkybg.js → chunk-7m60qnc8.js} +10 -0
  6. package/dist/{chunk-838t87x3.js → chunk-ztbn47we.js} +102 -2
  7. package/dist/deploy/index.js +17 -7
  8. package/dist/deploy/server-dns.d.ts +77 -3
  9. package/dist/drivers/hetzner/state.d.ts +8 -0
  10. package/dist/drivers/index.js +2 -2
  11. package/dist/index.d.ts +2 -1
  12. package/dist/index.js +15 -5
  13. package/dist/ui/access-denied.html +2 -2
  14. package/dist/ui/account/automation.html +3 -3
  15. package/dist/ui/account/security.html +2 -2
  16. package/dist/ui/applications/compose.html +4 -4
  17. package/dist/ui/applications/new.html +2 -2
  18. package/dist/ui/data/backups.html +4 -4
  19. package/dist/ui/data/services.html +3 -3
  20. package/dist/ui/data/volumes.html +4 -4
  21. package/dist/ui/index.html +4 -4
  22. package/dist/ui/integrations.html +2 -2
  23. package/dist/ui/operations/alerts.html +3 -3
  24. package/dist/ui/operations/configuration.html +4 -4
  25. package/dist/ui/operations/jobs.html +4 -4
  26. package/dist/ui/operations/maintenance.html +3 -3
  27. package/dist/ui/operations/observability.html +4 -4
  28. package/dist/ui/operations/previews.html +3 -3
  29. package/dist/ui/operations/queue.html +4 -4
  30. package/dist/ui/operations/regions.html +3 -3
  31. package/dist/ui/operations/releases.html +3 -3
  32. package/dist/ui/operations/workloads.html +3 -3
  33. package/dist/ui/security.html +2 -2
  34. package/dist/ui/server/actions.html +3 -3
  35. package/dist/ui/server/activity.html +2 -2
  36. package/dist/ui/server/capacity.html +4 -4
  37. package/dist/ui/server/database.html +4 -4
  38. package/dist/ui/server/deployments.html +4 -4
  39. package/dist/ui/server/diagnostics.html +2 -2
  40. package/dist/ui/server/firewall.html +4 -4
  41. package/dist/ui/server/fleet.html +4 -4
  42. package/dist/ui/server/logs.html +4 -4
  43. package/dist/ui/server/metrics.html +3 -3
  44. package/dist/ui/server/services.html +2 -2
  45. package/dist/ui/server/sites.html +3 -3
  46. package/dist/ui/server/ssh-keys.html +4 -4
  47. package/dist/ui/server/team.html +4 -4
  48. package/dist/ui/server/terminal.html +2 -2
  49. package/dist/ui/serverless/alarms.html +4 -4
  50. package/dist/ui/serverless/assets.html +2 -2
  51. package/dist/ui/serverless/cost.html +2 -2
  52. package/dist/ui/serverless/data.html +4 -4
  53. package/dist/ui/serverless/deployments.html +2 -2
  54. package/dist/ui/serverless/firewall.html +2 -2
  55. package/dist/ui/serverless/functions.html +4 -4
  56. package/dist/ui/serverless/logs.html +3 -3
  57. package/dist/ui/serverless/metrics.html +2 -2
  58. package/dist/ui/serverless/queues.html +3 -3
  59. package/dist/ui/serverless/secrets.html +4 -4
  60. package/dist/ui/serverless/traces.html +4 -4
  61. package/dist/ui/serverless.html +4 -4
  62. package/package.json +3 -3
@@ -45,7 +45,7 @@ import {
45
45
  resolveSiteKind,
46
46
  resolveUiSource,
47
47
  siteInstallBase
48
- } from "./chunk-838t87x3.js";
48
+ } from "./chunk-ztbn47we.js";
49
49
  import {
50
50
  artifactKey,
51
51
  buildCloudFormationTemplate,
@@ -70,7 +70,7 @@ import {
70
70
  } from "./chunk-1qjyqrc5.js";
71
71
  import {
72
72
  SSMClient
73
- } from "./chunk-703nkybg.js";
73
+ } from "./chunk-7m60qnc8.js";
74
74
  import {
75
75
  CloudFormationClient
76
76
  } from "./chunk-4cjrg98a.js";
@@ -88,45 +88,6 @@ import {
88
88
  import {
89
89
  __require
90
90
  } from "./chunk-v0bahtg2.js";
91
- // src/deploy/server-dns.ts
92
- function collectServerDnsDomains(sites = {}) {
93
- const domains = new Set;
94
- for (const site of Object.values(sites)) {
95
- if (!site.domain)
96
- continue;
97
- if (site.redirect || site.deploy === "server" || site.start)
98
- domains.add(site.domain);
99
- }
100
- return domains;
101
- }
102
- function normalizeName(name) {
103
- return name.replace(/\.$/, "").toLowerCase();
104
- }
105
- function matchesHostname(record, zone, hostname) {
106
- const recordName = normalizeName(record.name);
107
- const normalizedZone = normalizeName(zone);
108
- const normalizedHostname = normalizeName(hostname);
109
- const relativeName = normalizedHostname === normalizedZone ? "@" : normalizedHostname.endsWith(`.${normalizedZone}`) ? normalizedHostname.slice(0, -(normalizedZone.length + 1)) : normalizedHostname;
110
- return recordName === normalizedHostname || recordName === relativeName || relativeName === "@" && (recordName === "" || recordName === normalizedZone);
111
- }
112
- async function removeStaleServerAddressRecords(provider, zone, hostname, desiredAddress) {
113
- const listed = await provider.listRecords(zone);
114
- if (!listed.success)
115
- return [`could not list A records: ${listed.message || "unknown provider error"}`];
116
- const matching = listed.records.filter((record) => record.type === "A" && matchesHostname(record, zone, hostname));
117
- const desiredIndex = matching.findIndex((record) => record.content === desiredAddress);
118
- if (matching.length <= 1 || desiredIndex === -1)
119
- return [];
120
- const warnings = [];
121
- for (const [index, record] of matching.entries()) {
122
- if (index === desiredIndex)
123
- continue;
124
- const result = await provider.deleteRecord(zone, record);
125
- if (!result.success)
126
- warnings.push(`could not remove stale ${record.name} A ${record.content}: ${result.message || "unknown provider error"}`);
127
- }
128
- return warnings;
129
- }
130
91
  // src/deploy/dashboard-control-plane.ts
131
92
  import { createHash as createHash5 } from "node:crypto";
132
93
 
@@ -13016,7 +12977,7 @@ function normalizeHost(value) {
13016
12977
  throw new Error("Source host must use HTTPS");
13017
12978
  return `${url.protocol}//${url.host}${url.pathname.replace(/\/$/, "")}`;
13018
12979
  }
13019
- function normalizeName2(value) {
12980
+ function normalizeName(value) {
13020
12981
  const name = value.trim();
13021
12982
  if (name.length < 2 || name.length > 80)
13022
12983
  throw new Error("Connection name must contain 2-80 characters");
@@ -13207,7 +13168,7 @@ class SourceConnectionStore {
13207
13168
  id,
13208
13169
  input.organizationId,
13209
13170
  input.provider,
13210
- normalizeName2(input.name),
13171
+ normalizeName(input.name),
13211
13172
  normalizeHost(input.host),
13212
13173
  input.owner?.trim() || null,
13213
13174
  input.authKind ?? (encoded ? "access_token" : "none"),
@@ -13340,7 +13301,7 @@ class SourceConnectionStore {
13340
13301
  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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
13341
13302
  id,
13342
13303
  input.connectionId,
13343
- normalizeName2(input.name),
13304
+ normalizeName(input.name),
13344
13305
  input.publicKey.trim(),
13345
13306
  publicFingerprint,
13346
13307
  this.encrypt(input.privateKey),
@@ -49156,4 +49117,4 @@ data: ${JSON.stringify({ cursor: position, at: new Date().toISOString() })}
49156
49117
  };
49157
49118
  return { server, url: `http://${host2}:${server.port}/` };
49158
49119
  }
49159
- export { defaultConfig4 as defaultConfig, getConfig, loadCloudConfig, config5 as config, encodeBase32, decodeBase32, hotp, totp, verifyTotp, matchTotpCounter, totpUri, AUTH_SESSION_IDLE_TTL_MS, AUTH_SESSION_ABSOLUTE_TTL_MS, AUTH_ACTION_TOKEN_TTL_MS, AUTH_MFA_CHALLENGE_TTL_MS, AUTH_OIDC_TRANSACTION_TTL_MS, AuthenticationStore, sendAuthenticationEmail, authEncryptionKeyFile, resolveAuthEncryptionKey, sanitizeOidcReturnPath, discoverOidcProvider, beginOidcAuthorization, completeOidcAuthorization, CONTROL_PLANE_SCHEMA_VERSION, controlPlaneMigrations, AUTHORIZATION_CAPABILITIES, roleCapabilities, scopeContains, authorizeOrganization, effectiveCapabilities, OptimisticConcurrencyError, InvalidOperationTransitionError, UnsupportedSchemaVersionError, controlPlaneDatabaseFile, MAX_CONTROL_PLANE_JSON_BYTES, MAX_CONTROL_PLANE_ERROR_BYTES, sanitizeControlPlaneValue, ControlPlaneStore, searchControlPlane, API_TOKEN_DEFAULT_TTL_MS, API_TOKEN_MAX_TTL_MS, API_IDEMPOTENCY_TTL_MS, AutomationIdentityStore, TsCloudApiError, TsCloudClient, parseCompose, exportCompose, diffCompose, listComposeTemplates, getComposeTemplate, renderComposeTemplate, parseComposeCatalog, planComposeTemplateUpgrade, composeProjectName, buildComposeRuntimeCommand, buildComposeScaleCommand, buildComposeLogsCommand, buildComposeShellCommand, QueueCancellationError, QueueTimeoutError, RetryableOperationError, DurableOperationQueue, DurableQueueWorker, PreviewEnvironmentStore, PreviewEnvironmentService, DEPLOYMENT_QUEUE_KINDS, resolveQueuedDeploymentCommand, createDeploymentQueueHandlers, unsupportedVolumeCapabilities, volumeCapabilities, validateMountPath, validateAttachment, VolumeService, createVolumeQueueHandlers, DockerNamedVolumeDriver, ServerPathVolumeDriver, CloudBlockVolumeDriver, VolumeStore, synchronizeComposeVolumes, completeComposeVolumeDeletion, ComposeApplicationStore, ComposeApplicationService, releaseStrategyCapabilities, assertReleaseStrategy, ReleaseStore, ReleaseService, releaseTrafficPlan, activateImmutableRelease, rollbackImmutableRelease, RELEASE_QUEUE_KINDS, createReleaseQueueHandlers, SourceConnectionStore, SourceProviderError, GithubSourceAdapter, GitlabSourceAdapter, BitbucketSourceAdapter, GiteaSourceAdapter, createSourceAdapter, normalizeSourceEvent, processSourceWebhook, webhookEndpoint, discoverGitRefs, cloneSourceBinding, testSourceConnection, syncSourceRepositories, listSourceReferences, reconcileSourceWebhook, removeSourceWebhook, API_VERSION, openApiDocument, ApiServiceError, requestHash, AutomationApiService, createApiV1Handler, SecurityPostureStore, SECRET_PATTERNS, PreDeployScanner, scanForSecrets, formatScanResults, SecurityScannerRunner, SecretFindingScanner, TrivyImageScanner, AwsIamCapabilityScanner, generateCycloneDxSbom, generateImageSbom, attachSbomToRelease, attachVulnerabilitySummary, createReleaseProvenance, attachProvenanceToRelease, verifyArtifactSignature, securityScope, ensureDefaultSecurityPolicies, recordPreDeploySecretScan, recordSkippedSecretScan, recordDashboardHostPosture, productionChangeReview, secureContainerRelease, runtimeId2 as runtimeId, unsupportedCapabilities, capabilities2 as capabilities, normalizeRuntimeStatus, redactRuntimeConfig, ageSeconds, bytes, discoverRuntimeInventory, ecsWorkloads, lambdaWorkloads, parseDockerInspect, dockerWorkloads, DockerDiscoveryAdapter, parseSystemdRecords, systemdWorkloads, SystemdDiscoveryAdapter, EcsRuntimeAdapter, LambdaRuntimeAdapter, createRuntimeAdapters, resolveRuntimeInventory, authorizeRuntimePath, DIAGNOSTIC_PRESETS, RuntimeOperationService, RuntimeStreamRegistry, DEFAULT_TELEMETRY_POLICY, normalizeTelemetryPolicy, telemetryPolicyKey, loadTelemetryPolicy, saveTelemetryPolicy, telemetryEstimatedMonthlyCost, redactTelemetryText, redactTelemetryValue, pathTemplate, telemetryCursor, telemetryPercentile, telemetryBucketLabel, TelemetryStore, AlertStore, AlertEvaluator, isQuietHours, NotificationRouter, HealthCheckRunner, evaluateTelemetryAlertRules, normalizeScheduleExpression, nextScheduleRuns, previewSchedule, jobProviderCapability, renderServerCron, eventBridgeScheduleInput, reconcileJobObservation, desiredState, ServerCronJobAdapter, EventBridgeJobAdapter, JobProviderReconciler, synchronizeConfiguredJobs, JobService, createJobQueueHandlers, JobStore, dataServiceCapabilities, DataServiceStore, connectionGuidance, DataServiceLifecycle, createDataServiceQueueHandlers, AwsRdsDataAdapter, AwsAuroraDataAdapter, AwsElastiCacheDataAdapter, ServerDataAdapter, ContainerDataAdapter, AwsRdsTransport, AwsAuroraTransport, AwsElastiCacheTransport, BunDockerRuntime, DockerDataTransport, EncryptedDataSecretStore, SystemFleetSshTransport, SshFleetDriver, createFleetQueueHandlers, FleetStore, FleetService, zeroCapacity, capacity, PlacementStore, PlacementService, RemoteBuildService, createRemoteBuildQueueHandlers, TransportRemoteBuildDriver, createServerBuildDriver, createEcsBuildDriver, createAsgBuildDriver, RegionStore, RegionService, createRegionQueueHandlers, AwsRegionalDriver, UnavailableRegionalDriver, canonicalJson, manifestDigest, documentDigest, publicKeyFingerprint, verifyUpdateSignature, updateCompatibility, MaintenanceStore, maintenanceWindowOpen, MaintenanceService, createMaintenanceQueueHandlers, TransportPlatformMaintenanceDriver, ControlPlaneCleanupDriver, TransportDisasterRecoveryDriver, collectServerDnsDomains, removeStaleServerAddressRecords, ensureDashboardActor, initializeDashboardControlPlane, synchronizeDashboardUsers, trackDashboardOperation, dashboardPageRoutes, resolveLegacyDashboardRoute, routesForDashboard, deploySite, createStaticApiOriginDependencies, deployStaticApiOrigin, verifyStaticApiOrigin, estimateStaticApiOriginMonthlyCost, createExistingStaticFullStackDependencies, generateExistingStaticFullStackTemplate, deployExistingStaticFullStack, estimateExistingStaticFullStackMonthlyCost, hashContainerContext, createContainerImageDependencies, buildAndPushContainerImage, infraEnvFromOutputs, buildFunctionEnv, deployServerlessApp, redeployServerlessApp, rollbackServerlessApp, setMaintenance, runRemoteCommand, resolveDashboardData, validateBackupDestination, BackupStore, encryptBackup, decryptBackup, backupCredentialStatus, S3BackupDestinationAdapter, BackupCoordinator, createBackupQueueHandlers, AwsDatabaseBackupSource, compressBackup, decompressBackup, BunFilesystemArchiveRuntime, FilesystemBackupSource, LogicalDatabaseBackupSource, BunDockerVolumeRuntime, DockerVolumeBackupSource, ControlPlaneBackupSource, AwsInfrastructureBackupSource, ConfigurationStore, parseDotenv, serializeDotenv, LocalEncryptedConfigurationBackend, AwsSecretsManagerConfigurationBackend, AwsSsmConfigurationBackend, ExternalConfigurationBackend, ConfigurationService, synchronizeConfiguredConfiguration, sanitizeCloudConfig, dashboardActions, resolveDashboardAction, startLocalDashboardServer };
49120
+ export { defaultConfig4 as defaultConfig, getConfig, loadCloudConfig, config5 as config, encodeBase32, decodeBase32, hotp, totp, verifyTotp, matchTotpCounter, totpUri, AUTH_SESSION_IDLE_TTL_MS, AUTH_SESSION_ABSOLUTE_TTL_MS, AUTH_ACTION_TOKEN_TTL_MS, AUTH_MFA_CHALLENGE_TTL_MS, AUTH_OIDC_TRANSACTION_TTL_MS, AuthenticationStore, sendAuthenticationEmail, authEncryptionKeyFile, resolveAuthEncryptionKey, sanitizeOidcReturnPath, discoverOidcProvider, beginOidcAuthorization, completeOidcAuthorization, CONTROL_PLANE_SCHEMA_VERSION, controlPlaneMigrations, AUTHORIZATION_CAPABILITIES, roleCapabilities, scopeContains, authorizeOrganization, effectiveCapabilities, OptimisticConcurrencyError, InvalidOperationTransitionError, UnsupportedSchemaVersionError, controlPlaneDatabaseFile, MAX_CONTROL_PLANE_JSON_BYTES, MAX_CONTROL_PLANE_ERROR_BYTES, sanitizeControlPlaneValue, ControlPlaneStore, searchControlPlane, API_TOKEN_DEFAULT_TTL_MS, API_TOKEN_MAX_TTL_MS, API_IDEMPOTENCY_TTL_MS, AutomationIdentityStore, TsCloudApiError, TsCloudClient, parseCompose, exportCompose, diffCompose, listComposeTemplates, getComposeTemplate, renderComposeTemplate, parseComposeCatalog, planComposeTemplateUpgrade, composeProjectName, buildComposeRuntimeCommand, buildComposeScaleCommand, buildComposeLogsCommand, buildComposeShellCommand, QueueCancellationError, QueueTimeoutError, RetryableOperationError, DurableOperationQueue, DurableQueueWorker, PreviewEnvironmentStore, PreviewEnvironmentService, DEPLOYMENT_QUEUE_KINDS, resolveQueuedDeploymentCommand, createDeploymentQueueHandlers, unsupportedVolumeCapabilities, volumeCapabilities, validateMountPath, validateAttachment, VolumeService, createVolumeQueueHandlers, DockerNamedVolumeDriver, ServerPathVolumeDriver, CloudBlockVolumeDriver, VolumeStore, synchronizeComposeVolumes, completeComposeVolumeDeletion, ComposeApplicationStore, ComposeApplicationService, releaseStrategyCapabilities, assertReleaseStrategy, ReleaseStore, ReleaseService, releaseTrafficPlan, activateImmutableRelease, rollbackImmutableRelease, RELEASE_QUEUE_KINDS, createReleaseQueueHandlers, SourceConnectionStore, SourceProviderError, GithubSourceAdapter, GitlabSourceAdapter, BitbucketSourceAdapter, GiteaSourceAdapter, createSourceAdapter, normalizeSourceEvent, processSourceWebhook, webhookEndpoint, discoverGitRefs, cloneSourceBinding, testSourceConnection, syncSourceRepositories, listSourceReferences, reconcileSourceWebhook, removeSourceWebhook, API_VERSION, openApiDocument, ApiServiceError, requestHash, AutomationApiService, createApiV1Handler, SecurityPostureStore, SECRET_PATTERNS, PreDeployScanner, scanForSecrets, formatScanResults, SecurityScannerRunner, SecretFindingScanner, TrivyImageScanner, AwsIamCapabilityScanner, generateCycloneDxSbom, generateImageSbom, attachSbomToRelease, attachVulnerabilitySummary, createReleaseProvenance, attachProvenanceToRelease, verifyArtifactSignature, securityScope, ensureDefaultSecurityPolicies, recordPreDeploySecretScan, recordSkippedSecretScan, recordDashboardHostPosture, productionChangeReview, secureContainerRelease, runtimeId2 as runtimeId, unsupportedCapabilities, capabilities2 as capabilities, normalizeRuntimeStatus, redactRuntimeConfig, ageSeconds, bytes, discoverRuntimeInventory, ecsWorkloads, lambdaWorkloads, parseDockerInspect, dockerWorkloads, DockerDiscoveryAdapter, parseSystemdRecords, systemdWorkloads, SystemdDiscoveryAdapter, EcsRuntimeAdapter, LambdaRuntimeAdapter, createRuntimeAdapters, resolveRuntimeInventory, authorizeRuntimePath, DIAGNOSTIC_PRESETS, RuntimeOperationService, RuntimeStreamRegistry, DEFAULT_TELEMETRY_POLICY, normalizeTelemetryPolicy, telemetryPolicyKey, loadTelemetryPolicy, saveTelemetryPolicy, telemetryEstimatedMonthlyCost, redactTelemetryText, redactTelemetryValue, pathTemplate, telemetryCursor, telemetryPercentile, telemetryBucketLabel, TelemetryStore, AlertStore, AlertEvaluator, isQuietHours, NotificationRouter, HealthCheckRunner, evaluateTelemetryAlertRules, normalizeScheduleExpression, nextScheduleRuns, previewSchedule, jobProviderCapability, renderServerCron, eventBridgeScheduleInput, reconcileJobObservation, desiredState, ServerCronJobAdapter, EventBridgeJobAdapter, JobProviderReconciler, synchronizeConfiguredJobs, JobService, createJobQueueHandlers, JobStore, dataServiceCapabilities, DataServiceStore, connectionGuidance, DataServiceLifecycle, createDataServiceQueueHandlers, AwsRdsDataAdapter, AwsAuroraDataAdapter, AwsElastiCacheDataAdapter, ServerDataAdapter, ContainerDataAdapter, AwsRdsTransport, AwsAuroraTransport, AwsElastiCacheTransport, BunDockerRuntime, DockerDataTransport, EncryptedDataSecretStore, SystemFleetSshTransport, SshFleetDriver, createFleetQueueHandlers, FleetStore, FleetService, zeroCapacity, capacity, PlacementStore, PlacementService, RemoteBuildService, createRemoteBuildQueueHandlers, TransportRemoteBuildDriver, createServerBuildDriver, createEcsBuildDriver, createAsgBuildDriver, RegionStore, RegionService, createRegionQueueHandlers, AwsRegionalDriver, UnavailableRegionalDriver, canonicalJson, manifestDigest, documentDigest, publicKeyFingerprint, verifyUpdateSignature, updateCompatibility, MaintenanceStore, maintenanceWindowOpen, MaintenanceService, createMaintenanceQueueHandlers, TransportPlatformMaintenanceDriver, ControlPlaneCleanupDriver, TransportDisasterRecoveryDriver, ensureDashboardActor, initializeDashboardControlPlane, synchronizeDashboardUsers, trackDashboardOperation, dashboardPageRoutes, resolveLegacyDashboardRoute, routesForDashboard, deploySite, createStaticApiOriginDependencies, deployStaticApiOrigin, verifyStaticApiOrigin, estimateStaticApiOriginMonthlyCost, createExistingStaticFullStackDependencies, generateExistingStaticFullStackTemplate, deployExistingStaticFullStack, estimateExistingStaticFullStackMonthlyCost, hashContainerContext, createContainerImageDependencies, buildAndPushContainerImage, infraEnvFromOutputs, buildFunctionEnv, deployServerlessApp, redeployServerlessApp, rollbackServerlessApp, setMaintenance, runRemoteCommand, resolveDashboardData, validateBackupDestination, BackupStore, encryptBackup, decryptBackup, backupCredentialStatus, S3BackupDestinationAdapter, BackupCoordinator, createBackupQueueHandlers, AwsDatabaseBackupSource, compressBackup, decompressBackup, BunFilesystemArchiveRuntime, FilesystemBackupSource, LogicalDatabaseBackupSource, BunDockerVolumeRuntime, DockerVolumeBackupSource, ControlPlaneBackupSource, AwsInfrastructureBackupSource, ConfigurationStore, parseDotenv, serializeDotenv, LocalEncryptedConfigurationBackend, AwsSecretsManagerConfigurationBackend, AwsSsmConfigurationBackend, ExternalConfigurationBackend, ConfigurationService, synchronizeConfiguredConfiguration, sanitizeCloudConfig, dashboardActions, resolveDashboardAction, startLocalDashboardServer };
@@ -1087,6 +1087,15 @@ class EC2Client {
1087
1087
  return [];
1088
1088
  return Array.isArray(item) ? item : [item];
1089
1089
  }
1090
+ parseFirstIpv6Address(item) {
1091
+ for (const eni of this.parseArray(item)) {
1092
+ for (const entry of this.parseArray(eni?.ipv6AddressesSet?.item)) {
1093
+ if (entry?.ipv6Address)
1094
+ return entry.ipv6Address;
1095
+ }
1096
+ }
1097
+ return;
1098
+ }
1090
1099
  parseTags(item) {
1091
1100
  return this.parseArray(item).map((t) => ({
1092
1101
  Key: t.key,
@@ -1110,6 +1119,7 @@ class EC2Client {
1110
1119
  } : undefined,
1111
1120
  PrivateIpAddress: i.privateIpAddress,
1112
1121
  PublicIpAddress: i.ipAddress,
1122
+ Ipv6Address: this.parseFirstIpv6Address(i.networkInterfaceSet?.item),
1113
1123
  SubnetId: i.subnetId,
1114
1124
  VpcId: i.vpcId,
1115
1125
  SecurityGroups: this.parseArray(i.groupSet?.item).map((g) => ({
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  EC2Client,
14
14
  SSMClient
15
- } from "./chunk-703nkybg.js";
15
+ } from "./chunk-7m60qnc8.js";
16
16
  import {
17
17
  CloudFormationClient
18
18
  } from "./chunk-4cjrg98a.js";
@@ -27,6 +27,98 @@ import {
27
27
  import { readFileSync } from "node:fs";
28
28
  import { join } from "node:path";
29
29
 
30
+ // src/deploy/server-dns.ts
31
+ function collectServerDnsDomains(sites = {}) {
32
+ const domains = new Set;
33
+ for (const site of Object.values(sites)) {
34
+ if (!site.domain)
35
+ continue;
36
+ if (site.redirect || site.deploy === "server" || site.start)
37
+ domains.add(site.domain);
38
+ }
39
+ return domains;
40
+ }
41
+ function normalizeName(name) {
42
+ return name.replace(/\.$/, "").toLowerCase();
43
+ }
44
+ function matchesHostname(record, zone, hostname) {
45
+ const recordName = normalizeName(record.name);
46
+ const normalizedZone = normalizeName(zone);
47
+ const normalizedHostname = normalizeName(hostname);
48
+ const relativeName = normalizedHostname === normalizedZone ? "@" : normalizedHostname.endsWith(`.${normalizedZone}`) ? normalizedHostname.slice(0, -(normalizedZone.length + 1)) : normalizedHostname;
49
+ return recordName === normalizedHostname || recordName === relativeName || relativeName === "@" && (recordName === "" || recordName === normalizedZone);
50
+ }
51
+ async function removeStaleServerAddressRecords(provider, zone, hostname, desiredAddress, recordType = "A") {
52
+ const listed = await provider.listRecords(zone);
53
+ if (!listed.success)
54
+ return [`could not list ${recordType} records: ${listed.message || "unknown provider error"}`];
55
+ const matching = listed.records.filter((record) => record.type === recordType && matchesHostname(record, zone, hostname));
56
+ const desiredIndex = matching.findIndex((record) => record.content === desiredAddress);
57
+ if (matching.length <= 1 || desiredIndex === -1)
58
+ return [];
59
+ const warnings = [];
60
+ for (const [index, record] of matching.entries()) {
61
+ if (index === desiredIndex)
62
+ continue;
63
+ const result = await provider.deleteRecord(zone, record);
64
+ if (!result.success)
65
+ warnings.push(`could not remove stale ${record.name} ${recordType} ${record.content}: ${result.message || "unknown provider error"}`);
66
+ }
67
+ return warnings;
68
+ }
69
+ function normalizePublicIpv6(reported) {
70
+ if (!reported)
71
+ return;
72
+ const trimmed = reported.trim();
73
+ if (!trimmed)
74
+ return;
75
+ if (!trimmed.includes("/"))
76
+ return trimmed;
77
+ const [block] = trimmed.split("/");
78
+ if (!block.endsWith("::"))
79
+ return block || undefined;
80
+ return `${block}1`;
81
+ }
82
+ var IPV6_EXCLUDED_HOST_LABELS = new Set(["mail", "smtp", "imap", "mx"]);
83
+ function hostAcceptsIpv6(fqdn) {
84
+ return !IPV6_EXCLUDED_HOST_LABELS.has(fqdn.split(".")[0] ?? "");
85
+ }
86
+ async function reconcileAddressRecords(options) {
87
+ const { provider, zone, fqdn, ipv4, ipv6, ttl = 600 } = options;
88
+ const report = { published: [], warnings: [] };
89
+ const families = [{ type: "A", content: ipv4 }];
90
+ if (ipv6 && hostAcceptsIpv6(fqdn))
91
+ families.push({ type: "AAAA", content: ipv6 });
92
+ for (const { type, content } of families) {
93
+ const result = await provider.upsertRecord(zone, { name: fqdn, type, content, ttl });
94
+ if (result?.success === false) {
95
+ report.warnings.push(`${fqdn} → ${content} failed: ${result.error || result.message || "unknown error"}`);
96
+ continue;
97
+ }
98
+ report.warnings.push(...(await removeStaleServerAddressRecords(provider, zone, fqdn, content, type)).map((warning) => `${fqdn} cleanup: ${warning}`));
99
+ if (await verifyAddressRecord(provider, zone, fqdn, content, type))
100
+ report.published.push({ fqdn, type, content });
101
+ else
102
+ report.warnings.push(`${fqdn} → ${content} reported success at ${provider.name} but no matching ${type} record exists — create it manually: ${type} ${fqdn} → ${content}`);
103
+ }
104
+ return report;
105
+ }
106
+ async function verifyAddressRecord(provider, zone, fqdn, content, recordType) {
107
+ try {
108
+ if (typeof provider?.listRecords !== "function")
109
+ return true;
110
+ const listed = await provider.listRecords(zone);
111
+ if (!listed?.success || !Array.isArray(listed.records))
112
+ return true;
113
+ return listed.records.some((record) => {
114
+ const name = typeof record?.name === "string" ? record.name.replace(/\.$/, "") : "";
115
+ return record?.type === recordType && name === fqdn && record?.content === content;
116
+ });
117
+ } catch {
118
+ return true;
119
+ }
120
+ }
121
+
30
122
  // src/drivers/shared/package-manager.ts
31
123
  var PANTRY_PACKAGES = {
32
124
  php: "php.net",
@@ -1752,6 +1844,7 @@ class AwsDriver {
1752
1844
  return {
1753
1845
  appInstanceId: first.id,
1754
1846
  appPublicIp: first.publicIp,
1847
+ appPublicIpv6: first.publicIpv6,
1755
1848
  sshUser: "ubuntu",
1756
1849
  deployStoragePath: "/var/ts-cloud/staging"
1757
1850
  };
@@ -1834,6 +1927,7 @@ class AwsDriver {
1834
1927
  return {
1835
1928
  appInstanceId: instanceId,
1836
1929
  appPublicIp: running.PublicIpAddress,
1930
+ appPublicIpv6: normalizePublicIpv6(running.Ipv6Address),
1837
1931
  sshUser: "ubuntu",
1838
1932
  deployStoragePath: "/var/ts-cloud/staging"
1839
1933
  };
@@ -1892,6 +1986,7 @@ class AwsDriver {
1892
1986
  return {
1893
1987
  appInstanceId: first?.id,
1894
1988
  appPublicIp: first?.publicIp,
1989
+ appPublicIpv6: first?.publicIpv6,
1895
1990
  sshUser: "ubuntu",
1896
1991
  deployStoragePath: "/var/ts-cloud/staging"
1897
1992
  };
@@ -1961,6 +2056,7 @@ class AwsDriver {
1961
2056
  id: instance.InstanceId,
1962
2057
  name: nameTag,
1963
2058
  publicIp: instance.PublicIpAddress,
2059
+ publicIpv6: normalizePublicIpv6(instance.Ipv6Address),
1964
2060
  privateIp: instance.PrivateIpAddress,
1965
2061
  status: instance.State?.Name
1966
2062
  });
@@ -2613,6 +2709,7 @@ class HetznerDriver {
2613
2709
  serverId: alreadyRunning.id,
2614
2710
  serverName: alreadyRunning.name,
2615
2711
  publicIp: alreadyRunning.public_net.ipv4?.ip,
2712
+ publicIpv6: normalizePublicIpv6(alreadyRunning.public_net.ipv6?.ip),
2616
2713
  deployStoragePath: "/var/ts-cloud/staging",
2617
2714
  sshUser: this.sshUser
2618
2715
  };
@@ -2660,6 +2757,7 @@ class HetznerDriver {
2660
2757
  serverName: running.name,
2661
2758
  firewallId: firewall.id,
2662
2759
  publicIp: running.public_net.ipv4?.ip,
2760
+ publicIpv6: normalizePublicIpv6(running.public_net.ipv6?.ip),
2663
2761
  deployStoragePath: "/var/ts-cloud/staging",
2664
2762
  sshUser: this.sshUser
2665
2763
  };
@@ -3161,6 +3259,7 @@ class HetznerDriver {
3161
3259
  id: String(server.id),
3162
3260
  name: server.name,
3163
3261
  publicIp: server.public_net.ipv4?.ip,
3262
+ publicIpv6: normalizePublicIpv6(server.public_net.ipv6?.ip),
3164
3263
  privateIp: server.private_net?.[0]?.ip,
3165
3264
  status: server.status
3166
3265
  });
@@ -3373,6 +3472,7 @@ ${out}`);
3373
3472
  deployStoragePath: state.deployStoragePath || "/var/ts-cloud/staging",
3374
3473
  appInstanceId: state.serverId ? String(state.serverId) : undefined,
3375
3474
  appPublicIp: server?.public_net.ipv4?.ip || state.publicIp,
3475
+ appPublicIpv6: normalizePublicIpv6(server?.public_net.ipv6?.ip) || state.publicIpv6,
3376
3476
  sshUser: state.sshUser || this.sshUser,
3377
3477
  servicesPrivateIp: state.servicesPrivateIp
3378
3478
  };
@@ -6198,4 +6298,4 @@ function buildCloudFrontOriginConfig(options) {
6198
6298
  CustomErrorResponses: { Quantity: 0 }
6199
6299
  };
6200
6300
  }
6201
- export { PANTRY_PROJECT_DIR, pgAdminCommand, BACKUP_RUNNER_PATH, buildBackupRestoreScript, siteInstallBase, isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, shipsARelease, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, buildRpxFragmentRefreshScript, buildUbuntuBootstrapScript, AwsDriver, resolveHetznerLocation, HetznerClient, resolveHetznerApiToken2 as resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, HetznerDriver, LocalBoxDriver, isBoxMode, createCloudDriver, CloudDriverFactory, cloudDrivers, planHetznerServerResize, isHetznerCapacityError, executeHetznerServerResize, buildSshArgs, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, collectHetznerResizeManifest, prepareHetznerResize, verifyHetznerResize, resolveHetznerHostOptimizationPlan, buildHetznerHostOptimizationScript, applyHetznerHostOptimization, collectHetznerHostOptimizationReport, verifyHetznerHostOptimization, resizeCheckpointPath, resizeLockPath, readResizeCheckpoint, writeResizeCheckpoint, acquireResizeLock, ensureSshKey, ensureFirewall, ensureServer, serverPublicIpv4, UBUNTU_2404_AMI_PARAM, buildBoxUserData, HetznerBoxProvisioner, AwsBoxProvisioner, createBoxProvisioner, releasePaths, buildRollbackScript, resolveExecStart, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, buildAwsArtifactFetch, buildLocalArtifactFetch, buildHostCleanupScript, MANAGEMENT_DASHBOARD_SITE, dashboardCredentialsFile, resolveDashboardAuth, resolveUiSource, ensureManagementDashboard, buildManagementDashboardArtifact, resolveSiteFramework, deploySiteRelease, deployAllComputeSites, reloadRpxGateway, renewRpxCertificates, MANAGED_CACHE_POLICY_OPTIMIZED, MANAGED_CACHE_POLICY_DISABLED, MANAGED_ORIGIN_REQUEST_POLICY_ALL_VIEWER, buildCloudFrontOriginConfig };
6301
+ export { collectServerDnsDomains, removeStaleServerAddressRecords, normalizePublicIpv6, IPV6_EXCLUDED_HOST_LABELS, hostAcceptsIpv6, reconcileAddressRecords, verifyAddressRecord, PANTRY_PROJECT_DIR, pgAdminCommand, BACKUP_RUNNER_PATH, buildBackupRestoreScript, siteInstallBase, isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, shipsARelease, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, buildRpxFragmentRefreshScript, buildUbuntuBootstrapScript, AwsDriver, resolveHetznerLocation, HetznerClient, resolveHetznerApiToken2 as resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, HetznerDriver, LocalBoxDriver, isBoxMode, createCloudDriver, CloudDriverFactory, cloudDrivers, planHetznerServerResize, isHetznerCapacityError, executeHetznerServerResize, buildSshArgs, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, collectHetznerResizeManifest, prepareHetznerResize, verifyHetznerResize, resolveHetznerHostOptimizationPlan, buildHetznerHostOptimizationScript, applyHetznerHostOptimization, collectHetznerHostOptimizationReport, verifyHetznerHostOptimization, resizeCheckpointPath, resizeLockPath, readResizeCheckpoint, writeResizeCheckpoint, acquireResizeLock, ensureSshKey, ensureFirewall, ensureServer, serverPublicIpv4, UBUNTU_2404_AMI_PARAM, buildBoxUserData, HetznerBoxProvisioner, AwsBoxProvisioner, createBoxProvisioner, releasePaths, buildRollbackScript, resolveExecStart, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, buildAwsArtifactFetch, buildLocalArtifactFetch, buildHostCleanupScript, MANAGEMENT_DASHBOARD_SITE, dashboardCredentialsFile, resolveDashboardAuth, resolveUiSource, ensureManagementDashboard, buildManagementDashboardArtifact, resolveSiteFramework, deploySiteRelease, deployAllComputeSites, reloadRpxGateway, renewRpxCertificates, MANAGED_CACHE_POLICY_OPTIMIZED, MANAGED_CACHE_POLICY_DISABLED, MANAGED_ORIGIN_REQUEST_POLICY_ALL_VIEWER, buildCloudFrontOriginConfig };
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  buildAndPushContainerImage,
3
3
  buildFunctionEnv,
4
- collectServerDnsDomains,
5
4
  createContainerImageDependencies,
6
5
  createExistingStaticFullStackDependencies,
7
6
  createStaticApiOriginDependencies,
@@ -19,7 +18,6 @@ import {
19
18
  infraEnvFromOutputs,
20
19
  initializeDashboardControlPlane,
21
20
  redeployServerlessApp,
22
- removeStaleServerAddressRecords,
23
21
  resolveDashboardAction,
24
22
  resolveDashboardData,
25
23
  resolveLegacyDashboardRoute,
@@ -32,7 +30,7 @@ import {
32
30
  synchronizeDashboardUsers,
33
31
  trackDashboardOperation,
34
32
  verifyStaticApiOrigin
35
- } from "../chunk-8m38yfba.js";
33
+ } from "../chunk-4erbrg3e.js";
36
34
  import {
37
35
  deleteStaticSite,
38
36
  deployStaticSite,
@@ -53,21 +51,28 @@ import"../chunk-50jpda9q.js";
53
51
  import"../chunk-he9a874b.js";
54
52
  import"../chunk-gttvakpv.js";
55
53
  import {
54
+ IPV6_EXCLUDED_HOST_LABELS,
56
55
  MANAGEMENT_DASHBOARD_SITE,
57
56
  buildManagementDashboardArtifact,
57
+ collectServerDnsDomains,
58
58
  dashboardCredentialsFile,
59
59
  ensureManagementDashboard,
60
+ hostAcceptsIpv6,
60
61
  isPhpSite,
62
+ normalizePublicIpv6,
63
+ reconcileAddressRecords,
64
+ removeStaleServerAddressRecords,
61
65
  resolveDashboardAuth,
62
66
  resolveSiteDeployTarget,
63
67
  resolveSiteKind,
64
68
  resolveUiSource,
65
69
  shipsARelease,
66
70
  siteInstallBase,
67
- validateDeploymentConfig
68
- } from "../chunk-838t87x3.js";
71
+ validateDeploymentConfig,
72
+ verifyAddressRecord
73
+ } from "../chunk-ztbn47we.js";
69
74
  import"../chunk-1qjyqrc5.js";
70
- import"../chunk-703nkybg.js";
75
+ import"../chunk-7m60qnc8.js";
71
76
  import"../chunk-4cjrg98a.js";
72
77
  import"../chunk-hpv68b4a.js";
73
78
  import"../chunk-32e7ya18.js";
@@ -76,6 +81,7 @@ import"../chunk-zqtpg06c.js";
76
81
  import"../chunk-v0bahtg2.js";
77
82
  export {
78
83
  verifyStaticApiOrigin,
84
+ verifyAddressRecord,
79
85
  validateDeploymentConfig,
80
86
  uploadStaticFiles,
81
87
  trackDashboardOperation,
@@ -97,10 +103,13 @@ export {
97
103
  resolveDashboardAction,
98
104
  removeStaleServerAddressRecords,
99
105
  redeployServerlessApp,
106
+ reconcileAddressRecords,
107
+ normalizePublicIpv6,
100
108
  isPhpSite,
101
109
  invalidateCache,
102
110
  initializeDashboardControlPlane,
103
111
  infraEnvFromOutputs,
112
+ hostAcceptsIpv6,
104
113
  hashContainerContext,
105
114
  generateStaticSiteTemplate,
106
115
  generateExternalDnsStaticSiteTemplate,
@@ -129,5 +138,6 @@ export {
129
138
  buildFunctionEnv,
130
139
  buildAndPushServerlessImage,
131
140
  buildAndPushContainerImage,
132
- MANAGEMENT_DASHBOARD_SITE
141
+ MANAGEMENT_DASHBOARD_SITE,
142
+ IPV6_EXCLUDED_HOST_LABELS
133
143
  };
@@ -9,8 +9,82 @@ interface ServerSite {
9
9
  export declare function collectServerDnsDomains(sites?: Record<string, ServerSite>): Set<string>;
10
10
  /**
11
11
  * A compute deployment owns one address per managed hostname. After an upsert,
12
- * remove only duplicate A records for that exact hostname, preserving one copy
13
- * of the desired address and leaving every unrelated record untouched.
12
+ * remove only duplicate address records for that exact hostname, preserving one
13
+ * copy of the desired address and leaving every unrelated record untouched.
14
+ *
15
+ * `recordType` selects the family. It used to be hardcoded to 'A', which meant
16
+ * a dual-stack box could clean up its stale IPv4 records but accumulated stale
17
+ * AAAA ones forever — and a stale AAAA is worse than a stale A, because
18
+ * dual-stack clients prefer IPv6 and would keep landing on the dead address.
14
19
  */
15
- export declare function removeStaleServerAddressRecords(provider: DnsProvider, zone: string, hostname: string, desiredAddress: string): Promise<string[]>;
20
+ export declare function removeStaleServerAddressRecords(provider: DnsProvider, zone: string, hostname: string, desiredAddress: string, recordType?: 'A' | 'AAAA'): Promise<string[]>;
21
+ /**
22
+ * Turn whatever a provider reports as a box's IPv6 into an address an AAAA
23
+ * record can point at.
24
+ *
25
+ * Providers disagree on what "the server's IPv6" means. Hetzner hands out a
26
+ * routed /64 and reports the block (`2a01:4f8:c014:6186::/64`) while the
27
+ * interface actually holds `::1` inside it; AWS reports a plain address per
28
+ * network interface. Publishing a block verbatim gives an AAAA record nothing
29
+ * answers on, which is the kind of failure that only shows up for the fraction
30
+ * of visitors whose network prefers IPv6 — so every driver runs its value
31
+ * through here rather than reinventing the narrowing.
32
+ *
33
+ * A plain address passes through unchanged.
34
+ */
35
+ export declare function normalizePublicIpv6(reported: string | undefined | null): string | undefined;
36
+ /**
37
+ * Hostname labels that must stay IPv4-only.
38
+ *
39
+ * A box typically runs its mail server on IPv4 alone, and its IPv6 address
40
+ * usually has no PTR — both of which make an AAAA on a mail host actively
41
+ * harmful: senders try the v6 address first, find nothing listening (or get
42
+ * rejected for the missing reverse record) and defer the message. Web traffic
43
+ * has no such constraint, so the exclusion is per-host rather than per-zone.
44
+ */
45
+ export declare const IPV6_EXCLUDED_HOST_LABELS: ReadonlySet<string>;
46
+ /** Whether `fqdn` should get an AAAA record pointing at the box. */
47
+ export declare function hostAcceptsIpv6(fqdn: string): boolean;
48
+ export interface AddressRecordReport {
49
+ /** Records confirmed present at the provider after the write. */
50
+ published: Array<{
51
+ fqdn: string;
52
+ type: 'A' | 'AAAA';
53
+ content: string;
54
+ }>;
55
+ /** Anything the caller should surface: failed writes, unverified writes, stale-record cleanup problems. */
56
+ warnings: string[];
57
+ }
58
+ interface ReconcileAddressRecordsOptions {
59
+ provider: DnsProvider;
60
+ zone: string;
61
+ fqdn: string;
62
+ ipv4: string;
63
+ /** Omit when the box has no public IPv6; the AAAA pass is then skipped entirely. */
64
+ ipv6?: string;
65
+ ttl?: number;
66
+ }
67
+ /**
68
+ * Point one hostname at a box on every address family the box actually has.
69
+ *
70
+ * Shared by every driver and by the framework's deploy command so the rules
71
+ * live in one place: upsert, then remove the *other* records of that family for
72
+ * the same hostname (a leftover address round-robins traffic to a dead host —
73
+ * and a stale AAAA is the worse of the two, because dual-stack clients prefer
74
+ * IPv6), then verify against the provider rather than trusting the write.
75
+ */
76
+ export declare function reconcileAddressRecords(options: ReconcileAddressRecordsOptions): Promise<AddressRecordReport>;
77
+ /**
78
+ * Best-effort post-write check that the record exists at the provider.
79
+ *
80
+ * Returns true when the provider offers no list API or the listing itself
81
+ * fails: verification must never turn a possibly-good write into a false
82
+ * alarm. It exists to catch phantom successes — an upsert that reported OK
83
+ * while editing the wrong record — at providers that can list their zone.
84
+ *
85
+ * The listing is deliberately untyped. Typed listings map to endpoints like
86
+ * Porkbun's retrieveByNameType, whose subdomain-less form returns apex records
87
+ * only, which made verification blind to every non-apex record.
88
+ */
89
+ export declare function verifyAddressRecord(provider: DnsProvider, zone: string, fqdn: string, content: string, recordType: 'A' | 'AAAA'): Promise<boolean>;
16
90
  export {};
@@ -6,6 +6,14 @@ export interface HetznerDriverState {
6
6
  serverName?: string;
7
7
  firewallId?: number;
8
8
  publicIp?: string;
9
+ /**
10
+ * The box's public IPv6 address, already narrowed from the routed /64 the
11
+ * API reports to the address the interface actually holds. Recorded so a
12
+ * deploy can publish AAAA records alongside the A records without having to
13
+ * call the Hetzner API again — attach-mode tenants read this state and never
14
+ * see the server object at all.
15
+ */
16
+ publicIpv6?: string;
9
17
  deployStoragePath?: string;
10
18
  sshUser?: string;
11
19
  /** Fleet: network/LB ids + the services box private IP, for deploy + teardown. */
@@ -68,9 +68,9 @@ import {
68
68
  waitForSsh,
69
69
  wrapCloudInitUserData,
70
70
  writeResizeCheckpoint
71
- } from "../chunk-838t87x3.js";
71
+ } from "../chunk-ztbn47we.js";
72
72
  import"../chunk-1qjyqrc5.js";
73
- import"../chunk-703nkybg.js";
73
+ import"../chunk-7m60qnc8.js";
74
74
  import"../chunk-4cjrg98a.js";
75
75
  import"../chunk-wj3s95p9.js";
76
76
  import"../chunk-zqtpg06c.js";
package/dist/index.d.ts CHANGED
@@ -30,7 +30,8 @@ export { keyMatchesFilters, migrateObjectStorage, remapKey } from './object-stor
30
30
  export type { MigrateEndpoint, MigrateError, MigrateOptions, MigratePlanItem, MigrateProgress, MigrateResult, MigrateVerification, } from './object-storage/migrate';
31
31
  export * from './ssl';
32
32
  export { deployStaticSite, deployStaticSiteFull, uploadStaticFiles, invalidateCache, deleteStaticSite, generateStaticSiteTemplate, deployStaticSiteWithExternalDns, deployStaticSiteWithExternalDnsFull, generateExternalDnsStaticSiteTemplate, deploySite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, buildAndPushServerlessImage, buildFunctionEnv, deployServerlessApp, infraEnvFromOutputs, redeployServerlessApp, rollbackServerlessApp, runRemoteCommand, setMaintenance, buildManagementDashboardArtifact, dashboardCredentialsFile, ensureManagementDashboard, MANAGEMENT_DASHBOARD_SITE, resolveDashboardAuth, resolveUiSource, } from './deploy';
33
- export { collectServerDnsDomains, removeStaleServerAddressRecords } from './deploy/server-dns';
33
+ export { collectServerDnsDomains, hostAcceptsIpv6, IPV6_EXCLUDED_HOST_LABELS, normalizePublicIpv6, reconcileAddressRecords, removeStaleServerAddressRecords, verifyAddressRecord, } from './deploy/server-dns';
34
+ export type { AddressRecordReport } from './deploy/server-dns';
34
35
  export type { EnsureDashboardLogger, ResolvedDashboardAuth, StaticSiteConfig, DeployResult, UploadOptions, ExternalDnsStaticSiteConfig, ExternalDnsDeployResult, DeploySiteConfig, DeploySiteResult, StaticSiteDnsProvider, SiteDeployKind, DeploymentValidationResult, BuildImageOptions, BuiltImage, CodeSource, DeployServerlessOptions, ResolvedContext, } from './deploy';
35
36
  export { createCloudDriver, CloudDriverFactory, cloudDrivers, AwsDriver, HetznerDriver, HetznerClient, resolveHetznerApiToken, normalizeSshPublicKey, ensureFirewall, ensureServer, ensureSshKey, serverPublicIpv4, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, buildSshArgs, generateUbuntuAppCloudInit, wrapCloudInitUserData, buildHostCleanupScript, buildSiteDeployScript, buildStaticSiteDeployScript, resolveExecStart, deployAllComputeSites, deploySiteRelease, } from './drivers';
36
37
  export type { CreateCloudDriverOptions } from './drivers/factory';
package/dist/index.js CHANGED
@@ -139,7 +139,6 @@ import {
139
139
  capabilities,
140
140
  capacity,
141
141
  cloneSourceBinding,
142
- collectServerDnsDomains,
143
142
  completeComposeVolumeDeletion,
144
143
  completeOidcAuthorization,
145
144
  composeProjectName,
@@ -234,7 +233,6 @@ import {
234
233
  releaseStrategyCapabilities,
235
234
  releaseTrafficPlan,
236
235
  removeSourceWebhook,
237
- removeStaleServerAddressRecords,
238
236
  renderComposeTemplate,
239
237
  renderServerCron,
240
238
  requestHash,
@@ -285,7 +283,7 @@ import {
285
283
  volumeCapabilities,
286
284
  webhookEndpoint,
287
285
  zeroCapacity
288
- } from "./chunk-8m38yfba.js";
286
+ } from "./chunk-4erbrg3e.js";
289
287
  import {
290
288
  deleteStaticSite,
291
289
  deployStaticSite,
@@ -367,6 +365,7 @@ import {
367
365
  CloudDriverFactory,
368
366
  HetznerClient,
369
367
  HetznerDriver,
368
+ IPV6_EXCLUDED_HOST_LABELS,
370
369
  MANAGEMENT_DASHBOARD_SITE,
371
370
  buildHostCleanupScript,
372
371
  buildManagementDashboardArtifact,
@@ -375,6 +374,7 @@ import {
375
374
  buildStaticSiteDeployScript,
376
375
  buildUbuntuBootstrapScript,
377
376
  cloudDrivers,
377
+ collectServerDnsDomains,
378
378
  createCloudDriver,
379
379
  dashboardCredentialsFile,
380
380
  deployAllComputeSites,
@@ -383,7 +383,11 @@ import {
383
383
  ensureManagementDashboard,
384
384
  ensureServer,
385
385
  ensureSshKey,
386
+ hostAcceptsIpv6,
387
+ normalizePublicIpv6,
386
388
  normalizeSshPublicKey,
389
+ reconcileAddressRecords,
390
+ removeStaleServerAddressRecords,
387
391
  resolveDashboardAuth,
388
392
  resolveExecStart,
389
393
  resolveHetznerApiToken,
@@ -395,10 +399,11 @@ import {
395
399
  sshExec,
396
400
  sshExecOrThrow,
397
401
  validateDeploymentConfig,
402
+ verifyAddressRecord,
398
403
  waitForCloudInit,
399
404
  waitForSsh,
400
405
  wrapCloudInitUserData
401
- } from "./chunk-838t87x3.js";
406
+ } from "./chunk-ztbn47we.js";
402
407
  import {
403
408
  ABTestManager,
404
409
  AI,
@@ -816,7 +821,7 @@ import {
816
821
  import {
817
822
  EC2Client,
818
823
  SSMClient
819
- } from "./chunk-703nkybg.js";
824
+ } from "./chunk-7m60qnc8.js";
820
825
  import {
821
826
  CloudFormationClient
822
827
  } from "./chunk-4cjrg98a.js";
@@ -5124,6 +5129,7 @@ export {
5124
5129
  verifyTotp,
5125
5130
  verifyMediaAccessToken,
5126
5131
  verifyArtifactSignature,
5132
+ verifyAddressRecord,
5127
5133
  validateTemplateSize,
5128
5134
  validateTemplate,
5129
5135
  validateResourceLimits,
@@ -5265,6 +5271,7 @@ export {
5265
5271
  recordDashboardHostPosture,
5266
5272
  reconcileSourceWebhook,
5267
5273
  reconcileJobObservation,
5274
+ reconcileAddressRecords,
5268
5275
  quickHash,
5269
5276
  queueManagementManager,
5270
5277
  publicKeyFingerprint,
@@ -5301,6 +5308,7 @@ export {
5301
5308
  normalizeSourceEvent,
5302
5309
  normalizeScheduleExpression,
5303
5310
  normalizeRuntimeStatus,
5311
+ normalizePublicIpv6,
5304
5312
  nextScheduleRuns,
5305
5313
  networkSecurityManager,
5306
5314
  needsRenewal,
@@ -5345,6 +5353,7 @@ export {
5345
5353
  infraEnvFromOutputs,
5346
5354
  imageScanningManager,
5347
5355
  hotp,
5356
+ hostAcceptsIpv6,
5348
5357
  healthCheckManager,
5349
5358
  hashString,
5350
5359
  hashManifest,
@@ -5773,6 +5782,7 @@ export {
5773
5782
  InvalidOperationTransitionError,
5774
5783
  InfrastructureGenerator,
5775
5784
  ImageScanningManager,
5785
+ IPV6_EXCLUDED_HOST_LABELS,
5776
5786
  IAMClient,
5777
5787
  HetznerDriver,
5778
5788
  HetznerClient,