@@ -112,44 +87,20 @@ export function PublicLaunchStatus({
{checklist.map((item) => (
-
- {item.label}: {item.configured ? 'configured' : 'missing'}
+ {item.label}: {item.configured
+ ? (item.id === 'public-auth-runtime' ? 'production-ready' : 'configured')
+ : (item.id === 'public-auth-runtime' ? 'local-or-mixed' : 'missing')}
))}
- -
- Paddle webhook secret:{' '}
- {authHealthQuery.isLoading
- ? 'checking'
- : authHealthQuery.isError
- ? 'unknown'
- : webhookReady
- ? 'configured'
- : 'missing'}
-
- -
- Public auth runtime posture:{' '}
- {authHealthQuery.isLoading
- ? 'checking'
- : authHealthQuery.isError
- ? 'unknown'
- : runtimeReady
- ? 'production-ready'
- : 'local-or-mixed'}
-
+ - Operator checkout target: {launchStatus.targets.operatorCheckoutTarget || 'support fallback active'}
+ - Studio checkout target: {launchStatus.targets.studioCheckoutTarget || 'support fallback active'}
{authHealthQuery.isLoading ? (
- Checking live auth-runtime and billing-webhook posture from the deployed auth server.
+ Checking live launch-readiness posture from the deployed auth server.
) : null}
{authHealthQuery.isError ? (
- Live auth-health lookup failed. Launch posture cannot confirm runtime or billing-webhook readiness right now.
-
- ) : null}
- {releaseManifestQuery.isLoading ? (
- Refreshing Windows release readiness from the live auth-server manifest.
- ) : null}
- {releaseManifestQuery.isError ? (
-
- Live release-manifest lookup failed. This launch checklist is currently using a bounded frontend fallback and intentionally withholds direct download-lane authority until the auth server returns.
+ Live auth-health lookup failed. Launch posture cannot confirm runtime, billing, or release-authority readiness right now.
) : null}
{!ready ? (
diff --git a/website/src/pages/app-pages.tsx b/website/src/pages/app-pages.tsx
index 868b4d9..9eeb1f6 100644
--- a/website/src/pages/app-pages.tsx
+++ b/website/src/pages/app-pages.tsx
@@ -5,9 +5,9 @@ import { buildAuthApiBaseUrls, createDesktopLinkToken, getAuthHealth, getRelease
import { usePlatformAuth, type PlatformUser } from '../auth/platform-auth'
import { SiteMetadata } from '../components/seo/SiteMetadata'
import { ReleaseValidationSummary } from '../components/ui/ReleaseValidationSummary'
-import { resolvePublicLaunchReadiness } from '../public-launch'
-import { downloadTargets, launchReadiness, mplSourceUrl, openSourceRepoUrl, planCatalog, publicDocsUrl, releaseNotesUrl } from '../site-config'
-import { buildReleaseMetadataItems, resolveReleaseCommerceView, resolveReleaseManifestView, type ReleaseManifestView } from '../release-manifest'
+import { resolvePublicLaunchStatusSummary } from '../public-launch'
+import { downloadTargets, launchReadiness, mplSourceUrl, openSourceRepoUrl, publicDocsUrl, releaseNotesUrl } from '../site-config'
+import { buildReleaseMetadataItems, resolveReleaseManifestView, type ReleaseManifestView } from '../release-manifest'
import { buildSupportPath, getDownloadPlatformLabel, normalizeDownloadPlatform } from '../site-routes'
import { desktopDownloadSteps, desktopFirstLaunchCards, roadmapHonestyCards, supportEscalationCards } from '../site-data'
@@ -29,15 +29,6 @@ function Panel({
)
}
-const operatorFallbackPlan = planCatalog.find((plan) => plan.key === 'operator') ?? planCatalog[1]
-const studioFallbackPlan = planCatalog.find((plan) => plan.key === 'studio') ?? planCatalog[2]
-const releaseCommerceFallback = {
- operatorCheckoutUrl: /^https?:/i.test(operatorFallbackPlan.ctaHref) ? operatorFallbackPlan.ctaHref : '',
- studioCheckoutUrl: /^https?:/i.test(studioFallbackPlan.ctaHref) ? studioFallbackPlan.ctaHref : '',
- planPriceOperator: operatorFallbackPlan.price,
- planPriceStudio: studioFallbackPlan.price,
-}
-
function buildProtectedReleaseManifestFallback(user: PlatformUser | null | undefined, supportEmail: string) {
return {
downloadTargets,
@@ -283,27 +274,14 @@ export function DashboardOverviewPage() {
},
})
- const releaseCommerce = useMemo(
- () => resolveReleaseCommerceView(releaseManifestQuery.data?.manifest, releaseCommerceFallback),
- [releaseManifestQuery.data?.manifest],
- )
- const publicLaunchReadiness = useMemo(
- () => resolvePublicLaunchReadiness(releaseManifestQuery.data?.manifest, launchReadiness),
- [releaseManifestQuery.data?.manifest],
- )
+ const launchStatus = useMemo(() => (
+ resolvePublicLaunchStatusSummary(
+ healthQuery.data,
+ releaseManifestQuery.data?.manifest,
+ launchReadiness,
+ )
+ ), [healthQuery.data, releaseManifestQuery.data?.manifest])
- const manifestWindowsConfigured = useMemo(
- () => releaseManifest.platforms.some((platform) => platform.platform_key === 'windows' && platform.configured),
- [releaseManifest.platforms],
- )
- const manifestMacConfigured = useMemo(
- () => releaseManifest.platforms.some((platform) => platform.platform_key === 'macos' && platform.configured),
- [releaseManifest.platforms],
- )
- const manifestLinuxConfigured = useMemo(
- () => releaseManifest.platforms.some((platform) => platform.platform_key === 'linux' && platform.configured),
- [releaseManifest.platforms],
- )
const manifestWindowsTarget = useMemo(
() => releaseManifest.platforms.find((platform) => platform.platform_key === 'windows') || null,
[releaseManifest.platforms],
@@ -317,17 +295,7 @@ export function DashboardOverviewPage() {
return `${baseUrl}/api/auth/desktop-link/verify?token=${encodeURIComponent(token)}`
}, [desktopLinkMutation.data?.token])
- const launchReadinessIssues = useMemo(() => {
- const issues: string[] = []
- if (!manifestWindowsConfigured) issues.push('Windows download URL missing')
- if (!publicLaunchReadiness.operatorCheckoutConfigured) issues.push('Operator checkout URL missing')
- if (!publicLaunchReadiness.studioCheckoutConfigured) issues.push('Studio checkout URL missing')
- if (!publicLaunchReadiness.mplSourceConfigured) issues.push('MPL corresponding-source URL missing')
- if (!publicLaunchReadiness.openSourceRepoConfigured) issues.push('Open-source repository/notices URL missing')
- if (healthQuery.data && !healthQuery.data.billing.webhookSecretConfigured) issues.push('Paddle webhook secret missing')
- if (healthQuery.data && !healthQuery.data.runtime.public_origin_ready) issues.push('Public auth runtime still uses local or mixed deployment posture')
- return issues
- }, [healthQuery.data, manifestWindowsConfigured, publicLaunchReadiness])
+ const launchReadinessIssues = launchStatus.missingLabels
return (
<>
@@ -339,30 +307,30 @@ export function DashboardOverviewPage() {
/>
- {user?.name}
- {user?.email}
- Plan: {user?.plan}
- Role: {user?.role || 'operator'}
- Desktop downloads: {user?.canDownload ? 'enabled' : 'not yet entitled'}
- {!superTokensConfigured || user?.billing?.source === 'local-fallback' ? (
-
- This session is currently using local fallback posture, not fully shared production auth.
-
- ) : null}
- {releaseManifestQuery.data?.manifest && releaseAuthoritySyncItems.length > 0 ? (
-
-
Live authority sync
-
- The protected browser session was refreshed from live release authority so the local dashboard view catches up to current account-access truth.
+
{user?.name}
+
{user?.email}
+
Plan: {user?.plan}
+
Role: {user?.role || 'operator'}
+
Desktop downloads: {user?.canDownload ? 'enabled' : 'not yet entitled'}
+ {!superTokensConfigured || user?.billing?.source === 'local-fallback' ? (
+
+ This session is currently using local fallback posture, not fully shared production auth.
-
- {releaseAuthoritySyncItems.map((item) => (
- - {item}
- ))}
-
-
- ) : null}
-
+ ) : null}
+ {releaseManifestQuery.data?.manifest && releaseAuthoritySyncItems.length > 0 ? (
+
+
Live authority sync
+
+ The protected browser session was refreshed from live release authority so the local dashboard view catches up to current account-access truth.
+
+
+ {releaseAuthoritySyncItems.map((item) => (
+ - {item}
+ ))}
+
+
+ ) : null}
+
{healthQuery.isLoading ? Checking auth server health...
: null}
@@ -440,20 +408,19 @@ export function DashboardOverviewPage() {
+
+ {launchStatus.ready ? 'Launch-ready posture' : 'Preview posture'}
+
- - Windows download URL: {manifestWindowsConfigured ? 'configured' : 'missing'}
- - macOS download URL: {manifestMacConfigured ? 'configured' : 'missing'}
- - Linux download URL: {manifestLinuxConfigured ? 'configured' : 'missing'}
- - Operator checkout URL: {publicLaunchReadiness.operatorCheckoutConfigured ? 'configured' : 'missing'}
- - Studio checkout URL: {publicLaunchReadiness.studioCheckoutConfigured ? 'configured' : 'missing'}
- - MPL corresponding-source URL: {publicLaunchReadiness.mplSourceConfigured ? 'configured' : 'missing'}
- - Open-source repo/notices URL: {publicLaunchReadiness.openSourceRepoConfigured ? 'configured' : 'missing'}
- - Paddle webhook secret: {!healthQuery.data ? 'checking' : (healthQuery.data.billing.webhookSecretConfigured ? 'configured' : 'missing')}
- - Billing product map: {!healthQuery.data ? 'checking' : (healthQuery.data.billing.productPlanMapConfigured ? 'configured' : 'missing')}
- - Billing price map: {!healthQuery.data ? 'checking' : (healthQuery.data.billing.pricePlanMapConfigured ? 'configured' : 'missing')}
- - Public auth runtime posture: {!healthQuery.data ? 'checking' : (healthQuery.data.runtime.public_origin_ready ? 'production-ready' : 'local-or-mixed')}
- - Operator checkout target: {releaseCommerce.operator_checkout_url || 'support fallback active'}
- - Studio checkout target: {releaseCommerce.studio_checkout_url || 'support fallback active'}
+ {launchStatus.checklist.map((item) => (
+ -
+ {item.label}: {item.configured
+ ? (item.id === 'public-auth-runtime' ? 'production-ready' : 'configured')
+ : (item.id === 'public-auth-runtime' ? 'local-or-mixed' : 'missing')}
+
+ ))}
+ - Operator checkout target: {launchStatus.targets.operatorCheckoutTarget || 'support fallback active'}
+ - Studio checkout target: {launchStatus.targets.studioCheckoutTarget || 'support fallback active'}
{releaseManifestQuery.isLoading ? (
Refreshing release-manifest download readiness from the auth server.
diff --git a/website/src/pages/public-pages-commerce.tsx b/website/src/pages/public-pages-commerce.tsx
index 83c4a0e..d6b3379 100644
--- a/website/src/pages/public-pages-commerce.tsx
+++ b/website/src/pages/public-pages-commerce.tsx
@@ -21,6 +21,7 @@ import {
digitalDeliveryCards,
distributionDoctrineCards,
openSourceNotices,
+ operatorManualTracks,
privacyBoundaryCards,
termsBoundaryCards,
} from '../site-data'
@@ -94,6 +95,25 @@ export function PricingPage() {
+
+
+ {operatorManualTracks.slice(0, 3).map((track) => (
+
+ {track.title}
+ {track.description}
+
+ {track.steps.map((step) => (
+ - {step}
+ ))}
+
+
+ ))}
+
+
+
+
+
+ {operatorManualTracks.slice(0, 3).map((track) => (
+
+ {track.title}
+ {track.description}
+
+ {track.steps.map((step) => (
+ - {step}
+ ))}
+
+
+ ))}
+
+
+
+
+
+
+ {operatorManualTracks.map((track) => (
+
+ {track.title}
+ {track.description}
+
+ {track.steps.map((step) => (
+ - {step}
+ ))}
+
+
+ ))}
+
+
+
+
+
+ {inputAndDevicePostureCards.map((card) => (
+
+ {card.title}
+ {card.description}
+
+ {card.bullets.map((bullet) => (
+ - {bullet}
+ ))}
+
+
+ ))}
+
+
+
+
+
+ {deploymentReadinessTracks.map((track) => (
+
+ {track.title}
+
+ {track.steps.map((step) => (
+ - {step}
+ ))}
+
+
+ ))}
+
+
>
)
diff --git a/website/src/public-launch.ts b/website/src/public-launch.ts
index 0736b59..1de9055 100644
--- a/website/src/public-launch.ts
+++ b/website/src/public-launch.ts
@@ -1,92 +1,89 @@
+import type { AuthHealthPayload } from './auth/auth-api'
import type { ReleaseManifestView } from './release-manifest'
import { launchReadiness } from './site-config'
+import {
+ buildPublicLaunchStatusSummary,
+ getMissingPublicLaunchChecklistItems as getSharedMissingPublicLaunchChecklistItems,
+ getPublicLaunchChecklist as getSharedPublicLaunchChecklist,
+ isPublicLaunchReady as isSharedPublicLaunchReady,
+ normalizePublicLaunchReadiness,
+ resolveHealthPublicLaunchReadiness,
+ resolveManifestPublicLaunchReadiness,
+ resolvePublicLaunchStatusSummary as resolveSharedPublicLaunchStatusSummary,
+ type PublicLaunchChecklistId,
+ type PublicLaunchChecklistItem,
+ type PublicLaunchReadiness,
+ type PublicLaunchStatusSummary,
+ type PublicLaunchTargets,
+} from './shared/public-launch'
-type PublicLaunchChecklistId =
- | 'windows-download'
- | 'operator-checkout'
- | 'studio-checkout'
- | 'mpl-source'
- | 'open-source-notices'
+const defaultLaunchReadiness = normalizePublicLaunchReadiness(launchReadiness)
-export type PublicLaunchChecklistItem = {
- id: PublicLaunchChecklistId
- label: string
- configured: boolean
-}
-
-export type PublicLaunchReadiness = {
- windowsDownloadConfigured: boolean
- operatorCheckoutConfigured: boolean
- studioCheckoutConfigured: boolean
- mplSourceConfigured: boolean
- openSourceRepoConfigured: boolean
+export type {
+ PublicLaunchChecklistId,
+ PublicLaunchChecklistItem,
+ PublicLaunchReadiness,
+ PublicLaunchStatusSummary,
+ PublicLaunchTargets,
}
export function getPublicLaunchChecklist(
- readiness: PublicLaunchReadiness = launchReadiness,
+ readiness: Partial = defaultLaunchReadiness,
): PublicLaunchChecklistItem[] {
- return [
- {
- id: 'windows-download',
- label: 'Windows download URL',
- configured: readiness.windowsDownloadConfigured,
- },
- {
- id: 'operator-checkout',
- label: 'Operator checkout',
- configured: readiness.operatorCheckoutConfigured,
- },
- {
- id: 'studio-checkout',
- label: 'Studio checkout',
- configured: readiness.studioCheckoutConfigured,
- },
- {
- id: 'mpl-source',
- label: 'Corresponding-source URL',
- configured: readiness.mplSourceConfigured,
- },
- {
- id: 'open-source-notices',
- label: 'Open-source notices/repository URL',
- configured: readiness.openSourceRepoConfigured,
- },
- ]
+ return getSharedPublicLaunchChecklist(readiness)
}
export function getMissingPublicLaunchChecklistItems(
- readiness: PublicLaunchReadiness = launchReadiness,
+ readiness: Partial = defaultLaunchReadiness,
+ options?: {
+ requiredOnly?: boolean
+ },
): PublicLaunchChecklistItem[] {
- return getPublicLaunchChecklist(readiness).filter((item) => !item.configured)
+ return getSharedMissingPublicLaunchChecklistItems(readiness, options)
}
-export function isPublicLaunchReady(readiness: PublicLaunchReadiness = launchReadiness): boolean {
- return getMissingPublicLaunchChecklistItems(readiness).length === 0
+export function isPublicLaunchReady(
+ readiness: Partial = defaultLaunchReadiness,
+): boolean {
+ return isSharedPublicLaunchReady(readiness)
}
export function resolvePublicLaunchReadiness(
manifest: ReleaseManifestView | null | undefined,
- fallback: PublicLaunchReadiness = launchReadiness,
+ fallback: Partial = defaultLaunchReadiness,
): PublicLaunchReadiness {
- return {
- windowsDownloadConfigured: manifest?.platforms.some(
- (platform) => platform.platform_key === 'windows' && platform.configured,
- ) ?? fallback.windowsDownloadConfigured,
- operatorCheckoutConfigured:
- manifest?.commerce?.operator_checkout_url != null
- ? Boolean(manifest.commerce.operator_checkout_url)
- : fallback.operatorCheckoutConfigured,
- studioCheckoutConfigured:
- manifest?.commerce?.studio_checkout_url != null
- ? Boolean(manifest.commerce.studio_checkout_url)
- : fallback.studioCheckoutConfigured,
- mplSourceConfigured:
- manifest?.corresponding_source_url != null
- ? Boolean(manifest.corresponding_source_url)
- : fallback.mplSourceConfigured,
- openSourceRepoConfigured:
- manifest?.open_source_repo_url != null
- ? Boolean(manifest.open_source_repo_url)
- : fallback.openSourceRepoConfigured,
- }
+ return resolveManifestPublicLaunchReadiness(manifest, fallback)
+}
+
+export function resolvePublicLaunchReadinessFromHealth({
+ manifest,
+ health,
+ fallback = defaultLaunchReadiness,
+}: {
+ manifest?: ReleaseManifestView | null
+ health?: AuthHealthPayload | null
+ fallback?: Partial
+}): PublicLaunchReadiness {
+ return resolveHealthPublicLaunchReadiness({
+ manifest,
+ health,
+ fallback,
+ })
+}
+
+export function resolvePublicLaunchStatusSummary(
+ health?: AuthHealthPayload | null,
+ manifest?: ReleaseManifestView | null,
+ fallback: Partial = defaultLaunchReadiness,
+): PublicLaunchStatusSummary {
+ return resolveSharedPublicLaunchStatusSummary({
+ health,
+ manifest,
+ fallback,
+ })
+}
+
+export {
+ buildPublicLaunchStatusSummary,
+ normalizePublicLaunchReadiness,
}
diff --git a/website/src/shared/public-launch.ts b/website/src/shared/public-launch.ts
new file mode 100644
index 0000000..eac95f5
--- /dev/null
+++ b/website/src/shared/public-launch.ts
@@ -0,0 +1,324 @@
+type ReleaseManifestLike = {
+ commerce?: {
+ operator_checkout_url?: string | null
+ studio_checkout_url?: string | null
+ } | null
+ corresponding_source_url?: string | null
+ open_source_repo_url?: string | null
+ platforms?: Array<{
+ platform_key: string
+ configured: boolean
+ }>
+}
+
+type AuthHealthLike = {
+ billing?: {
+ productPlanMapConfigured?: boolean
+ pricePlanMapConfigured?: boolean
+ webhookSecretConfigured?: boolean
+ }
+ runtime?: {
+ public_origin_ready?: boolean
+ }
+ launch?: {
+ posture?: 'launch-ready' | 'preview'
+ ready?: boolean
+ readiness?: Partial | null
+ checklist?: PublicLaunchChecklistItem[]
+ missingLabels?: string[]
+ targets?: PublicLaunchTargets
+ } | null
+}
+
+export type PublicLaunchChecklistId =
+ | 'windows-download'
+ | 'macos-download'
+ | 'linux-download'
+ | 'operator-checkout'
+ | 'studio-checkout'
+ | 'mpl-source'
+ | 'open-source-notices'
+ | 'billing-product-map'
+ | 'billing-price-map'
+ | 'billing-webhook-secret'
+ | 'public-auth-runtime'
+
+export type PublicLaunchChecklistItem = {
+ id: PublicLaunchChecklistId
+ label: string
+ configured: boolean
+ requiredForPublicLaunch: boolean
+}
+
+export type PublicLaunchReadiness = {
+ windowsDownloadConfigured: boolean
+ macosDownloadConfigured: boolean
+ linuxDownloadConfigured: boolean
+ operatorCheckoutConfigured: boolean
+ studioCheckoutConfigured: boolean
+ mplSourceConfigured: boolean
+ openSourceRepoConfigured: boolean
+ billingProductPlanMapConfigured: boolean
+ billingPricePlanMapConfigured: boolean
+ billingWebhookSecretConfigured: boolean
+ publicAuthRuntimeReady: boolean
+}
+
+export type PublicLaunchTargets = {
+ operatorCheckoutTarget: string | null
+ studioCheckoutTarget: string | null
+}
+
+export type PublicLaunchStatusSummary = {
+ posture: 'launch-ready' | 'preview'
+ ready: boolean
+ readiness: PublicLaunchReadiness
+ checklist: PublicLaunchChecklistItem[]
+ missingLabels: string[]
+ targets: PublicLaunchTargets
+}
+
+type PublicLaunchReadinessInput = Partial & {
+ macDownloadConfigured?: boolean
+}
+
+function hasConfiguredPlatform(manifest: ReleaseManifestLike | null | undefined, platformKey: string) {
+ if (!Array.isArray(manifest?.platforms)) {
+ return null
+ }
+
+ return manifest.platforms.some((platform) => platform.platform_key === platformKey && platform.configured)
+}
+
+function normalizeConfiguredValue(value: unknown) {
+ return value === true
+}
+
+export function normalizePublicLaunchReadiness(
+ input?: PublicLaunchReadinessInput | null,
+): PublicLaunchReadiness {
+ return {
+ windowsDownloadConfigured: normalizeConfiguredValue(input?.windowsDownloadConfigured),
+ macosDownloadConfigured:
+ normalizeConfiguredValue(input?.macosDownloadConfigured)
+ || normalizeConfiguredValue(input?.macDownloadConfigured),
+ linuxDownloadConfigured: normalizeConfiguredValue(input?.linuxDownloadConfigured),
+ operatorCheckoutConfigured: normalizeConfiguredValue(input?.operatorCheckoutConfigured),
+ studioCheckoutConfigured: normalizeConfiguredValue(input?.studioCheckoutConfigured),
+ mplSourceConfigured: normalizeConfiguredValue(input?.mplSourceConfigured),
+ openSourceRepoConfigured: normalizeConfiguredValue(input?.openSourceRepoConfigured),
+ billingProductPlanMapConfigured: normalizeConfiguredValue(input?.billingProductPlanMapConfigured),
+ billingPricePlanMapConfigured: normalizeConfiguredValue(input?.billingPricePlanMapConfigured),
+ billingWebhookSecretConfigured: normalizeConfiguredValue(input?.billingWebhookSecretConfigured),
+ publicAuthRuntimeReady: normalizeConfiguredValue(input?.publicAuthRuntimeReady),
+ }
+}
+
+export function getPublicLaunchChecklist(
+ readinessInput: PublicLaunchReadinessInput,
+): PublicLaunchChecklistItem[] {
+ const readiness = normalizePublicLaunchReadiness(readinessInput)
+
+ return [
+ {
+ id: 'windows-download',
+ label: 'Windows download URL',
+ configured: readiness.windowsDownloadConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'macos-download',
+ label: 'macOS download URL',
+ configured: readiness.macosDownloadConfigured,
+ requiredForPublicLaunch: false,
+ },
+ {
+ id: 'linux-download',
+ label: 'Linux download URL',
+ configured: readiness.linuxDownloadConfigured,
+ requiredForPublicLaunch: false,
+ },
+ {
+ id: 'operator-checkout',
+ label: 'Operator checkout URL',
+ configured: readiness.operatorCheckoutConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'studio-checkout',
+ label: 'Studio checkout URL',
+ configured: readiness.studioCheckoutConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'mpl-source',
+ label: 'MPL corresponding-source URL',
+ configured: readiness.mplSourceConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'open-source-notices',
+ label: 'Open-source repo/notices URL',
+ configured: readiness.openSourceRepoConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'billing-product-map',
+ label: 'Billing product-plan map',
+ configured: readiness.billingProductPlanMapConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'billing-price-map',
+ label: 'Billing price-plan map',
+ configured: readiness.billingPricePlanMapConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'billing-webhook-secret',
+ label: 'Paddle webhook secret',
+ configured: readiness.billingWebhookSecretConfigured,
+ requiredForPublicLaunch: true,
+ },
+ {
+ id: 'public-auth-runtime',
+ label: 'Public auth runtime posture',
+ configured: readiness.publicAuthRuntimeReady,
+ requiredForPublicLaunch: true,
+ },
+ ]
+}
+
+export function getMissingPublicLaunchChecklistItems(
+ readinessInput: PublicLaunchReadinessInput,
+ options?: {
+ requiredOnly?: boolean
+ },
+): PublicLaunchChecklistItem[] {
+ return getPublicLaunchChecklist(readinessInput).filter((item) => (
+ !item.configured && (!options?.requiredOnly || item.requiredForPublicLaunch)
+ ))
+}
+
+export function isPublicLaunchReady(readinessInput: PublicLaunchReadinessInput): boolean {
+ return getMissingPublicLaunchChecklistItems(readinessInput, { requiredOnly: true }).length === 0
+}
+
+export function resolveManifestPublicLaunchReadiness(
+ manifest: ReleaseManifestLike | null | undefined,
+ fallback?: PublicLaunchReadinessInput | null,
+): PublicLaunchReadiness {
+ const normalizedFallback = normalizePublicLaunchReadiness(fallback)
+
+ const windowsDownloadConfigured = hasConfiguredPlatform(manifest, 'windows')
+ const macosDownloadConfigured = hasConfiguredPlatform(manifest, 'macos')
+ const linuxDownloadConfigured = hasConfiguredPlatform(manifest, 'linux')
+
+ return {
+ windowsDownloadConfigured:
+ windowsDownloadConfigured ?? normalizedFallback.windowsDownloadConfigured,
+ macosDownloadConfigured:
+ macosDownloadConfigured ?? normalizedFallback.macosDownloadConfigured,
+ linuxDownloadConfigured:
+ linuxDownloadConfigured ?? normalizedFallback.linuxDownloadConfigured,
+ operatorCheckoutConfigured:
+ manifest?.commerce?.operator_checkout_url != null
+ ? Boolean(manifest.commerce.operator_checkout_url)
+ : normalizedFallback.operatorCheckoutConfigured,
+ studioCheckoutConfigured:
+ manifest?.commerce?.studio_checkout_url != null
+ ? Boolean(manifest.commerce.studio_checkout_url)
+ : normalizedFallback.studioCheckoutConfigured,
+ mplSourceConfigured:
+ manifest?.corresponding_source_url != null
+ ? Boolean(manifest.corresponding_source_url)
+ : normalizedFallback.mplSourceConfigured,
+ openSourceRepoConfigured:
+ manifest?.open_source_repo_url != null
+ ? Boolean(manifest.open_source_repo_url)
+ : normalizedFallback.openSourceRepoConfigured,
+ billingProductPlanMapConfigured: normalizedFallback.billingProductPlanMapConfigured,
+ billingPricePlanMapConfigured: normalizedFallback.billingPricePlanMapConfigured,
+ billingWebhookSecretConfigured: normalizedFallback.billingWebhookSecretConfigured,
+ publicAuthRuntimeReady: normalizedFallback.publicAuthRuntimeReady,
+ }
+}
+
+export function resolvePublicLaunchTargets(
+ manifest: ReleaseManifestLike | null | undefined,
+ health?: AuthHealthLike | null,
+): PublicLaunchTargets {
+ return {
+ operatorCheckoutTarget:
+ health?.launch?.targets?.operatorCheckoutTarget
+ ?? manifest?.commerce?.operator_checkout_url
+ ?? null,
+ studioCheckoutTarget:
+ health?.launch?.targets?.studioCheckoutTarget
+ ?? manifest?.commerce?.studio_checkout_url
+ ?? null,
+ }
+}
+
+export function resolveHealthPublicLaunchReadiness({
+ manifest,
+ health,
+ fallback,
+}: {
+ manifest?: ReleaseManifestLike | null
+ health?: AuthHealthLike | null
+ fallback?: PublicLaunchReadinessInput | null
+}): PublicLaunchReadiness {
+ const manifestReadiness = resolveManifestPublicLaunchReadiness(manifest, fallback)
+ const healthReadiness = normalizePublicLaunchReadiness({
+ ...manifestReadiness,
+ billingProductPlanMapConfigured: health?.billing?.productPlanMapConfigured,
+ billingPricePlanMapConfigured: health?.billing?.pricePlanMapConfigured,
+ billingWebhookSecretConfigured: health?.billing?.webhookSecretConfigured,
+ publicAuthRuntimeReady: health?.runtime?.public_origin_ready,
+ ...health?.launch?.readiness,
+ })
+
+ return healthReadiness
+}
+
+export function buildPublicLaunchStatusSummary(
+ readinessInput: PublicLaunchReadinessInput,
+ targets: PublicLaunchTargets = {
+ operatorCheckoutTarget: null,
+ studioCheckoutTarget: null,
+ },
+): PublicLaunchStatusSummary {
+ const readiness = normalizePublicLaunchReadiness(readinessInput)
+ const ready = isPublicLaunchReady(readiness)
+
+ return {
+ posture: ready ? 'launch-ready' : 'preview',
+ ready,
+ readiness,
+ checklist: getPublicLaunchChecklist(readiness),
+ missingLabels: getMissingPublicLaunchChecklistItems(readiness, {
+ requiredOnly: true,
+ }).map((item) => item.label),
+ targets,
+ }
+}
+
+export function resolvePublicLaunchStatusSummary({
+ manifest,
+ health,
+ fallback,
+}: {
+ manifest?: ReleaseManifestLike | null
+ health?: AuthHealthLike | null
+ fallback?: PublicLaunchReadinessInput | null
+}): PublicLaunchStatusSummary {
+ return buildPublicLaunchStatusSummary(
+ resolveHealthPublicLaunchReadiness({
+ manifest,
+ health,
+ fallback,
+ }),
+ resolvePublicLaunchTargets(manifest, health),
+ )
+}
diff --git a/website/src/site-config.ts b/website/src/site-config.ts
index e7a4646..4918cb2 100644
--- a/website/src/site-config.ts
+++ b/website/src/site-config.ts
@@ -126,10 +126,15 @@ export const launchReadiness = {
operatorCheckoutConfigured: Boolean(operatorCheckoutUrl),
studioCheckoutConfigured: Boolean(studioCheckoutUrl),
windowsDownloadConfigured: Boolean(downloadTargets.find((target) => target.platformKey === 'windows')?.configured),
+ macosDownloadConfigured: Boolean(downloadTargets.find((target) => target.platformKey === 'macos')?.configured),
macDownloadConfigured: Boolean(downloadTargets.find((target) => target.platformKey === 'macos')?.configured),
linuxDownloadConfigured: Boolean(downloadTargets.find((target) => target.platformKey === 'linux')?.configured),
mplSourceConfigured: Boolean(mplSourceUrl),
openSourceRepoConfigured: Boolean(openSourceRepoUrl),
+ billingProductPlanMapConfigured: false,
+ billingPricePlanMapConfigured: false,
+ billingWebhookSecretConfigured: false,
+ publicAuthRuntimeReady: false,
} as const
export const paddleReadyDescription =