@stacksjs/ts-cloud 0.7.84 → 0.7.85

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 (59) hide show
  1. package/dist/bin/cli.js +382 -382
  2. package/dist/{chunk-838t87x3.js → chunk-gx4288t5.js} +57 -1
  3. package/dist/{chunk-8m38yfba.js → chunk-qbj74thz.js} +5 -44
  4. package/dist/deploy/index.js +6 -4
  5. package/dist/deploy/server-dns.d.ts +18 -3
  6. package/dist/drivers/hetzner/state.d.ts +8 -0
  7. package/dist/drivers/index.js +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.js +6 -4
  10. package/dist/ui/access-denied.html +2 -2
  11. package/dist/ui/account/automation.html +3 -3
  12. package/dist/ui/account/security.html +2 -2
  13. package/dist/ui/applications/compose.html +4 -4
  14. package/dist/ui/applications/new.html +2 -2
  15. package/dist/ui/data/backups.html +4 -4
  16. package/dist/ui/data/services.html +4 -4
  17. package/dist/ui/data/volumes.html +4 -4
  18. package/dist/ui/index.html +4 -4
  19. package/dist/ui/integrations.html +2 -2
  20. package/dist/ui/operations/alerts.html +3 -3
  21. package/dist/ui/operations/configuration.html +4 -4
  22. package/dist/ui/operations/jobs.html +4 -4
  23. package/dist/ui/operations/maintenance.html +3 -3
  24. package/dist/ui/operations/observability.html +4 -4
  25. package/dist/ui/operations/previews.html +4 -4
  26. package/dist/ui/operations/queue.html +4 -4
  27. package/dist/ui/operations/regions.html +4 -4
  28. package/dist/ui/operations/releases.html +4 -4
  29. package/dist/ui/operations/workloads.html +4 -4
  30. package/dist/ui/security.html +2 -2
  31. package/dist/ui/server/actions.html +4 -4
  32. package/dist/ui/server/activity.html +2 -2
  33. package/dist/ui/server/capacity.html +4 -4
  34. package/dist/ui/server/database.html +4 -4
  35. package/dist/ui/server/deployments.html +4 -4
  36. package/dist/ui/server/diagnostics.html +2 -2
  37. package/dist/ui/server/firewall.html +4 -4
  38. package/dist/ui/server/fleet.html +4 -4
  39. package/dist/ui/server/logs.html +4 -4
  40. package/dist/ui/server/metrics.html +4 -4
  41. package/dist/ui/server/services.html +2 -2
  42. package/dist/ui/server/sites.html +4 -4
  43. package/dist/ui/server/ssh-keys.html +4 -4
  44. package/dist/ui/server/team.html +3 -3
  45. package/dist/ui/server/terminal.html +2 -2
  46. package/dist/ui/serverless/alarms.html +3 -3
  47. package/dist/ui/serverless/assets.html +2 -2
  48. package/dist/ui/serverless/cost.html +2 -2
  49. package/dist/ui/serverless/data.html +4 -4
  50. package/dist/ui/serverless/deployments.html +2 -2
  51. package/dist/ui/serverless/firewall.html +2 -2
  52. package/dist/ui/serverless/functions.html +4 -4
  53. package/dist/ui/serverless/logs.html +4 -4
  54. package/dist/ui/serverless/metrics.html +2 -2
  55. package/dist/ui/serverless/queues.html +4 -4
  56. package/dist/ui/serverless/secrets.html +4 -4
  57. package/dist/ui/serverless/traces.html +4 -4
  58. package/dist/ui/serverless.html +4 -4
  59. package/package.json +3 -3
@@ -2045,6 +2045,59 @@ import { execSync } from "node:child_process";
2045
2045
  import { randomUUID } from "node:crypto";
2046
2046
  import { existsSync, readFileSync as readFileSync2 } from "node:fs";
2047
2047
 
2048
+ // src/deploy/server-dns.ts
2049
+ function collectServerDnsDomains(sites = {}) {
2050
+ const domains = new Set;
2051
+ for (const site of Object.values(sites)) {
2052
+ if (!site.domain)
2053
+ continue;
2054
+ if (site.redirect || site.deploy === "server" || site.start)
2055
+ domains.add(site.domain);
2056
+ }
2057
+ return domains;
2058
+ }
2059
+ function normalizeName(name) {
2060
+ return name.replace(/\.$/, "").toLowerCase();
2061
+ }
2062
+ function matchesHostname(record, zone, hostname) {
2063
+ const recordName = normalizeName(record.name);
2064
+ const normalizedZone = normalizeName(zone);
2065
+ const normalizedHostname = normalizeName(hostname);
2066
+ const relativeName = normalizedHostname === normalizedZone ? "@" : normalizedHostname.endsWith(`.${normalizedZone}`) ? normalizedHostname.slice(0, -(normalizedZone.length + 1)) : normalizedHostname;
2067
+ return recordName === normalizedHostname || recordName === relativeName || relativeName === "@" && (recordName === "" || recordName === normalizedZone);
2068
+ }
2069
+ async function removeStaleServerAddressRecords(provider, zone, hostname, desiredAddress, recordType = "A") {
2070
+ const listed = await provider.listRecords(zone);
2071
+ if (!listed.success)
2072
+ return [`could not list ${recordType} records: ${listed.message || "unknown provider error"}`];
2073
+ const matching = listed.records.filter((record) => record.type === recordType && matchesHostname(record, zone, hostname));
2074
+ const desiredIndex = matching.findIndex((record) => record.content === desiredAddress);
2075
+ if (matching.length <= 1 || desiredIndex === -1)
2076
+ return [];
2077
+ const warnings = [];
2078
+ for (const [index, record] of matching.entries()) {
2079
+ if (index === desiredIndex)
2080
+ continue;
2081
+ const result = await provider.deleteRecord(zone, record);
2082
+ if (!result.success)
2083
+ warnings.push(`could not remove stale ${record.name} ${recordType} ${record.content}: ${result.message || "unknown provider error"}`);
2084
+ }
2085
+ return warnings;
2086
+ }
2087
+ function hetznerBoxIpv6(reported) {
2088
+ if (!reported)
2089
+ return;
2090
+ const trimmed = reported.trim();
2091
+ if (!trimmed)
2092
+ return;
2093
+ if (!trimmed.includes("/"))
2094
+ return trimmed;
2095
+ const [block] = trimmed.split("/");
2096
+ if (!block.endsWith("::"))
2097
+ return block || undefined;
2098
+ return `${block}1`;
2099
+ }
2100
+
2048
2101
  // src/drivers/shared/fleet.ts
2049
2102
  function resolveFleetTopology(compute = {}) {
2050
2103
  const appServers = Math.max(1, compute.appServers ?? compute.instances ?? 1);
@@ -2613,6 +2666,7 @@ class HetznerDriver {
2613
2666
  serverId: alreadyRunning.id,
2614
2667
  serverName: alreadyRunning.name,
2615
2668
  publicIp: alreadyRunning.public_net.ipv4?.ip,
2669
+ publicIpv6: hetznerBoxIpv6(alreadyRunning.public_net.ipv6?.ip),
2616
2670
  deployStoragePath: "/var/ts-cloud/staging",
2617
2671
  sshUser: this.sshUser
2618
2672
  };
@@ -2660,6 +2714,7 @@ class HetznerDriver {
2660
2714
  serverName: running.name,
2661
2715
  firewallId: firewall.id,
2662
2716
  publicIp: running.public_net.ipv4?.ip,
2717
+ publicIpv6: hetznerBoxIpv6(running.public_net.ipv6?.ip),
2663
2718
  deployStoragePath: "/var/ts-cloud/staging",
2664
2719
  sshUser: this.sshUser
2665
2720
  };
@@ -3373,6 +3428,7 @@ ${out}`);
3373
3428
  deployStoragePath: state.deployStoragePath || "/var/ts-cloud/staging",
3374
3429
  appInstanceId: state.serverId ? String(state.serverId) : undefined,
3375
3430
  appPublicIp: server?.public_net.ipv4?.ip || state.publicIp,
3431
+ appPublicIpv6: hetznerBoxIpv6(server?.public_net.ipv6?.ip) || state.publicIpv6,
3376
3432
  sshUser: state.sshUser || this.sshUser,
3377
3433
  servicesPrivateIp: state.servicesPrivateIp
3378
3434
  };
@@ -6198,4 +6254,4 @@ function buildCloudFrontOriginConfig(options) {
6198
6254
  CustomErrorResponses: { Quantity: 0 }
6199
6255
  };
6200
6256
  }
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 };
6257
+ 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, collectServerDnsDomains, removeStaleServerAddressRecords, hetznerBoxIpv6, 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 };
@@ -45,7 +45,7 @@ import {
45
45
  resolveSiteKind,
46
46
  resolveUiSource,
47
47
  siteInstallBase
48
- } from "./chunk-838t87x3.js";
48
+ } from "./chunk-gx4288t5.js";
49
49
  import {
50
50
  artifactKey,
51
51
  buildCloudFormationTemplate,
@@ -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 };
@@ -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-qbj74thz.js";
36
34
  import {
37
35
  deleteStaticSite,
38
36
  deployStaticSite,
@@ -55,9 +53,12 @@ import"../chunk-gttvakpv.js";
55
53
  import {
56
54
  MANAGEMENT_DASHBOARD_SITE,
57
55
  buildManagementDashboardArtifact,
56
+ collectServerDnsDomains,
58
57
  dashboardCredentialsFile,
59
58
  ensureManagementDashboard,
59
+ hetznerBoxIpv6,
60
60
  isPhpSite,
61
+ removeStaleServerAddressRecords,
61
62
  resolveDashboardAuth,
62
63
  resolveSiteDeployTarget,
63
64
  resolveSiteKind,
@@ -65,7 +66,7 @@ import {
65
66
  shipsARelease,
66
67
  siteInstallBase,
67
68
  validateDeploymentConfig
68
- } from "../chunk-838t87x3.js";
69
+ } from "../chunk-gx4288t5.js";
69
70
  import"../chunk-1qjyqrc5.js";
70
71
  import"../chunk-703nkybg.js";
71
72
  import"../chunk-4cjrg98a.js";
@@ -101,6 +102,7 @@ export {
101
102
  invalidateCache,
102
103
  initializeDashboardControlPlane,
103
104
  infraEnvFromOutputs,
105
+ hetznerBoxIpv6,
104
106
  hashContainerContext,
105
107
  generateStaticSiteTemplate,
106
108
  generateExternalDnsStaticSiteTemplate,
@@ -9,8 +9,23 @@ 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
+ * Hetzner hands a cloud server a routed /64 and configures `::1` inside it on
23
+ * the interface, but the API reports the block (`2a01:4f8:c014:6186::/64`), not
24
+ * the address. Publishing the block verbatim as an AAAA record yields a host
25
+ * nothing answers on, so turn it into the address the box actually holds.
26
+ *
27
+ * A plain address (no prefix) is returned unchanged, so this is safe to apply
28
+ * to whatever the driver surfaced.
29
+ */
30
+ export declare function hetznerBoxIpv6(reported: string | undefined | null): string | undefined;
16
31
  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,7 +68,7 @@ import {
68
68
  waitForSsh,
69
69
  wrapCloudInitUserData,
70
70
  writeResizeCheckpoint
71
- } from "../chunk-838t87x3.js";
71
+ } from "../chunk-gx4288t5.js";
72
72
  import"../chunk-1qjyqrc5.js";
73
73
  import"../chunk-703nkybg.js";
74
74
  import"../chunk-4cjrg98a.js";
package/dist/index.d.ts CHANGED
@@ -30,7 +30,7 @@ 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, hetznerBoxIpv6, removeStaleServerAddressRecords } from './deploy/server-dns';
34
34
  export type { EnsureDashboardLogger, ResolvedDashboardAuth, StaticSiteConfig, DeployResult, UploadOptions, ExternalDnsStaticSiteConfig, ExternalDnsDeployResult, DeploySiteConfig, DeploySiteResult, StaticSiteDnsProvider, SiteDeployKind, DeploymentValidationResult, BuildImageOptions, BuiltImage, CodeSource, DeployServerlessOptions, ResolvedContext, } from './deploy';
35
35
  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
36
  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-qbj74thz.js";
289
287
  import {
290
288
  deleteStaticSite,
291
289
  deployStaticSite,
@@ -375,6 +373,7 @@ import {
375
373
  buildStaticSiteDeployScript,
376
374
  buildUbuntuBootstrapScript,
377
375
  cloudDrivers,
376
+ collectServerDnsDomains,
378
377
  createCloudDriver,
379
378
  dashboardCredentialsFile,
380
379
  deployAllComputeSites,
@@ -383,7 +382,9 @@ import {
383
382
  ensureManagementDashboard,
384
383
  ensureServer,
385
384
  ensureSshKey,
385
+ hetznerBoxIpv6,
386
386
  normalizeSshPublicKey,
387
+ removeStaleServerAddressRecords,
387
388
  resolveDashboardAuth,
388
389
  resolveExecStart,
389
390
  resolveHetznerApiToken,
@@ -398,7 +399,7 @@ import {
398
399
  waitForCloudInit,
399
400
  waitForSsh,
400
401
  wrapCloudInitUserData
401
- } from "./chunk-838t87x3.js";
402
+ } from "./chunk-gx4288t5.js";
402
403
  import {
403
404
  ABTestManager,
404
405
  AI,
@@ -5345,6 +5346,7 @@ export {
5345
5346
  infraEnvFromOutputs,
5346
5347
  imageScanningManager,
5347
5348
  hotp,
5349
+ hetznerBoxIpv6,
5348
5350
  healthCheckManager,
5349
5351
  hashString,
5350
5352
  hashManifest,