@stacksjs/ts-cloud 0.7.83 → 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 (58) hide show
  1. package/dist/bin/cli.js +601 -601
  2. package/dist/{chunk-838t87x3.js → chunk-gx4288t5.js} +57 -1
  3. package/dist/{chunk-ptf1hhsd.js → chunk-qbj74thz.js} +30 -48
  4. package/dist/deploy/index.js +6 -4
  5. package/dist/deploy/local-dashboard-server.d.ts +1 -0
  6. package/dist/deploy/server-dns.d.ts +18 -3
  7. package/dist/drivers/hetzner/state.d.ts +8 -0
  8. package/dist/drivers/index.js +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +6 -4
  11. package/dist/ui/access-denied.html +2 -2
  12. package/dist/ui/account/automation.html +3 -3
  13. package/dist/ui/account/security.html +2 -2
  14. package/dist/ui/applications/compose.html +4 -4
  15. package/dist/ui/applications/new.html +2 -2
  16. package/dist/ui/data/backups.html +4 -4
  17. package/dist/ui/data/services.html +4 -4
  18. package/dist/ui/data/volumes.html +4 -4
  19. package/dist/ui/index.html +4 -4
  20. package/dist/ui/integrations.html +2 -2
  21. package/dist/ui/operations/alerts.html +4 -4
  22. package/dist/ui/operations/configuration.html +4 -4
  23. package/dist/ui/operations/jobs.html +4 -4
  24. package/dist/ui/operations/maintenance.html +3 -3
  25. package/dist/ui/operations/observability.html +4 -4
  26. package/dist/ui/operations/previews.html +4 -4
  27. package/dist/ui/operations/queue.html +4 -4
  28. package/dist/ui/operations/regions.html +4 -4
  29. package/dist/ui/operations/releases.html +4 -4
  30. package/dist/ui/operations/workloads.html +4 -4
  31. package/dist/ui/security.html +2 -2
  32. package/dist/ui/server/actions.html +4 -4
  33. package/dist/ui/server/activity.html +2 -2
  34. package/dist/ui/server/capacity.html +4 -4
  35. package/dist/ui/server/database.html +4 -4
  36. package/dist/ui/server/deployments.html +4 -4
  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 +3 -3
  44. package/dist/ui/server/team.html +4 -4
  45. package/dist/ui/server/terminal.html +2 -2
  46. package/dist/ui/serverless/alarms.html +4 -4
  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/firewall.html +2 -2
  51. package/dist/ui/serverless/functions.html +4 -4
  52. package/dist/ui/serverless/logs.html +4 -4
  53. package/dist/ui/serverless/metrics.html +2 -2
  54. package/dist/ui/serverless/queues.html +3 -3
  55. package/dist/ui/serverless/secrets.html +3 -3
  56. package/dist/ui/serverless/traces.html +4 -4
  57. package/dist/ui/serverless.html +4 -4
  58. 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),
@@ -43156,7 +43117,7 @@ function authorizationScope(body) {
43156
43117
  const id2 = String(body.scopeId ?? "").trim();
43157
43118
  return id2 ? { type, id: id2 } : undefined;
43158
43119
  }
43159
- async function resolveLiveDashboardData(config6, environment2) {
43120
+ async function resolveLiveDashboardData(config6, environment2, options = {}) {
43160
43121
  const mode = resolveDeploymentMode(config6);
43161
43122
  const meta = {
43162
43123
  mode,
@@ -43165,12 +43126,24 @@ async function resolveLiveDashboardData(config6, environment2) {
43165
43126
  project: { name: config6.project.name, slug: config6.project.slug, region: config6.project.region }
43166
43127
  };
43167
43128
  try {
43168
- const data = mode === "serverless" ? await resolveDashboardData(config6, environment2) : await resolveServerDashboardData(config6, environment2);
43129
+ const data = mode === "serverless" ? await resolveDashboardData(config6, environment2) : await resolveServerDashboardData(config6, environment2, {
43130
+ includeSiteHealth: options.includeSiteHealth
43131
+ });
43169
43132
  return { ...data ?? {}, ...meta };
43170
43133
  } catch {
43171
43134
  return { ...meta };
43172
43135
  }
43173
43136
  }
43137
+ function preserveDashboardSiteSnapshot(previous, next) {
43138
+ if (!previous)
43139
+ return next;
43140
+ return {
43141
+ ...next,
43142
+ ...Array.isArray(previous.sites) ? { sites: previous.sites } : {},
43143
+ ...Array.isArray(previous.sitesDetail) ? { sitesDetail: previous.sitesDetail } : {},
43144
+ ...Array.isArray(previous.siteHealth) ? { siteHealth: previous.siteHealth } : {}
43145
+ };
43146
+ }
43174
43147
  function resolveUiSourceDir(cwd) {
43175
43148
  const candidates = [
43176
43149
  join13(cwd, "packages", "ui"),
@@ -43524,8 +43497,13 @@ async function startLocalDashboardServer(options = {}) {
43524
43497
  const initialData = await resolveLiveDashboardData(config6, defaultEnvironment);
43525
43498
  const latestDataByEnvironment = new Map([[defaultEnvironment, initialData]]);
43526
43499
  const latestDataRefreshedAtByEnvironment = new Map([[defaultEnvironment, Date.now()]]);
43500
+ const latestSiteHealthRefreshedAtByEnvironment = new Map([
43501
+ [defaultEnvironment, Date.now()]
43502
+ ]);
43527
43503
  const liveDataRefreshesByEnvironment = new Map;
43528
43504
  const dashboardDataMinimumRefreshMs = Math.min(5 * 60000, Math.max(5000, Number(process.env.TS_CLOUD_DASHBOARD_REFRESH_MS) || 30000));
43505
+ const dashboardSiteHealthMinimumRefreshMs = Math.min(30 * 60000, Math.max(60000, Number(process.env.TS_CLOUD_DASHBOARD_SITE_REFRESH_MS) || 5 * 60000));
43506
+ const computeDashboard = resolveDeploymentMode(config6) !== "serverless";
43529
43507
  const refreshLatestDashboardData = (environment2) => {
43530
43508
  const previous = latestDataByEnvironment.get(environment2);
43531
43509
  if (previous && !dashboardDataRefreshDue(latestDataRefreshedAtByEnvironment.get(environment2), Date.now(), dashboardDataMinimumRefreshMs))
@@ -43533,10 +43511,14 @@ async function startLocalDashboardServer(options = {}) {
43533
43511
  const running = liveDataRefreshesByEnvironment.get(environment2);
43534
43512
  if (running)
43535
43513
  return running;
43536
- const refresh = resolveLiveDashboardData(config6, environment2).then((data) => {
43514
+ const includeSiteHealth = !computeDashboard || dashboardDataRefreshDue(latestSiteHealthRefreshedAtByEnvironment.get(environment2), Date.now(), dashboardSiteHealthMinimumRefreshMs);
43515
+ const refresh = resolveLiveDashboardData(config6, environment2, { includeSiteHealth }).then((refreshedData) => {
43537
43516
  const previous2 = latestDataByEnvironment.get(environment2);
43517
+ const data = includeSiteHealth ? refreshedData : preserveDashboardSiteSnapshot(previous2, refreshedData);
43538
43518
  latestDataByEnvironment.set(environment2, data);
43539
43519
  latestDataRefreshedAtByEnvironment.set(environment2, Date.now());
43520
+ if (includeSiteHealth)
43521
+ latestSiteHealthRefreshedAtByEnvironment.set(environment2, Date.now());
43540
43522
  if (previous2?._serverReachable !== data._serverReachable || previous2?._metricsStatus !== data._metricsStatus || (previous2?.sitesDetail?.length ?? 0) !== (data.sitesDetail?.length ?? 0))
43541
43523
  clearUiCache();
43542
43524
  return data;
@@ -43549,7 +43531,7 @@ async function startLocalDashboardServer(options = {}) {
43549
43531
  const backgroundTelemetryEnabled = options.box && telemetryPreference !== "0" && (telemetryPreference === "1" || !config6.cloud?.attachTo);
43550
43532
  if (backgroundTelemetryEnabled) {
43551
43533
  let telemetryCollectionRunning = false;
43552
- let nextSiteHealthCollectionAt = 0;
43534
+ let nextSiteHealthCollectionAt = Date.now() + 5 * 60000;
43553
43535
  const collectHostHistory = async () => {
43554
43536
  if (telemetryCollectionRunning)
43555
43537
  return;
@@ -49135,4 +49117,4 @@ data: ${JSON.stringify({ cursor: position, at: new Date().toISOString() })}
49135
49117
  };
49136
49118
  return { server, url: `http://${host2}:${server.port}/` };
49137
49119
  }
49138
- 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-ptf1hhsd.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,
@@ -48,6 +48,7 @@ export declare function resolveDashboardEnvironment(available: readonly string[]
48
48
  export declare function dashboardDataRefreshDue(lastRefreshedAt: number | undefined, now: number, minimumIntervalMs: number): boolean;
49
49
  /** Reject browser cross-site mutations while retaining header-light CLI access. */
50
50
  export declare function isTrustedMutationRequest(req: Request): boolean;
51
+ export declare function preserveDashboardSiteSnapshot(previous: Record<string, any> | undefined, next: Record<string, any>): Record<string, any>;
51
52
  export declare function sanitizeCloudConfig(config: CloudConfig): Record<string, any>;
52
53
  export declare function dashboardActions(environment: EnvironmentType): DashboardAction[];
53
54
  export declare function resolveDashboardAction(id: string, environment: EnvironmentType): DashboardAction | undefined;
@@ -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-ptf1hhsd.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,