#!/usr/bin/env node// @effect-diagnostics nodeBuiltinImport:off - Node's typed junction API avoids Windows symlink privileges while keeping the probe isolated. import * as NodeFSP from "node:fs/promises";import * as NodeCrypto from "node:crypto";import * as NodeModule from "node:module"; import { createPackageWithOptions, extractAll, getRawHeader, statFile, type DirectoryRecord,} from "@electron/asar"; import { fromYaml } from "@t3tools/shared/schemaYaml";import { HostProcessArchitecture, HostProcessPlatform } from "@t3tools/shared/hostProcess";import { clerkFrontendApiHostnameFromPublishableKey } from "@t3tools/shared/relayAuth";import { resolveSpawnCommand } from "@t3tools/shared/shell";import rootPackageJson from "../package.json" with { type: "json" };import desktopPackageJson from "../apps/desktop/package.json" with { type: "json" };import serverPackageJson from "../apps/server/package.json" with { type: "json" }; import { applyWebBrandAssets } from "./apply-web-brand-assets.ts";import { BRAND_ASSET_PATHS, resolveWebAssetBrandForChannel, type WebAssetBrand,} from "./lib/brand-assets.ts";import { getDefaultBuildArch } from "./lib/build-target-arch.ts";import { findInlinedExternalPackages, selectCliRuntimeExternalDependencies,} from "./lib/cli-external-packages.ts";import { loadRepoEnv } from "./lib/public-config.ts";import { resolveCatalogDependencies } from "./lib/resolve-catalog.ts"; import * as NodeRuntime from "@effect/platform-node/NodeRuntime";import * as NodeServices from "@effect/platform-node/NodeServices";import * as Config from "effect/Config";import * as Duration from "effect/Duration";import * as Effect from "effect/Effect";import * as FileSystem from "effect/FileSystem";import * as Layer from "effect/Layer";import * as Logger from "effect/Logger";import * as Option from "effect/Option";import type { PlatformError } from "effect/PlatformError";import * as Path from "effect/Path";import * as Schema from "effect/Schema";import * as Stream from "effect/Stream";import { Command, Flag } from "effect/unstable/cli";import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"; const LINUX_ICON_SIZES = [16, 22, 24, 32, 48, 64, 128, 256, 512] as const;const DESKTOP_APP_ID = "com.t3tools.t3code";const APPLE_TEAM_ID_PATTERN = /^[A-Z0-9]{10}$/u; const BuildPlatform = Schema.Literals(["mac", "linux", "win"]);const BuildArch = Schema.Literals(["arm64", "x64", "universal"]); const WorkspaceConfig = Schema.Struct({ catalog: Schema.optional(Schema.Record(Schema.String, Schema.String)), overrides: Schema.optional(Schema.Record(Schema.String, Schema.String)), patchedDependencies: Schema.optional(Schema.Record(Schema.String, Schema.String)), allowBuilds: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)),});type WorkspaceConfig = typeof WorkspaceConfig.Type; const StageWorkspaceConfig = Schema.Struct({ supportedArchitectures: Schema.Struct({ os: Schema.Array(Schema.String), cpu: Schema.Array(Schema.String), libc: Schema.optional(Schema.Array(Schema.String)), }), // pnpm 11 only reads these from pnpm-workspace.yaml (not package.json#pnpm). // Without allowBuilds the staged `vp install --prod` fails with // ERR_PNPM_IGNORED_BUILDS for packages that have lifecycle scripts. allowBuilds: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)), patchedDependencies: Schema.optional(Schema.Record(Schema.String, Schema.String)), overrides: Schema.optional(Schema.Record(Schema.String, Schema.String)), nodeLinker: Schema.optional(Schema.Literals(["hoisted"])),});type StageWorkspaceConfig = typeof StageWorkspaceConfig.Type; const RepoRoot = Effect.service(Path.Path).pipe( Effect.flatMap((path) => path.fromFileUrl(new URL("..", import.meta.url))),);const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown));const decodeWorkspaceConfig = Schema.decodeEffect(fromYaml(WorkspaceConfig));const decodeNodePtyManifest = Schema.decodeUnknownEffect( Schema.fromJsonString(Schema.Struct({ version: Schema.String })),);const encodeStageWorkspaceConfig = Schema.encodeEffect(fromYaml(StageWorkspaceConfig)); const readWorkspaceConfig = Effect.fn("readWorkspaceConfig")(function* () { const fs = yield* FileSystem.FileSystem; const path = yield* Path.Path; const repoRoot = yield* RepoRoot; const workspaceYaml = yield* fs.readFileString(path.join(repoRoot, "pnpm-workspace.yaml")); return yield* decodeWorkspaceConfig(workspaceYaml);}); interface DesktopBuildIconAssets { readonly macIconPng: string; readonly linuxIconPng: string; readonly windowsIconIco: string;} interface PlatformConfig { readonly cliFlag: "--mac" | "--linux" | "--win"; readonly defaultTarget: string; readonly archChoices: ReadonlyArray<typeof BuildArch.Type>;} export function resolveResourceMonitorRustTargets( platform: typeof BuildPlatform.Type, arch: typeof BuildArch.Type,): ReadonlyArray<string> { if (platform === "mac") { if (arch === "universal") { return ["aarch64-apple-darwin", "x86_64-apple-darwin"]; } return [arch === "arm64" ? "aarch64-apple-darwin" : "x86_64-apple-darwin"]; } if (platform === "linux") { return [arch === "arm64" ? "aarch64-unknown-linux-gnu" : "x86_64-unknown-linux-gnu"]; } return [arch === "arm64" ? "aarch64-pc-windows-msvc" : "x86_64-pc-windows-msvc"];} export function resourceMonitorExecutableName(platform: typeof BuildPlatform.Type): string { return platform === "win" ? "t3-resource-monitor.exe" : "t3-resource-monitor";} const PLATFORM_CONFIG: Record<typeof BuildPlatform.Type, PlatformConfig> = { mac: { cliFlag: "--mac", defaultTarget: "dmg", archChoices: ["arm64", "x64", "universal"], }, linux: { cliFlag: "--linux", defaultTarget: "AppImage", archChoices: ["x64", "arm64"], }, win: { cliFlag: "--win", defaultTarget: "nsis", archChoices: ["x64", "arm64"], },}; interface BuildCliInput { readonly platform: Option.Option<typeof BuildPlatform.Type>; readonly target: Option.Option<string>; readonly arch: Option.Option<typeof BuildArch.Type>; readonly buildVersion: Option.Option<string>; readonly outputDir: Option.Option<string>; readonly skipBuild: Option.Option<boolean>; readonly keepStage: Option.Option<boolean>; readonly signed: Option.Option<boolean>; readonly verbose: Option.Option<boolean>; readonly mockUpdates: Option.Option<boolean>; readonly mockUpdateServerPort: Option.Option<number>; readonly wslPrebuild: Option.Option<string>;} function detectHostBuildPlatform(hostPlatform: string): typeof BuildPlatform.Type | undefined { if (hostPlatform === "darwin") return "mac"; if (hostPlatform === "linux") return "linux"; if (hostPlatform === "win32") return "win"; return undefined;} const getDefaultArch = Effect.fn("getDefaultArch")(function* (platform: typeof BuildPlatform.Type) { const config = PLATFORM_CONFIG[platform]; if (!config) { return "x64"; } return yield* getDefaultBuildArch(platform, config);}); export class MacPasskeySigningConfigurationResolutionError extends Schema.TaggedErrorClass<MacPasskeySigningConfigurationResolutionError>()( "MacPasskeySigningConfigurationResolutionError", { cause: Schema.Defect(), },) { static fromCause( cause: unknown, ): MacPasskeySigningConfigurationError | MacPasskeySigningConfigurationResolutionError { return isMacPasskeySigningConfigurationError(cause) ? cause : new MacPasskeySigningConfigurationResolutionError({ cause }); } override get message(): string { return "Failed to resolve macOS passkey signing configuration."; }} export class ClerkPasskeyNativePackageMissingError extends Schema.TaggedErrorClass<ClerkPasskeyNativePackageMissingError>()( "ClerkPasskeyNativePackageMissingError", { packageName: Schema.String, binaryFileName: Schema.String, packageEntryPath: Schema.String, platform: BuildPlatform, arch: BuildArch, cause: Schema.Defect(), },) { override get message(): string { return `Clerk passkey native package is missing: ${this.packageName}`; }} export class UnsupportedHostBuildPlatformError extends Schema.TaggedErrorClass<UnsupportedHostBuildPlatformError>()( "UnsupportedHostBuildPlatformError", { hostPlatform: Schema.String, },) { override get message(): string { return `Unsupported host platform '${this.hostPlatform}'.`; }} export class UnsupportedDesktopBuildArchitectureError extends Schema.TaggedErrorClass<UnsupportedDesktopBuildArchitectureError>()( "UnsupportedDesktopBuildArchitectureError", { platform: BuildPlatform, arch: BuildArch, supportedArchitectures: Schema.Array(BuildArch), },) { override get message(): string { return `Unsupported architecture '${this.arch}' for ${this.platform}.`; }} const InvalidMockUpdateServerPortReason = Schema.Literals([ "not-numeric", "not-integer", "out-of-range",]); export class InvalidMockUpdateServerPortError extends Schema.TaggedErrorClass<InvalidMockUpdateServerPortError>()( "InvalidMockUpdateServerPortError", { reason: InvalidMockUpdateServerPortReason, inputLength: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)), cause: Schema.Defect(), },) { override get message(): string { return "Invalid mock update server port."; } static fromConfigValue(configuredPort: string, cause: unknown) { return new InvalidMockUpdateServerPortError({ reason: invalidMockUpdateServerPortReason(configuredPort), inputLength: configuredPort.length, cause, }); }} export class BuildCommandFailedError extends Schema.TaggedErrorClass<BuildCommandFailedError>()( "BuildCommandFailedError", { command: Schema.String, exitCode: Schema.Int, stdoutTail: Schema.optionalKey(Schema.String), stderrTail: Schema.optionalKey(Schema.String), },) { override get message(): string { const outputSections = [ `Command: ${this.command}`, formatOutputSection("stdout", this.stdoutTail ?? ""), formatOutputSection("stderr", this.stderrTail ?? ""), ].filter((section): section is string => section !== undefined); const outputSuffix = outputSections.length > 0 ? `\n\n${outputSections.join("\n\n")}` : ""; return `Command exited with non-zero exit code (${this.exitCode})${outputSuffix}`; }} export class ResourceMonitorBuildOutputMissingError extends Schema.TaggedErrorClass<ResourceMonitorBuildOutputMissingError>()( "ResourceMonitorBuildOutputMissingError", { binaryPath: Schema.String, rustTarget: Schema.String, platform: BuildPlatform, arch: BuildArch, },) { override get message(): string { return `Resource monitor build for ${this.rustTarget} did not produce ${this.binaryPath}.`; }} const desktopIconPlatformNames = { mac: "macOS", linux: "Linux", win: "Windows",} satisfies Record<typeof BuildPlatform.Type, string>; export class DesktopIconSourceMissingError extends Schema.TaggedErrorClass<DesktopIconSourceMissingError>()( "DesktopIconSourceMissingError", { platform: BuildPlatform, sourcePath: Schema.String, },) { override get message(): string { return `Desktop ${desktopIconPlatformNames[this.platform]} icon source is missing at ${this.sourcePath}`; }} export class DesktopDmgBackgroundSourceMissingError extends Schema.TaggedErrorClass<DesktopDmgBackgroundSourceMissingError>()( "DesktopDmgBackgroundSourceMissingError", { channel: Schema.Literals(["latest", "nightly"]), sourcePath: Schema.String, },) { override get message(): string { return `Desktop ${this.channel} DMG background source is missing at ${this.sourcePath}`; }} export class BundledClientAssetsMissingError extends Schema.TaggedErrorClass<BundledClientAssetsMissingError>()( "BundledClientAssetsMissingError", { indexPath: Schema.String, missingFiles: Schema.Array(Schema.String), },) { override get message(): string { const preview = this.missingFiles.slice(0, 6).join(", "); const suffix = this.missingFiles.length > 6 ? ` (+${this.missingFiles.length - 6} more)` : ""; return `Bundled client references missing files in ${this.indexPath}: ${preview}${suffix}. Rebuild web/server artifacts.`; }} export class UnsupportedDesktopBuildPlatformError extends Schema.TaggedErrorClass<UnsupportedDesktopBuildPlatformError>()( "UnsupportedDesktopBuildPlatformError", { platform: Schema.String, },) { override get message(): string { return `Unsupported platform '${this.platform}'.`; }} const dependencyResolutionDescriptions = { "server-production": "production dependencies", "workspace-overrides": "overrides", "desktop-runtime": "desktop runtime dependencies",} as const;const DependencyResolutionKind = Schema.Literals([ "server-production", "workspace-overrides", "desktop-runtime",]); export class DesktopBuildDependencyResolutionError extends Schema.TaggedErrorClass<DesktopBuildDependencyResolutionError>()( "DesktopBuildDependencyResolutionError", { kind: DependencyResolutionKind, manifestPath: Schema.String, cause: Schema.Defect(), },) { override get message(): string { return `Could not resolve ${dependencyResolutionDescriptions[this.kind]} from ${this.manifestPath}.`; }} export class MissingServerProductionDependenciesError extends Schema.TaggedErrorClass<MissingServerProductionDependenciesError>()( "MissingServerProductionDependenciesError", { manifestPath: Schema.String, },) { override get message(): string { return `Could not resolve production dependencies from ${this.manifestPath}.`; }} const DesktopBuildInputArtifact = Schema.Literals([ "desktop-dist", "desktop-resources", "server-dist", "bundled-server-client",]);type DesktopBuildInputArtifact = typeof DesktopBuildInputArtifact.Type;const desktopBuildInputArtifactNames = { "desktop-dist": "desktopDist", "desktop-resources": "desktopResources", "server-dist": "serverDist", "bundled-server-client": "bundled server client",} satisfies Record<DesktopBuildInputArtifact, string>; /** * Imported by every server module, so it is inlined in any correctly bundled * build. Its absence means the bundle went back to externalizing its * dependencies, which the sidecar's selected runtime closure does not cover. */const BUNDLE_SELF_CONTAINED_SENTINEL = "effect"; const BUNDLE_SELF_CHECK_TIMEOUT = Duration.seconds(120);const WINDOWS_PRIMARY_NATIVE_PROBE_TIMEOUT = Duration.seconds(30); const WINDOWS_PRIMARY_FFF_PROBE_SOURCE = `const { join } = await import("node:path");const { pathToFileURL } = await import("node:url");const { FileFinder } = await import(pathToFileURL(process.argv[1]).href);const probeRoot = process.argv[2];const result = FileFinder.create({ basePath: probeRoot, frecencyDbPath: join(probeRoot, "frecency.mdb"), historyDbPath: join(probeRoot, "history.mdb"), disableWatch: true, disableMmapCache: true, disableContentIndexing: true,});if (!result.ok) throw new Error(result.error);result.value.destroy();`; export class ExternalizedBundleError extends Schema.TaggedErrorClass<ExternalizedBundleError>()( "ExternalizedBundleError", { sentinel: Schema.String, inlinedPackageCount: Schema.Number },) { override get message(): string { return `The server bundle did not inline "${this.sentinel}" (${this.inlinedPackageCount} packages inlined). The bundle is meant to be self-contained apart from the runtime externals; if its dependencies are external again they will be absent from the sidecar, and the backend will fail with ERR_MODULE_NOT_FOUND. Check the deps.alwaysBundle wiring in apps/server/vite.config.ts.`; }} export class BundleNotSelfContainedError extends Schema.TaggedErrorClass<BundleNotSelfContainedError>()( "BundleNotSelfContainedError", { exitCode: Schema.Number, output: Schema.String },) { override get message(): string { return `The packaged server bundle could not load from the isolated, extracted sidecar (exit ${this.exitCode}). Anything it imports that is neither a Node built-in nor in the selected runtime-external closure is unavailable to both backends. Output:${this.output}`; }} export class InlinedNativePackageError extends Schema.TaggedErrorClass<InlinedNativePackageError>()( "InlinedNativePackageError", { packages: Schema.Array(Schema.String) },) { override get message(): string { return `The server bundle inlined packages that load native binaries: ${this.packages.join(", ")}. A node-gyp-build style loader resolves prebuilds relative to its own file, so inlined into a chunk it finds none and the importer quietly falls back to a slower JS path. Add them to CLI_RUNTIME_EXTERNAL_PREFIXES in scripts/lib/cli-external-packages.ts so they stay external and are staged in the sidecar.`; }} export class InlinedExternalPackageError extends Schema.TaggedErrorClass<InlinedExternalPackageError>()( "InlinedExternalPackageError", { packages: Schema.Array(Schema.String) },) { override get message(): string { return `The server bundle inlined packages that must stay external: ${this.packages.join(", ")}. These are native addons or their loaders; inlined, they resolve prebuilds relative to the bundle and silently lose native acceleration. Check the deps.neverBundle wiring in apps/server/vite.config.ts.`; }} export class MissingDesktopBuildInputError extends Schema.TaggedErrorClass<MissingDesktopBuildInputError>()( "MissingDesktopBuildInputError", { artifact: DesktopBuildInputArtifact, artifactPath: Schema.String, buildCommand: Schema.Literal("vp run build:desktop"), },) { override get message(): string { return `Missing ${desktopBuildInputArtifactNames[this.artifact]} at ${this.artifactPath}. Run '${this.buildCommand}' first.`; }} export class MacProvisioningProfileNotFoundError extends Schema.TaggedErrorClass<MacProvisioningProfileNotFoundError>()( "MacProvisioningProfileNotFoundError", { provisioningProfilePath: Schema.String, },) { override get message(): string { return `macOS provisioning profile not found: ${this.provisioningProfilePath}`; }} export class DesktopBuildDistDirectoryMissingError extends Schema.TaggedErrorClass<DesktopBuildDistDirectoryMissingError>()( "DesktopBuildDistDirectoryMissingError", { distPath: Schema.String, platform: BuildPlatform,Lines 1–500 of 3465. Load more
#!/usr/bin/env node // @effect-diagnostics nodeBuiltinImport:off - Node's typed junction API avoids Windows symlink privileges while keeping the probe isolated. import * as NodeFSP from "node:fs/promises"; import * as NodeCrypto from "node:crypto"; import * as NodeModule from "node:module"; import { createPackageWithOptions, extractAll, getRawHeader, statFile, type DirectoryRecord, } from "@electron/asar"; import { fromYaml } from "@t3tools/shared/schemaYaml"; import { HostProcessArchitecture, HostProcessPlatform } from "@t3tools/shared/hostProcess"; import { clerkFrontendApiHostnameFromPublishableKey } from "@t3tools/shared/relayAuth"; import { resolveSpawnCommand } from "@t3tools/shared/shell"; import rootPackageJson from "../package.json" with { type: "json" }; import desktopPackageJson from "../apps/desktop/package.json" with { type: "json" }; import serverPackageJson from "../apps/server/package.json" with { type: "json" }; import { applyWebBrandAssets } from "./apply-web-brand-assets.ts"; import { BRAND_ASSET_PATHS, resolveWebAssetBrandForChannel, type WebAssetBrand, } from "./lib/brand-assets.ts"; import { getDefaultBuildArch } from "./lib/build-target-arch.ts"; import { findInlinedExternalPackages, selectCliRuntimeExternalDependencies, } from "./lib/cli-external-packages.ts"; import { loadRepoEnv } from "./lib/public-config.ts"; import { resolveCatalogDependencies } from "./lib/resolve-catalog.ts"; import * as NodeRuntime from "@effect/platform-node/NodeRuntime"; import * as NodeServices from "@effect/platform-node/NodeServices"; import * as Config from "effect/Config"; import * as Duration from "effect/Duration"; import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; import * as Layer from "effect/Layer"; import * as Logger from "effect/Logger"; import * as Option from "effect/Option"; import type { PlatformError } from "effect/PlatformError"; import * as Path from "effect/Path"; import * as Schema from "effect/Schema"; import * as Stream from "effect/Stream"; import { Command, Flag } from "effect/unstable/cli"; import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"; const LINUX_ICON_SIZES = [16, 22, 24, 32, 48, 64, 128, 256, 512] as const; const DESKTOP_APP_ID = "com.t3tools.t3code"; const APPLE_TEAM_ID_PATTERN = /^[A-Z0-9]{10}$/u; const BuildPlatform = Schema.Literals(["mac", "linux", "win"]); const BuildArch = Schema.Literals(["arm64", "x64", "universal"]); const WorkspaceConfig = Schema.Struct({ catalog: Schema.optional(Schema.Record(Schema.String, Schema.String)), overrides: Schema.optional(Schema.Record(Schema.String, Schema.String)), patchedDependencies: Schema.optional(Schema.Record(Schema.String, Schema.String)), allowBuilds: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)), }); type WorkspaceConfig = typeof WorkspaceConfig.Type; const StageWorkspaceConfig = Schema.Struct({ supportedArchitectures: Schema.Struct({ os: Schema.Array(Schema.String), cpu: Schema.Array(Schema.String), libc: Schema.optional(Schema.Array(Schema.String)), }), // pnpm 11 only reads these from pnpm-workspace.yaml (not package.json#pnpm). // Without allowBuilds the staged `vp install --prod` fails with // ERR_PNPM_IGNORED_BUILDS for packages that have lifecycle scripts. allowBuilds: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)), patchedDependencies: Schema.optional(Schema.Record(Schema.String, Schema.String)), overrides: Schema.optional(Schema.Record(Schema.String, Schema.String)), nodeLinker: Schema.optional(Schema.Literals(["hoisted"])), }); type StageWorkspaceConfig = typeof StageWorkspaceConfig.Type; const RepoRoot = Effect.service(Path.Path).pipe( Effect.flatMap((path) => path.fromFileUrl(new URL("..", import.meta.url))), ); const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); const decodeWorkspaceConfig = Schema.decodeEffect(fromYaml(WorkspaceConfig)); const decodeNodePtyManifest = Schema.decodeUnknownEffect( Schema.fromJsonString(Schema.Struct({ version: Schema.String })), ); const encodeStageWorkspaceConfig = Schema.encodeEffect(fromYaml(StageWorkspaceConfig)); const readWorkspaceConfig = Effect.fn("readWorkspaceConfig")(function* () { const fs = yield* FileSystem.FileSystem; const path = yield* Path.Path; const repoRoot = yield* RepoRoot; const workspaceYaml = yield* fs.readFileString(path.join(repoRoot, "pnpm-workspace.yaml")); return yield* decodeWorkspaceConfig(workspaceYaml); }); interface DesktopBuildIconAssets { readonly macIconPng: string; readonly linuxIconPng: string; readonly windowsIconIco: string; } interface PlatformConfig { readonly cliFlag: "--mac" | "--linux" | "--win"; readonly defaultTarget: string; readonly archChoices: ReadonlyArray<typeof BuildArch.Type>; } export function resolveResourceMonitorRustTargets( platform: typeof BuildPlatform.Type, arch: typeof BuildArch.Type, ): ReadonlyArray<string> { if (platform === "mac") { if (arch === "universal") { return ["aarch64-apple-darwin", "x86_64-apple-darwin"]; } return [arch === "arm64" ? "aarch64-apple-darwin" : "x86_64-apple-darwin"]; } if (platform === "linux") { return [arch === "arm64" ? "aarch64-unknown-linux-gnu" : "x86_64-unknown-linux-gnu"]; } return [arch === "arm64" ? "aarch64-pc-windows-msvc" : "x86_64-pc-windows-msvc"]; } export function resourceMonitorExecutableName(platform: typeof BuildPlatform.Type): string { return platform === "win" ? "t3-resource-monitor.exe" : "t3-resource-monitor"; } const PLATFORM_CONFIG: Record<typeof BuildPlatform.Type, PlatformConfig> = { mac: { cliFlag: "--mac", defaultTarget: "dmg", archChoices: ["arm64", "x64", "universal"], }, linux: { cliFlag: "--linux", defaultTarget: "AppImage", archChoices: ["x64", "arm64"], }, win: { cliFlag: "--win", defaultTarget: "nsis", archChoices: ["x64", "arm64"], }, }; interface BuildCliInput { readonly platform: Option.Option<typeof BuildPlatform.Type>; readonly target: Option.Option<string>; readonly arch: Option.Option<typeof BuildArch.Type>; readonly buildVersion: Option.Option<string>; readonly outputDir: Option.Option<string>; readonly skipBuild: Option.Option<boolean>; readonly keepStage: Option.Option<boolean>; readonly signed: Option.Option<boolean>; readonly verbose: Option.Option<boolean>; readonly mockUpdates: Option.Option<boolean>; readonly mockUpdateServerPort: Option.Option<number>; readonly wslPrebuild: Option.Option<string>; } function detectHostBuildPlatform(hostPlatform: string): typeof BuildPlatform.Type | undefined { if (hostPlatform === "darwin") return "mac"; if (hostPlatform === "linux") return "linux"; if (hostPlatform === "win32") return "win"; return undefined; } const getDefaultArch = Effect.fn("getDefaultArch")(function* (platform: typeof BuildPlatform.Type) { const config = PLATFORM_CONFIG[platform]; if (!config) { return "x64"; } return yield* getDefaultBuildArch(platform, config); }); export class MacPasskeySigningConfigurationResolutionError extends Schema.TaggedErrorClass<MacPasskeySigningConfigurationResolutionError>()( "MacPasskeySigningConfigurationResolutionError", { cause: Schema.Defect(), }, ) { static fromCause( cause: unknown, ): MacPasskeySigningConfigurationError | MacPasskeySigningConfigurationResolutionError { return isMacPasskeySigningConfigurationError(cause) ? cause : new MacPasskeySigningConfigurationResolutionError({ cause }); } override get message(): string { return "Failed to resolve macOS passkey signing configuration."; } } export class ClerkPasskeyNativePackageMissingError extends Schema.TaggedErrorClass<ClerkPasskeyNativePackageMissingError>()( "ClerkPasskeyNativePackageMissingError", { packageName: Schema.String, binaryFileName: Schema.String, packageEntryPath: Schema.String, platform: BuildPlatform, arch: BuildArch, cause: Schema.Defect(), }, ) { override get message(): string { return `Clerk passkey native package is missing: ${this.packageName}`; } } export class UnsupportedHostBuildPlatformError extends Schema.TaggedErrorClass<UnsupportedHostBuildPlatformError>()( "UnsupportedHostBuildPlatformError", { hostPlatform: Schema.String, }, ) { override get message(): string { return `Unsupported host platform '${this.hostPlatform}'.`; } } export class UnsupportedDesktopBuildArchitectureError extends Schema.TaggedErrorClass<UnsupportedDesktopBuildArchitectureError>()( "UnsupportedDesktopBuildArchitectureError", { platform: BuildPlatform, arch: BuildArch, supportedArchitectures: Schema.Array(BuildArch), }, ) { override get message(): string { return `Unsupported architecture '${this.arch}' for ${this.platform}.`; } } const InvalidMockUpdateServerPortReason = Schema.Literals([ "not-numeric", "not-integer", "out-of-range", ]); export class InvalidMockUpdateServerPortError extends Schema.TaggedErrorClass<InvalidMockUpdateServerPortError>()( "InvalidMockUpdateServerPortError", { reason: InvalidMockUpdateServerPortReason, inputLength: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)), cause: Schema.Defect(), }, ) { override get message(): string { return "Invalid mock update server port."; } static fromConfigValue(configuredPort: string, cause: unknown) { return new InvalidMockUpdateServerPortError({ reason: invalidMockUpdateServerPortReason(configuredPort), inputLength: configuredPort.length, cause, }); } } export class BuildCommandFailedError extends Schema.TaggedErrorClass<BuildCommandFailedError>()( "BuildCommandFailedError", { command: Schema.String, exitCode: Schema.Int, stdoutTail: Schema.optionalKey(Schema.String), stderrTail: Schema.optionalKey(Schema.String), }, ) { override get message(): string { const outputSections = [ `Command: ${this.command}`, formatOutputSection("stdout", this.stdoutTail ?? ""), formatOutputSection("stderr", this.stderrTail ?? ""), ].filter((section): section is string => section !== undefined); const outputSuffix = outputSections.length > 0 ? `\n\n${outputSections.join("\n\n")}` : ""; return `Command exited with non-zero exit code (${this.exitCode})${outputSuffix}`; } } export class ResourceMonitorBuildOutputMissingError extends Schema.TaggedErrorClass<ResourceMonitorBuildOutputMissingError>()( "ResourceMonitorBuildOutputMissingError", { binaryPath: Schema.String, rustTarget: Schema.String, platform: BuildPlatform, arch: BuildArch, }, ) { override get message(): string { return `Resource monitor build for ${this.rustTarget} did not produce ${this.binaryPath}.`; } } const desktopIconPlatformNames = { mac: "macOS", linux: "Linux", win: "Windows", } satisfies Record<typeof BuildPlatform.Type, string>; export class DesktopIconSourceMissingError extends Schema.TaggedErrorClass<DesktopIconSourceMissingError>()( "DesktopIconSourceMissingError", { platform: BuildPlatform, sourcePath: Schema.String, }, ) { override get message(): string { return `Desktop ${desktopIconPlatformNames[this.platform]} icon source is missing at ${this.sourcePath}`; } } export class DesktopDmgBackgroundSourceMissingError extends Schema.TaggedErrorClass<DesktopDmgBackgroundSourceMissingError>()( "DesktopDmgBackgroundSourceMissingError", { channel: Schema.Literals(["latest", "nightly"]), sourcePath: Schema.String, }, ) { override get message(): string { return `Desktop ${this.channel} DMG background source is missing at ${this.sourcePath}`; } } export class BundledClientAssetsMissingError extends Schema.TaggedErrorClass<BundledClientAssetsMissingError>()( "BundledClientAssetsMissingError", { indexPath: Schema.String, missingFiles: Schema.Array(Schema.String), }, ) { override get message(): string { const preview = this.missingFiles.slice(0, 6).join(", "); const suffix = this.missingFiles.length > 6 ? ` (+${this.missingFiles.length - 6} more)` : ""; return `Bundled client references missing files in ${this.indexPath}: ${preview}${suffix}. Rebuild web/server artifacts.`; } } export class UnsupportedDesktopBuildPlatformError extends Schema.TaggedErrorClass<UnsupportedDesktopBuildPlatformError>()( "UnsupportedDesktopBuildPlatformError", { platform: Schema.String, }, ) { override get message(): string { return `Unsupported platform '${this.platform}'.`; } } const dependencyResolutionDescriptions = { "server-production": "production dependencies", "workspace-overrides": "overrides", "desktop-runtime": "desktop runtime dependencies", } as const; const DependencyResolutionKind = Schema.Literals([ "server-production", "workspace-overrides", "desktop-runtime", ]); export class DesktopBuildDependencyResolutionError extends Schema.TaggedErrorClass<DesktopBuildDependencyResolutionError>()( "DesktopBuildDependencyResolutionError", { kind: DependencyResolutionKind, manifestPath: Schema.String, cause: Schema.Defect(), }, ) { override get message(): string { return `Could not resolve ${dependencyResolutionDescriptions[this.kind]} from ${this.manifestPath}.`; } } export class MissingServerProductionDependenciesError extends Schema.TaggedErrorClass<MissingServerProductionDependenciesError>()( "MissingServerProductionDependenciesError", { manifestPath: Schema.String, }, ) { override get message(): string { return `Could not resolve production dependencies from ${this.manifestPath}.`; } } const DesktopBuildInputArtifact = Schema.Literals([ "desktop-dist", "desktop-resources", "server-dist", "bundled-server-client", ]); type DesktopBuildInputArtifact = typeof DesktopBuildInputArtifact.Type; const desktopBuildInputArtifactNames = { "desktop-dist": "desktopDist", "desktop-resources": "desktopResources", "server-dist": "serverDist", "bundled-server-client": "bundled server client", } satisfies Record<DesktopBuildInputArtifact, string>; /** * Imported by every server module, so it is inlined in any correctly bundled * build. Its absence means the bundle went back to externalizing its * dependencies, which the sidecar's selected runtime closure does not cover. */ const BUNDLE_SELF_CONTAINED_SENTINEL = "effect"; const BUNDLE_SELF_CHECK_TIMEOUT = Duration.seconds(120); const WINDOWS_PRIMARY_NATIVE_PROBE_TIMEOUT = Duration.seconds(30); const WINDOWS_PRIMARY_FFF_PROBE_SOURCE = ` const { join } = await import("node:path"); const { pathToFileURL } = await import("node:url"); const { FileFinder } = await import(pathToFileURL(process.argv[1]).href); const probeRoot = process.argv[2]; const result = FileFinder.create({ basePath: probeRoot, frecencyDbPath: join(probeRoot, "frecency.mdb"), historyDbPath: join(probeRoot, "history.mdb"), disableWatch: true, disableMmapCache: true, disableContentIndexing: true, }); if (!result.ok) throw new Error(result.error); result.value.destroy(); `; export class ExternalizedBundleError extends Schema.TaggedErrorClass<ExternalizedBundleError>()( "ExternalizedBundleError", { sentinel: Schema.String, inlinedPackageCount: Schema.Number }, ) { override get message(): string { return `The server bundle did not inline "${this.sentinel}" (${this.inlinedPackageCount} packages inlined). The bundle is meant to be self-contained apart from the runtime externals; if its dependencies are external again they will be absent from the sidecar, and the backend will fail with ERR_MODULE_NOT_FOUND. Check the deps.alwaysBundle wiring in apps/server/vite.config.ts.`; } } export class BundleNotSelfContainedError extends Schema.TaggedErrorClass<BundleNotSelfContainedError>()( "BundleNotSelfContainedError", { exitCode: Schema.Number, output: Schema.String }, ) { override get message(): string { return `The packaged server bundle could not load from the isolated, extracted sidecar (exit ${this.exitCode}). Anything it imports that is neither a Node built-in nor in the selected runtime-external closure is unavailable to both backends. Output: ${this.output}`; } } export class InlinedNativePackageError extends Schema.TaggedErrorClass<InlinedNativePackageError>()( "InlinedNativePackageError", { packages: Schema.Array(Schema.String) }, ) { override get message(): string { return `The server bundle inlined packages that load native binaries: ${this.packages.join(", ")}. A node-gyp-build style loader resolves prebuilds relative to its own file, so inlined into a chunk it finds none and the importer quietly falls back to a slower JS path. Add them to CLI_RUNTIME_EXTERNAL_PREFIXES in scripts/lib/cli-external-packages.ts so they stay external and are staged in the sidecar.`; } } export class InlinedExternalPackageError extends Schema.TaggedErrorClass<InlinedExternalPackageError>()( "InlinedExternalPackageError", { packages: Schema.Array(Schema.String) }, ) { override get message(): string { return `The server bundle inlined packages that must stay external: ${this.packages.join(", ")}. These are native addons or their loaders; inlined, they resolve prebuilds relative to the bundle and silently lose native acceleration. Check the deps.neverBundle wiring in apps/server/vite.config.ts.`; } } export class MissingDesktopBuildInputError extends Schema.TaggedErrorClass<MissingDesktopBuildInputError>()( "MissingDesktopBuildInputError", { artifact: DesktopBuildInputArtifact, artifactPath: Schema.String, buildCommand: Schema.Literal("vp run build:desktop"), }, ) { override get message(): string { return `Missing ${desktopBuildInputArtifactNames[this.artifact]} at ${this.artifactPath}. Run '${this.buildCommand}' first.`; } } export class MacProvisioningProfileNotFoundError extends Schema.TaggedErrorClass<MacProvisioningProfileNotFoundError>()( "MacProvisioningProfileNotFoundError", { provisioningProfilePath: Schema.String, }, ) { override get message(): string { return `macOS provisioning profile not found: ${this.provisioningProfilePath}`; } } export class DesktopBuildDistDirectoryMissingError extends Schema.TaggedErrorClass<DesktopBuildDistDirectoryMissingError>()( "DesktopBuildDistDirectoryMissingError", { distPath: Schema.String, platform: BuildPlatform,